alchemy-effect 0.2.0 → 0.3.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 (428) hide show
  1. package/bin/alchemy-effect.js +55038 -8
  2. package/bin/alchemy-effect.js.map +1 -1
  3. package/bin/alchemy-effect.ts +266 -10
  4. package/lib/$.d.ts +5 -0
  5. package/lib/$.d.ts.map +1 -0
  6. package/lib/$.js +9 -0
  7. package/lib/$.js.map +1 -0
  8. package/lib/app.d.ts +4 -17
  9. package/lib/app.d.ts.map +1 -1
  10. package/lib/app.js +0 -20
  11. package/lib/app.js.map +1 -1
  12. package/lib/apply.d.ts +14 -74
  13. package/lib/apply.d.ts.map +1 -1
  14. package/lib/apply.js +62 -57
  15. package/lib/apply.js.map +1 -1
  16. package/lib/assert-never.d.ts +12 -0
  17. package/lib/assert-never.d.ts.map +1 -0
  18. package/lib/assert-never.js +11 -0
  19. package/lib/assert-never.js.map +1 -0
  20. package/lib/aws/account.d.ts +10 -1
  21. package/lib/aws/account.d.ts.map +1 -1
  22. package/lib/aws/account.js +18 -3
  23. package/lib/aws/account.js.map +1 -1
  24. package/lib/aws/client.d.ts.map +1 -1
  25. package/lib/aws/client.js +0 -1
  26. package/lib/aws/client.js.map +1 -1
  27. package/lib/aws/config.d.ts +15 -0
  28. package/lib/aws/config.d.ts.map +1 -0
  29. package/lib/aws/config.js +1 -0
  30. package/lib/aws/config.js.map +1 -0
  31. package/lib/aws/credentials.d.ts +10 -0
  32. package/lib/aws/credentials.d.ts.map +1 -1
  33. package/lib/aws/credentials.js +73 -47
  34. package/lib/aws/credentials.js.map +1 -1
  35. package/lib/aws/dynamodb/client.d.ts +1 -1
  36. package/lib/aws/dynamodb/client.d.ts.map +1 -1
  37. package/lib/aws/dynamodb/index.d.ts +2 -1
  38. package/lib/aws/dynamodb/index.d.ts.map +1 -1
  39. package/lib/aws/dynamodb/index.js +1 -2
  40. package/lib/aws/dynamodb/index.js.map +1 -1
  41. package/lib/aws/dynamodb/secondary-index.d.ts +5 -4
  42. package/lib/aws/dynamodb/secondary-index.d.ts.map +1 -1
  43. package/lib/aws/dynamodb/table.d.ts +23 -20
  44. package/lib/aws/dynamodb/table.d.ts.map +1 -1
  45. package/lib/aws/dynamodb/table.get-item.d.ts +8 -6
  46. package/lib/aws/dynamodb/table.get-item.d.ts.map +1 -1
  47. package/lib/aws/dynamodb/table.get-item.js +4 -2
  48. package/lib/aws/dynamodb/table.get-item.js.map +1 -1
  49. package/lib/aws/dynamodb/table.js.map +1 -1
  50. package/lib/aws/dynamodb/table.provider.d.ts +3 -4
  51. package/lib/aws/dynamodb/table.provider.d.ts.map +1 -1
  52. package/lib/aws/dynamodb/table.provider.js +17 -29
  53. package/lib/aws/dynamodb/table.provider.js.map +1 -1
  54. package/lib/aws/ec2/client.d.ts +1 -1
  55. package/lib/aws/ec2/client.d.ts.map +1 -1
  56. package/lib/aws/ec2/index.d.ts +3 -0
  57. package/lib/aws/ec2/index.d.ts.map +1 -1
  58. package/lib/aws/ec2/index.js +3 -0
  59. package/lib/aws/ec2/index.js.map +1 -1
  60. package/lib/aws/ec2/subnet.d.ts +175 -0
  61. package/lib/aws/ec2/subnet.d.ts.map +1 -0
  62. package/lib/aws/ec2/subnet.js +4 -0
  63. package/lib/aws/ec2/subnet.js.map +1 -0
  64. package/lib/aws/ec2/subnet.provider.d.ts +4 -0
  65. package/lib/aws/ec2/subnet.provider.d.ts.map +1 -0
  66. package/lib/aws/ec2/subnet.provider.js +250 -0
  67. package/lib/aws/ec2/subnet.provider.js.map +1 -0
  68. package/lib/aws/ec2/vpc.d.ts +12 -8
  69. package/lib/aws/ec2/vpc.d.ts.map +1 -1
  70. package/lib/aws/ec2/vpc.js +1 -0
  71. package/lib/aws/ec2/vpc.js.map +1 -1
  72. package/lib/aws/ec2/vpc.provider.d.ts +3 -4
  73. package/lib/aws/ec2/vpc.provider.d.ts.map +1 -1
  74. package/lib/aws/ec2/vpc.provider.js +11 -26
  75. package/lib/aws/ec2/vpc.provider.js.map +1 -1
  76. package/lib/aws/index.d.ts +16 -19
  77. package/lib/aws/index.d.ts.map +1 -1
  78. package/lib/aws/index.js +7 -10
  79. package/lib/aws/index.js.map +1 -1
  80. package/lib/aws/lambda/consume.d.ts +10 -11
  81. package/lib/aws/lambda/consume.d.ts.map +1 -1
  82. package/lib/aws/lambda/consume.js +3 -3
  83. package/lib/aws/lambda/consume.js.map +1 -1
  84. package/lib/aws/lambda/function.d.ts +7 -7
  85. package/lib/aws/lambda/function.d.ts.map +1 -1
  86. package/lib/aws/lambda/function.handler.d.ts +1 -1
  87. package/lib/aws/lambda/function.handler.d.ts.map +1 -1
  88. package/lib/aws/lambda/function.handler.js.map +1 -1
  89. package/lib/aws/lambda/function.invoke.d.ts +6 -4
  90. package/lib/aws/lambda/function.invoke.d.ts.map +1 -1
  91. package/lib/aws/lambda/function.invoke.js +3 -1
  92. package/lib/aws/lambda/function.invoke.js.map +1 -1
  93. package/lib/aws/lambda/function.js +1 -1
  94. package/lib/aws/lambda/function.js.map +1 -1
  95. package/lib/aws/lambda/function.provider.d.ts +5 -4
  96. package/lib/aws/lambda/function.provider.d.ts.map +1 -1
  97. package/lib/aws/lambda/function.provider.js +16 -14
  98. package/lib/aws/lambda/function.provider.js.map +1 -1
  99. package/lib/aws/lambda/index.d.ts +1 -0
  100. package/lib/aws/lambda/index.d.ts.map +1 -1
  101. package/lib/aws/lambda/index.js +1 -0
  102. package/lib/aws/lambda/index.js.map +1 -1
  103. package/lib/aws/lambda/serve.d.ts +2 -4
  104. package/lib/aws/lambda/serve.d.ts.map +1 -1
  105. package/lib/aws/profile.d.ts +2 -2
  106. package/lib/aws/profile.d.ts.map +1 -1
  107. package/lib/aws/profile.js +1 -1
  108. package/lib/aws/profile.js.map +1 -1
  109. package/lib/aws/region.d.ts +14 -2
  110. package/lib/aws/region.d.ts.map +1 -1
  111. package/lib/aws/region.js +26 -1
  112. package/lib/aws/region.js.map +1 -1
  113. package/lib/aws/sqs/client.d.ts +1 -1
  114. package/lib/aws/sqs/client.d.ts.map +1 -1
  115. package/lib/aws/sqs/index.d.ts +1 -0
  116. package/lib/aws/sqs/index.d.ts.map +1 -1
  117. package/lib/aws/sqs/index.js +1 -0
  118. package/lib/aws/sqs/index.js.map +1 -1
  119. package/lib/aws/sqs/queue.consume.d.ts +1 -1
  120. package/lib/aws/sqs/queue.consume.d.ts.map +1 -1
  121. package/lib/aws/sqs/queue.consume.js +0 -1
  122. package/lib/aws/sqs/queue.consume.js.map +1 -1
  123. package/lib/aws/sqs/queue.d.ts +6 -4
  124. package/lib/aws/sqs/queue.d.ts.map +1 -1
  125. package/lib/aws/sqs/queue.event-source.d.ts +8 -6
  126. package/lib/aws/sqs/queue.event-source.d.ts.map +1 -1
  127. package/lib/aws/sqs/queue.event-source.js +26 -44
  128. package/lib/aws/sqs/queue.event-source.js.map +1 -1
  129. package/lib/aws/sqs/queue.js +1 -1
  130. package/lib/aws/sqs/queue.js.map +1 -1
  131. package/lib/aws/sqs/queue.provider.d.ts +4 -4
  132. package/lib/aws/sqs/queue.provider.d.ts.map +1 -1
  133. package/lib/aws/sqs/queue.provider.js +3 -3
  134. package/lib/aws/sqs/queue.provider.js.map +1 -1
  135. package/lib/aws/sqs/queue.send-message.d.ts +7 -5
  136. package/lib/aws/sqs/queue.send-message.d.ts.map +1 -1
  137. package/lib/aws/sqs/queue.send-message.js +4 -2
  138. package/lib/aws/sqs/queue.send-message.js.map +1 -1
  139. package/lib/binding.d.ts +12 -12
  140. package/lib/binding.d.ts.map +1 -1
  141. package/lib/binding.js.map +1 -1
  142. package/lib/cli/components/ApprovePlan.d.ts +2 -2
  143. package/lib/cli/components/ApprovePlan.d.ts.map +1 -1
  144. package/lib/cli/components/ApprovePlan.js.map +1 -1
  145. package/lib/cli/components/Plan.d.ts +2 -2
  146. package/lib/cli/components/Plan.d.ts.map +1 -1
  147. package/lib/cli/components/Plan.js.map +1 -1
  148. package/lib/cli/components/PlanProgress.d.ts +8 -4
  149. package/lib/cli/components/PlanProgress.d.ts.map +1 -1
  150. package/lib/cli/components/PlanProgress.js +11 -1
  151. package/lib/cli/components/PlanProgress.js.map +1 -1
  152. package/lib/cli/index.d.ts +265 -224
  153. package/lib/cli/index.d.ts.map +1 -1
  154. package/lib/cli/index.js +57 -65
  155. package/lib/cli/index.js.map +1 -1
  156. package/lib/cli/ink-service.d.ts +4 -0
  157. package/lib/cli/ink-service.d.ts.map +1 -0
  158. package/lib/cli/ink-service.js +43 -0
  159. package/lib/cli/ink-service.js.map +1 -0
  160. package/lib/cli/service.d.ts +21 -0
  161. package/lib/cli/service.d.ts.map +1 -0
  162. package/lib/cli/service.js +5 -0
  163. package/lib/cli/service.js.map +1 -0
  164. package/lib/cloudflare/account.d.ts +10 -0
  165. package/lib/cloudflare/account.d.ts.map +1 -0
  166. package/lib/cloudflare/account.js +24 -0
  167. package/lib/cloudflare/account.js.map +1 -0
  168. package/lib/cloudflare/api.d.ts +7 -7
  169. package/lib/cloudflare/api.d.ts.map +1 -1
  170. package/lib/cloudflare/api.js +18 -17
  171. package/lib/cloudflare/api.js.map +1 -1
  172. package/lib/cloudflare/config.d.ts +9 -0
  173. package/lib/cloudflare/config.d.ts.map +1 -0
  174. package/lib/cloudflare/config.js +1 -0
  175. package/lib/cloudflare/config.js.map +1 -0
  176. package/lib/cloudflare/index.d.ts +3 -1
  177. package/lib/cloudflare/index.d.ts.map +1 -1
  178. package/lib/cloudflare/index.js +3 -0
  179. package/lib/cloudflare/index.js.map +1 -1
  180. package/lib/cloudflare/kv/namespace.binding.d.ts +5 -3
  181. package/lib/cloudflare/kv/namespace.binding.d.ts.map +1 -1
  182. package/lib/cloudflare/kv/namespace.binding.js +1 -1
  183. package/lib/cloudflare/kv/namespace.binding.js.map +1 -1
  184. package/lib/cloudflare/kv/namespace.d.ts +3 -2
  185. package/lib/cloudflare/kv/namespace.d.ts.map +1 -1
  186. package/lib/cloudflare/kv/namespace.js.map +1 -1
  187. package/lib/cloudflare/kv/namespace.provider.d.ts +3 -2
  188. package/lib/cloudflare/kv/namespace.provider.d.ts.map +1 -1
  189. package/lib/cloudflare/kv/namespace.provider.js +8 -7
  190. package/lib/cloudflare/kv/namespace.provider.js.map +1 -1
  191. package/lib/cloudflare/live.d.ts +5 -5
  192. package/lib/cloudflare/live.d.ts.map +1 -1
  193. package/lib/cloudflare/live.js +5 -8
  194. package/lib/cloudflare/live.js.map +1 -1
  195. package/lib/cloudflare/r2/bucket.binding.d.ts +5 -3
  196. package/lib/cloudflare/r2/bucket.binding.d.ts.map +1 -1
  197. package/lib/cloudflare/r2/bucket.binding.js +1 -1
  198. package/lib/cloudflare/r2/bucket.binding.js.map +1 -1
  199. package/lib/cloudflare/r2/bucket.d.ts +3 -2
  200. package/lib/cloudflare/r2/bucket.d.ts.map +1 -1
  201. package/lib/cloudflare/r2/bucket.js.map +1 -1
  202. package/lib/cloudflare/r2/bucket.provider.d.ts +3 -2
  203. package/lib/cloudflare/r2/bucket.provider.d.ts.map +1 -1
  204. package/lib/cloudflare/r2/bucket.provider.js +8 -7
  205. package/lib/cloudflare/r2/bucket.provider.js.map +1 -1
  206. package/lib/cloudflare/worker/assets.fetch.d.ts +3 -2
  207. package/lib/cloudflare/worker/assets.fetch.d.ts.map +1 -1
  208. package/lib/cloudflare/worker/assets.fetch.js +2 -1
  209. package/lib/cloudflare/worker/assets.fetch.js.map +1 -1
  210. package/lib/cloudflare/worker/assets.provider.d.ts +1 -1
  211. package/lib/cloudflare/worker/assets.provider.d.ts.map +1 -1
  212. package/lib/cloudflare/worker/index.d.ts +0 -1
  213. package/lib/cloudflare/worker/index.d.ts.map +1 -1
  214. package/lib/cloudflare/worker/worker.d.ts +5 -6
  215. package/lib/cloudflare/worker/worker.d.ts.map +1 -1
  216. package/lib/cloudflare/worker/worker.handler.d.ts +1 -1
  217. package/lib/cloudflare/worker/worker.handler.d.ts.map +1 -1
  218. package/lib/cloudflare/worker/worker.handler.js.map +1 -1
  219. package/lib/cloudflare/worker/worker.js.map +1 -1
  220. package/lib/cloudflare/worker/worker.provider.d.ts +3 -2
  221. package/lib/cloudflare/worker/worker.provider.d.ts.map +1 -1
  222. package/lib/cloudflare/worker/worker.provider.js +7 -6
  223. package/lib/cloudflare/worker/worker.provider.js.map +1 -1
  224. package/lib/cloudflare/worker/worker.serve.d.ts +7 -7
  225. package/lib/cloudflare/worker/worker.serve.d.ts.map +1 -1
  226. package/lib/cloudflare/worker/worker.serve.js.map +1 -1
  227. package/lib/data.d.ts +3 -0
  228. package/lib/data.d.ts.map +1 -0
  229. package/lib/data.js +8 -0
  230. package/lib/data.js.map +1 -0
  231. package/lib/destroy.d.ts +1 -1
  232. package/lib/destroy.d.ts.map +1 -1
  233. package/lib/destroy.js +1 -4
  234. package/lib/destroy.js.map +1 -1
  235. package/lib/diff.d.ts +16 -0
  236. package/lib/diff.d.ts.map +1 -0
  237. package/lib/diff.js +9 -0
  238. package/lib/diff.js.map +1 -0
  239. package/lib/env.d.ts +5 -0
  240. package/lib/env.d.ts.map +1 -1
  241. package/lib/env.js +15 -29
  242. package/lib/env.js.map +1 -1
  243. package/lib/exports.d.ts +9 -0
  244. package/lib/exports.d.ts.map +1 -0
  245. package/lib/exports.js +13 -0
  246. package/lib/exports.js.map +1 -0
  247. package/lib/index.d.ts +10 -2
  248. package/lib/index.d.ts.map +1 -1
  249. package/lib/index.js +10 -5
  250. package/lib/index.js.map +1 -1
  251. package/lib/input.d.ts +32 -0
  252. package/lib/input.d.ts.map +1 -0
  253. package/lib/input.js +1 -0
  254. package/lib/input.js.map +1 -0
  255. package/lib/output.d.ts +143 -0
  256. package/lib/output.d.ts.map +1 -0
  257. package/lib/output.js +269 -0
  258. package/lib/output.js.map +1 -0
  259. package/lib/plan.d.ts +47 -28
  260. package/lib/plan.d.ts.map +1 -1
  261. package/lib/plan.js +257 -151
  262. package/lib/plan.js.map +1 -1
  263. package/lib/policy.d.ts +3 -4
  264. package/lib/policy.d.ts.map +1 -1
  265. package/lib/policy.js +0 -1
  266. package/lib/policy.js.map +1 -1
  267. package/lib/provider.d.ts +14 -16
  268. package/lib/provider.d.ts.map +1 -1
  269. package/lib/ref.d.ts +14 -0
  270. package/lib/ref.d.ts.map +1 -0
  271. package/lib/ref.js +21 -0
  272. package/lib/ref.js.map +1 -0
  273. package/lib/resource.d.ts +11 -6
  274. package/lib/resource.d.ts.map +1 -1
  275. package/lib/resource.js.map +1 -1
  276. package/lib/runtime.d.ts +7 -6
  277. package/lib/runtime.d.ts.map +1 -1
  278. package/lib/runtime.js.map +1 -1
  279. package/lib/service.d.ts +9 -6
  280. package/lib/service.d.ts.map +1 -1
  281. package/lib/service.js.map +1 -1
  282. package/lib/stack.d.ts +60 -0
  283. package/lib/stack.d.ts.map +1 -0
  284. package/lib/stack.js +11 -0
  285. package/lib/stack.js.map +1 -0
  286. package/lib/stage.d.ts +39 -0
  287. package/lib/stage.d.ts.map +1 -0
  288. package/lib/stage.js +32 -0
  289. package/lib/stage.js.map +1 -0
  290. package/lib/state.d.ts +51 -10
  291. package/lib/state.d.ts.map +1 -1
  292. package/lib/state.js +30 -29
  293. package/lib/state.js.map +1 -1
  294. package/lib/test.d.ts +25 -4
  295. package/lib/test.d.ts.map +1 -1
  296. package/lib/test.js +54 -14
  297. package/lib/test.js.map +1 -1
  298. package/lib/tsconfig.test.tsbuildinfo +1 -1
  299. package/lib/type.d.ts +3 -0
  300. package/lib/type.d.ts.map +1 -1
  301. package/lib/unknown.d.ts +4 -0
  302. package/lib/unknown.d.ts.map +1 -0
  303. package/lib/unknown.js +4 -0
  304. package/lib/unknown.js.map +1 -0
  305. package/lib/user.d.ts +3 -0
  306. package/lib/user.d.ts.map +1 -0
  307. package/lib/user.js +3 -0
  308. package/lib/user.js.map +1 -0
  309. package/lib/util.d.ts +6 -0
  310. package/lib/util.d.ts.map +1 -0
  311. package/lib/util.js +9 -0
  312. package/lib/util.js.map +1 -0
  313. package/package.json +18 -12
  314. package/src/$.ts +17 -0
  315. package/src/app.ts +3 -32
  316. package/src/apply.ts +429 -441
  317. package/src/assert-never.ts +18 -0
  318. package/src/aws/account.ts +23 -3
  319. package/src/aws/client.ts +0 -1
  320. package/src/aws/config.ts +16 -0
  321. package/src/aws/credentials.ts +212 -177
  322. package/src/aws/dynamodb/index.ts +3 -3
  323. package/src/aws/dynamodb/table.get-item.ts +5 -9
  324. package/src/aws/dynamodb/table.provider.ts +35 -39
  325. package/src/aws/dynamodb/table.ts +29 -84
  326. package/src/aws/ec2/index.ts +4 -0
  327. package/src/aws/ec2/subnet.provider.ts +358 -0
  328. package/src/aws/ec2/subnet.ts +213 -0
  329. package/src/aws/ec2/vpc.provider.ts +20 -36
  330. package/src/aws/ec2/vpc.ts +19 -8
  331. package/src/aws/index.ts +46 -40
  332. package/src/aws/lambda/consume.ts +8 -7
  333. package/src/aws/lambda/function.handler.ts +1 -1
  334. package/src/aws/lambda/function.invoke.ts +6 -2
  335. package/src/aws/lambda/function.provider.ts +28 -21
  336. package/src/aws/lambda/function.ts +7 -4
  337. package/src/aws/lambda/index.ts +2 -0
  338. package/src/aws/profile.ts +1 -4
  339. package/src/aws/region.ts +42 -3
  340. package/src/aws/sqs/index.ts +2 -0
  341. package/src/aws/sqs/queue.consume.ts +1 -1
  342. package/src/aws/sqs/queue.event-source.ts +29 -55
  343. package/src/aws/sqs/queue.provider.ts +11 -4
  344. package/src/aws/sqs/queue.send-message.ts +5 -8
  345. package/src/aws/sqs/queue.ts +9 -4
  346. package/src/binding.ts +19 -19
  347. package/src/cli/components/ApprovePlan.tsx +2 -2
  348. package/src/cli/components/Plan.tsx +3 -2
  349. package/src/cli/components/PlanProgress.tsx +32 -14
  350. package/src/cli/index.ts +2 -6
  351. package/src/cli/ink-service.tsx +61 -0
  352. package/src/cli/service.ts +23 -0
  353. package/src/cloudflare/account.ts +37 -0
  354. package/src/cloudflare/api.ts +33 -29
  355. package/src/cloudflare/config.ts +7 -0
  356. package/src/cloudflare/index.ts +3 -1
  357. package/src/cloudflare/kv/namespace.binding.ts +3 -1
  358. package/src/cloudflare/kv/namespace.provider.ts +9 -8
  359. package/src/cloudflare/kv/namespace.ts +3 -2
  360. package/src/cloudflare/live.ts +11 -17
  361. package/src/cloudflare/r2/bucket.binding.ts +3 -1
  362. package/src/cloudflare/r2/bucket.provider.ts +9 -8
  363. package/src/cloudflare/r2/bucket.ts +8 -2
  364. package/src/cloudflare/worker/assets.fetch.ts +3 -1
  365. package/src/cloudflare/worker/assets.provider.ts +1 -1
  366. package/src/cloudflare/worker/index.ts +0 -2
  367. package/src/cloudflare/worker/worker.handler.ts +1 -1
  368. package/src/cloudflare/worker/worker.provider.ts +16 -13
  369. package/src/cloudflare/worker/worker.serve.ts +5 -2
  370. package/src/cloudflare/worker/worker.ts +4 -3
  371. package/src/data.ts +18 -0
  372. package/src/destroy.ts +1 -5
  373. package/src/diff.ts +30 -0
  374. package/src/env.ts +20 -32
  375. package/src/exports.ts +21 -0
  376. package/src/index.ts +10 -5
  377. package/src/input.ts +81 -0
  378. package/src/output.ts +518 -0
  379. package/src/plan.ts +380 -192
  380. package/src/policy.ts +3 -5
  381. package/src/provider.ts +25 -23
  382. package/src/ref.ts +48 -0
  383. package/src/resource.ts +20 -6
  384. package/src/runtime.ts +15 -8
  385. package/src/service.ts +11 -7
  386. package/src/stack.ts +116 -0
  387. package/src/stage.ts +85 -0
  388. package/src/state.ts +138 -60
  389. package/src/test.ts +117 -16
  390. package/src/type.ts +4 -0
  391. package/src/unknown.ts +6 -0
  392. package/src/user.ts +4 -0
  393. package/src/util.ts +21 -0
  394. package/lib/approve.d.ts +0 -15
  395. package/lib/approve.d.ts.map +0 -1
  396. package/lib/approve.js +0 -7
  397. package/lib/approve.js.map +0 -1
  398. package/lib/cli/approve.d.ts +0 -4
  399. package/lib/cli/approve.d.ts.map +0 -1
  400. package/lib/cli/approve.js +0 -18
  401. package/lib/cli/approve.js.map +0 -1
  402. package/lib/cli/clack.d.ts +0 -14
  403. package/lib/cli/clack.d.ts.map +0 -1
  404. package/lib/cli/clack.js +0 -12
  405. package/lib/cli/clack.js.map +0 -1
  406. package/lib/cli/main.d.ts +0 -2
  407. package/lib/cli/main.d.ts.map +0 -1
  408. package/lib/cli/main.js +0 -1
  409. package/lib/cli/main.js.map +0 -1
  410. package/lib/cli/plan.d.ts +0 -13
  411. package/lib/cli/plan.d.ts.map +0 -1
  412. package/lib/cli/plan.js +0 -1
  413. package/lib/cli/plan.js.map +0 -1
  414. package/lib/cli/progress.d.ts +0 -7
  415. package/lib/cli/progress.d.ts.map +0 -1
  416. package/lib/cli/progress.js +0 -30
  417. package/lib/cli/progress.js.map +0 -1
  418. package/lib/cli/spinner.d.ts +0 -2
  419. package/lib/cli/spinner.d.ts.map +0 -1
  420. package/lib/cli/spinner.js +0 -13
  421. package/lib/cli/spinner.js.map +0 -1
  422. package/src/approve.ts +0 -13
  423. package/src/cli/approve.tsx +0 -30
  424. package/src/cli/clack.ts +0 -22
  425. package/src/cli/main.ts +0 -0
  426. package/src/cli/plan.ts +0 -16
  427. package/src/cli/progress.tsx +0 -46
  428. package/src/cli/spinner.ts +0 -14
@@ -1,4 +1,5 @@
1
1
  import type * as EC2 from "itty-aws/ec2";
2
+ import type { Input } from "../../input.ts";
2
3
  import { Resource } from "../../resource.ts";
3
4
  import type { AccountID } from "../account.ts";
4
5
  import type { RegionID } from "../region.ts";
@@ -13,7 +14,17 @@ export const Vpc = Resource<{
13
14
  export interface Vpc<
14
15
  ID extends string = string,
15
16
  Props extends VpcProps = VpcProps,
16
- > extends Resource<"AWS.EC2.VPC", ID, Props, VpcAttrs<Props>> {}
17
+ > extends Resource<
18
+ "AWS.EC2.VPC",
19
+ ID,
20
+ Props,
21
+ VpcAttrs<Input.Resolve<Props>>,
22
+ Vpc
23
+ > {}
24
+
25
+ export type VpcId = `vpc-${string}`;
26
+ export const VpcId = <const S extends string>(value: S): S & VpcId =>
27
+ value as S & VpcId;
17
28
 
18
29
  export interface VpcProps {
19
30
  /**
@@ -26,7 +37,7 @@ export interface VpcProps {
26
37
  /**
27
38
  * The ID of an IPv4 IPAM pool you want to use for allocating this VPC's CIDR.
28
39
  */
29
- ipv4IpamPoolId?: string;
40
+ ipv4IpamPoolId?: Input<string>;
30
41
 
31
42
  /**
32
43
  * The netmask length of the IPv4 CIDR you want to allocate to this VPC from an IPAM pool.
@@ -36,7 +47,7 @@ export interface VpcProps {
36
47
  /**
37
48
  * The ID of an IPv6 IPAM pool which will be used to allocate this VPC an IPv6 CIDR.
38
49
  */
39
- ipv6IpamPoolId?: string;
50
+ ipv6IpamPoolId?: Input<string>;
40
51
 
41
52
  /**
42
53
  * The netmask length of the IPv6 CIDR you want to allocate to this VPC from an IPAM pool.
@@ -51,12 +62,12 @@ export interface VpcProps {
51
62
  /**
52
63
  * The ID of an IPv6 address pool from which to allocate the IPv6 CIDR block.
53
64
  */
54
- ipv6Pool?: string;
65
+ ipv6Pool?: Input<string>;
55
66
 
56
67
  /**
57
68
  * The Availability Zone or Local Zone Group name for the IPv6 CIDR block.
58
69
  */
59
- ipv6CidrBlockNetworkBorderGroup?: string;
70
+ ipv6CidrBlockNetworkBorderGroup?: Input<string>;
60
71
 
61
72
  /**
62
73
  * The tenancy options for instances launched into the VPC.
@@ -85,14 +96,14 @@ export interface VpcProps {
85
96
  * Tags to assign to the VPC.
86
97
  * These will be merged with alchemy auto-tags (alchemy::app, alchemy::stage, alchemy::id).
87
98
  */
88
- tags?: Record<string, string>;
99
+ tags?: Record<string, Input<string>>;
89
100
  }
90
101
 
91
- export interface VpcAttrs<Props extends VpcProps> {
102
+ export interface VpcAttrs<_Props extends VpcProps = VpcProps> {
92
103
  /**
93
104
  * The ID of the VPC.
94
105
  */
95
- vpcId: string;
106
+ vpcId: VpcId;
96
107
 
97
108
  /**
98
109
  * The Amazon Resource Name (ARN) of the VPC.
package/src/aws/index.ts CHANGED
@@ -1,4 +1,8 @@
1
1
  import * as Layer from "effect/Layer";
2
+
3
+ // oxlint-disable-next-line no-unused-vars - needed or else provider types are transitively resolved through DynamoDB.Provider<..> lol
4
+ import type { Provider } from "../provider.ts";
5
+
2
6
  import * as ESBuild from "../esbuild.ts";
3
7
  import * as Account from "./account.ts";
4
8
  import * as Credentials from "./credentials.ts";
@@ -10,45 +14,47 @@ import * as Region from "./region.ts";
10
14
  import * as S3 from "./s3.ts";
11
15
  import * as SQS from "./sqs/index.ts";
12
16
  import * as STS from "./sts.ts";
13
- // TODO(sam): should this be named?
14
- export * from "./profile.ts";
15
17
 
16
- export const providers = Layer.mergeAll(
17
- Layer.provide(
18
- Layer.provideMerge(Lambda.functionProvider(), ESBuild.layer()),
18
+ export { loadProfile, loadSSOCredentials } from "./credentials.ts";
19
+
20
+ import "./config.ts";
21
+
22
+ export const resources = () =>
23
+ Layer.mergeAll(
24
+ DynamoDB.tableProvider(),
25
+ EC2.subnetProvider(),
26
+ EC2.vpcProvider(),
27
+ Lambda.functionProvider(),
28
+ SQS.queueProvider(),
29
+ );
30
+
31
+ export const bindings = () =>
32
+ Layer.mergeAll(
33
+ DynamoDB.getItemFromLambdaFunction(),
34
+ SQS.queueEventSourceProvider(),
35
+ SQS.sendMessageFromLambdaFunction(),
36
+ );
37
+
38
+ export const clients = () =>
39
+ Layer.mergeAll(
40
+ DynamoDB.client(),
41
+ EC2.client(),
42
+ IAM.client(),
19
43
  Lambda.client(),
20
- ),
21
- Layer.provide(SQS.queueProvider(), SQS.client()),
22
- Layer.provide(DynamoDB.tableProvider(), DynamoDB.client()),
23
- Layer.provide(EC2.vpcProvider(), EC2.client()),
24
- );
25
-
26
- export const bindings = Layer.mergeAll(
27
- //
28
- SQS.sendMessageFromLambdaFunction(),
29
- SQS.queueEventSourceProvider(),
30
- DynamoDB.getItemFromLambdaFunction(),
31
- );
32
-
33
- export const clients = Layer.mergeAll(
34
- STS.client(),
35
- IAM.client(),
36
- S3.client(),
37
- SQS.client(),
38
- Lambda.client(),
39
- DynamoDB.client(),
40
- EC2.client(),
41
- );
42
-
43
- export const defaultProviders = providers.pipe(
44
- Layer.provideMerge(bindings),
45
- Layer.provideMerge(Account.fromIdentity()),
46
- Layer.provideMerge(clients),
47
- );
48
-
49
- export const live = defaultProviders.pipe(
50
- Layer.provide(Region.fromEnv()),
51
- Layer.provide(Credentials.fromSSO()),
52
- );
53
-
54
- export default live;
44
+ S3.client(),
45
+ SQS.client(),
46
+ // STS.client(),
47
+ );
48
+
49
+ export const utils = () => Layer.mergeAll(ESBuild.layer());
50
+
51
+ export const providers = () =>
52
+ resources().pipe(
53
+ Layer.provideMerge(bindings()),
54
+ Layer.provideMerge(clients()),
55
+ Layer.provideMerge(utils()),
56
+ Layer.provideMerge(Account.fromStageConfig()),
57
+ Layer.provideMerge(STS.client()),
58
+ Layer.provideMerge(Region.fromStageConfig()),
59
+ Layer.provideMerge(Credentials.fromStageConfig()),
60
+ );
@@ -1,5 +1,3 @@
1
- import type { From } from "alchemy-effect";
2
- import { declare } from "alchemy-effect";
3
1
  import type {
4
2
  Context as LambdaContext,
5
3
  SQSBatchResponse,
@@ -7,11 +5,14 @@ import type {
7
5
  } from "aws-lambda";
8
6
  import * as Effect from "effect/Effect";
9
7
  import * as S from "effect/Schema";
10
- import * as SQS from "../sqs/index.ts";
8
+ import { declare, type From } from "../../policy.ts";
11
9
  import * as Lambda from "./function.ts";
10
+ import type { Queue } from "../sqs/queue.ts";
11
+ import type { Consume, QueueEvent } from "../sqs/queue.consume.ts";
12
+ import { QueueEventSource } from "../sqs/queue.event-source.ts";
12
13
 
13
14
  export const consume =
14
- <Q extends SQS.Queue, ID extends string, Req>(
15
+ <Q extends Queue, ID extends string, Req>(
15
16
  id: ID,
16
17
  {
17
18
  queue,
@@ -19,7 +20,7 @@ export const consume =
19
20
  }: {
20
21
  queue: Q;
21
22
  handle: (
22
- event: SQS.QueueEvent<Q["props"]["schema"]["Type"]>,
23
+ event: QueueEvent<Q["props"]["schema"]["Type"]>,
23
24
  context: LambdaContext,
24
25
  ) => Effect.Effect<SQSBatchResponse | void, never, Req>;
25
26
  },
@@ -30,7 +31,7 @@ export const consume =
30
31
  }: Props) =>
31
32
  Lambda.Function(id, {
32
33
  handle: Effect.fn(function* (event: SQSEvent, context: LambdaContext) {
33
- yield* declare<SQS.Consume<From<Q>>>();
34
+ yield* declare<Consume<From<Q>>>();
34
35
  const records = yield* Effect.all(
35
36
  event.Records.map(
36
37
  Effect.fn(function* (record) {
@@ -60,4 +61,4 @@ export const consume =
60
61
  ],
61
62
  } satisfies SQSBatchResponse;
62
63
  }),
63
- })({ ...props, bindings: bindings.and(SQS.QueueEventSource(queue)) });
64
+ })({ ...props, bindings: bindings.and(QueueEventSource(queue)) });
@@ -1,6 +1,6 @@
1
- import type { Capability } from "alchemy-effect";
2
1
  import type { Context as LambdaContext } from "aws-lambda";
3
2
  import * as Effect from "effect/Effect";
3
+ import type { Capability } from "../../capability.ts";
4
4
 
5
5
  type Handler = (
6
6
  event: any,
@@ -1,6 +1,10 @@
1
1
  import * as Effect from "effect/Effect";
2
2
 
3
- import { $, Binding, type Capability, declare, toEnvKey } from "alchemy-effect";
3
+ import { Binding } from "../../binding.ts";
4
+ import type { Capability } from "../../capability.ts";
5
+ import { toEnvKey } from "../../env.ts";
6
+ import { declare, type On } from "../../policy.ts";
7
+ import type { $ } from "../../$.ts";
4
8
  import { LambdaClient } from "./client.ts";
5
9
  import { Function } from "./function.ts";
6
10
 
@@ -8,7 +12,7 @@ export interface InvokeFunction<Resource = unknown>
8
12
  extends Capability<"AWS.Lambda.InvokeFunction", Resource> {}
9
13
 
10
14
  export const InvokeFunction = Binding<
11
- <F extends Function>(func: F) => Binding<Function, InvokeFunction<$<F>>>
15
+ <F extends Function>(func: F) => Binding<Function, InvokeFunction<On<F>>>
12
16
  >(Function, "AWS.Lambda.InvokeFunction");
13
17
 
14
18
  export const invoke = <F extends Function>(func: F, input: any) =>
@@ -5,29 +5,30 @@ import { FileSystem } from "@effect/platform";
5
5
  import * as Effect from "effect/Effect";
6
6
  import * as Schedule from "effect/Schedule";
7
7
 
8
- import { App, DotAlchemy, type ProviderService } from "alchemy-effect";
9
-
10
8
  import type {
11
9
  CreateFunctionRequest,
12
10
  CreateFunctionUrlConfigRequest,
13
11
  UpdateFunctionUrlConfigRequest,
14
12
  } from "itty-aws/lambda";
13
+ import { App } from "../../app.ts";
14
+ import { DotAlchemy } from "../../dot-alchemy.ts";
15
+ import type { ProviderService } from "../../provider.ts";
15
16
  import { createTagger, createTagsList, hasTags } from "../../tags.ts";
16
- import { Account } from "../account.ts";
17
17
  import * as IAM from "../iam.ts";
18
- import { Region } from "../region.ts";
19
18
  import { zipCode } from "../zip.ts";
20
19
  import { LambdaClient } from "./client.ts";
21
20
  import { Function, type FunctionAttr, type FunctionProps } from "./function.ts";
21
+ import { Account } from "../account.ts";
22
+ import { Region } from "../region.ts";
22
23
 
23
24
  export const functionProvider = () =>
24
25
  Function.provider.effect(
25
26
  Effect.gen(function* () {
26
27
  const lambda = yield* LambdaClient;
27
28
  const iam = yield* IAM.IAMClient;
29
+ const app = yield* App;
28
30
  const accountId = yield* Account;
29
31
  const region = yield* Region;
30
- const app = yield* App;
31
32
  const dotAlchemy = yield* DotAlchemy;
32
33
  const fs = yield* FileSystem.FileSystem;
33
34
 
@@ -68,7 +69,7 @@ export const functionProvider = () =>
68
69
  }) {
69
70
  const env = bindings
70
71
  .map((binding) => binding?.env)
71
- .reduce((acc, env) => ({ ...acc, ...(env ?? {}) }), {});
72
+ .reduce((acc, env) => ({ ...acc, ...env }), {});
72
73
  const policyStatements = bindings.flatMap(
73
74
  (binding) =>
74
75
  binding?.policyStatements?.map((stmt: IAM.PolicyStatement) => ({
@@ -156,7 +157,10 @@ export const functionProvider = () =>
156
157
 
157
158
  const bundleCode = Effect.fn(function* (
158
159
  id: string,
159
- props: FunctionProps,
160
+ props: {
161
+ main: string;
162
+ handler?: string;
163
+ },
160
164
  ) {
161
165
  const handler = props.handler ?? "default";
162
166
  let file = path.relative(process.cwd(), props.main);
@@ -215,7 +219,7 @@ export const functionProvider = () =>
215
219
  functionName,
216
220
  }: {
217
221
  id: string;
218
- news: FunctionProps;
222
+ news: FunctionProps<any>;
219
223
  roleArn: string;
220
224
  code: string | Uint8Array<ArrayBufferLike>;
221
225
  env: Record<string, string> | undefined;
@@ -264,17 +268,13 @@ export const functionProvider = () =>
264
268
  })
265
269
  .pipe(
266
270
  Effect.retry({
267
- while: (e) => {
268
- console.log({ e });
269
- return (
270
- e._tag === "ResourceConflictException" ||
271
- (e._tag === "InvalidParameterValueException" &&
272
- e.message?.includes(
273
- "The role defined for the function cannot be assumed by Lambda.",
274
- ))
275
- );
276
- },
277
- schedule: Schedule.fixed(100),
271
+ while: (e) =>
272
+ e._tag === "ResourceConflictException" ||
273
+ (e._tag === "InvalidParameterValueException" &&
274
+ e.message?.includes(
275
+ "The role defined for the function cannot be assumed by Lambda.",
276
+ )),
277
+ schedule: Schedule.exponential(100),
278
278
  }),
279
279
  );
280
280
  yield* Effect.logDebug(`updated function code ${id}`);
@@ -461,12 +461,19 @@ export const functionProvider = () =>
461
461
  olds.url !== news.url
462
462
  ) {
463
463
  return { action: "replace" };
464
- } else if (output.code.hash !== (yield* bundleCode(id, news)).hash) {
464
+ }
465
+ if (
466
+ output.code.hash !==
467
+ (yield* bundleCode(id, {
468
+ main: news.main,
469
+ handler: news.handler,
470
+ })).hash
471
+ ) {
465
472
  // code changed
466
473
  return { action: "update" };
467
474
  }
468
475
  }),
469
- precreate: Effect.fn(function* ({ id, news, session }) {
476
+ precreate: Effect.fn(function* ({ id, news }) {
470
477
  const { roleName, functionName, roleArn } = createPhysicalNames(id);
471
478
 
472
479
  const role = yield* createRoleIfNotExists({ id, roleName });
@@ -1,9 +1,11 @@
1
- import { Runtime, type Capability, type RuntimeProps } from "alchemy-effect";
1
+ import type { Capability } from "../../capability.ts";
2
+ import { Runtime, type RuntimeProps } from "../../runtime.ts";
2
3
  import type * as IAM from "../iam.ts";
3
4
 
4
5
  export type { Context } from "aws-lambda";
5
6
 
6
- export interface FunctionProps<Req = any> extends RuntimeProps<Function, Req> {
7
+ export interface FunctionProps<Req = unknown>
8
+ extends RuntimeProps<Function, Req> {
7
9
  functionName?: string;
8
10
  functionArn?: string;
9
11
  main: string;
@@ -38,8 +40,9 @@ export interface FunctionBinding {
38
40
  }
39
41
 
40
42
  export interface Function extends Runtime<"AWS.Lambda.Function"> {
41
- props: FunctionProps;
42
- attr: FunctionAttr<Extract<this["props"], FunctionProps>>;
43
+ props: FunctionProps<any>;
44
+ attr: FunctionAttr<Extract<this["props"], FunctionProps<any>>>;
43
45
  binding: FunctionBinding;
46
+ base: Function;
44
47
  }
45
48
  export const Function = Runtime("AWS.Lambda.Function")<Function>();
@@ -7,3 +7,5 @@ export * from "./serve.ts";
7
7
  export * from "./consume.ts";
8
8
 
9
9
  // export type * as lambda from "aws-lambda";
10
+
11
+ import "../config.ts";
@@ -1,6 +1,3 @@
1
1
  import * as Context from "effect/Context";
2
2
 
3
- export class AwsProfile extends Context.Tag("AWS::Profile")<
4
- AwsProfile,
5
- string
6
- >() {}
3
+ export class Profile extends Context.Tag("AWS::Profile")<Profile, string>() {}
package/src/aws/region.ts CHANGED
@@ -1,12 +1,16 @@
1
+ import * as Config from "effect/Config";
2
+ import * as Option from "effect/Option";
1
3
  import * as Context from "effect/Context";
2
4
  import * as Data from "effect/Data";
3
5
  import * as Effect from "effect/Effect";
4
6
  import * as Layer from "effect/Layer";
5
-
6
- export type RegionID = string;
7
+ import { App } from "../app.ts";
8
+ import { loadProfile } from "./credentials.ts";
7
9
 
8
10
  export class Region extends Context.Tag("AWS::Region")<Region, RegionID>() {}
9
11
 
12
+ export type RegionID = string;
13
+
10
14
  export const of = (region: string) => Layer.succeed(Region, region);
11
15
 
12
16
  export const fromEnvOrElse = (region: string) =>
@@ -19,11 +23,16 @@ export class EnvironmentVariableNotSet extends Data.TaggedError(
19
23
  variable: string;
20
24
  }> {}
21
25
 
26
+ export const AWS_REGION = Config.string("AWS_REGION");
27
+
28
+ const tryGetAWSRegion = () =>
29
+ Config.option(AWS_REGION).pipe(Effect.map(Option.getOrUndefined));
30
+
22
31
  export const fromEnv = () =>
23
32
  Layer.effect(
24
33
  Region,
25
34
  Effect.gen(function* () {
26
- const region = process.env.AWS_REGION;
35
+ const region = yield* tryGetAWSRegion();
27
36
  if (!region) {
28
37
  return yield* Effect.fail(
29
38
  new EnvironmentVariableNotSet({
@@ -35,3 +44,33 @@ export const fromEnv = () =>
35
44
  return region;
36
45
  }),
37
46
  );
47
+
48
+ export class AWSStageConfigRegionMissing extends Data.TaggedError(
49
+ "AWSStageConfigMissing",
50
+ )<{
51
+ message: string;
52
+ stage: string;
53
+ }> {}
54
+
55
+ export const fromStageConfig = () =>
56
+ Layer.effect(
57
+ Region,
58
+ Effect.gen(function* () {
59
+ const app = yield* App;
60
+ if (app.config.aws?.region) {
61
+ return app.config.aws.region;
62
+ } else if (app.config.aws?.profile) {
63
+ const profile = yield* loadProfile(app.config.aws.profile);
64
+ if (profile.region) {
65
+ return profile.region;
66
+ }
67
+ }
68
+ const region = yield* tryGetAWSRegion();
69
+ if (region) {
70
+ return region;
71
+ }
72
+ return yield* Effect.dieMessage(
73
+ "No AWS region found in stage config, SSO profile, or environment variable",
74
+ );
75
+ }),
76
+ );
@@ -4,3 +4,5 @@ export * from "./queue.event-source.ts";
4
4
  export * from "./queue.provider.ts";
5
5
  export * from "./queue.send-message.ts";
6
6
  export * from "./queue.ts";
7
+
8
+ import "../config.ts";
@@ -1,5 +1,5 @@
1
- import { type Capability } from "alchemy-effect";
2
1
  import type * as lambda from "aws-lambda";
2
+ import type { Capability } from "../../capability.ts";
3
3
  import { Queue } from "./queue.ts";
4
4
 
5
5
  export type QueueRecord<Data> = Omit<lambda.SQSRecord, "body"> & {
@@ -1,17 +1,15 @@
1
- import { Binding, type From } from "alchemy-effect";
2
1
  import * as Effect from "effect/Effect";
3
2
  import * as Schedule from "effect/Schedule";
4
3
  import type * as Lambda from "itty-aws/lambda";
4
+ import { Binding } from "../../binding.ts";
5
+ import type { From } from "../../policy.ts";
5
6
  import { createTagger, hasTags } from "../../tags.ts";
6
- import { Account } from "../account.ts";
7
- import {
8
- Function,
9
- LambdaClient,
10
- type FunctionBinding,
11
- } from "../lambda/index.ts";
12
- import { Region } from "../region.ts";
13
7
  import type { Consume } from "./queue.consume.ts";
14
8
  import { Queue, type QueueAttrs, type QueueProps } from "./queue.ts";
9
+ import { Function, type FunctionBinding } from "../lambda/function.ts";
10
+ import { LambdaClient } from "../lambda/client.ts";
11
+ import { Account } from "../account.ts";
12
+ import { Region } from "../region.ts";
15
13
 
16
14
  export interface QueueEventSourceProps {
17
15
  batchSize?: number;
@@ -43,10 +41,9 @@ export const QueueEventSource = Binding<
43
41
 
44
42
  export const queueEventSourceProvider = () =>
45
43
  QueueEventSource.provider.effect(
46
- // @ts-expect-error
47
44
  Effect.gen(function* () {
48
- const region = yield* Region;
49
45
  const accountId = yield* Account;
46
+ const region = yield* Region;
50
47
  const lambda = yield* LambdaClient;
51
48
  const tagged = yield* createTagger();
52
49
 
@@ -113,45 +110,26 @@ export const queueEventSourceProvider = () =>
113
110
  return undefined;
114
111
  });
115
112
 
116
- const createFunctionBinding = (queue: {
117
- attr: { queueArn: string };
118
- }) => ({
119
- // we need the policies to be present before the event source mapping is created
120
- policyStatements: [
121
- {
122
- Sid: "AWS.SQS.Consume",
123
- Effect: "Allow" as const,
124
- Action: [
125
- "sqs:ReceiveMessage",
126
- "sqs:DeleteMessage",
127
- "sqs:ChangeMessageVisibility",
128
- ],
129
- Resource: [queue.attr.queueArn],
130
- },
131
- ],
132
- });
133
-
134
113
  return {
135
- attach: ({ source: queue }) => {
136
- console.log("attaching queue event source", queue.id);
137
- return {
138
- // we need the policies to be present before the event source mapping is created
139
- policyStatements: [
140
- {
141
- Sid: "AWS.SQS.Consume",
142
- Effect: "Allow" as const,
143
- Action: [
144
- "sqs:ReceiveMessage",
145
- "sqs:DeleteMessage",
146
- "sqs:ChangeMessageVisibility",
147
- "sqs:GetQueueAttributes",
148
- "sqs:GetQueueUrl",
149
- ],
150
- Resource: [queue.attr.queueArn],
151
- },
152
- ],
153
- };
154
- },
114
+ attach: ({ source: queue, attr }) => ({
115
+ // TODO(sam): bit of a broken model here - we can't know the UUID until post-attach
116
+ uuid: attr?.uuid ?? undefined!,
117
+ // we need the policies to be present before the event source mapping is created
118
+ policyStatements: [
119
+ {
120
+ Sid: "AWS.SQS.Consume",
121
+ Effect: "Allow" as const,
122
+ Action: [
123
+ "sqs:ReceiveMessage",
124
+ "sqs:DeleteMessage",
125
+ "sqs:ChangeMessageVisibility",
126
+ "sqs:GetQueueAttributes",
127
+ "sqs:GetQueueUrl",
128
+ ],
129
+ Resource: [queue.attr.queueArn],
130
+ },
131
+ ],
132
+ }),
155
133
  postattach: Effect.fn(function* ({
156
134
  source: queue,
157
135
  props: { batchSize, maxBatchingWindow, scalingConfig } = {},
@@ -160,11 +138,6 @@ export const queueEventSourceProvider = () =>
160
138
  attr: { functionName },
161
139
  },
162
140
  }) {
163
- console.log(
164
- "postattaching queue event source",
165
- queue.id,
166
- functionName,
167
- );
168
141
  const config:
169
142
  | Lambda.CreateEventSourceMappingRequest
170
143
  | Lambda.UpdateEventSourceMappingRequest = {
@@ -220,10 +193,11 @@ export const queueEventSourceProvider = () =>
220
193
  ),
221
194
  schedule: Schedule.exponential(100),
222
195
  }),
196
+ Effect.orDie,
223
197
  );
224
198
  return {
225
199
  ...attr,
226
- uuid: eventSourceMapping.UUID,
200
+ uuid: eventSourceMapping.UUID!,
227
201
  };
228
202
  }),
229
203
  detach: Effect.fn(function* ({
@@ -235,7 +209,7 @@ export const queueEventSourceProvider = () =>
235
209
  }) {
236
210
  const uuid =
237
211
  attr?.uuid ??
238
- (yield* findEventSourceMapping(queue, functionName))?.UUID!;
212
+ (yield* findEventSourceMapping(queue, functionName))?.UUID;
239
213
  if (uuid) {
240
214
  // we found (or were aware of) the event source mapping, so we can delete it
241
215
  yield* (
@@ -1,11 +1,12 @@
1
1
  import * as Effect from "effect/Effect";
2
2
  import * as Schedule from "effect/Schedule";
3
3
 
4
- import { App, type ProviderService } from "alchemy-effect";
5
- import { Account } from "../account.ts";
6
- import { Region } from "../region.ts";
4
+ import { App } from "../../app.ts";
5
+ import type { ProviderService } from "../../provider.ts";
7
6
  import { SQSClient } from "./client.ts";
8
7
  import { Queue, type QueueProps } from "./queue.ts";
8
+ import { Region } from "../region.ts";
9
+ import { Account } from "../account.ts";
9
10
 
10
11
  export const queueProvider = () =>
11
12
  Queue.provider.effect(
@@ -14,7 +15,13 @@ export const queueProvider = () =>
14
15
  const app = yield* App;
15
16
  const region = yield* Region;
16
17
  const accountId = yield* Account;
17
- const createQueueName = (id: string, props: QueueProps) =>
18
+ const createQueueName = (
19
+ id: string,
20
+ props: {
21
+ queueName?: string | undefined;
22
+ fifo?: boolean;
23
+ },
24
+ ) =>
18
25
  props.queueName ??
19
26
  `${app.name}-${id}-${app.stage}${props.fifo ? ".fifo" : ""}`;
20
27
  const createAttributes = (props: QueueProps) => ({
@@ -1,13 +1,10 @@
1
1
  import * as Effect from "effect/Effect";
2
2
 
3
- import {
4
- Binding,
5
- declare,
6
- toEnvKey,
7
- type Capability,
8
- type To,
9
- } from "alchemy-effect";
10
- import { Function } from "../lambda/index.ts";
3
+ import { Binding } from "../../binding.ts";
4
+ import type { Capability } from "../../capability.ts";
5
+ import { toEnvKey } from "../../env.ts";
6
+ import { declare, type To } from "../../policy.ts";
7
+ import { Function } from "../lambda/function.ts";
11
8
  import { SQSClient } from "./client.ts";
12
9
  import { Queue } from "./queue.ts";
13
10