alchemy 0.62.2 → 0.63.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 (611) hide show
  1. package/bin/alchemy.js +1518 -1204
  2. package/bin/commands/deploy.ts +2 -0
  3. package/bin/commands/dev.ts +2 -0
  4. package/bin/services/execute-alchemy.ts +11 -0
  5. package/bin/services/template-manager.ts +2 -0
  6. package/bin/types.ts +2 -1
  7. package/lib/alchemy.d.ts +6 -22
  8. package/lib/alchemy.d.ts.map +1 -1
  9. package/lib/alchemy.js +65 -169
  10. package/lib/alchemy.js.map +1 -1
  11. package/lib/apply.d.ts +0 -2
  12. package/lib/apply.d.ts.map +1 -1
  13. package/lib/apply.js +2 -16
  14. package/lib/apply.js.map +1 -1
  15. package/lib/aws/account-id.d.ts.map +1 -1
  16. package/lib/aws/account-id.js +3 -2
  17. package/lib/aws/account-id.js.map +1 -1
  18. package/lib/aws/bucket.d.ts +8 -2
  19. package/lib/aws/bucket.d.ts.map +1 -1
  20. package/lib/aws/bucket.js +21 -14
  21. package/lib/aws/bucket.js.map +1 -1
  22. package/lib/aws/ec2/security-group.d.ts +8 -2
  23. package/lib/aws/ec2/security-group.d.ts.map +1 -1
  24. package/lib/aws/ec2/security-group.js +7 -2
  25. package/lib/aws/ec2/security-group.js.map +1 -1
  26. package/lib/aws/function.d.ts +9 -3
  27. package/lib/aws/function.d.ts.map +1 -1
  28. package/lib/aws/function.js +35 -26
  29. package/lib/aws/function.js.map +1 -1
  30. package/lib/aws/policy-attachment.d.ts.map +1 -1
  31. package/lib/aws/policy-attachment.js +2 -1
  32. package/lib/aws/policy-attachment.js.map +1 -1
  33. package/lib/aws/policy.d.ts +8 -2
  34. package/lib/aws/policy.d.ts.map +1 -1
  35. package/lib/aws/policy.js +13 -4
  36. package/lib/aws/policy.js.map +1 -1
  37. package/lib/aws/queue.d.ts +8 -2
  38. package/lib/aws/queue.d.ts.map +1 -1
  39. package/lib/aws/queue.js +22 -14
  40. package/lib/aws/queue.js.map +1 -1
  41. package/lib/aws/role.d.ts +8 -2
  42. package/lib/aws/role.d.ts.map +1 -1
  43. package/lib/aws/role.js +10 -3
  44. package/lib/aws/role.js.map +1 -1
  45. package/lib/aws/ses.d.ts +1 -1
  46. package/lib/aws/ses.d.ts.map +1 -1
  47. package/lib/aws/ses.js +2 -1
  48. package/lib/aws/ses.js.map +1 -1
  49. package/lib/aws/ssm-parameter.d.ts +8 -2
  50. package/lib/aws/ssm-parameter.d.ts.map +1 -1
  51. package/lib/aws/ssm-parameter.js +15 -10
  52. package/lib/aws/ssm-parameter.js.map +1 -1
  53. package/lib/aws/table.d.ts +8 -2
  54. package/lib/aws/table.d.ts.map +1 -1
  55. package/lib/aws/table.js +17 -9
  56. package/lib/aws/table.js.map +1 -1
  57. package/lib/cloudflare/account-api-token.d.ts +2 -2
  58. package/lib/cloudflare/account-api-token.d.ts.map +1 -1
  59. package/lib/cloudflare/account-api-token.js +7 -6
  60. package/lib/cloudflare/account-api-token.js.map +1 -1
  61. package/lib/cloudflare/ai-gateway.d.ts +9 -4
  62. package/lib/cloudflare/ai-gateway.d.ts.map +1 -1
  63. package/lib/cloudflare/ai-gateway.js +20 -24
  64. package/lib/cloudflare/ai-gateway.js.map +1 -1
  65. package/lib/cloudflare/api-schema.d.ts +2 -2
  66. package/lib/cloudflare/api-schema.d.ts.map +1 -1
  67. package/lib/cloudflare/api-schema.js +6 -2
  68. package/lib/cloudflare/api-schema.js.map +1 -1
  69. package/lib/cloudflare/api-shield.d.ts +5 -1
  70. package/lib/cloudflare/api-shield.d.ts.map +1 -1
  71. package/lib/cloudflare/api-shield.js +6 -1
  72. package/lib/cloudflare/api-shield.js.map +1 -1
  73. package/lib/cloudflare/assets.d.ts +1 -1
  74. package/lib/cloudflare/assets.d.ts.map +1 -1
  75. package/lib/cloudflare/astro/astro.d.ts.map +1 -1
  76. package/lib/cloudflare/astro/astro.js +3 -1
  77. package/lib/cloudflare/astro/astro.js.map +1 -1
  78. package/lib/cloudflare/astro/plugin.d.ts +2 -1
  79. package/lib/cloudflare/astro/plugin.d.ts.map +1 -1
  80. package/lib/cloudflare/astro/plugin.js.map +1 -1
  81. package/lib/cloudflare/bindings.d.ts +2 -2
  82. package/lib/cloudflare/bindings.d.ts.map +1 -1
  83. package/lib/cloudflare/bound.d.ts +1 -1
  84. package/lib/cloudflare/bound.d.ts.map +1 -1
  85. package/lib/cloudflare/bucket.d.ts +120 -1
  86. package/lib/cloudflare/bucket.d.ts.map +1 -1
  87. package/lib/cloudflare/bucket.js +80 -2
  88. package/lib/cloudflare/bucket.js.map +1 -1
  89. package/lib/cloudflare/compatibility-date.gen.d.ts +1 -1
  90. package/lib/cloudflare/compatibility-date.gen.js +1 -1
  91. package/lib/cloudflare/container.d.ts +10 -4
  92. package/lib/cloudflare/container.d.ts.map +1 -1
  93. package/lib/cloudflare/container.js +12 -9
  94. package/lib/cloudflare/container.js.map +1 -1
  95. package/lib/cloudflare/custom-domain.js +2 -1
  96. package/lib/cloudflare/custom-domain.js.map +1 -1
  97. package/lib/cloudflare/d1-database.d.ts +1 -1
  98. package/lib/cloudflare/d1-database.d.ts.map +1 -1
  99. package/lib/cloudflare/d1-database.js +7 -3
  100. package/lib/cloudflare/d1-database.js.map +1 -1
  101. package/lib/cloudflare/dispatch-namespace.d.ts +2 -0
  102. package/lib/cloudflare/dispatch-namespace.d.ts.map +1 -1
  103. package/lib/cloudflare/dispatch-namespace.js +7 -5
  104. package/lib/cloudflare/dispatch-namespace.js.map +1 -1
  105. package/lib/cloudflare/hyperdrive.d.ts +7 -1
  106. package/lib/cloudflare/hyperdrive.d.ts.map +1 -1
  107. package/lib/cloudflare/hyperdrive.js +2 -1
  108. package/lib/cloudflare/hyperdrive.js.map +1 -1
  109. package/lib/cloudflare/kv-namespace.d.ts +3 -0
  110. package/lib/cloudflare/kv-namespace.d.ts.map +1 -1
  111. package/lib/cloudflare/kv-namespace.js +11 -2
  112. package/lib/cloudflare/kv-namespace.js.map +1 -1
  113. package/lib/cloudflare/miniflare/miniflare-worker-proxy.js +3 -1
  114. package/lib/cloudflare/miniflare/miniflare-worker-proxy.js.map +1 -1
  115. package/lib/cloudflare/miniflare/paths.d.ts +4 -0
  116. package/lib/cloudflare/miniflare/paths.d.ts.map +1 -1
  117. package/lib/cloudflare/miniflare/paths.js +11 -0
  118. package/lib/cloudflare/miniflare/paths.js.map +1 -1
  119. package/lib/cloudflare/pipeline.d.ts +14 -3
  120. package/lib/cloudflare/pipeline.d.ts.map +1 -1
  121. package/lib/cloudflare/pipeline.js +31 -2
  122. package/lib/cloudflare/pipeline.js.map +1 -1
  123. package/lib/cloudflare/queue-consumer.js +1 -1
  124. package/lib/cloudflare/queue-consumer.js.map +1 -1
  125. package/lib/cloudflare/queue.d.ts +6 -4
  126. package/lib/cloudflare/queue.d.ts.map +1 -1
  127. package/lib/cloudflare/queue.js +13 -9
  128. package/lib/cloudflare/queue.js.map +1 -1
  129. package/lib/cloudflare/react-router/plugin.d.ts +1 -1
  130. package/lib/cloudflare/react-router/plugin.d.ts.map +1 -1
  131. package/lib/cloudflare/react-router/react-router.d.ts.map +1 -1
  132. package/lib/cloudflare/react-router/react-router.js +32 -2
  133. package/lib/cloudflare/react-router/react-router.js.map +1 -1
  134. package/lib/cloudflare/redwood/plugin.d.ts +2 -1
  135. package/lib/cloudflare/redwood/plugin.d.ts.map +1 -1
  136. package/lib/cloudflare/redwood/plugin.js.map +1 -1
  137. package/lib/cloudflare/route.js +1 -1
  138. package/lib/cloudflare/route.js.map +1 -1
  139. package/lib/cloudflare/ruleset.d.ts +3 -1
  140. package/lib/cloudflare/ruleset.d.ts.map +1 -1
  141. package/lib/cloudflare/ruleset.js +3 -2
  142. package/lib/cloudflare/ruleset.js.map +1 -1
  143. package/lib/cloudflare/secret.d.ts +6 -23
  144. package/lib/cloudflare/secret.d.ts.map +1 -1
  145. package/lib/cloudflare/secret.js +8 -4
  146. package/lib/cloudflare/secret.js.map +1 -1
  147. package/lib/cloudflare/secrets-store.d.ts +1 -1
  148. package/lib/cloudflare/secrets-store.d.ts.map +1 -1
  149. package/lib/cloudflare/secrets-store.js +5 -2
  150. package/lib/cloudflare/secrets-store.js.map +1 -1
  151. package/lib/cloudflare/tunnel.d.ts +5 -1
  152. package/lib/cloudflare/tunnel.d.ts.map +1 -1
  153. package/lib/cloudflare/tunnel.js +5 -1
  154. package/lib/cloudflare/tunnel.js.map +1 -1
  155. package/lib/cloudflare/vectorize-index.d.ts +7 -1
  156. package/lib/cloudflare/vectorize-index.d.ts.map +1 -1
  157. package/lib/cloudflare/vectorize-index.js +5 -2
  158. package/lib/cloudflare/vectorize-index.js.map +1 -1
  159. package/lib/cloudflare/vite/plugin.d.ts +2 -1
  160. package/lib/cloudflare/vite/plugin.d.ts.map +1 -1
  161. package/lib/cloudflare/vite/plugin.js.map +1 -1
  162. package/lib/cloudflare/vite/vite.d.ts +1 -1
  163. package/lib/cloudflare/vite/vite.d.ts.map +1 -1
  164. package/lib/cloudflare/vite/vite.js +1 -1
  165. package/lib/cloudflare/vite/vite.js.map +1 -1
  166. package/lib/cloudflare/website.js +1 -1
  167. package/lib/cloudflare/website.js.map +1 -1
  168. package/lib/cloudflare/worker.d.ts +1 -1
  169. package/lib/cloudflare/worker.d.ts.map +1 -1
  170. package/lib/cloudflare/worker.js +12 -7
  171. package/lib/cloudflare/worker.js.map +1 -1
  172. package/lib/cloudflare/wrangler.json.d.ts +1 -1
  173. package/lib/cloudflare/wrangler.json.d.ts.map +1 -1
  174. package/lib/cloudflare/wrangler.json.js +5 -3
  175. package/lib/cloudflare/wrangler.json.js.map +1 -1
  176. package/lib/docker/container.d.ts +6 -0
  177. package/lib/docker/container.d.ts.map +1 -1
  178. package/lib/docker/container.js +5 -1
  179. package/lib/docker/container.js.map +1 -1
  180. package/lib/docker/network.d.ts +8 -2
  181. package/lib/docker/network.d.ts.map +1 -1
  182. package/lib/docker/network.js +7 -2
  183. package/lib/docker/network.js.map +1 -1
  184. package/lib/docker/volume.d.ts +8 -2
  185. package/lib/docker/volume.d.ts.map +1 -1
  186. package/lib/docker/volume.js +6 -4
  187. package/lib/docker/volume.js.map +1 -1
  188. package/lib/esbuild/bundle.d.ts +1 -1
  189. package/lib/fs/index.d.ts +0 -8
  190. package/lib/fs/index.d.ts.map +1 -1
  191. package/lib/fs/index.js +0 -8
  192. package/lib/fs/index.js.map +1 -1
  193. package/lib/github/client.d.ts +1 -1
  194. package/lib/github/client.d.ts.map +1 -1
  195. package/lib/github/client.js +2 -1
  196. package/lib/github/client.js.map +1 -1
  197. package/lib/github/repository-environment.d.ts +8 -2
  198. package/lib/github/repository-environment.d.ts.map +1 -1
  199. package/lib/github/repository-environment.js +16 -12
  200. package/lib/github/repository-environment.js.map +1 -1
  201. package/lib/neon/project.d.ts +7 -1
  202. package/lib/neon/project.d.ts.map +1 -1
  203. package/lib/neon/project.js +10 -6
  204. package/lib/neon/project.js.map +1 -1
  205. package/lib/planetscale/branch.d.ts +4 -2
  206. package/lib/planetscale/branch.d.ts.map +1 -1
  207. package/lib/planetscale/branch.js +18 -12
  208. package/lib/planetscale/branch.js.map +1 -1
  209. package/lib/planetscale/database.d.ts +8 -2
  210. package/lib/planetscale/database.d.ts.map +1 -1
  211. package/lib/planetscale/database.js +24 -16
  212. package/lib/planetscale/database.js.map +1 -1
  213. package/lib/planetscale/password.d.ts +8 -2
  214. package/lib/planetscale/password.d.ts.map +1 -1
  215. package/lib/planetscale/password.js +2 -2
  216. package/lib/planetscale/password.js.map +1 -1
  217. package/lib/resource.d.ts +0 -2
  218. package/lib/resource.d.ts.map +1 -1
  219. package/lib/resource.js +1 -9
  220. package/lib/resource.js.map +1 -1
  221. package/lib/scope.d.ts +9 -3
  222. package/lib/scope.d.ts.map +1 -1
  223. package/lib/scope.js +21 -34
  224. package/lib/scope.js.map +1 -1
  225. package/lib/sentry/client-key.d.ts +7 -1
  226. package/lib/sentry/client-key.d.ts.map +1 -1
  227. package/lib/sentry/client-key.js +45 -6
  228. package/lib/sentry/client-key.js.map +1 -1
  229. package/lib/sentry/project.d.ts +8 -2
  230. package/lib/sentry/project.d.ts.map +1 -1
  231. package/lib/sentry/project.js +35 -5
  232. package/lib/sentry/project.js.map +1 -1
  233. package/lib/sentry/team.d.ts +8 -2
  234. package/lib/sentry/team.d.ts.map +1 -1
  235. package/lib/sentry/team.js +36 -6
  236. package/lib/sentry/team.js.map +1 -1
  237. package/lib/serde.d.ts +0 -5
  238. package/lib/serde.d.ts.map +1 -1
  239. package/lib/serde.js +0 -28
  240. package/lib/serde.js.map +1 -1
  241. package/lib/state/d1-state-store.d.ts +1 -1
  242. package/lib/state/d1-state-store.d.ts.map +1 -1
  243. package/lib/state/d1-state-store.js +5 -5
  244. package/lib/state/d1-state-store.js.map +1 -1
  245. package/lib/state/sqlite-state-store.d.ts.map +1 -1
  246. package/lib/state/sqlite-state-store.js +7 -11
  247. package/lib/state/sqlite-state-store.js.map +1 -1
  248. package/lib/stripe/card.d.ts.map +1 -1
  249. package/lib/stripe/card.js +3 -2
  250. package/lib/stripe/card.js.map +1 -1
  251. package/lib/stripe/client.d.ts +2 -2
  252. package/lib/stripe/client.d.ts.map +1 -1
  253. package/lib/stripe/client.js +4 -3
  254. package/lib/stripe/client.js.map +1 -1
  255. package/lib/stripe/coupon.d.ts.map +1 -1
  256. package/lib/stripe/coupon.js +4 -3
  257. package/lib/stripe/coupon.js.map +1 -1
  258. package/lib/stripe/customer.js +2 -2
  259. package/lib/stripe/customer.js.map +1 -1
  260. package/lib/stripe/entitlements-feature.d.ts.map +1 -1
  261. package/lib/stripe/entitlements-feature.js +3 -2
  262. package/lib/stripe/entitlements-feature.js.map +1 -1
  263. package/lib/stripe/file.d.ts.map +1 -1
  264. package/lib/stripe/file.js +3 -2
  265. package/lib/stripe/file.js.map +1 -1
  266. package/lib/stripe/meter.js +2 -2
  267. package/lib/stripe/meter.js.map +1 -1
  268. package/lib/stripe/portal-configuration.d.ts.map +1 -1
  269. package/lib/stripe/portal-configuration.js +3 -2
  270. package/lib/stripe/portal-configuration.js.map +1 -1
  271. package/lib/stripe/price.d.ts.map +1 -1
  272. package/lib/stripe/price.js +3 -2
  273. package/lib/stripe/price.js.map +1 -1
  274. package/lib/stripe/product-feature.d.ts.map +1 -1
  275. package/lib/stripe/product-feature.js +3 -2
  276. package/lib/stripe/product-feature.js.map +1 -1
  277. package/lib/stripe/product.d.ts.map +1 -1
  278. package/lib/stripe/product.js +3 -2
  279. package/lib/stripe/product.js.map +1 -1
  280. package/lib/stripe/promotion-code.d.ts.map +1 -1
  281. package/lib/stripe/promotion-code.js +3 -2
  282. package/lib/stripe/promotion-code.js.map +1 -1
  283. package/lib/stripe/shipping-rate.d.ts.map +1 -1
  284. package/lib/stripe/shipping-rate.js +4 -3
  285. package/lib/stripe/shipping-rate.js.map +1 -1
  286. package/lib/stripe/tax-rate.d.ts.map +1 -1
  287. package/lib/stripe/tax-rate.js +3 -2
  288. package/lib/stripe/tax-rate.js.map +1 -1
  289. package/lib/stripe/webhook.d.ts.map +1 -1
  290. package/lib/stripe/webhook.js +4 -3
  291. package/lib/stripe/webhook.js.map +1 -1
  292. package/lib/test/vitest.d.ts.map +1 -1
  293. package/lib/test/vitest.js +1 -0
  294. package/lib/test/vitest.js.map +1 -1
  295. package/lib/upstash/redis.d.ts +8 -2
  296. package/lib/upstash/redis.d.ts.map +1 -1
  297. package/lib/upstash/redis.js +5 -4
  298. package/lib/upstash/redis.js.map +1 -1
  299. package/lib/util/ignore-matcher.d.ts.map +1 -1
  300. package/lib/util/ignore-matcher.js +3 -1
  301. package/lib/util/ignore-matcher.js.map +1 -1
  302. package/lib/util/peer.d.ts +10 -0
  303. package/lib/util/peer.d.ts.map +1 -0
  304. package/lib/util/peer.js +42 -0
  305. package/lib/util/peer.js.map +1 -0
  306. package/lib/util/telemetry/constants.d.ts.map +1 -1
  307. package/lib/util/telemetry/constants.js +2 -2
  308. package/lib/util/telemetry/constants.js.map +1 -1
  309. package/lib/vercel/project.d.ts +7 -1
  310. package/lib/vercel/project.d.ts.map +1 -1
  311. package/lib/vercel/project.js +28 -0
  312. package/lib/vercel/project.js.map +1 -1
  313. package/package.json +88 -74
  314. package/src/alchemy.ts +76 -222
  315. package/src/apply.ts +6 -19
  316. package/src/aws/account-id.ts +6 -3
  317. package/src/aws/bucket.ts +43 -32
  318. package/src/aws/ec2/security-group.ts +15 -3
  319. package/src/aws/function.ts +65 -39
  320. package/src/aws/policy-attachment.ts +10 -6
  321. package/src/aws/policy.ts +33 -15
  322. package/src/aws/queue.ts +50 -29
  323. package/src/aws/role.ts +37 -20
  324. package/src/aws/ses.ts +24 -20
  325. package/src/aws/ssm-parameter.ts +40 -20
  326. package/src/aws/table.ts +35 -17
  327. package/src/cloudflare/account-api-token.ts +9 -7
  328. package/src/cloudflare/ai-gateway.ts +37 -34
  329. package/src/cloudflare/api-schema.ts +33 -26
  330. package/src/cloudflare/api-shield.ts +15 -2
  331. package/src/cloudflare/astro/astro.ts +5 -1
  332. package/src/cloudflare/astro/plugin.ts +2 -1
  333. package/src/cloudflare/bindings.ts +2 -2
  334. package/src/cloudflare/bound.ts +1 -1
  335. package/src/cloudflare/bucket.ts +242 -3
  336. package/src/cloudflare/compatibility-date.gen.ts +1 -1
  337. package/src/cloudflare/container.ts +23 -12
  338. package/src/cloudflare/custom-domain.ts +2 -2
  339. package/src/cloudflare/d1-database.ts +11 -4
  340. package/src/cloudflare/dispatch-namespace.ts +10 -7
  341. package/src/cloudflare/hyperdrive.ts +13 -3
  342. package/src/cloudflare/kv-namespace.ts +25 -2
  343. package/src/cloudflare/miniflare/miniflare-worker-proxy.ts +3 -1
  344. package/src/cloudflare/miniflare/paths.ts +13 -0
  345. package/src/cloudflare/pipeline.ts +76 -28
  346. package/src/cloudflare/queue-consumer.ts +1 -1
  347. package/src/cloudflare/queue.ts +65 -54
  348. package/src/cloudflare/react-router/react-router.ts +28 -2
  349. package/src/cloudflare/redwood/plugin.ts +3 -2
  350. package/src/cloudflare/route.ts +1 -1
  351. package/src/cloudflare/ruleset.ts +7 -2
  352. package/src/cloudflare/secret.ts +20 -31
  353. package/src/cloudflare/secrets-store.ts +7 -3
  354. package/src/cloudflare/tunnel.ts +13 -2
  355. package/src/cloudflare/vectorize-index.ts +14 -3
  356. package/src/cloudflare/vite/plugin.ts +3 -2
  357. package/src/cloudflare/vite/vite.ts +2 -3
  358. package/src/cloudflare/website.ts +1 -1
  359. package/src/cloudflare/worker.ts +35 -23
  360. package/src/cloudflare/wrangler.json.ts +7 -4
  361. package/src/docker/container.ts +13 -1
  362. package/src/docker/network.ts +18 -3
  363. package/src/docker/volume.ts +17 -6
  364. package/src/fs/index.ts +0 -8
  365. package/src/github/client.ts +6 -2
  366. package/src/github/repository-environment.ts +27 -13
  367. package/src/neon/project.ts +20 -6
  368. package/src/planetscale/branch.ts +24 -13
  369. package/src/planetscale/database.ts +38 -17
  370. package/src/planetscale/password.ts +10 -3
  371. package/src/resource.ts +1 -10
  372. package/src/scope.ts +29 -38
  373. package/src/sentry/client-key.ts +74 -6
  374. package/src/sentry/project.ts +59 -6
  375. package/src/sentry/team.ts +55 -7
  376. package/src/serde.ts +0 -44
  377. package/src/state/d1-state-store.ts +13 -6
  378. package/src/state/sqlite-state-store.ts +16 -17
  379. package/src/stripe/card.ts +5 -2
  380. package/src/stripe/client.ts +10 -3
  381. package/src/stripe/coupon.ts +4 -3
  382. package/src/stripe/customer.ts +2 -2
  383. package/src/stripe/entitlements-feature.ts +5 -2
  384. package/src/stripe/file.ts +3 -2
  385. package/src/stripe/meter.ts +2 -2
  386. package/src/stripe/portal-configuration.ts +5 -2
  387. package/src/stripe/price.ts +3 -2
  388. package/src/stripe/product-feature.ts +5 -2
  389. package/src/stripe/product.ts +3 -2
  390. package/src/stripe/promotion-code.ts +3 -2
  391. package/src/stripe/shipping-rate.ts +4 -3
  392. package/src/stripe/tax-rate.ts +3 -2
  393. package/src/stripe/webhook.ts +4 -3
  394. package/src/test/vitest.ts +1 -0
  395. package/src/upstash/redis.ts +15 -5
  396. package/src/util/ignore-matcher.ts +3 -1
  397. package/src/util/peer.ts +53 -0
  398. package/src/util/telemetry/constants.ts +2 -2
  399. package/src/vercel/project.ts +46 -1
  400. package/templates/astro/_gitignore +2 -1
  401. package/templates/hono/README.md +19 -0
  402. package/templates/hono/_env +1 -0
  403. package/templates/hono/_env.example +1 -0
  404. package/templates/hono/_gitignore +34 -0
  405. package/templates/hono/alchemy.run.ts +22 -0
  406. package/templates/hono/package.json +18 -0
  407. package/templates/hono/src/index.ts +17 -0
  408. package/templates/hono/tsconfig.json +13 -0
  409. package/templates/hono/types/env.d.ts +16 -0
  410. package/templates/nuxt/_gitignore +2 -1
  411. package/templates/react-router/_gitignore +1 -0
  412. package/templates/react-router/vite.config.ts +5 -3
  413. package/templates/rwsdk/_gitignore +2 -3
  414. package/templates/sveltekit/_gitignore +2 -1
  415. package/templates/tanstack-start/_gitignore +2 -1
  416. package/templates/typescript/_gitignore +2 -1
  417. package/templates/vite/_gitignore +2 -1
  418. package/workers/cloudflare-state-store.js +69 -74
  419. package/workers/dofs-state-store.js +1 -1
  420. package/bin/bootstrap-s3.ts +0 -255
  421. package/lib/ai/ark.d.ts +0 -12
  422. package/lib/ai/ark.d.ts.map +0 -1
  423. package/lib/ai/ark.js +0 -87
  424. package/lib/ai/ark.js.map +0 -1
  425. package/lib/ai/astro-file.d.ts +0 -138
  426. package/lib/ai/astro-file.d.ts.map +0 -1
  427. package/lib/ai/astro-file.js +0 -158
  428. package/lib/ai/astro-file.js.map +0 -1
  429. package/lib/ai/client.d.ts +0 -51
  430. package/lib/ai/client.d.ts.map +0 -1
  431. package/lib/ai/client.js +0 -58
  432. package/lib/ai/client.js.map +0 -1
  433. package/lib/ai/css-file.d.ts +0 -132
  434. package/lib/ai/css-file.d.ts.map +0 -1
  435. package/lib/ai/css-file.js +0 -142
  436. package/lib/ai/css-file.js.map +0 -1
  437. package/lib/ai/data.d.ts +0 -152
  438. package/lib/ai/data.d.ts.map +0 -1
  439. package/lib/ai/data.js +0 -120
  440. package/lib/ai/data.js.map +0 -1
  441. package/lib/ai/document.d.ts +0 -208
  442. package/lib/ai/document.d.ts.map +0 -1
  443. package/lib/ai/document.js +0 -206
  444. package/lib/ai/document.js.map +0 -1
  445. package/lib/ai/html-file.d.ts +0 -129
  446. package/lib/ai/html-file.d.ts.map +0 -1
  447. package/lib/ai/html-file.js +0 -139
  448. package/lib/ai/html-file.js.map +0 -1
  449. package/lib/ai/index.d.ts +0 -11
  450. package/lib/ai/index.d.ts.map +0 -1
  451. package/lib/ai/index.js +0 -11
  452. package/lib/ai/index.js.map +0 -1
  453. package/lib/ai/json-file.d.ts +0 -161
  454. package/lib/ai/json-file.d.ts.map +0 -1
  455. package/lib/ai/json-file.js +0 -188
  456. package/lib/ai/json-file.js.map +0 -1
  457. package/lib/ai/typescript-file.d.ts +0 -140
  458. package/lib/ai/typescript-file.d.ts.map +0 -1
  459. package/lib/ai/typescript-file.js +0 -146
  460. package/lib/ai/typescript-file.js.map +0 -1
  461. package/lib/ai/vue-file.d.ts +0 -127
  462. package/lib/ai/vue-file.d.ts.map +0 -1
  463. package/lib/ai/vue-file.js +0 -137
  464. package/lib/ai/vue-file.js.map +0 -1
  465. package/lib/ai/yaml-file.d.ts +0 -170
  466. package/lib/ai/yaml-file.d.ts.map +0 -1
  467. package/lib/ai/yaml-file.js +0 -201
  468. package/lib/ai/yaml-file.js.map +0 -1
  469. package/lib/fs/static-astro-file.d.ts +0 -35
  470. package/lib/fs/static-astro-file.d.ts.map +0 -1
  471. package/lib/fs/static-astro-file.js +0 -40
  472. package/lib/fs/static-astro-file.js.map +0 -1
  473. package/lib/fs/static-css-file.d.ts +0 -25
  474. package/lib/fs/static-css-file.d.ts.map +0 -1
  475. package/lib/fs/static-css-file.js +0 -30
  476. package/lib/fs/static-css-file.js.map +0 -1
  477. package/lib/fs/static-html-file.d.ts +0 -32
  478. package/lib/fs/static-html-file.d.ts.map +0 -1
  479. package/lib/fs/static-html-file.js +0 -37
  480. package/lib/fs/static-html-file.js.map +0 -1
  481. package/lib/fs/static-json-file.d.ts +0 -18
  482. package/lib/fs/static-json-file.d.ts.map +0 -1
  483. package/lib/fs/static-json-file.js +0 -19
  484. package/lib/fs/static-json-file.js.map +0 -1
  485. package/lib/fs/static-text-file.d.ts +0 -13
  486. package/lib/fs/static-text-file.d.ts.map +0 -1
  487. package/lib/fs/static-text-file.js +0 -9
  488. package/lib/fs/static-text-file.js.map +0 -1
  489. package/lib/fs/static-typescript-file.d.ts +0 -20
  490. package/lib/fs/static-typescript-file.d.ts.map +0 -1
  491. package/lib/fs/static-typescript-file.js +0 -16
  492. package/lib/fs/static-typescript-file.js.map +0 -1
  493. package/lib/fs/static-vue-file.d.ts +0 -29
  494. package/lib/fs/static-vue-file.d.ts.map +0 -1
  495. package/lib/fs/static-vue-file.js +0 -34
  496. package/lib/fs/static-vue-file.js.map +0 -1
  497. package/lib/fs/static-yaml-file.d.ts +0 -23
  498. package/lib/fs/static-yaml-file.d.ts.map +0 -1
  499. package/lib/fs/static-yaml-file.js +0 -10
  500. package/lib/fs/static-yaml-file.js.map +0 -1
  501. package/lib/internal/docs/providers.d.ts +0 -34
  502. package/lib/internal/docs/providers.d.ts.map +0 -1
  503. package/lib/internal/docs/providers.js +0 -200
  504. package/lib/internal/docs/providers.js.map +0 -1
  505. package/lib/runtime/bind.d.ts +0 -25
  506. package/lib/runtime/bind.d.ts.map +0 -1
  507. package/lib/runtime/bind.js +0 -76
  508. package/lib/runtime/bind.js.map +0 -1
  509. package/lib/runtime/global.d.ts +0 -8
  510. package/lib/runtime/global.d.ts.map +0 -1
  511. package/lib/runtime/global.js +0 -3
  512. package/lib/runtime/global.js.map +0 -1
  513. package/lib/runtime/plugin.d.ts +0 -35
  514. package/lib/runtime/plugin.d.ts.map +0 -1
  515. package/lib/runtime/plugin.js +0 -134
  516. package/lib/runtime/plugin.js.map +0 -1
  517. package/lib/runtime/shims.d.ts +0 -6
  518. package/lib/runtime/shims.d.ts.map +0 -1
  519. package/lib/runtime/shims.js +0 -27
  520. package/lib/runtime/shims.js.map +0 -1
  521. package/lib/runtime/state.d.ts +0 -5
  522. package/lib/runtime/state.d.ts.map +0 -1
  523. package/lib/runtime/state.js +0 -4
  524. package/lib/runtime/state.js.map +0 -1
  525. package/lib/web/astro.d.ts +0 -148
  526. package/lib/web/astro.d.ts.map +0 -1
  527. package/lib/web/astro.js +0 -419
  528. package/lib/web/astro.js.map +0 -1
  529. package/lib/web/shadcn-component.d.ts +0 -30
  530. package/lib/web/shadcn-component.d.ts.map +0 -1
  531. package/lib/web/shadcn-component.js +0 -25
  532. package/lib/web/shadcn-component.js.map +0 -1
  533. package/lib/web/shadcn.d.ts +0 -98
  534. package/lib/web/shadcn.d.ts.map +0 -1
  535. package/lib/web/shadcn.js +0 -102
  536. package/lib/web/shadcn.js.map +0 -1
  537. package/lib/web/tailwind.d.ts +0 -65
  538. package/lib/web/tailwind.d.ts.map +0 -1
  539. package/lib/web/tailwind.js +0 -98
  540. package/lib/web/tailwind.js.map +0 -1
  541. package/lib/web/vite.d.ts +0 -96
  542. package/lib/web/vite.d.ts.map +0 -1
  543. package/lib/web/vite.js +0 -232
  544. package/lib/web/vite.js.map +0 -1
  545. package/lib/web/vitepress/config.d.ts +0 -12
  546. package/lib/web/vitepress/config.d.ts.map +0 -1
  547. package/lib/web/vitepress/config.js +0 -33
  548. package/lib/web/vitepress/config.js.map +0 -1
  549. package/lib/web/vitepress/custom-theme.d.ts +0 -174
  550. package/lib/web/vitepress/custom-theme.d.ts.map +0 -1
  551. package/lib/web/vitepress/custom-theme.js +0 -337
  552. package/lib/web/vitepress/custom-theme.js.map +0 -1
  553. package/lib/web/vitepress/dependencies.d.ts +0 -13
  554. package/lib/web/vitepress/dependencies.d.ts.map +0 -1
  555. package/lib/web/vitepress/dependencies.js +0 -37
  556. package/lib/web/vitepress/dependencies.js.map +0 -1
  557. package/lib/web/vitepress/home-page.d.ts +0 -247
  558. package/lib/web/vitepress/home-page.d.ts.map +0 -1
  559. package/lib/web/vitepress/home-page.js +0 -146
  560. package/lib/web/vitepress/home-page.js.map +0 -1
  561. package/lib/web/vitepress/index.d.ts +0 -6
  562. package/lib/web/vitepress/index.d.ts.map +0 -1
  563. package/lib/web/vitepress/index.js +0 -6
  564. package/lib/web/vitepress/index.js.map +0 -1
  565. package/lib/web/vitepress/process-front-matter-files.d.ts +0 -19
  566. package/lib/web/vitepress/process-front-matter-files.d.ts.map +0 -1
  567. package/lib/web/vitepress/process-front-matter-files.js +0 -73
  568. package/lib/web/vitepress/process-front-matter-files.js.map +0 -1
  569. package/lib/web/vitepress/vitepress.d.ts +0 -75
  570. package/lib/web/vitepress/vitepress.d.ts.map +0 -1
  571. package/lib/web/vitepress/vitepress.js +0 -254
  572. package/lib/web/vitepress/vitepress.js.map +0 -1
  573. package/src/ai/ark.ts +0 -118
  574. package/src/ai/astro-file.ts +0 -270
  575. package/src/ai/client.ts +0 -117
  576. package/src/ai/css-file.ts +0 -247
  577. package/src/ai/data.ts +0 -221
  578. package/src/ai/document.ts +0 -367
  579. package/src/ai/html-file.ts +0 -244
  580. package/src/ai/index.ts +0 -10
  581. package/src/ai/json-file.ts +0 -325
  582. package/src/ai/typescript-file.ts +0 -259
  583. package/src/ai/vue-file.ts +0 -242
  584. package/src/ai/yaml-file.ts +0 -328
  585. package/src/fs/static-astro-file.ts +0 -45
  586. package/src/fs/static-css-file.ts +0 -35
  587. package/src/fs/static-html-file.ts +0 -42
  588. package/src/fs/static-json-file.ts +0 -38
  589. package/src/fs/static-text-file.ts +0 -23
  590. package/src/fs/static-typescript-file.ts +0 -37
  591. package/src/fs/static-vue-file.ts +0 -39
  592. package/src/fs/static-yaml-file.ts +0 -33
  593. package/src/internal/docs/providers.ts +0 -286
  594. package/src/runtime/bind.ts +0 -95
  595. package/src/runtime/global.ts +0 -10
  596. package/src/runtime/plugin.ts +0 -163
  597. package/src/runtime/shims.js +0 -34
  598. package/src/runtime/state.ts +0 -9
  599. package/src/web/astro.ts +0 -643
  600. package/src/web/shadcn-component.ts +0 -72
  601. package/src/web/shadcn.ts +0 -221
  602. package/src/web/tailwind.ts +0 -167
  603. package/src/web/vite.ts +0 -407
  604. package/src/web/vitepress/config.ts +0 -50
  605. package/src/web/vitepress/custom-theme.ts +0 -514
  606. package/src/web/vitepress/dependencies.ts +0 -69
  607. package/src/web/vitepress/home-page.ts +0 -378
  608. package/src/web/vitepress/index.ts +0 -5
  609. package/src/web/vitepress/process-front-matter-files.ts +0 -107
  610. package/src/web/vitepress/vitepress.ts +0 -372
  611. package/templates/sveltekit/bun.lock +0 -1099
@@ -28,8 +28,10 @@ export type NeonRegion =
28
28
  export interface NeonProjectProps extends NeonApiOptions {
29
29
  /**
30
30
  * Name of the project
31
+ *
32
+ * @default ${app}-${stage}-${id}
31
33
  */
32
- name: string;
34
+ name?: string;
33
35
 
34
36
  /**
35
37
  * Region where the project will be provisioned
@@ -440,6 +442,11 @@ export interface NeonProject
440
442
  */
441
443
  id: string;
442
444
 
445
+ /**
446
+ * Name of the Project.
447
+ */
448
+ name: string;
449
+
443
450
  /**
444
451
  * Time at which the project was created
445
452
  */
@@ -515,6 +522,12 @@ export const NeonProject = Resource(
515
522
  ): Promise<NeonProject> {
516
523
  const api = createNeonApi(props);
517
524
  const projectId = props.existing_project_id || this.output?.id;
525
+ const projectName =
526
+ props.name ?? this.output?.name ?? this.scope.createPhysicalName(id);
527
+
528
+ if (this.phase === "update" && this.output.name !== projectName) {
529
+ this.replace();
530
+ }
518
531
 
519
532
  if (this.phase === "delete") {
520
533
  try {
@@ -540,7 +553,7 @@ export const NeonProject = Resource(
540
553
  // Neon only allows updating the project name
541
554
  const projectResponse = await api.patch(`/projects/${projectId}`, {
542
555
  project: {
543
- name: props.name,
556
+ name: projectName,
544
557
  },
545
558
  });
546
559
 
@@ -564,7 +577,7 @@ export const NeonProject = Resource(
564
577
  // Project exists, update it
565
578
  const projectResponse = await api.patch(`/projects/${projectId}`, {
566
579
  project: {
567
- name: props.name,
580
+ name: projectName,
568
581
  },
569
582
  });
570
583
 
@@ -585,11 +598,11 @@ export const NeonProject = Resource(
585
598
  throw new Error("Failed to check if project exists");
586
599
  } else {
587
600
  // Project doesn't exist, create new
588
- response = await createNewProject(api, props);
601
+ response = await createNewProject(api, projectName, props);
589
602
  }
590
603
  } else {
591
604
  // No output ID, create new project
592
- response = await createNewProject(api, props);
605
+ response = await createNewProject(api, projectName, props);
593
606
  }
594
607
  }
595
608
 
@@ -640,12 +653,13 @@ export const NeonProject = Resource(
640
653
  */
641
654
  async function createNewProject(
642
655
  api: any,
656
+ projectName: string,
643
657
  props: NeonProjectProps,
644
658
  ): Promise<NeonApiResponse> {
645
659
  const defaultEndpoint = props.default_endpoint ?? true;
646
660
  const projectResponse = await api.post("/projects", {
647
661
  project: {
648
- name: props.name,
662
+ name: projectName,
649
663
  region_id: props.region_id || "aws-us-east-1",
650
664
  pg_version: props.pg_version || 16,
651
665
  default_endpoint: defaultEndpoint,
@@ -14,8 +14,10 @@ import {
14
14
  export interface BranchProps {
15
15
  /**
16
16
  * The name of the branch
17
+ *
18
+ * @default ${app}-${stage}-${id}
17
19
  */
18
- name: string;
20
+ name?: string;
19
21
 
20
22
  /**
21
23
  * The organization ID
@@ -152,9 +154,10 @@ export const Branch = Resource(
152
154
  "planetscale::Branch",
153
155
  async function (
154
156
  this: Context<Branch>,
155
- _id: string,
157
+ id: string,
156
158
  props: BranchProps,
157
159
  ): Promise<Branch> {
160
+ const adopt = props.adopt ?? this.scope.adopt;
158
161
  const apiKey =
159
162
  props.apiKey?.unencrypted || process.env.PLANETSCALE_API_TOKEN;
160
163
  if (!apiKey) {
@@ -163,6 +166,14 @@ export const Branch = Resource(
163
166
 
164
167
  const api = new PlanetScaleApi({ apiKey });
165
168
 
169
+ const branchName =
170
+ props.name ?? this.output?.name ?? this.scope.createPhysicalName(id);
171
+
172
+ if (this.phase === "update" && this.output.name !== branchName) {
173
+ // TODO(sam): maybe we don't need to replace? just branch again? or rename?
174
+ this.replace();
175
+ }
176
+
166
177
  if (this.phase === "delete") {
167
178
  try {
168
179
  if (this.output?.name) {
@@ -201,7 +212,7 @@ export const Branch = Resource(
201
212
 
202
213
  // Check if branch exists
203
214
  const getResponse = await api.get(
204
- `/organizations/${props.organizationId}/databases/${props.databaseName}/branches/${props.name}`,
215
+ `/organizations/${props.organizationId}/databases/${props.databaseName}/branches/${branchName}`,
205
216
  );
206
217
 
207
218
  if (!getResponse.ok && getResponse.status !== 404) {
@@ -213,9 +224,9 @@ export const Branch = Resource(
213
224
 
214
225
  if (getResponse.ok) {
215
226
  // Branch exists
216
- if (!props.adopt) {
227
+ if (!adopt) {
217
228
  throw new Error(
218
- `Branch ${props.name} already exists and adopt is false`,
229
+ `Branch ${branchName} already exists and adopt is false`,
219
230
  );
220
231
  }
221
232
 
@@ -245,7 +256,7 @@ export const Branch = Resource(
245
256
  const safeMigrationsResponse = await api[
246
257
  props.safeMigrations ? "post" : "delete"
247
258
  ](
248
- `/organizations/${props.organizationId}/databases/${props.databaseName}/branches/${props.name}/safe-migrations`,
259
+ `/organizations/${props.organizationId}/databases/${props.databaseName}/branches/${branchName}/safe-migrations`,
249
260
  );
250
261
 
251
262
  if (!safeMigrationsResponse.ok) {
@@ -257,7 +268,7 @@ export const Branch = Resource(
257
268
 
258
269
  if (props.clusterSize && data.cluster_size !== props.clusterSize) {
259
270
  const clusterResponse = await api.patch(
260
- `/organizations/${props.organizationId}/databases/${props.databaseName}/branches/${props.name}/cluster`,
271
+ `/organizations/${props.organizationId}/databases/${props.databaseName}/branches/${branchName}/cluster`,
261
272
  {
262
273
  cluster_size: props.clusterSize,
263
274
  },
@@ -272,7 +283,7 @@ export const Branch = Resource(
272
283
 
273
284
  return this({
274
285
  ...props,
275
- name: props.name,
286
+ name: branchName,
276
287
  parentBranch: currentParentBranch,
277
288
  createdAt: data.created_at,
278
289
  updatedAt: data.updated_at,
@@ -285,7 +296,7 @@ export const Branch = Resource(
285
296
  const createResponse = await api.post(
286
297
  `/organizations/${props.organizationId}/databases/${props.databaseName}/branches`,
287
298
  {
288
- name: props.name,
299
+ name: branchName,
289
300
  parent_branch: parentBranchName,
290
301
  backup_id: props.backupId,
291
302
  seed_data: props.seedData,
@@ -308,12 +319,12 @@ export const Branch = Resource(
308
319
  api,
309
320
  props.organizationId,
310
321
  props.databaseName,
311
- props.name,
322
+ branchName,
312
323
  );
313
324
  const safeMigrationsResponse = await api[
314
325
  props.safeMigrations ? "post" : "delete"
315
326
  ](
316
- `/organizations/${props.organizationId}/databases/${props.databaseName}/branches/${props.name}/safe-migrations`,
327
+ `/organizations/${props.organizationId}/databases/${props.databaseName}/branches/${branchName}/safe-migrations`,
317
328
  );
318
329
 
319
330
  if (!safeMigrationsResponse.ok) {
@@ -330,7 +341,7 @@ export const Branch = Resource(
330
341
  api,
331
342
  props.organizationId,
332
343
  props.databaseName,
333
- props.name,
344
+ branchName,
334
345
  props.clusterSize,
335
346
  true,
336
347
  );
@@ -338,7 +349,7 @@ export const Branch = Resource(
338
349
 
339
350
  return this({
340
351
  ...props,
341
- name: props.name,
352
+ name: branchName,
342
353
  parentBranch: data.parent_branch,
343
354
  createdAt: data.created_at,
344
355
  updatedAt: data.updated_at,
@@ -14,8 +14,10 @@ import {
14
14
  export interface DatabaseProps {
15
15
  /**
16
16
  * The name of the database
17
+ *
18
+ * @default ${app}-${stage}-${id}
17
19
  */
18
- name: string;
20
+ name?: string;
19
21
 
20
22
  /**
21
23
  * The organization ID where the database will be created
@@ -104,6 +106,11 @@ export interface Database
104
106
  */
105
107
  id: string;
106
108
 
109
+ /**
110
+ * The name of the database
111
+ */
112
+ name: string;
113
+
107
114
  /**
108
115
  * The current state of the database
109
116
  */
@@ -173,9 +180,10 @@ export const Database = Resource(
173
180
  "planetscale::Database",
174
181
  async function (
175
182
  this: Context<Database>,
176
- _id: string,
183
+ id: string,
177
184
  props: DatabaseProps,
178
185
  ): Promise<Database> {
186
+ const adopt = props.adopt ?? this.scope.adopt;
179
187
  const apiKey =
180
188
  props.apiKey?.unencrypted || process.env.PLANETSCALE_API_TOKEN;
181
189
  if (!apiKey) {
@@ -184,6 +192,16 @@ export const Database = Resource(
184
192
 
185
193
  const api = new PlanetScaleApi({ apiKey });
186
194
 
195
+ const databaseName =
196
+ props.name ?? this.output?.name ?? this.scope.createPhysicalName(id);
197
+
198
+ if (this.phase === "update" && this.output.name !== databaseName) {
199
+ await api.patch(
200
+ `/organizations/${props.organizationId}/databases/${this.output.name}`,
201
+ { new_name: databaseName },
202
+ );
203
+ }
204
+
187
205
  if (this.phase === "delete") {
188
206
  try {
189
207
  if (this.output?.name) {
@@ -207,26 +225,26 @@ export const Database = Resource(
207
225
  try {
208
226
  // Check if database exists
209
227
  const getResponse = await api.get(
210
- `/organizations/${props.organizationId}/databases/${props.name}`,
228
+ `/organizations/${props.organizationId}/databases/${databaseName}`,
211
229
  );
212
230
  const getData = await getResponse.json<any>();
213
- if (this.phase === "update" || (props.adopt && getResponse.ok)) {
231
+ if (this.phase === "update" || (adopt && getResponse.ok)) {
214
232
  if (!getResponse.ok) {
215
- throw new Error(`Database ${props.name} not found`);
233
+ throw new Error(`Database ${databaseName} not found`);
216
234
  }
217
235
  // Update database settings
218
236
  // If updating to a non-'main' default branch, create it first
219
237
  if (props.defaultBranch && props.defaultBranch !== "main") {
220
238
  const branchResponse = await api.get(
221
- `/organizations/${props.organizationId}/databases/${props.name}/branches/${props.defaultBranch}`,
239
+ `/organizations/${props.organizationId}/databases/${databaseName}/branches/${props.defaultBranch}`,
222
240
  );
223
241
  if (!getData.ready) {
224
- await waitForDatabaseReady(api, props.organizationId, props.name);
242
+ await waitForDatabaseReady(api, props.organizationId, databaseName);
225
243
  }
226
244
  if (!branchResponse.ok && branchResponse.status === 404) {
227
245
  // Create the branch
228
246
  const createBranchResponse = await api.post(
229
- `/organizations/${props.organizationId}/databases/${props.name}/branches`,
247
+ `/organizations/${props.organizationId}/databases/${databaseName}/branches`,
230
248
  {
231
249
  name: props.defaultBranch,
232
250
  parent_branch: "main",
@@ -242,7 +260,7 @@ export const Database = Resource(
242
260
  }
243
261
 
244
262
  const updateResponse = await api.patch(
245
- `/organizations/${props.organizationId}/databases/${props.name}`,
263
+ `/organizations/${props.organizationId}/databases/${databaseName}`,
246
264
  {
247
265
  automatic_migrations: props.automaticMigrations,
248
266
  migration_framework: props.migrationFramework,
@@ -265,7 +283,7 @@ export const Database = Resource(
265
283
  await fixClusterSize(
266
284
  api,
267
285
  props.organizationId,
268
- props.name,
286
+ databaseName,
269
287
  props.defaultBranch || "main",
270
288
  props.clusterSize,
271
289
  getData.ready,
@@ -275,6 +293,7 @@ export const Database = Resource(
275
293
  return this({
276
294
  ...props,
277
295
  id: data.id,
296
+ name: databaseName,
278
297
  state: data.state,
279
298
  defaultBranch: data.default_branch,
280
299
  plan: data.plan,
@@ -285,14 +304,14 @@ export const Database = Resource(
285
304
  }
286
305
 
287
306
  if (getResponse.ok) {
288
- throw new Error(`Database with name ${props.name} already exists`);
307
+ throw new Error(`Database with name ${databaseName} already exists`);
289
308
  }
290
309
 
291
310
  // Create new database
292
311
  const createResponse = await api.post(
293
312
  `/organizations/${props.organizationId}/databases`,
294
313
  {
295
- name: props.name,
314
+ name: databaseName,
296
315
  region_slug: props.region?.slug,
297
316
  require_approval_for_deploy: props.requireApprovalForDeploy,
298
317
  allow_data_branching: props.allowDataBranching,
@@ -316,17 +335,17 @@ export const Database = Resource(
316
335
 
317
336
  // If a non-'main' default branch is specified, create it
318
337
  if (props.defaultBranch && props.defaultBranch !== "main") {
319
- await waitForDatabaseReady(api, props.organizationId, props.name);
338
+ await waitForDatabaseReady(api, props.organizationId, databaseName);
320
339
 
321
340
  // Check if branch exists
322
341
  const branchResponse = await api.get(
323
- `/organizations/${props.organizationId}/databases/${props.name}/branches/${props.defaultBranch}`,
342
+ `/organizations/${props.organizationId}/databases/${databaseName}/branches/${props.defaultBranch}`,
324
343
  );
325
344
 
326
345
  if (!branchResponse.ok && branchResponse.status === 404) {
327
346
  // Create the branch
328
347
  const createBranchResponse = await api.post(
329
- `/organizations/${props.organizationId}/databases/${props.name}/branches`,
348
+ `/organizations/${props.organizationId}/databases/${databaseName}/branches`,
330
349
  {
331
350
  name: props.defaultBranch,
332
351
  parent_branch: "main",
@@ -342,7 +361,7 @@ export const Database = Resource(
342
361
  await fixClusterSize(
343
362
  api,
344
363
  props.organizationId,
345
- props.name,
364
+ databaseName,
346
365
  props.defaultBranch || "main",
347
366
  props.clusterSize,
348
367
  false,
@@ -350,7 +369,7 @@ export const Database = Resource(
350
369
 
351
370
  // Update database to use new branch as default
352
371
  const updateResponse = await api.patch(
353
- `/organizations/${props.organizationId}/databases/${props.name}`,
372
+ `/organizations/${props.organizationId}/databases/${databaseName}`,
354
373
  {
355
374
  default_branch: props.defaultBranch,
356
375
  },
@@ -366,6 +385,7 @@ export const Database = Resource(
366
385
  return this({
367
386
  ...props,
368
387
  id: data.id,
388
+ name: databaseName,
369
389
  state: updatedData.state,
370
390
  defaultBranch: updatedData.default_branch,
371
391
  plan: updatedData.plan,
@@ -379,6 +399,7 @@ export const Database = Resource(
379
399
  return this({
380
400
  ...props,
381
401
  id: data.id,
402
+ name: databaseName,
382
403
  state: data.state,
383
404
  defaultBranch: data.default_branch || "main",
384
405
  plan: data.plan,
@@ -14,8 +14,10 @@ import type { Database } from "./database.ts";
14
14
  export interface PasswordProps {
15
15
  /**
16
16
  * The name of the password
17
+ *
18
+ * @default ${app}-${stage}-${id}
17
19
  */
18
- name: string;
20
+ name?: string;
19
21
 
20
22
  /**
21
23
  * The organization ID where the password will be created
@@ -73,6 +75,11 @@ export interface Password
73
75
  */
74
76
  id: string;
75
77
 
78
+ /**
79
+ * Name of the Password.
80
+ */
81
+ name: string;
82
+
76
83
  /**
77
84
  * The timestamp when the password expires (ISO 8601 format)
78
85
  */
@@ -255,7 +262,7 @@ export const Password = Resource(
255
262
  "planetscale::Password",
256
263
  async function (
257
264
  this: Context<Password>,
258
- _id: string,
265
+ id: string,
259
266
  props: PasswordProps,
260
267
  ): Promise<Password> {
261
268
  const apiKey =
@@ -266,7 +273,7 @@ export const Password = Resource(
266
273
  const nameSlug = this.isReplacement
267
274
  ? lowercaseId()
268
275
  : (this.output?.nameSlug ?? lowercaseId());
269
- const name = `${props.name.toLowerCase()}-${nameSlug}`;
276
+ const name = `${(props.name ?? this.output?.name ?? this.scope.createPhysicalName(id)).toLowerCase()}-${nameSlug}`;
270
277
 
271
278
  const api = new PlanetScaleApi({ apiKey });
272
279
  const branchName =
package/src/resource.ts CHANGED
@@ -59,7 +59,6 @@ export const ResourceFQN = Symbol.for("alchemy::ResourceFQN");
59
59
  export type ResourceKind = string;
60
60
  export const ResourceKind = Symbol.for("alchemy::ResourceKind");
61
61
  export const ResourceScope = Symbol.for("alchemy::ResourceScope");
62
- export const InnerResourceScope = Symbol.for("alchemy::InnerResourceScope");
63
62
  export const ResourceSeq = Symbol.for("alchemy::ResourceSeq");
64
63
 
65
64
  export interface ProviderOptions {
@@ -97,7 +96,6 @@ export interface PendingResource<Out = unknown> extends Promise<Out> {
97
96
  [ResourceScope]: Scope;
98
97
  [ResourceSeq]: number;
99
98
  [DestroyStrategy]: DestroyStrategy;
100
- [InnerResourceScope]: Promise<Scope>;
101
99
  }
102
100
 
103
101
  export interface Resource<Kind extends ResourceKind = ResourceKind> {
@@ -187,7 +185,6 @@ export function Resource<
187
185
 
188
186
  // get a sequence number (unique within the scope) for the resource
189
187
  const seq = scope.seq();
190
- let resolveInnerScope: ((scope: Scope) => void) | undefined;
191
188
  const meta = {
192
189
  [ResourceKind]: type,
193
190
  [ResourceID]: resourceID,
@@ -195,14 +192,8 @@ export function Resource<
195
192
  [ResourceSeq]: seq,
196
193
  [ResourceScope]: scope,
197
194
  [DestroyStrategy]: options?.destroyStrategy ?? "sequential",
198
- [InnerResourceScope]: new Promise<Scope>((resolve) => {
199
- resolveInnerScope = resolve;
200
- }),
201
195
  } as any as PendingResource<Out>;
202
- const promise = apply(meta, props, {
203
- ...options,
204
- resolveInnerScope,
205
- });
196
+ const promise = apply(meta, props, options);
206
197
  const resource = Object.assign(promise, meta);
207
198
  scope.resources.set(resourceID, resource);
208
199
  return resource;
package/src/scope.ts CHANGED
@@ -15,7 +15,6 @@ import {
15
15
  type ResourceProps,
16
16
  } from "./resource.ts";
17
17
  import type { State, StateStore, StateStoreType } from "./state.ts";
18
- import { D1StateStore } from "./state/d1-state-store.ts";
19
18
  import { FileSystemStateStore } from "./state/file-system-state-store.ts";
20
19
  import { InstrumentedStateStore } from "./state/instrumented-state-store.ts";
21
20
  import {
@@ -84,6 +83,12 @@ export interface ScopeOptions extends ProviderCredentials {
84
83
  * @default "./.alchemy"
85
84
  */
86
85
  dotAlchemy?: string;
86
+ /**
87
+ * Whether to adopt resources if they already exist but are not yet managed by your Alchemy app.
88
+ *
89
+ * @default false
90
+ */
91
+ adopt?: boolean;
87
92
  }
88
93
 
89
94
  /**
@@ -123,7 +128,6 @@ export const DEFAULT_STAGE =
123
128
 
124
129
  declare global {
125
130
  var __ALCHEMY_STORAGE__: AsyncLocalStorage<Scope>;
126
- var __ALCHEMY_GLOBALS__: Scope[];
127
131
  }
128
132
 
129
133
  const ScopeSymbol = Symbol.for("alchemy::Scope");
@@ -139,17 +143,9 @@ export class Scope {
139
143
 
140
144
  public static storage = (globalThis.__ALCHEMY_STORAGE__ ??=
141
145
  new AsyncLocalStorage<Scope>());
142
- public static globals: Scope[] = (globalThis.__ALCHEMY_GLOBALS__ ??= []);
143
146
 
144
147
  public static getScope(): Scope | undefined {
145
- const scope = Scope.storage.getStore();
146
- if (!scope) {
147
- if (Scope.globals.length > 0) {
148
- return Scope.globals[Scope.globals.length - 1];
149
- }
150
- return undefined;
151
- }
152
- return scope;
148
+ return Scope.storage.getStore();
153
149
  }
154
150
 
155
151
  public static get root(): Scope {
@@ -176,10 +172,12 @@ export class Scope {
176
172
  public readonly local: boolean;
177
173
  public readonly watch: boolean;
178
174
  public readonly force: boolean;
175
+ public readonly adopt: boolean;
179
176
  public readonly destroyStrategy: DestroyStrategy;
180
177
  public readonly logger: LoggerApi;
181
178
  public readonly telemetryClient: ITelemetryClient;
182
179
  public readonly dataMutex: AsyncMutex;
180
+ public readonly dotAlchemy: string;
183
181
 
184
182
  // Provider credentials for scope-level credential overrides
185
183
  public readonly providerCredentials: ProviderCredentials;
@@ -198,8 +196,6 @@ export class Scope {
198
196
  return this.scopeName;
199
197
  }
200
198
 
201
- public readonly dotAlchemy: string;
202
-
203
199
  constructor(options: ScopeOptions) {
204
200
  // Extract core scope options first
205
201
  const {
@@ -216,10 +212,16 @@ export class Scope {
216
212
  destroyStrategy,
217
213
  telemetryClient,
218
214
  logger,
215
+ adopt,
219
216
  dotAlchemy,
220
217
  ...providerCredentials
221
218
  } = options;
222
219
 
220
+ this.dotAlchemy =
221
+ dotAlchemy ??
222
+ this.parent?.dotAlchemy ??
223
+ path.join(process.cwd(), ".alchemy");
224
+
223
225
  this.scopeName = scopeName;
224
226
  this.name = this.scopeName;
225
227
  this.parent = parent ?? Scope.getScope();
@@ -234,10 +236,6 @@ export class Scope {
234
236
  `Scope name "${this.scopeName}" cannot contain double colons`,
235
237
  );
236
238
  }
237
- this.dotAlchemy =
238
- options.dotAlchemy ??
239
- this.parent?.dotAlchemy ??
240
- path.join(process.cwd(), ".alchemy");
241
239
 
242
240
  this.stage = stage ?? this.parent?.stage ?? DEFAULT_STAGE;
243
241
  this.parent?.children.set(this.scopeName!, this);
@@ -266,6 +264,7 @@ export class Scope {
266
264
  this.local = local ?? this.parent?.local ?? false;
267
265
  this.watch = watch ?? this.parent?.watch ?? false;
268
266
  this.force = force ?? this.parent?.force ?? false;
267
+ this.adopt = adopt ?? this.parent?.adopt ?? false;
269
268
  this.destroyStrategy =
270
269
  destroyStrategy ?? this.parent?.destroyStrategy ?? "sequential";
271
270
  if (this.local) {
@@ -275,7 +274,9 @@ export class Scope {
275
274
  }
276
275
 
277
276
  this.stateStore =
278
- stateStore ?? this.parent?.stateStore ?? defaultStateStore;
277
+ stateStore ??
278
+ this.parent?.stateStore ??
279
+ ((scope) => new FileSystemStateStore(scope));
279
280
  this.telemetryClient = telemetryClient ?? this.parent?.telemetryClient!;
280
281
  this.state = new InstrumentedStateStore(
281
282
  this.stateStore(this),
@@ -287,6 +288,14 @@ export class Scope {
287
288
  this.dataMutex = new AsyncMutex();
288
289
  }
289
290
 
291
+ public createPhysicalName(id: string, delimiter = "-"): string {
292
+ const app = this.appName;
293
+ const stage = this.stage;
294
+ return [app, ...this.chain.slice(2), id, stage]
295
+ .map((s) => s.replaceAll(/[^a-z0-9_-]/gi, delimiter))
296
+ .join(delimiter);
297
+ }
298
+
290
299
  public async spawn<
291
300
  E extends ((line: string) => string | undefined) | undefined,
292
301
  >(
@@ -294,9 +303,8 @@ export class Scope {
294
303
  id: string,
295
304
  options: Omit<IdempotentSpawnOptions, "log" | "stateFile">,
296
305
  ): Promise<E extends undefined ? undefined : string> {
297
- const dotAlchemy = path.join(process.cwd(), ".alchemy");
298
- const logsDir = path.join(dotAlchemy, "logs");
299
- const pidsDir = path.join(dotAlchemy, "pids");
306
+ const logsDir = path.join(this.dotAlchemy, "logs");
307
+ const pidsDir = path.join(this.dotAlchemy, "pids");
300
308
 
301
309
  const result = await idempotentSpawn({
302
310
  log: path.join(logsDir, `${id}.log`),
@@ -496,14 +504,6 @@ export class Scope {
496
504
  if (this.finalized && !shouldForce) {
497
505
  return;
498
506
  }
499
- if (this.parent === undefined && Scope.globals.length > 0) {
500
- const last = Scope.globals.pop();
501
- if (last !== this) {
502
- throw new Error(
503
- "Running in AsyncLocaStorage.enterWith emulation mode and attempted to finalize a global Scope that wasn't top of the stack",
504
- );
505
- }
506
- }
507
507
  this.finalized = true;
508
508
  // trigger and await all deferred promises
509
509
  await Promise.all(this.deferred.map((fn) => fn()));
@@ -667,15 +667,6 @@ export class Scope {
667
667
  }
668
668
  }
669
669
 
670
- const defaultStateStore: StateStoreType = (scope: Scope) => {
671
- switch (process.env.ALCHEMY_STATE_STORE) {
672
- case "d1":
673
- return new D1StateStore(scope);
674
- default:
675
- return new FileSystemStateStore(scope);
676
- }
677
- };
678
-
679
670
  declare global {
680
671
  // for runtime
681
672
  // TODO(sam): maybe inject is a better way to achieve this