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
@@ -10,6 +10,8 @@ import { SentryApi } from "./api.ts";
10
10
  export interface ClientKeyProps {
11
11
  /**
12
12
  * The name of the key
13
+ *
14
+ * @default ${app}-${stage}-${id}
13
15
  */
14
16
  name?: string;
15
17
 
@@ -68,6 +70,11 @@ export interface ClientKey
68
70
  */
69
71
  id: string;
70
72
 
73
+ /**
74
+ * Name of the Client Key.
75
+ */
76
+ name: string;
77
+
71
78
  /**
72
79
  * The label of the key
73
80
  */
@@ -180,11 +187,45 @@ export const ClientKey = Resource(
180
187
  "sentry::ClientKey",
181
188
  async function (
182
189
  this: Context<ClientKey>,
183
- _id: string,
190
+ id: string,
184
191
  props: ClientKeyProps,
185
192
  ): Promise<ClientKey> {
186
193
  const api = new SentryApi({ authToken: props.authToken });
187
194
 
195
+ // it's possible that `this.output.name` is undefined because a previous version
196
+ // of alchemy had a bug where it didn't set the name on the output
197
+ // so, we try to find the key by ID and use the name from the API response
198
+ const lookupName = async () => {
199
+ if (!this.output?.id) {
200
+ // not running in the update phase
201
+ return undefined;
202
+ } else if (this.output.name) {
203
+ return this.output.name;
204
+ }
205
+ const name = (
206
+ await getClientKeyName(api, {
207
+ organization: props.organization,
208
+ project: props.project,
209
+ keyId: this.output.id,
210
+ })
211
+ )?.name;
212
+
213
+ if (name) {
214
+ this.output.name = name;
215
+ }
216
+
217
+ return name;
218
+ };
219
+
220
+ const clientKeyName =
221
+ props.name ?? (await lookupName()) ?? this.scope.createPhysicalName(id);
222
+
223
+ if (this.phase === "update") {
224
+ if (this.output.name !== clientKeyName) {
225
+ this.replace();
226
+ }
227
+ }
228
+
188
229
  if (this.phase === "delete") {
189
230
  try {
190
231
  if (this.output?.id) {
@@ -217,24 +258,24 @@ export const ClientKey = Resource(
217
258
  } catch (error) {
218
259
  // Check if this is a "key already exists" error and adopt is enabled
219
260
  if (
220
- props.adopt &&
261
+ (props.adopt ?? this.scope.adopt) &&
221
262
  error instanceof Error &&
222
263
  error.message.includes("already exists") &&
223
- props.name
264
+ clientKeyName
224
265
  ) {
225
266
  logger.log(
226
- `Client key '${props.name}' already exists, adopting it`,
267
+ `Client key '${clientKeyName}' already exists, adopting it`,
227
268
  );
228
269
  // Find the existing key by name
229
270
  const existingKey = await findClientKeyByName(
230
271
  api,
231
272
  props.organization,
232
273
  props.project,
233
- props.name,
274
+ clientKeyName,
234
275
  );
235
276
  if (!existingKey) {
236
277
  throw new Error(
237
- `Failed to find existing client key '${props.name}' for adoption`,
278
+ `Failed to find existing client key '${clientKeyName}' for adoption`,
238
279
  );
239
280
  }
240
281
  response = await api.get(
@@ -257,6 +298,7 @@ export const ClientKey = Resource(
257
298
  return this({
258
299
  ...props,
259
300
  id: data.id,
301
+ name: clientKeyName,
260
302
  label: data.label,
261
303
  public: data.public,
262
304
  secret: data.secret,
@@ -294,3 +336,29 @@ async function findClientKeyByName(
294
336
  const key = keys.find((k) => k.name === name);
295
337
  return key ? { id: key.id } : null;
296
338
  }
339
+
340
+ /**
341
+ * Find a client key by ID
342
+ */
343
+ async function getClientKeyName(
344
+ api: SentryApi,
345
+ {
346
+ organization,
347
+ project,
348
+ keyId,
349
+ }: {
350
+ organization: string;
351
+ project: string;
352
+ keyId: string;
353
+ },
354
+ ): Promise<{ id: string; name: string } | null> {
355
+ const response = await api.get(
356
+ `/projects/${organization}/${project}/keys/${keyId}`,
357
+ );
358
+ if (!response.ok) {
359
+ throw new Error(`API error: ${response.statusText}`);
360
+ }
361
+
362
+ const key = (await response.json()) as { id: string; name: string };
363
+ return key ? { id: key.id, name: key.name } : null;
364
+ }
@@ -10,8 +10,10 @@ import { SentryApi } from "./api.ts";
10
10
  export interface ProjectProps {
11
11
  /**
12
12
  * The name for the project
13
+ *
14
+ * @default ${app}-${stage}-${id}
13
15
  */
14
- name: string;
16
+ name?: string;
15
17
 
16
18
  /**
17
19
  * Uniquely identifies a project and is used for the interface
@@ -63,6 +65,11 @@ export interface Project
63
65
  */
64
66
  id: string;
65
67
 
68
+ /**
69
+ * The name for the project
70
+ */
71
+ name: string;
72
+
66
73
  /**
67
74
  * The team that owns the project
68
75
  */
@@ -282,11 +289,43 @@ export const Project = Resource(
282
289
  "sentry::Project",
283
290
  async function (
284
291
  this: Context<Project>,
285
- _id: string,
292
+ id: string,
286
293
  props: ProjectProps,
287
294
  ): Promise<Project> {
288
295
  const api = new SentryApi({ authToken: props.authToken });
289
296
 
297
+ // it's possible that `this.output.name` is undefined because a previous version
298
+ // of alchemy had a bug where it didn't set the name on the output
299
+ // so, we try to find the key by ID and use the name from the API response
300
+ const lookupName = async () => {
301
+ if (!this.output) {
302
+ return undefined;
303
+ } else if (this.output.name) {
304
+ return this.output.name;
305
+ }
306
+ const name = await getProjectName(
307
+ api,
308
+ props.organization,
309
+ this.output.id,
310
+ );
311
+ if (name) {
312
+ this.output.name = name;
313
+ }
314
+ return name;
315
+ };
316
+
317
+ const projectName =
318
+ props.name ?? (await lookupName()) ?? this.scope.createPhysicalName(id);
319
+
320
+ if (this.phase === "update" && this.output.name !== projectName) {
321
+ await api.put(
322
+ `/projects/${props.organization}/${this.output.slug || this.output.id}/`,
323
+ {
324
+ name: projectName,
325
+ },
326
+ );
327
+ }
328
+
290
329
  if (this.phase === "delete") {
291
330
  try {
292
331
  if (this.output?.id) {
@@ -319,22 +358,22 @@ export const Project = Resource(
319
358
  } catch (error) {
320
359
  // Check if this is a "project already exists" error and adopt is enabled
321
360
  if (
322
- props.adopt &&
361
+ (props.adopt ?? this.scope.adopt) &&
323
362
  error instanceof Error &&
324
363
  error.message.includes("already exists")
325
364
  ) {
326
365
  logger.log(
327
- `Project '${props.slug || props.name}' already exists, adopting it`,
366
+ `Project '${props.slug || projectName}' already exists, adopting it`,
328
367
  );
329
368
  // Find the existing project by slug
330
369
  const existingProject = await findProjectBySlug(
331
370
  api,
332
371
  props.organization,
333
- props.slug || props.name,
372
+ props.slug || projectName,
334
373
  );
335
374
  if (!existingProject) {
336
375
  throw new Error(
337
- `Failed to find existing project '${props.slug || props.name}' for adoption`,
376
+ `Failed to find existing project '${props.slug || projectName}' for adoption`,
338
377
  );
339
378
  }
340
379
  response = await api.get(
@@ -357,6 +396,7 @@ export const Project = Resource(
357
396
  return this({
358
397
  ...props,
359
398
  id: data.id,
399
+ name: projectName,
360
400
  team: data.team,
361
401
  teams: data.teams,
362
402
  isBookmarked: data.isBookmarked,
@@ -419,3 +459,16 @@ async function findProjectBySlug(
419
459
  const project = projects.find((p) => p.slug === slug);
420
460
  return project ? { id: project.id, slug: project.slug } : null;
421
461
  }
462
+
463
+ async function getProjectName(
464
+ api: SentryApi,
465
+ organization: string,
466
+ slug: string,
467
+ ): Promise<string | undefined> {
468
+ const response = await api.get(`/projects/${organization}/${slug}/`);
469
+ if (!response.ok) {
470
+ throw new Error(`API error: ${response.statusText}`);
471
+ }
472
+
473
+ return ((await response.json()) as { name: string }).name;
474
+ }
@@ -10,8 +10,10 @@ import { SentryApi } from "./api.ts";
10
10
  export interface TeamProps {
11
11
  /**
12
12
  * The name for the team
13
+ *
14
+ * @default ${app}-${stage}-${id}
13
15
  */
14
- name: string;
16
+ name?: string;
15
17
 
16
18
  /**
17
19
  * Uniquely identifies a team and is used for the interface
@@ -46,6 +48,11 @@ export interface Team extends Resource<"sentry::Team">, TeamProps {
46
48
  */
47
49
  id: string;
48
50
 
51
+ /**
52
+ * Name of the Team.
53
+ */
54
+ name: string;
55
+
49
56
  /**
50
57
  * Time at which the team was created
51
58
  */
@@ -127,11 +134,36 @@ export const Team = Resource(
127
134
  "sentry::Team",
128
135
  async function (
129
136
  this: Context<Team>,
130
- _id: string,
137
+ id: string,
131
138
  props: TeamProps,
132
139
  ): Promise<Team> {
133
140
  const api = new SentryApi({ authToken: props.authToken });
134
141
 
142
+ // it's possible that `this.output.name` is undefined because a previous version
143
+ // of alchemy had a bug where it didn't set the name on the output
144
+ // so, we try to find the key by ID and use the name from the API response
145
+ const lookupName = async () => {
146
+ if (!this.output) {
147
+ return undefined;
148
+ } else if (this.output?.name) {
149
+ return this.output.name;
150
+ }
151
+ const name = await getTeamName(api, props.organization, this.output.id);
152
+ if (name) {
153
+ this.output.name = name;
154
+ }
155
+ return name;
156
+ };
157
+
158
+ const teamName =
159
+ props.name ?? (await lookupName()) ?? this.scope.createPhysicalName(id);
160
+
161
+ if (this.phase === "update" && this.output.name !== teamName) {
162
+ // TODO(sam): can we rename without destroying?
163
+ // -> no: https://docs.sentry.io/api/teams/update-a-team/
164
+ this.replace();
165
+ }
166
+
135
167
  if (this.phase === "delete") {
136
168
  try {
137
169
  if (this.output?.id) {
@@ -164,22 +196,22 @@ export const Team = Resource(
164
196
  } catch (error) {
165
197
  // Check if this is a "team already exists" error and adopt is enabled
166
198
  if (
167
- props.adopt &&
199
+ (props.adopt ?? this.scope.adopt) &&
168
200
  error instanceof Error &&
169
201
  error.message.includes("already exists")
170
202
  ) {
171
203
  logger.log(
172
- `Team '${props.slug || props.name}' already exists, adopting it`,
204
+ `Team '${props.slug || teamName}' already exists, adopting it`,
173
205
  );
174
206
  // Find the existing team by slug
175
207
  const existingTeam = await findTeamBySlug(
176
208
  api,
177
209
  props.organization,
178
- props.slug || props.name,
210
+ props.slug || teamName,
179
211
  );
180
212
  if (!existingTeam) {
181
213
  throw new Error(
182
- `Failed to find existing team '${props.slug || props.name}' for adoption`,
214
+ `Failed to find existing team '${props.slug || teamName}' for adoption`,
183
215
  );
184
216
  }
185
217
  response = await api.get(
@@ -192,13 +224,16 @@ export const Team = Resource(
192
224
  }
193
225
 
194
226
  if (!response.ok) {
195
- throw new Error(`API error: ${response.statusText}`);
227
+ throw new Error(
228
+ `API error: ${response.statusText} ${await response.text()}`,
229
+ );
196
230
  }
197
231
 
198
232
  const data = (await response.json()) as Omit<Team, keyof TeamProps>;
199
233
  return this({
200
234
  ...props,
201
235
  id: data.id,
236
+ name: teamName,
202
237
  dateCreated: data.dateCreated,
203
238
  isMember: data.isMember,
204
239
  teamRole: data.teamRole,
@@ -234,3 +269,16 @@ async function findTeamBySlug(
234
269
  const team = teams.find((t) => t.slug === slug);
235
270
  return team ? { id: team.id, slug: team.slug } : null;
236
271
  }
272
+
273
+ async function getTeamName(
274
+ api: SentryApi,
275
+ organization: string,
276
+ slug: string,
277
+ ): Promise<string | undefined> {
278
+ const response = await api.get(`/teams/${organization}/${slug}/`);
279
+ if (!response.ok) {
280
+ throw new Error(`API error: ${response.statusText}`);
281
+ }
282
+
283
+ return ((await response.json()) as { name: string }).name;
284
+ }
package/src/serde.ts CHANGED
@@ -1,10 +1,4 @@
1
1
  import { decryptWithKey, encrypt } from "./encrypt.ts";
2
- import {
3
- InnerResourceScope,
4
- ResourceFQN,
5
- ResourceKind,
6
- type Resource,
7
- } from "./resource.ts";
8
2
  import { isScope, type Scope } from "./scope.ts";
9
3
  import { isSecret, Secret } from "./secret.ts";
10
4
 
@@ -65,44 +59,6 @@ export type Serialized<T> = T extends
65
59
  }
66
60
  : T;
67
61
 
68
- export type SerializedScope = {
69
- [fqn: ResourceFQN]: Serialized<Resource>;
70
- };
71
-
72
- export async function serializeScope(scope: Scope): Promise<SerializedScope> {
73
- const map: SerializedScope = {};
74
-
75
- return serializeScope(scope);
76
-
77
- async function serializeScope(scope: Scope): Promise<SerializedScope> {
78
- await Promise.all(
79
- Array.from(scope.resources.values()).map(async (resource) => {
80
- if (resource[ResourceKind] === "alchemy::Scope") {
81
- return;
82
- }
83
- map[resource[ResourceFQN]] = await serialize(scope, await resource, {
84
- transform: (value) => {
85
- if (isSecret(value)) {
86
- return {
87
- "@secret-env": value.name,
88
- };
89
- }
90
- return value;
91
- },
92
- });
93
- const innerScope = await resource[InnerResourceScope];
94
- if (innerScope) {
95
- await serializeScope(innerScope);
96
- }
97
- }),
98
- );
99
- await Promise.all(
100
- Array.from(scope.children.values()).map((scope) => serializeScope(scope)),
101
- );
102
- return map;
103
- }
104
- }
105
-
106
62
  export async function serialize(
107
63
  scope: Scope,
108
64
  value: any,
@@ -1,13 +1,16 @@
1
- import { drizzle, type RemoteCallback } from "drizzle-orm/sqlite-proxy";
1
+ import type { RemoteCallback } from "drizzle-orm/sqlite-proxy";
2
2
  import assert from "node:assert";
3
3
  import { extractCloudflareResult } from "../cloudflare/api-response.ts";
4
- import type { CloudflareApi, CloudflareApiOptions } from "../cloudflare/api.ts";
4
+ import {
5
+ createCloudflareApi,
6
+ type CloudflareApi,
7
+ type CloudflareApiOptions,
8
+ } from "../cloudflare/api.ts";
5
9
  import type { Scope } from "../scope.ts";
6
10
  import { memoize } from "../util/memoize.ts";
11
+ import { importPeer } from "../util/peer.ts";
7
12
  import { MIGRATIONS_DIRECTORY } from "./migrations.ts";
8
- import { SQLiteStateStoreOperations } from "./operations.ts";
9
13
  import { StateStoreProxy } from "./proxy.ts";
10
- import * as schema from "./schema.ts";
11
14
 
12
15
  export interface D1StateStoreOptions extends CloudflareApiOptions {
13
16
  databaseName?: string;
@@ -26,6 +29,7 @@ export class D1StateStore extends StateStoreProxy {
26
29
 
27
30
  async provision(): Promise<StateStoreProxy.Dispatch> {
28
31
  const db = await createDatabaseClient(this.options);
32
+ const { SQLiteStateStoreOperations } = await import("./operations.js");
29
33
  const operations = new SQLiteStateStoreOperations(db, {
30
34
  chain: this.scope.chain,
31
35
  });
@@ -34,7 +38,10 @@ export class D1StateStore extends StateStoreProxy {
34
38
  }
35
39
 
36
40
  const createDatabaseClient = memoize(async (options: D1StateStoreOptions) => {
37
- const { createCloudflareApi } = await import("../cloudflare/api.ts");
41
+ const { drizzle } = await importPeer(
42
+ import("drizzle-orm/sqlite-proxy"),
43
+ "D1StateStore",
44
+ );
38
45
  const api = await createCloudflareApi(options);
39
46
  const database = await upsertDatabase(
40
47
  api,
@@ -63,7 +70,7 @@ const createDatabaseClient = memoize(async (options: D1StateStoreOptions) => {
63
70
  };
64
71
  };
65
72
  return drizzle(remoteCallback, {
66
- schema,
73
+ schema: await import("./schema.js"),
67
74
  });
68
75
  });
69
76
 
@@ -3,10 +3,9 @@ import fs from "node:fs";
3
3
  import path from "node:path";
4
4
  import type { Scope } from "../scope.ts";
5
5
  import { memoize } from "../util/memoize.ts";
6
+ import { importPeer } from "../util/peer.ts";
6
7
  import { MIGRATIONS_DIRECTORY } from "./migrations.ts";
7
- import { SQLiteStateStoreOperations } from "./operations.ts";
8
8
  import { StateStoreProxy } from "./proxy.ts";
9
- import * as schema from "./schema.ts";
10
9
 
11
10
  interface BunSQLiteStateStoreOptions {
12
11
  /**
@@ -82,6 +81,7 @@ export class SQLiteStateStore extends StateStoreProxy {
82
81
 
83
82
  async provision(): Promise<StateStoreProxy.Dispatch> {
84
83
  const db = await createDatabase(this.options);
84
+ const { SQLiteStateStoreOperations } = await import("./operations.js");
85
85
  const operations = new SQLiteStateStoreOperations(db, {
86
86
  chain: this.scope.chain,
87
87
  });
@@ -125,12 +125,12 @@ async function createBunSQLiteDatabase(
125
125
  ".alchemy/state.sqlite";
126
126
  ensureDirectory(filename);
127
127
  const { Database } = await import("bun:sqlite");
128
- const { drizzle } = await import("drizzle-orm/bun-sqlite").catch(() => {
129
- throw new Error(
130
- "[SQLiteStateStore] Missing `drizzle-orm` peer dependency. Please `bun install drizzle-orm`.",
131
- );
132
- });
128
+ const { drizzle } = await importPeer(
129
+ import("drizzle-orm/bun-sqlite"),
130
+ "SQLiteStateStore",
131
+ );
133
132
  const { migrate } = await import("drizzle-orm/bun-sqlite/migrator");
133
+ const schema = await import("./schema.js");
134
134
  // Bun's constructor throws if we pass in an empty object or if extraneous
135
135
  // options are passed in, so here's some ugly destructuring!
136
136
  const { engine: _engine, filename: _filename, ...rest } = options ?? {};
@@ -154,17 +154,16 @@ async function createLibSQLDatabase(
154
154
  if (filename) {
155
155
  ensureDirectory(filename);
156
156
  }
157
- const { createClient } = await import("@libsql/client").catch(() => {
158
- throw new Error(
159
- "[SQLiteStateStore] Missing `@libsql/client` peer dependency. Please `npm install @libsql/client`.",
160
- );
161
- });
162
- const { drizzle } = await import("drizzle-orm/libsql").catch(() => {
163
- throw new Error(
164
- "[SQLiteStateStore] Missing `drizzle-orm` peer dependency. Please `npm install drizzle-orm`.",
165
- );
166
- });
157
+ const { drizzle } = await importPeer(
158
+ import("drizzle-orm/libsql"),
159
+ "SQLiteStateStore",
160
+ );
161
+ const { createClient } = await importPeer(
162
+ import("@libsql/client"),
163
+ "SQLiteStateStore (libsql)",
164
+ );
167
165
  const { migrate } = await import("drizzle-orm/libsql/migrator");
166
+ const schema = await import("./schema.js");
168
167
  const client = createClient({ url, ...options });
169
168
  await client.execute("PRAGMA journal_mode = WAL;");
170
169
  const db = drizzle(client, {
@@ -209,7 +209,7 @@ export const Card = Resource(
209
209
  _id: string,
210
210
  props: CardProps,
211
211
  ): Promise<Card> {
212
- const stripe = createStripeClient({ apiKey: props.apiKey });
212
+ const stripe = await createStripeClient({ apiKey: props.apiKey });
213
213
 
214
214
  if (this.phase === "delete") {
215
215
  try {
@@ -279,7 +279,10 @@ export const Card = Resource(
279
279
  createParams,
280
280
  )) as Stripe.Card;
281
281
  } catch (error) {
282
- if (isStripeConflictError(error) && props.adopt) {
282
+ if (
283
+ isStripeConflictError(error) &&
284
+ (props.adopt ?? this.scope.adopt)
285
+ ) {
283
286
  throw new Error(
284
287
  "Card adoption is not supported - cards cannot be uniquely identified for adoption",
285
288
  );
@@ -1,13 +1,20 @@
1
- import Stripe from "stripe";
1
+ import type Stripe from "stripe";
2
2
  import type { Secret } from "../secret.ts";
3
- import { withExponentialBackoff } from "../util/retry.ts";
4
3
  import { logger } from "../util/logger.ts";
4
+ import { importPeer } from "../util/peer.ts";
5
+ import { withExponentialBackoff } from "../util/retry.ts";
5
6
 
6
7
  export interface StripeClientOptions {
7
8
  apiKey?: Secret | string;
8
9
  }
9
10
 
10
- export function createStripeClient(options: StripeClientOptions = {}): Stripe {
11
+ export async function createStripeClient(
12
+ options: StripeClientOptions = {},
13
+ ): Promise<Stripe> {
14
+ const { default: Stripe } = await importPeer(
15
+ import("stripe"),
16
+ "Stripe resources",
17
+ );
11
18
  let apiKey: string;
12
19
 
13
20
  if (options.apiKey) {
@@ -163,7 +163,8 @@ export const Coupon = Resource(
163
163
  _id: string,
164
164
  props: CouponProps,
165
165
  ): Promise<Coupon> {
166
- const stripe = createStripeClient({ apiKey: props.apiKey });
166
+ const adopt = props.adopt ?? this.scope.adopt;
167
+ const stripe = await createStripeClient({ apiKey: props.apiKey });
167
168
 
168
169
  if (this.phase === "delete") {
169
170
  try {
@@ -217,7 +218,7 @@ export const Coupon = Resource(
217
218
  try {
218
219
  coupon = await stripe.coupons.create(createParams);
219
220
  } catch (error) {
220
- if (isStripeConflictError(error) && props.adopt) {
221
+ if (isStripeConflictError(error) && adopt) {
221
222
  if (props.id) {
222
223
  const existingCoupon = await stripe.coupons.retrieve(props.id);
223
224
  const updateParams: Stripe.CouponUpdateParams = {
@@ -236,7 +237,7 @@ export const Coupon = Resource(
236
237
  }
237
238
  }
238
239
  } catch (error) {
239
- if (isStripeConflictError(error) && props.adopt) {
240
+ if (isStripeConflictError(error) && adopt) {
240
241
  if (props.id) {
241
242
  const existingCoupon = await stripe.coupons.retrieve(props.id);
242
243
  const updateParams: Stripe.CouponUpdateParams = {
@@ -282,7 +282,7 @@ export const Customer = Resource(
282
282
  _id: string,
283
283
  props: CustomerProps,
284
284
  ): Promise<Customer> {
285
- const stripe = createStripeClient({ apiKey: props.apiKey });
285
+ const stripe = await createStripeClient({ apiKey: props.apiKey });
286
286
 
287
287
  if (this.phase === "delete") {
288
288
  try {
@@ -385,7 +385,7 @@ export const Customer = Resource(
385
385
  };
386
386
  }
387
387
 
388
- if (props.adopt && props.email) {
388
+ if ((props.adopt ?? this.scope.adopt) && props.email) {
389
389
  const existingCustomers = await stripe.customers.list({
390
390
  email: props.email,
391
391
  limit: 1,
@@ -101,7 +101,7 @@ export const EntitlementsFeature = Resource(
101
101
  _id: string,
102
102
  props: EntitlementsFeatureProps,
103
103
  ): Promise<EntitlementsFeature> {
104
- const stripe = createStripeClient({ apiKey: props.apiKey });
104
+ const stripe = await createStripeClient({ apiKey: props.apiKey });
105
105
 
106
106
  if (this.phase === "delete") {
107
107
  return this.destroy();
@@ -130,7 +130,10 @@ export const EntitlementsFeature = Resource(
130
130
  try {
131
131
  feature = await stripe.entitlements.features.create(createParams);
132
132
  } catch (error) {
133
- if (isStripeConflictError(error) && props.adopt) {
133
+ if (
134
+ isStripeConflictError(error) &&
135
+ (props.adopt ?? this.scope.adopt)
136
+ ) {
134
137
  const existingFeatures = await stripe.entitlements.features.list({
135
138
  lookup_key: props.lookupKey,
136
139
  limit: 1,
@@ -153,7 +153,8 @@ export const File = Resource(
153
153
  _id: string,
154
154
  props: FileProps,
155
155
  ): Promise<File> {
156
- const stripe = createStripeClient({ apiKey: props.apiKey });
156
+ const adopt = props.adopt ?? this.scope.adopt;
157
+ const stripe = await createStripeClient({ apiKey: props.apiKey });
157
158
 
158
159
  if (this.phase === "delete") {
159
160
  return this.destroy();
@@ -171,7 +172,7 @@ export const File = Resource(
171
172
  purpose: props.purpose,
172
173
  });
173
174
  } catch (error) {
174
- if (isStripeConflictError(error) && props.adopt) {
175
+ if (isStripeConflictError(error) && adopt) {
175
176
  throw new Error(
176
177
  "File adoption is not supported - files are immutable and cannot be adopted",
177
178
  );