alchemy 0.62.3 → 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 (594) hide show
  1. package/bin/alchemy.js +1516 -1202
  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 +6 -2
  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 +4 -2
  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/website.js +1 -1
  163. package/lib/cloudflare/website.js.map +1 -1
  164. package/lib/cloudflare/worker.d.ts +1 -1
  165. package/lib/cloudflare/worker.d.ts.map +1 -1
  166. package/lib/cloudflare/worker.js +12 -7
  167. package/lib/cloudflare/worker.js.map +1 -1
  168. package/lib/cloudflare/wrangler.json.d.ts +1 -1
  169. package/lib/cloudflare/wrangler.json.d.ts.map +1 -1
  170. package/lib/cloudflare/wrangler.json.js +5 -3
  171. package/lib/cloudflare/wrangler.json.js.map +1 -1
  172. package/lib/docker/container.d.ts +6 -0
  173. package/lib/docker/container.d.ts.map +1 -1
  174. package/lib/docker/container.js +5 -1
  175. package/lib/docker/container.js.map +1 -1
  176. package/lib/docker/network.d.ts +8 -2
  177. package/lib/docker/network.d.ts.map +1 -1
  178. package/lib/docker/network.js +7 -2
  179. package/lib/docker/network.js.map +1 -1
  180. package/lib/docker/volume.d.ts +8 -2
  181. package/lib/docker/volume.d.ts.map +1 -1
  182. package/lib/docker/volume.js +6 -4
  183. package/lib/docker/volume.js.map +1 -1
  184. package/lib/esbuild/bundle.d.ts +1 -1
  185. package/lib/fs/index.d.ts +0 -8
  186. package/lib/fs/index.d.ts.map +1 -1
  187. package/lib/fs/index.js +0 -8
  188. package/lib/fs/index.js.map +1 -1
  189. package/lib/github/client.d.ts +1 -1
  190. package/lib/github/client.d.ts.map +1 -1
  191. package/lib/github/client.js +2 -1
  192. package/lib/github/client.js.map +1 -1
  193. package/lib/github/repository-environment.d.ts +8 -2
  194. package/lib/github/repository-environment.d.ts.map +1 -1
  195. package/lib/github/repository-environment.js +16 -12
  196. package/lib/github/repository-environment.js.map +1 -1
  197. package/lib/neon/project.d.ts +7 -1
  198. package/lib/neon/project.d.ts.map +1 -1
  199. package/lib/neon/project.js +10 -6
  200. package/lib/neon/project.js.map +1 -1
  201. package/lib/planetscale/branch.d.ts +4 -2
  202. package/lib/planetscale/branch.d.ts.map +1 -1
  203. package/lib/planetscale/branch.js +18 -12
  204. package/lib/planetscale/branch.js.map +1 -1
  205. package/lib/planetscale/database.d.ts +8 -2
  206. package/lib/planetscale/database.d.ts.map +1 -1
  207. package/lib/planetscale/database.js +24 -16
  208. package/lib/planetscale/database.js.map +1 -1
  209. package/lib/planetscale/password.d.ts +8 -2
  210. package/lib/planetscale/password.d.ts.map +1 -1
  211. package/lib/planetscale/password.js +2 -2
  212. package/lib/planetscale/password.js.map +1 -1
  213. package/lib/resource.d.ts +0 -2
  214. package/lib/resource.d.ts.map +1 -1
  215. package/lib/resource.js +1 -9
  216. package/lib/resource.js.map +1 -1
  217. package/lib/scope.d.ts +9 -3
  218. package/lib/scope.d.ts.map +1 -1
  219. package/lib/scope.js +21 -34
  220. package/lib/scope.js.map +1 -1
  221. package/lib/sentry/client-key.d.ts +7 -1
  222. package/lib/sentry/client-key.d.ts.map +1 -1
  223. package/lib/sentry/client-key.js +45 -6
  224. package/lib/sentry/client-key.js.map +1 -1
  225. package/lib/sentry/project.d.ts +8 -2
  226. package/lib/sentry/project.d.ts.map +1 -1
  227. package/lib/sentry/project.js +35 -5
  228. package/lib/sentry/project.js.map +1 -1
  229. package/lib/sentry/team.d.ts +8 -2
  230. package/lib/sentry/team.d.ts.map +1 -1
  231. package/lib/sentry/team.js +36 -6
  232. package/lib/sentry/team.js.map +1 -1
  233. package/lib/serde.d.ts +0 -5
  234. package/lib/serde.d.ts.map +1 -1
  235. package/lib/serde.js +0 -28
  236. package/lib/serde.js.map +1 -1
  237. package/lib/state/d1-state-store.d.ts +1 -1
  238. package/lib/state/d1-state-store.d.ts.map +1 -1
  239. package/lib/state/d1-state-store.js +5 -5
  240. package/lib/state/d1-state-store.js.map +1 -1
  241. package/lib/state/sqlite-state-store.d.ts.map +1 -1
  242. package/lib/state/sqlite-state-store.js +7 -11
  243. package/lib/state/sqlite-state-store.js.map +1 -1
  244. package/lib/stripe/card.d.ts.map +1 -1
  245. package/lib/stripe/card.js +3 -2
  246. package/lib/stripe/card.js.map +1 -1
  247. package/lib/stripe/client.d.ts +2 -2
  248. package/lib/stripe/client.d.ts.map +1 -1
  249. package/lib/stripe/client.js +4 -3
  250. package/lib/stripe/client.js.map +1 -1
  251. package/lib/stripe/coupon.d.ts.map +1 -1
  252. package/lib/stripe/coupon.js +4 -3
  253. package/lib/stripe/coupon.js.map +1 -1
  254. package/lib/stripe/customer.js +2 -2
  255. package/lib/stripe/customer.js.map +1 -1
  256. package/lib/stripe/entitlements-feature.d.ts.map +1 -1
  257. package/lib/stripe/entitlements-feature.js +3 -2
  258. package/lib/stripe/entitlements-feature.js.map +1 -1
  259. package/lib/stripe/file.d.ts.map +1 -1
  260. package/lib/stripe/file.js +3 -2
  261. package/lib/stripe/file.js.map +1 -1
  262. package/lib/stripe/meter.js +2 -2
  263. package/lib/stripe/meter.js.map +1 -1
  264. package/lib/stripe/portal-configuration.d.ts.map +1 -1
  265. package/lib/stripe/portal-configuration.js +3 -2
  266. package/lib/stripe/portal-configuration.js.map +1 -1
  267. package/lib/stripe/price.d.ts.map +1 -1
  268. package/lib/stripe/price.js +3 -2
  269. package/lib/stripe/price.js.map +1 -1
  270. package/lib/stripe/product-feature.d.ts.map +1 -1
  271. package/lib/stripe/product-feature.js +3 -2
  272. package/lib/stripe/product-feature.js.map +1 -1
  273. package/lib/stripe/product.d.ts.map +1 -1
  274. package/lib/stripe/product.js +3 -2
  275. package/lib/stripe/product.js.map +1 -1
  276. package/lib/stripe/promotion-code.d.ts.map +1 -1
  277. package/lib/stripe/promotion-code.js +3 -2
  278. package/lib/stripe/promotion-code.js.map +1 -1
  279. package/lib/stripe/shipping-rate.d.ts.map +1 -1
  280. package/lib/stripe/shipping-rate.js +4 -3
  281. package/lib/stripe/shipping-rate.js.map +1 -1
  282. package/lib/stripe/tax-rate.d.ts.map +1 -1
  283. package/lib/stripe/tax-rate.js +3 -2
  284. package/lib/stripe/tax-rate.js.map +1 -1
  285. package/lib/stripe/webhook.d.ts.map +1 -1
  286. package/lib/stripe/webhook.js +4 -3
  287. package/lib/stripe/webhook.js.map +1 -1
  288. package/lib/test/vitest.d.ts.map +1 -1
  289. package/lib/test/vitest.js +1 -0
  290. package/lib/test/vitest.js.map +1 -1
  291. package/lib/upstash/redis.d.ts +8 -2
  292. package/lib/upstash/redis.d.ts.map +1 -1
  293. package/lib/upstash/redis.js +5 -4
  294. package/lib/upstash/redis.js.map +1 -1
  295. package/lib/util/ignore-matcher.d.ts.map +1 -1
  296. package/lib/util/ignore-matcher.js +3 -1
  297. package/lib/util/ignore-matcher.js.map +1 -1
  298. package/lib/util/peer.d.ts +10 -0
  299. package/lib/util/peer.d.ts.map +1 -0
  300. package/lib/util/peer.js +42 -0
  301. package/lib/util/peer.js.map +1 -0
  302. package/lib/vercel/project.d.ts +7 -1
  303. package/lib/vercel/project.d.ts.map +1 -1
  304. package/lib/vercel/project.js +28 -0
  305. package/lib/vercel/project.js.map +1 -1
  306. package/package.json +88 -74
  307. package/src/alchemy.ts +76 -222
  308. package/src/apply.ts +6 -19
  309. package/src/aws/account-id.ts +6 -3
  310. package/src/aws/bucket.ts +43 -32
  311. package/src/aws/ec2/security-group.ts +15 -3
  312. package/src/aws/function.ts +65 -39
  313. package/src/aws/policy-attachment.ts +10 -6
  314. package/src/aws/policy.ts +33 -15
  315. package/src/aws/queue.ts +50 -29
  316. package/src/aws/role.ts +37 -20
  317. package/src/aws/ses.ts +24 -20
  318. package/src/aws/ssm-parameter.ts +40 -20
  319. package/src/aws/table.ts +35 -17
  320. package/src/cloudflare/account-api-token.ts +9 -7
  321. package/src/cloudflare/ai-gateway.ts +37 -34
  322. package/src/cloudflare/api-schema.ts +33 -26
  323. package/src/cloudflare/api-shield.ts +15 -2
  324. package/src/cloudflare/astro/astro.ts +5 -1
  325. package/src/cloudflare/astro/plugin.ts +2 -1
  326. package/src/cloudflare/bindings.ts +2 -2
  327. package/src/cloudflare/bound.ts +1 -1
  328. package/src/cloudflare/bucket.ts +242 -3
  329. package/src/cloudflare/compatibility-date.gen.ts +1 -1
  330. package/src/cloudflare/container.ts +23 -12
  331. package/src/cloudflare/custom-domain.ts +2 -2
  332. package/src/cloudflare/d1-database.ts +10 -3
  333. package/src/cloudflare/dispatch-namespace.ts +10 -7
  334. package/src/cloudflare/hyperdrive.ts +13 -3
  335. package/src/cloudflare/kv-namespace.ts +25 -2
  336. package/src/cloudflare/miniflare/miniflare-worker-proxy.ts +3 -1
  337. package/src/cloudflare/miniflare/paths.ts +13 -0
  338. package/src/cloudflare/pipeline.ts +76 -28
  339. package/src/cloudflare/queue-consumer.ts +1 -1
  340. package/src/cloudflare/queue.ts +26 -14
  341. package/src/cloudflare/react-router/react-router.ts +28 -2
  342. package/src/cloudflare/redwood/plugin.ts +3 -2
  343. package/src/cloudflare/route.ts +1 -1
  344. package/src/cloudflare/ruleset.ts +7 -2
  345. package/src/cloudflare/secret.ts +20 -31
  346. package/src/cloudflare/secrets-store.ts +7 -3
  347. package/src/cloudflare/tunnel.ts +13 -2
  348. package/src/cloudflare/vectorize-index.ts +14 -3
  349. package/src/cloudflare/vite/plugin.ts +3 -2
  350. package/src/cloudflare/website.ts +1 -1
  351. package/src/cloudflare/worker.ts +35 -23
  352. package/src/cloudflare/wrangler.json.ts +7 -4
  353. package/src/docker/container.ts +13 -1
  354. package/src/docker/network.ts +18 -3
  355. package/src/docker/volume.ts +17 -6
  356. package/src/fs/index.ts +0 -8
  357. package/src/github/client.ts +6 -2
  358. package/src/github/repository-environment.ts +27 -13
  359. package/src/neon/project.ts +20 -6
  360. package/src/planetscale/branch.ts +24 -13
  361. package/src/planetscale/database.ts +38 -17
  362. package/src/planetscale/password.ts +10 -3
  363. package/src/resource.ts +1 -10
  364. package/src/scope.ts +29 -38
  365. package/src/sentry/client-key.ts +74 -6
  366. package/src/sentry/project.ts +59 -6
  367. package/src/sentry/team.ts +55 -7
  368. package/src/serde.ts +0 -44
  369. package/src/state/d1-state-store.ts +13 -6
  370. package/src/state/sqlite-state-store.ts +16 -17
  371. package/src/stripe/card.ts +5 -2
  372. package/src/stripe/client.ts +10 -3
  373. package/src/stripe/coupon.ts +4 -3
  374. package/src/stripe/customer.ts +2 -2
  375. package/src/stripe/entitlements-feature.ts +5 -2
  376. package/src/stripe/file.ts +3 -2
  377. package/src/stripe/meter.ts +2 -2
  378. package/src/stripe/portal-configuration.ts +5 -2
  379. package/src/stripe/price.ts +3 -2
  380. package/src/stripe/product-feature.ts +5 -2
  381. package/src/stripe/product.ts +3 -2
  382. package/src/stripe/promotion-code.ts +3 -2
  383. package/src/stripe/shipping-rate.ts +4 -3
  384. package/src/stripe/tax-rate.ts +3 -2
  385. package/src/stripe/webhook.ts +4 -3
  386. package/src/test/vitest.ts +1 -0
  387. package/src/upstash/redis.ts +15 -5
  388. package/src/util/ignore-matcher.ts +3 -1
  389. package/src/util/peer.ts +53 -0
  390. package/src/vercel/project.ts +46 -1
  391. package/templates/hono/README.md +19 -0
  392. package/templates/hono/_env +1 -0
  393. package/templates/hono/_env.example +1 -0
  394. package/templates/hono/_gitignore +34 -0
  395. package/templates/hono/alchemy.run.ts +22 -0
  396. package/templates/hono/package.json +18 -0
  397. package/templates/hono/src/index.ts +17 -0
  398. package/templates/hono/tsconfig.json +13 -0
  399. package/templates/hono/types/env.d.ts +16 -0
  400. package/templates/react-router/vite.config.ts +5 -3
  401. package/workers/cloudflare-state-store.js +69 -74
  402. package/workers/dofs-state-store.js +1 -1
  403. package/bin/bootstrap-s3.ts +0 -255
  404. package/lib/ai/ark.d.ts +0 -12
  405. package/lib/ai/ark.d.ts.map +0 -1
  406. package/lib/ai/ark.js +0 -87
  407. package/lib/ai/ark.js.map +0 -1
  408. package/lib/ai/astro-file.d.ts +0 -138
  409. package/lib/ai/astro-file.d.ts.map +0 -1
  410. package/lib/ai/astro-file.js +0 -158
  411. package/lib/ai/astro-file.js.map +0 -1
  412. package/lib/ai/client.d.ts +0 -51
  413. package/lib/ai/client.d.ts.map +0 -1
  414. package/lib/ai/client.js +0 -58
  415. package/lib/ai/client.js.map +0 -1
  416. package/lib/ai/css-file.d.ts +0 -132
  417. package/lib/ai/css-file.d.ts.map +0 -1
  418. package/lib/ai/css-file.js +0 -142
  419. package/lib/ai/css-file.js.map +0 -1
  420. package/lib/ai/data.d.ts +0 -152
  421. package/lib/ai/data.d.ts.map +0 -1
  422. package/lib/ai/data.js +0 -120
  423. package/lib/ai/data.js.map +0 -1
  424. package/lib/ai/document.d.ts +0 -208
  425. package/lib/ai/document.d.ts.map +0 -1
  426. package/lib/ai/document.js +0 -206
  427. package/lib/ai/document.js.map +0 -1
  428. package/lib/ai/html-file.d.ts +0 -129
  429. package/lib/ai/html-file.d.ts.map +0 -1
  430. package/lib/ai/html-file.js +0 -139
  431. package/lib/ai/html-file.js.map +0 -1
  432. package/lib/ai/index.d.ts +0 -11
  433. package/lib/ai/index.d.ts.map +0 -1
  434. package/lib/ai/index.js +0 -11
  435. package/lib/ai/index.js.map +0 -1
  436. package/lib/ai/json-file.d.ts +0 -161
  437. package/lib/ai/json-file.d.ts.map +0 -1
  438. package/lib/ai/json-file.js +0 -188
  439. package/lib/ai/json-file.js.map +0 -1
  440. package/lib/ai/typescript-file.d.ts +0 -140
  441. package/lib/ai/typescript-file.d.ts.map +0 -1
  442. package/lib/ai/typescript-file.js +0 -146
  443. package/lib/ai/typescript-file.js.map +0 -1
  444. package/lib/ai/vue-file.d.ts +0 -127
  445. package/lib/ai/vue-file.d.ts.map +0 -1
  446. package/lib/ai/vue-file.js +0 -137
  447. package/lib/ai/vue-file.js.map +0 -1
  448. package/lib/ai/yaml-file.d.ts +0 -170
  449. package/lib/ai/yaml-file.d.ts.map +0 -1
  450. package/lib/ai/yaml-file.js +0 -201
  451. package/lib/ai/yaml-file.js.map +0 -1
  452. package/lib/fs/static-astro-file.d.ts +0 -35
  453. package/lib/fs/static-astro-file.d.ts.map +0 -1
  454. package/lib/fs/static-astro-file.js +0 -40
  455. package/lib/fs/static-astro-file.js.map +0 -1
  456. package/lib/fs/static-css-file.d.ts +0 -25
  457. package/lib/fs/static-css-file.d.ts.map +0 -1
  458. package/lib/fs/static-css-file.js +0 -30
  459. package/lib/fs/static-css-file.js.map +0 -1
  460. package/lib/fs/static-html-file.d.ts +0 -32
  461. package/lib/fs/static-html-file.d.ts.map +0 -1
  462. package/lib/fs/static-html-file.js +0 -37
  463. package/lib/fs/static-html-file.js.map +0 -1
  464. package/lib/fs/static-json-file.d.ts +0 -18
  465. package/lib/fs/static-json-file.d.ts.map +0 -1
  466. package/lib/fs/static-json-file.js +0 -19
  467. package/lib/fs/static-json-file.js.map +0 -1
  468. package/lib/fs/static-text-file.d.ts +0 -13
  469. package/lib/fs/static-text-file.d.ts.map +0 -1
  470. package/lib/fs/static-text-file.js +0 -9
  471. package/lib/fs/static-text-file.js.map +0 -1
  472. package/lib/fs/static-typescript-file.d.ts +0 -20
  473. package/lib/fs/static-typescript-file.d.ts.map +0 -1
  474. package/lib/fs/static-typescript-file.js +0 -16
  475. package/lib/fs/static-typescript-file.js.map +0 -1
  476. package/lib/fs/static-vue-file.d.ts +0 -29
  477. package/lib/fs/static-vue-file.d.ts.map +0 -1
  478. package/lib/fs/static-vue-file.js +0 -34
  479. package/lib/fs/static-vue-file.js.map +0 -1
  480. package/lib/fs/static-yaml-file.d.ts +0 -23
  481. package/lib/fs/static-yaml-file.d.ts.map +0 -1
  482. package/lib/fs/static-yaml-file.js +0 -10
  483. package/lib/fs/static-yaml-file.js.map +0 -1
  484. package/lib/internal/docs/providers.d.ts +0 -34
  485. package/lib/internal/docs/providers.d.ts.map +0 -1
  486. package/lib/internal/docs/providers.js +0 -200
  487. package/lib/internal/docs/providers.js.map +0 -1
  488. package/lib/runtime/bind.d.ts +0 -25
  489. package/lib/runtime/bind.d.ts.map +0 -1
  490. package/lib/runtime/bind.js +0 -76
  491. package/lib/runtime/bind.js.map +0 -1
  492. package/lib/runtime/global.d.ts +0 -8
  493. package/lib/runtime/global.d.ts.map +0 -1
  494. package/lib/runtime/global.js +0 -3
  495. package/lib/runtime/global.js.map +0 -1
  496. package/lib/runtime/plugin.d.ts +0 -35
  497. package/lib/runtime/plugin.d.ts.map +0 -1
  498. package/lib/runtime/plugin.js +0 -134
  499. package/lib/runtime/plugin.js.map +0 -1
  500. package/lib/runtime/shims.d.ts +0 -6
  501. package/lib/runtime/shims.d.ts.map +0 -1
  502. package/lib/runtime/shims.js +0 -27
  503. package/lib/runtime/shims.js.map +0 -1
  504. package/lib/runtime/state.d.ts +0 -5
  505. package/lib/runtime/state.d.ts.map +0 -1
  506. package/lib/runtime/state.js +0 -4
  507. package/lib/runtime/state.js.map +0 -1
  508. package/lib/web/astro.d.ts +0 -148
  509. package/lib/web/astro.d.ts.map +0 -1
  510. package/lib/web/astro.js +0 -419
  511. package/lib/web/astro.js.map +0 -1
  512. package/lib/web/shadcn-component.d.ts +0 -30
  513. package/lib/web/shadcn-component.d.ts.map +0 -1
  514. package/lib/web/shadcn-component.js +0 -25
  515. package/lib/web/shadcn-component.js.map +0 -1
  516. package/lib/web/shadcn.d.ts +0 -98
  517. package/lib/web/shadcn.d.ts.map +0 -1
  518. package/lib/web/shadcn.js +0 -102
  519. package/lib/web/shadcn.js.map +0 -1
  520. package/lib/web/tailwind.d.ts +0 -65
  521. package/lib/web/tailwind.d.ts.map +0 -1
  522. package/lib/web/tailwind.js +0 -98
  523. package/lib/web/tailwind.js.map +0 -1
  524. package/lib/web/vite.d.ts +0 -96
  525. package/lib/web/vite.d.ts.map +0 -1
  526. package/lib/web/vite.js +0 -232
  527. package/lib/web/vite.js.map +0 -1
  528. package/lib/web/vitepress/config.d.ts +0 -12
  529. package/lib/web/vitepress/config.d.ts.map +0 -1
  530. package/lib/web/vitepress/config.js +0 -33
  531. package/lib/web/vitepress/config.js.map +0 -1
  532. package/lib/web/vitepress/custom-theme.d.ts +0 -174
  533. package/lib/web/vitepress/custom-theme.d.ts.map +0 -1
  534. package/lib/web/vitepress/custom-theme.js +0 -337
  535. package/lib/web/vitepress/custom-theme.js.map +0 -1
  536. package/lib/web/vitepress/dependencies.d.ts +0 -13
  537. package/lib/web/vitepress/dependencies.d.ts.map +0 -1
  538. package/lib/web/vitepress/dependencies.js +0 -37
  539. package/lib/web/vitepress/dependencies.js.map +0 -1
  540. package/lib/web/vitepress/home-page.d.ts +0 -247
  541. package/lib/web/vitepress/home-page.d.ts.map +0 -1
  542. package/lib/web/vitepress/home-page.js +0 -146
  543. package/lib/web/vitepress/home-page.js.map +0 -1
  544. package/lib/web/vitepress/index.d.ts +0 -6
  545. package/lib/web/vitepress/index.d.ts.map +0 -1
  546. package/lib/web/vitepress/index.js +0 -6
  547. package/lib/web/vitepress/index.js.map +0 -1
  548. package/lib/web/vitepress/process-front-matter-files.d.ts +0 -19
  549. package/lib/web/vitepress/process-front-matter-files.d.ts.map +0 -1
  550. package/lib/web/vitepress/process-front-matter-files.js +0 -73
  551. package/lib/web/vitepress/process-front-matter-files.js.map +0 -1
  552. package/lib/web/vitepress/vitepress.d.ts +0 -75
  553. package/lib/web/vitepress/vitepress.d.ts.map +0 -1
  554. package/lib/web/vitepress/vitepress.js +0 -254
  555. package/lib/web/vitepress/vitepress.js.map +0 -1
  556. package/src/ai/ark.ts +0 -118
  557. package/src/ai/astro-file.ts +0 -270
  558. package/src/ai/client.ts +0 -117
  559. package/src/ai/css-file.ts +0 -247
  560. package/src/ai/data.ts +0 -221
  561. package/src/ai/document.ts +0 -367
  562. package/src/ai/html-file.ts +0 -244
  563. package/src/ai/index.ts +0 -10
  564. package/src/ai/json-file.ts +0 -325
  565. package/src/ai/typescript-file.ts +0 -259
  566. package/src/ai/vue-file.ts +0 -242
  567. package/src/ai/yaml-file.ts +0 -328
  568. package/src/fs/static-astro-file.ts +0 -45
  569. package/src/fs/static-css-file.ts +0 -35
  570. package/src/fs/static-html-file.ts +0 -42
  571. package/src/fs/static-json-file.ts +0 -38
  572. package/src/fs/static-text-file.ts +0 -23
  573. package/src/fs/static-typescript-file.ts +0 -37
  574. package/src/fs/static-vue-file.ts +0 -39
  575. package/src/fs/static-yaml-file.ts +0 -33
  576. package/src/internal/docs/providers.ts +0 -286
  577. package/src/runtime/bind.ts +0 -95
  578. package/src/runtime/global.ts +0 -10
  579. package/src/runtime/plugin.ts +0 -163
  580. package/src/runtime/shims.js +0 -34
  581. package/src/runtime/state.ts +0 -9
  582. package/src/web/astro.ts +0 -643
  583. package/src/web/shadcn-component.ts +0 -72
  584. package/src/web/shadcn.ts +0 -221
  585. package/src/web/tailwind.ts +0 -167
  586. package/src/web/vite.ts +0 -407
  587. package/src/web/vitepress/config.ts +0 -50
  588. package/src/web/vitepress/custom-theme.ts +0 -514
  589. package/src/web/vitepress/dependencies.ts +0 -69
  590. package/src/web/vitepress/home-page.ts +0 -378
  591. package/src/web/vitepress/index.ts +0 -5
  592. package/src/web/vitepress/process-front-matter-files.ts +0 -107
  593. package/src/web/vitepress/vitepress.ts +0 -372
  594. package/templates/sveltekit/bun.lock +0 -1099
@@ -134,7 +134,7 @@ export interface BaseWorkerProps<
134
134
  /**
135
135
  * Name for the worker
136
136
  *
137
- * @default id
137
+ * @default ${app}-${stage}-${id}
138
138
  */
139
139
  name?: string;
140
140
 
@@ -709,12 +709,14 @@ const _Worker = Resource(
709
709
  id: string,
710
710
  props: WorkerProps<B>,
711
711
  ) {
712
+ const adopt = props.adopt ?? this.scope.adopt;
712
713
  const options = (() => {
713
714
  if (props.projectRoot) {
714
715
  logger.warn("projectRoot is deprecated, use cwd instead");
715
716
  props.cwd = props.projectRoot;
716
717
  }
717
- const name = props.name ?? id;
718
+ const name =
719
+ props.name ?? this.output?.name ?? this.scope.createPhysicalName(id);
718
720
  const cwd = path.resolve(props.cwd ?? process.cwd());
719
721
  const compatibilityDate =
720
722
  props.compatibilityDate ?? DEFAULT_COMPATIBILITY_DATE;
@@ -826,12 +828,18 @@ const _Worker = Resource(
826
828
  });
827
829
  this.onCleanup(() => controller.dispose());
828
830
  }
829
- await provisionResources(props, {
830
- name: options.name,
831
- local: true,
832
- dispatchNamespace: options.dispatchNamespace,
833
- containers: options.containers,
834
- });
831
+ await provisionResources(
832
+ {
833
+ ...props,
834
+ adopt,
835
+ },
836
+ {
837
+ name: options.name,
838
+ local: true,
839
+ dispatchNamespace: options.dispatchNamespace,
840
+ containers: options.containers,
841
+ },
842
+ );
835
843
  return this({
836
844
  ...props,
837
845
  type: "service",
@@ -878,13 +886,9 @@ const _Worker = Resource(
878
886
  });
879
887
  }
880
888
  // We always "adopt" when publishing versions
881
- } else if (!props.adopt) {
889
+ } else if (!adopt) {
882
890
  await assertWorkerDoesNotExist(api, options.name);
883
- } else if (
884
- props.adopt &&
885
- !options.dispatchNamespace &&
886
- props.url === false
887
- ) {
891
+ } else if (adopt && !options.dispatchNamespace && props.url === false) {
888
892
  // explicitly disable the workers.dev subdomain
889
893
  await disableWorkerSubdomain(api, options.name);
890
894
  }
@@ -964,14 +968,20 @@ const _Worker = Resource(
964
968
  ),
965
969
  );
966
970
 
967
- const { domains, routes, subdomain } = await provisionResources(props, {
968
- name: options.name,
969
- local: false,
970
- dispatchNamespace: options.dispatchNamespace,
971
- containers: options.containers,
972
- result,
973
- api,
974
- });
971
+ const { domains, routes, subdomain } = await provisionResources(
972
+ {
973
+ ...props,
974
+ adopt,
975
+ },
976
+ {
977
+ name: options.name,
978
+ local: false,
979
+ dispatchNamespace: options.dispatchNamespace,
980
+ containers: options.containers,
981
+ result,
982
+ api,
983
+ },
984
+ );
975
985
 
976
986
  const now = new Date();
977
987
  return this({
@@ -1044,7 +1054,9 @@ const assertUnique = <T, Key extends keyof T>(
1044
1054
  };
1045
1055
 
1046
1056
  async function provisionResources<B extends Bindings>(
1047
- props: WorkerProps<B>,
1057
+ props: WorkerProps<B> & {
1058
+ adopt: boolean;
1059
+ },
1048
1060
  options:
1049
1061
  | {
1050
1062
  name: string;
@@ -1,7 +1,6 @@
1
1
  import fs from "node:fs/promises";
2
2
  import path from "node:path";
3
3
  import type { Context } from "../context.ts";
4
- import { formatJson } from "../fs/static-json-file.ts";
5
4
  import { Resource } from "../resource.ts";
6
5
  import { isSecret } from "../secret.ts";
7
6
  import { assertNever } from "../util/assert-never.ts";
@@ -29,7 +28,7 @@ export interface WranglerJsonProps {
29
28
  * The worker to generate the wrangler.json file for
30
29
  */
31
30
  worker:
32
- | Worker
31
+ | Worker<any>
33
32
  | (WorkerProps<any> & {
34
33
  name: string;
35
34
  });
@@ -218,9 +217,9 @@ export const WranglerJson = Resource(
218
217
  ),
219
218
  },
220
219
  };
221
- await fs.writeFile(filePath, await formatJson(withSecretsUnwrapped));
220
+ await writeJSON(filePath, withSecretsUnwrapped);
222
221
  } else {
223
- await fs.writeFile(filePath, await formatJson(finalSpec));
222
+ await writeJSON(filePath, finalSpec);
224
223
  }
225
224
 
226
225
  // Return the resource
@@ -234,6 +233,10 @@ export const WranglerJson = Resource(
234
233
  },
235
234
  );
236
235
 
236
+ const writeJSON = async (filePath: string, content: any) => {
237
+ await fs.writeFile(filePath, `${JSON.stringify(content, null, 2)}\n`);
238
+ };
239
+
237
240
  /**
238
241
  * Wrangler.json configuration specification based on Cloudflare's schema
239
242
  */
@@ -71,6 +71,8 @@ export interface ContainerProps {
71
71
 
72
72
  /**
73
73
  * Container name
74
+ *
75
+ * @default ${app}-${stage}-${id}
74
76
  */
75
77
  name?: string;
76
78
 
@@ -126,6 +128,11 @@ export interface Container
126
128
  */
127
129
  id: string;
128
130
 
131
+ /**
132
+ * Container name
133
+ */
134
+ name: string;
135
+
129
136
  /**
130
137
  * Container state
131
138
  */
@@ -184,7 +191,11 @@ export const Container = Resource(
184
191
 
185
192
  // Use provided name or generate one based on resource ID
186
193
  const containerName =
187
- props.name || `alchemy-${id.replace(/[^a-zA-Z0-9_.-]/g, "-")}`;
194
+ props.name ?? this.output?.name ?? this.scope.createPhysicalName(id);
195
+
196
+ if (this.phase === "update" && this.output.name !== containerName) {
197
+ this.replace();
198
+ }
188
199
 
189
200
  // Handle delete phase
190
201
  if (this.phase === "delete") {
@@ -259,6 +270,7 @@ export const Container = Resource(
259
270
  return this({
260
271
  ...props,
261
272
  id: containerId,
273
+ name: containerName,
262
274
  state: containerState,
263
275
  createdAt: Date.now(),
264
276
  });
@@ -8,8 +8,10 @@ import { DockerApi } from "./api.ts";
8
8
  export interface NetworkProps {
9
9
  /**
10
10
  * Network name
11
+ *
12
+ * @default ${app}-${stage}-${id}
11
13
  */
12
- name: string;
14
+ name?: string;
13
15
 
14
16
  /**
15
17
  * Network driver to use
@@ -38,6 +40,11 @@ export interface Network extends Resource<"docker::Network">, NetworkProps {
38
40
  */
39
41
  id: string;
40
42
 
43
+ /**
44
+ * Network name
45
+ */
46
+ name: string;
47
+
41
48
  /**
42
49
  * Time when the network was created
43
50
  */
@@ -70,12 +77,19 @@ export const Network = Resource(
70
77
  "docker::Network",
71
78
  async function (
72
79
  this: Context<Network>,
73
- _id: string,
80
+ id: string,
74
81
  props: NetworkProps,
75
82
  ): Promise<Network> {
76
83
  // Initialize Docker API client
77
84
  const api = new DockerApi();
78
85
 
86
+ const networkName =
87
+ props.name ?? this.output?.name ?? this.scope.createPhysicalName(id);
88
+
89
+ if (this.phase === "update" && this.output.name !== networkName) {
90
+ this.replace();
91
+ }
92
+
79
93
  // Handle delete phase
80
94
  if (this.phase === "delete") {
81
95
  if (this.output?.id) {
@@ -88,12 +102,13 @@ export const Network = Resource(
88
102
  } else {
89
103
  // Create the network
90
104
  props.driver = props.driver || "bridge";
91
- const networkId = await api.createNetwork(props.name, props.driver);
105
+ const networkId = await api.createNetwork(networkName, props.driver);
92
106
 
93
107
  // Return the resource using this() to construct output
94
108
  return this({
95
109
  ...props,
96
110
  id: networkId,
111
+ name: networkName,
97
112
  createdAt: Date.now(),
98
113
  });
99
114
  }
@@ -23,8 +23,10 @@ export interface VolumeLabel {
23
23
  export interface VolumeProps {
24
24
  /**
25
25
  * Volume name
26
+ *
27
+ * @default ${app}-${stage}-${id}
26
28
  */
27
- name: string;
29
+ name?: string;
28
30
 
29
31
  /**
30
32
  * Volume driver to use
@@ -52,6 +54,11 @@ export interface Volume extends Resource<"docker::Volume">, VolumeProps {
52
54
  */
53
55
  id: string;
54
56
 
57
+ /**
58
+ * Volume name
59
+ */
60
+ name: string;
61
+
55
62
  /**
56
63
  * Volume mountpoint path on the host
57
64
  */
@@ -94,12 +101,15 @@ export const Volume = Resource(
94
101
  "docker::Volume",
95
102
  async function (
96
103
  this: Context<Volume>,
97
- _id: string,
104
+ id: string,
98
105
  props: VolumeProps,
99
106
  ): Promise<Volume> {
100
107
  // Initialize Docker API client
101
108
  const api = new DockerApi();
102
109
 
110
+ const volumeName =
111
+ props.name ?? this.output?.name ?? this.scope.createPhysicalName(id);
112
+
103
113
  // Process labels to ensure consistent format
104
114
  const processedLabels: Record<string, string> = {};
105
115
  if (props.labels) {
@@ -129,21 +139,22 @@ export const Volume = Resource(
129
139
  const driverOpts = props.driverOpts || {};
130
140
 
131
141
  // Create the volume
132
- const volumeName = await api.createVolume(
133
- props.name,
142
+ const volumeId = await api.createVolume(
143
+ volumeName,
134
144
  props.driver,
135
145
  driverOpts,
136
146
  processedLabels,
137
147
  );
138
148
 
139
149
  // Get volume details to retrieve mountpoint
140
- const volumeInfos = await api.inspectVolume(volumeName);
150
+ const volumeInfos = await api.inspectVolume(volumeId);
141
151
  const mountpoint = volumeInfos[0].Mountpoint;
142
152
 
143
153
  // Return the resource using this() to construct output
144
154
  return this({
145
155
  ...props,
146
- id: volumeName,
156
+ id: volumeId,
157
+ name: volumeName,
147
158
  mountpoint,
148
159
  createdAt: Date.now(),
149
160
  labels: Array.isArray(props.labels) ? props.labels : undefined,
package/src/fs/index.ts CHANGED
@@ -3,11 +3,3 @@ export * from "./file-collection.ts";
3
3
  export * from "./file-ref.ts";
4
4
  export * from "./file.ts";
5
5
  export * from "./folder.ts";
6
- export * from "./static-astro-file.ts";
7
- export * from "./static-css-file.ts";
8
- export * from "./static-html-file.ts";
9
- export * from "./static-json-file.ts";
10
- export * from "./static-text-file.ts";
11
- export * from "./static-typescript-file.ts";
12
- export * from "./static-vue-file.ts";
13
- export * from "./static-yaml-file.ts";
@@ -1,7 +1,8 @@
1
- import { Octokit } from "@octokit/rest";
1
+ import type { Octokit } from "@octokit/rest";
2
2
  import { exec } from "node:child_process";
3
3
  import { promisify } from "node:util";
4
4
  import { logger } from "../util/logger.ts";
5
+ import { importPeer } from "../util/peer.ts";
5
6
 
6
7
  // Convert exec to promise-based
7
8
  const execAsync = promisify(exec);
@@ -52,7 +53,10 @@ export async function createGitHubClient(
52
53
  options: { token?: string } = {},
53
54
  ): Promise<Octokit> {
54
55
  const token = await getGitHubToken(options.token);
55
-
56
+ const { Octokit } = await importPeer(
57
+ import("@octokit/rest"),
58
+ "GitHub resources",
59
+ );
56
60
  return new Octokit({
57
61
  auth: token,
58
62
  });
@@ -19,8 +19,10 @@ export interface RepositoryEnvironmentProps {
19
19
 
20
20
  /**
21
21
  * Environment name
22
+ *
23
+ * @default ${app}-${stage}-${id}
22
24
  */
23
- name: string;
25
+ name?: string;
24
26
 
25
27
  /**
26
28
  * Wait timer before allowing deployments to proceed (in minutes)
@@ -104,6 +106,11 @@ export interface RepositoryEnvironment
104
106
  */
105
107
  id: string;
106
108
 
109
+ /**
110
+ * Environment name
111
+ */
112
+ name: string;
113
+
107
114
  /**
108
115
  * The numeric ID of the environment in GitHub
109
116
  */
@@ -174,7 +181,7 @@ export const RepositoryEnvironment = Resource(
174
181
  "github::RepositoryEnvironment",
175
182
  async function (
176
183
  this: Context<RepositoryEnvironment>,
177
- _id: string,
184
+ id: string,
178
185
  props: RepositoryEnvironmentProps,
179
186
  ): Promise<RepositoryEnvironment> {
180
187
  // Create authenticated Octokit client
@@ -187,6 +194,13 @@ export const RepositoryEnvironment = Resource(
187
194
  await verifyGitHubAuth(octokit, props.owner, props.repository);
188
195
  }
189
196
 
197
+ const environmentName =
198
+ props.name ?? this.output?.name ?? this.scope.createPhysicalName(id);
199
+
200
+ if (this.phase === "update" && this.output.name !== environmentName) {
201
+ this.replace();
202
+ }
203
+
190
204
  if (this.phase === "delete") {
191
205
  if (this.output?.id) {
192
206
  try {
@@ -194,7 +208,7 @@ export const RepositoryEnvironment = Resource(
194
208
  await octokit.rest.repos.deleteAnEnvironment({
195
209
  owner: props.owner,
196
210
  repo: props.repository,
197
- environment_name: props.name,
211
+ environment_name: environmentName,
198
212
  });
199
213
  } catch (error: any) {
200
214
  // Ignore 404 errors (environment already deleted)
@@ -220,7 +234,7 @@ export const RepositoryEnvironment = Resource(
220
234
  });
221
235
 
222
236
  const existingEnv = environments.environments?.find(
223
- (env) => env.name.toLowerCase() === props.name.toLowerCase(),
237
+ (env) => env.name.toLowerCase() === environmentName.toLowerCase(),
224
238
  );
225
239
 
226
240
  if (existingEnv?.id) {
@@ -303,7 +317,7 @@ export const RepositoryEnvironment = Resource(
303
317
  await octokit.rest.repos.createOrUpdateEnvironment({
304
318
  owner: props.owner,
305
319
  repo: props.repository,
306
- environment_name: props.name,
320
+ environment_name: environmentName,
307
321
  wait_timer: props.waitTimer,
308
322
  prevent_self_review: props.preventSelfReview,
309
323
  reviewers: reviewers.length > 0 ? reviewers : undefined,
@@ -330,7 +344,7 @@ export const RepositoryEnvironment = Resource(
330
344
  await octokit.rest.repos.createDeploymentBranchPolicy({
331
345
  owner: props.owner,
332
346
  repo: props.repository,
333
- environment_name: props.name,
347
+ environment_name: environmentName,
334
348
  name: pattern,
335
349
  });
336
350
  }
@@ -340,7 +354,7 @@ export const RepositoryEnvironment = Resource(
340
354
  await octokit.rest.repos.createOrUpdateEnvironment({
341
355
  owner: props.owner,
342
356
  repo: props.repository,
343
- environment_name: props.name,
357
+ environment_name: environmentName,
344
358
  wait_timer: props.waitTimer,
345
359
  prevent_self_review: props.preventSelfReview,
346
360
  reviewers: reviewers.length > 0 ? reviewers : undefined,
@@ -361,7 +375,7 @@ export const RepositoryEnvironment = Resource(
361
375
  await octokit.rest.repos.listDeploymentBranchPolicies({
362
376
  owner: props.owner,
363
377
  repo: props.repository,
364
- environment_name: props.name,
378
+ environment_name: environmentName,
365
379
  });
366
380
 
367
381
  const existingPatterns = existingPolicies.branch_policies.map(
@@ -402,7 +416,7 @@ export const RepositoryEnvironment = Resource(
402
416
  await octokit.rest.repos.deleteDeploymentBranchPolicy({
403
417
  owner: props.owner,
404
418
  repo: props.repository,
405
- environment_name: props.name,
419
+ environment_name: environmentName,
406
420
  branch_policy_id: policy.id,
407
421
  });
408
422
  }
@@ -413,7 +427,7 @@ export const RepositoryEnvironment = Resource(
413
427
  await octokit.rest.repos.createDeploymentBranchPolicy({
414
428
  owner: props.owner,
415
429
  repo: props.repository,
416
- environment_name: props.name,
430
+ environment_name: environmentName,
417
431
  name: pattern,
418
432
  });
419
433
  }
@@ -424,16 +438,16 @@ export const RepositoryEnvironment = Resource(
424
438
  const { data: env } = await octokit.rest.repos.getEnvironment({
425
439
  owner: props.owner,
426
440
  repo: props.repository,
427
- environment_name: props.name,
441
+ environment_name: environmentName,
428
442
  });
429
443
 
430
444
  // Return environment details
431
445
  return this({
432
- id: `${props.owner}/${props.repository}/${props.name}`,
446
+ id: `${props.owner}/${props.repository}/${environmentName}`,
433
447
  environmentId: environmentId || env.id,
434
448
  owner: props.owner,
435
449
  repository: props.repository,
436
- name: props.name,
450
+ name: environmentName,
437
451
  waitTimer: props.waitTimer,
438
452
  preventSelfReview: props.preventSelfReview,
439
453
  adminBypass: props.adminBypass,
@@ -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,