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
@@ -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
  );
@@ -155,7 +155,7 @@ export const Meter = Resource(
155
155
  _logicalId: string,
156
156
  props: MeterProps,
157
157
  ): Promise<Meter> {
158
- const stripe = createStripeClient({ apiKey: props.apiKey });
158
+ const stripe = await createStripeClient({ apiKey: props.apiKey });
159
159
 
160
160
  const currentOutputId = this.output?.id;
161
161
 
@@ -303,7 +303,7 @@ export const Meter = Resource(
303
303
  stripeAPIResponse = await stripe.billing.meters.create(createParams);
304
304
  } catch (error) {
305
305
  logger.warn("Error creating/updating meter:", error);
306
- if (isStripeConflictError(error) && props.adopt) {
306
+ if (isStripeConflictError(error) && (props.adopt ?? this.scope.adopt)) {
307
307
  throw new Error(
308
308
  "Meter adoption is not supported - meters cannot be uniquely identified for adoption",
309
309
  );
@@ -312,7 +312,7 @@ export const PortalConfiguration = Resource(
312
312
  _id: string,
313
313
  props: PortalConfigurationProps,
314
314
  ): Promise<PortalConfiguration> {
315
- const stripe = createStripeClient({ apiKey: props.apiKey });
315
+ const stripe = await createStripeClient({ apiKey: props.apiKey });
316
316
 
317
317
  if (this.phase === "delete") {
318
318
  try {
@@ -499,7 +499,10 @@ export const PortalConfiguration = Resource(
499
499
  configuration =
500
500
  await stripe.billingPortal.configurations.create(createParams);
501
501
  } catch (error) {
502
- if (isStripeConflictError(error) && props.adopt) {
502
+ if (
503
+ isStripeConflictError(error) &&
504
+ (props.adopt ?? this.scope.adopt)
505
+ ) {
503
506
  throw new Error(
504
507
  "PortalConfiguration adoption is not supported - portal configurations cannot be uniquely identified for adoption",
505
508
  );
@@ -353,7 +353,8 @@ export const Price = Resource(
353
353
  _id: string,
354
354
  props: PriceProps,
355
355
  ): Promise<Price> {
356
- const stripe = createStripeClient({ apiKey: props.apiKey });
356
+ const adopt = props.adopt ?? this.scope.adopt;
357
+ const stripe = await createStripeClient({ apiKey: props.apiKey });
357
358
 
358
359
  if (this.phase === "delete") {
359
360
  try {
@@ -475,7 +476,7 @@ export const Price = Resource(
475
476
  limit: 1,
476
477
  });
477
478
  if (existingPrices.data.length > 0) {
478
- if (props.adopt) {
479
+ if (adopt) {
479
480
  const existingPrice = existingPrices.data[0];
480
481
  const updateParams: Stripe.PriceUpdateParams & {
481
482
  expand?: string[];
@@ -97,7 +97,7 @@ export const ProductFeature = Resource(
97
97
  _id: string,
98
98
  props: ProductFeatureProps,
99
99
  ): Promise<ProductFeature> {
100
- const stripe = createStripeClient({ apiKey: props.apiKey });
100
+ const stripe = await createStripeClient({ apiKey: props.apiKey });
101
101
 
102
102
  if (this.phase === "delete") {
103
103
  try {
@@ -124,7 +124,10 @@ export const ProductFeature = Resource(
124
124
  entitlement_feature: props.entitlementFeature,
125
125
  });
126
126
  } catch (error) {
127
- if (isStripeConflictError(error) && props.adopt) {
127
+ if (
128
+ isStripeConflictError(error) &&
129
+ (props.adopt ?? this.scope.adopt)
130
+ ) {
128
131
  throw new Error(
129
132
  "ProductFeature adoption is not supported - product features cannot be uniquely identified for adoption",
130
133
  );
@@ -157,7 +157,8 @@ export const Product = Resource(
157
157
  _id: string,
158
158
  props: ProductProps,
159
159
  ): Promise<Product> {
160
- const stripe = createStripeClient({ apiKey: props.apiKey });
160
+ const adopt = props.adopt ?? this.scope.adopt;
161
+ const stripe = await createStripeClient({ apiKey: props.apiKey });
161
162
 
162
163
  if (this.phase === "delete") {
163
164
  try {
@@ -202,7 +203,7 @@ export const Product = Resource(
202
203
  metadata: props.metadata,
203
204
  tax_code: props.taxCode,
204
205
  };
205
- if (props.adopt) {
206
+ if (adopt) {
206
207
  const existingProducts = await stripe.products.list({
207
208
  limit: 100,
208
209
  });
@@ -156,7 +156,8 @@ export const PromotionCode = Resource(
156
156
  _id: string,
157
157
  props: PromotionCodeProps,
158
158
  ): Promise<PromotionCode> {
159
- const stripe = createStripeClient({ apiKey: props.apiKey });
159
+ const adopt = props.adopt ?? this.scope.adopt;
160
+ const stripe = await createStripeClient({ apiKey: props.apiKey });
160
161
 
161
162
  if (this.phase === "delete") {
162
163
  try {
@@ -203,7 +204,7 @@ export const PromotionCode = Resource(
203
204
  try {
204
205
  promotionCode = await stripe.promotionCodes.create(createParams);
205
206
  } catch (error) {
206
- if (isStripeConflictError(error) && props.adopt) {
207
+ if (isStripeConflictError(error) && adopt) {
207
208
  if (props.code) {
208
209
  const existingPromotionCodes = await stripe.promotionCodes.list({
209
210
  code: props.code,
@@ -209,7 +209,8 @@ export const ShippingRate = Resource(
209
209
  _id: string,
210
210
  props: ShippingRateProps,
211
211
  ): Promise<ShippingRate> {
212
- const stripe = createStripeClient({ apiKey: props.apiKey });
212
+ const adopt = props.adopt ?? this.scope.adopt;
213
+ const stripe = await createStripeClient({ apiKey: props.apiKey });
213
214
 
214
215
  if (this.phase === "delete") {
215
216
  try {
@@ -286,7 +287,7 @@ export const ShippingRate = Resource(
286
287
  try {
287
288
  shippingRate = await stripe.shippingRates.create(createParams);
288
289
  } catch (error) {
289
- if (isStripeConflictError(error) && props.adopt) {
290
+ if (isStripeConflictError(error) && adopt) {
290
291
  throw new Error(
291
292
  "ShippingRate adoption is not supported - shipping rates cannot be uniquely identified for adoption",
292
293
  );
@@ -295,7 +296,7 @@ export const ShippingRate = Resource(
295
296
  }
296
297
  }
297
298
  } catch (error) {
298
- if (isStripeConflictError(error) && props.adopt) {
299
+ if (isStripeConflictError(error) && adopt) {
299
300
  throw new Error(
300
301
  "ShippingRate adoption is not supported - shipping rates cannot be uniquely identified for adoption",
301
302
  );
@@ -143,7 +143,8 @@ export const TaxRate = Resource(
143
143
  _id: string,
144
144
  props: TaxRateProps,
145
145
  ): Promise<TaxRate> {
146
- const stripe = createStripeClient({ apiKey: props.apiKey });
146
+ const adopt = props.adopt ?? this.scope.adopt;
147
+ const stripe = await createStripeClient({ apiKey: props.apiKey });
147
148
 
148
149
  if (this.phase === "delete") {
149
150
  try {
@@ -185,7 +186,7 @@ export const TaxRate = Resource(
185
186
  tax_type: props.taxType,
186
187
  });
187
188
  } catch (error) {
188
- if (isStripeConflictError(error) && props.adopt) {
189
+ if (isStripeConflictError(error) && adopt) {
189
190
  throw new Error(
190
191
  "TaxRate adoption is not supported - tax rates cannot be uniquely identified for adoption",
191
192
  );
@@ -155,7 +155,8 @@ export const WebhookEndpoint = Resource(
155
155
  _id: string,
156
156
  props: WebhookEndpointProps,
157
157
  ) {
158
- const stripe = createStripeClient({ apiKey: props.apiKey });
158
+ const adopt = props.adopt ?? this.scope.adopt;
159
+ const stripe = await createStripeClient({ apiKey: props.apiKey });
159
160
 
160
161
  if (this.phase === "delete") {
161
162
  try {
@@ -197,7 +198,7 @@ export const WebhookEndpoint = Resource(
197
198
  try {
198
199
  webhook = await stripe.webhookEndpoints.create(createParams);
199
200
  } catch (error) {
200
- if (isStripeConflictError(error) && props.adopt) {
201
+ if (isStripeConflictError(error) && adopt) {
201
202
  const existingWebhooks = await stripe.webhookEndpoints.list({
202
203
  limit: 100,
203
204
  });
@@ -223,7 +224,7 @@ export const WebhookEndpoint = Resource(
223
224
  }
224
225
  }
225
226
  } catch (error) {
226
- if (isStripeConflictError(error) && props.adopt) {
227
+ if (isStripeConflictError(error) && adopt) {
227
228
  const existingWebhooks = await stripe.webhookEndpoints.list({
228
229
  limit: 100,
229
230
  });
@@ -131,6 +131,7 @@ export function test(
131
131
  phase: "up",
132
132
  telemetryClient: new NoopTelemetryClient(),
133
133
  quiet: defaultOptions.quiet,
134
+ password: process.env.ALCHEMY_PASSWORD,
134
135
  });
135
136
 
136
137
  test.beforeAll = (fn: (scope: Scope) => Promise<void>) => {