alchemy-effect 0.1.0 → 0.2.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 (420) hide show
  1. package/lib/app.d.ts +7 -2
  2. package/lib/app.d.ts.map +1 -1
  3. package/lib/app.js +1 -0
  4. package/lib/app.js.map +1 -1
  5. package/lib/apply.d.ts +57 -1
  6. package/lib/apply.d.ts.map +1 -1
  7. package/lib/apply.js +141 -55
  8. package/lib/apply.js.map +1 -1
  9. package/lib/aws/account.d.ts +4 -3
  10. package/lib/aws/account.d.ts.map +1 -1
  11. package/lib/aws/account.js +2 -2
  12. package/lib/aws/account.js.map +1 -1
  13. package/lib/aws/arn.d.ts +1 -5
  14. package/lib/aws/arn.d.ts.map +1 -1
  15. package/lib/aws/client.d.ts.map +1 -1
  16. package/lib/aws/client.js +9 -1
  17. package/lib/aws/client.js.map +1 -1
  18. package/lib/aws/credentials.d.ts +1 -1
  19. package/lib/aws/credentials.d.ts.map +1 -1
  20. package/lib/aws/credentials.js.map +1 -1
  21. package/lib/aws/dynamodb/attribute-value.d.ts +20 -0
  22. package/lib/aws/dynamodb/attribute-value.d.ts.map +1 -0
  23. package/lib/aws/dynamodb/attribute-value.js +217 -0
  24. package/lib/aws/dynamodb/attribute-value.js.map +1 -0
  25. package/lib/aws/dynamodb/client.d.ts +12 -0
  26. package/lib/aws/dynamodb/client.d.ts.map +1 -0
  27. package/lib/aws/{sqs/queue.client.js → dynamodb/client.js} +6 -6
  28. package/lib/aws/dynamodb/client.js.map +1 -0
  29. package/lib/aws/dynamodb/expr.d.ts +41 -0
  30. package/lib/aws/dynamodb/expr.d.ts.map +1 -0
  31. package/lib/aws/dynamodb/expr.js +1 -0
  32. package/lib/aws/dynamodb/expr.js.map +1 -0
  33. package/lib/aws/dynamodb/index.d.ts +9 -0
  34. package/lib/aws/dynamodb/index.d.ts.map +1 -0
  35. package/lib/aws/dynamodb/index.js +10 -0
  36. package/lib/aws/dynamodb/index.js.map +1 -0
  37. package/lib/aws/dynamodb/projection.d.ts +25 -0
  38. package/lib/aws/dynamodb/projection.d.ts.map +1 -0
  39. package/lib/aws/dynamodb/projection.js +1 -0
  40. package/lib/aws/dynamodb/projection.js.map +1 -0
  41. package/lib/aws/dynamodb/secondary-index.d.ts +25 -0
  42. package/lib/aws/dynamodb/secondary-index.d.ts.map +1 -0
  43. package/lib/aws/dynamodb/secondary-index.js +4 -0
  44. package/lib/aws/dynamodb/secondary-index.js.map +1 -0
  45. package/lib/aws/dynamodb/table.d.ts +56 -0
  46. package/lib/aws/dynamodb/table.d.ts.map +1 -0
  47. package/lib/aws/dynamodb/table.get-item.d.ts +55 -0
  48. package/lib/aws/dynamodb/table.get-item.d.ts.map +1 -0
  49. package/lib/aws/dynamodb/table.get-item.js +75 -0
  50. package/lib/aws/dynamodb/table.get-item.js.map +1 -0
  51. package/lib/aws/dynamodb/table.js +4 -0
  52. package/lib/aws/dynamodb/table.js.map +1 -0
  53. package/lib/aws/dynamodb/table.provider.d.ts +8 -0
  54. package/lib/aws/dynamodb/table.provider.d.ts.map +1 -0
  55. package/lib/aws/dynamodb/table.provider.js +199 -0
  56. package/lib/aws/dynamodb/table.provider.js.map +1 -0
  57. package/lib/aws/ec2/client.d.ts +12 -0
  58. package/lib/aws/ec2/client.d.ts.map +1 -0
  59. package/lib/aws/ec2/client.js +11 -0
  60. package/lib/aws/ec2/client.js.map +1 -0
  61. package/lib/aws/ec2/index.d.ts +4 -0
  62. package/lib/aws/ec2/index.d.ts.map +1 -0
  63. package/lib/aws/ec2/index.js +4 -0
  64. package/lib/aws/ec2/index.js.map +1 -0
  65. package/lib/aws/ec2/vpc.d.ts +131 -0
  66. package/lib/aws/ec2/vpc.d.ts.map +1 -0
  67. package/lib/aws/ec2/vpc.js +3 -0
  68. package/lib/aws/ec2/vpc.js.map +1 -0
  69. package/lib/aws/ec2/vpc.provider.d.ts +7 -0
  70. package/lib/aws/ec2/vpc.provider.d.ts.map +1 -0
  71. package/lib/aws/ec2/vpc.provider.js +198 -0
  72. package/lib/aws/ec2/vpc.provider.js.map +1 -0
  73. package/lib/aws/index.d.ts +24 -14
  74. package/lib/aws/index.d.ts.map +1 -1
  75. package/lib/aws/index.js +7 -12
  76. package/lib/aws/index.js.map +1 -1
  77. package/lib/aws/lambda/client.d.ts +8 -0
  78. package/lib/aws/lambda/client.d.ts.map +1 -0
  79. package/lib/aws/lambda/client.js +7 -0
  80. package/lib/aws/lambda/client.js.map +1 -0
  81. package/lib/aws/lambda/consume.d.ts +3 -3
  82. package/lib/aws/lambda/consume.d.ts.map +1 -1
  83. package/lib/aws/lambda/consume.js.map +1 -1
  84. package/lib/aws/lambda/function.d.ts +13 -10
  85. package/lib/aws/lambda/function.d.ts.map +1 -1
  86. package/lib/aws/lambda/function.invoke.d.ts +2 -2
  87. package/lib/aws/lambda/function.invoke.d.ts.map +1 -1
  88. package/lib/aws/lambda/function.invoke.js +2 -2
  89. package/lib/aws/lambda/function.invoke.js.map +1 -1
  90. package/lib/aws/lambda/function.js +1 -1
  91. package/lib/aws/lambda/function.js.map +1 -1
  92. package/lib/aws/lambda/function.provider.d.ts +3 -3
  93. package/lib/aws/lambda/function.provider.d.ts.map +1 -1
  94. package/lib/aws/lambda/function.provider.js +145 -55
  95. package/lib/aws/lambda/function.provider.js.map +1 -1
  96. package/lib/aws/lambda/index.d.ts +1 -2
  97. package/lib/aws/lambda/index.d.ts.map +1 -1
  98. package/lib/aws/lambda/index.js +1 -1
  99. package/lib/aws/lambda/index.js.map +1 -1
  100. package/lib/aws/lambda/serve.d.ts +1 -1
  101. package/lib/aws/lambda/serve.d.ts.map +1 -1
  102. package/lib/aws/lambda/serve.js.map +1 -1
  103. package/lib/aws/region.d.ts +1 -0
  104. package/lib/aws/region.d.ts.map +1 -1
  105. package/lib/aws/region.js.map +1 -1
  106. package/lib/aws/sqs/client.d.ts +12 -0
  107. package/lib/aws/sqs/client.d.ts.map +1 -0
  108. package/lib/aws/sqs/client.js +11 -0
  109. package/lib/aws/sqs/client.js.map +1 -0
  110. package/lib/aws/sqs/index.d.ts +2 -1
  111. package/lib/aws/sqs/index.d.ts.map +1 -1
  112. package/lib/aws/sqs/index.js +2 -1
  113. package/lib/aws/sqs/index.js.map +1 -1
  114. package/lib/aws/sqs/queue.consume.d.ts +1 -10
  115. package/lib/aws/sqs/queue.consume.d.ts.map +1 -1
  116. package/lib/aws/sqs/queue.consume.js +1 -19
  117. package/lib/aws/sqs/queue.consume.js.map +1 -1
  118. package/lib/aws/sqs/queue.d.ts +2 -10
  119. package/lib/aws/sqs/queue.d.ts.map +1 -1
  120. package/lib/aws/sqs/queue.event-source.d.ts +20 -0
  121. package/lib/aws/sqs/queue.event-source.d.ts.map +1 -0
  122. package/lib/aws/sqs/queue.event-source.js +148 -0
  123. package/lib/aws/sqs/queue.event-source.js.map +1 -0
  124. package/lib/aws/sqs/queue.provider.d.ts +4 -3
  125. package/lib/aws/sqs/queue.provider.d.ts.map +1 -1
  126. package/lib/aws/sqs/queue.provider.js +4 -4
  127. package/lib/aws/sqs/queue.provider.js.map +1 -1
  128. package/lib/aws/sqs/queue.send-message.d.ts +2 -2
  129. package/lib/aws/sqs/queue.send-message.d.ts.map +1 -1
  130. package/lib/aws/sqs/queue.send-message.js +2 -2
  131. package/lib/aws/sqs/queue.send-message.js.map +1 -1
  132. package/lib/binding.d.ts +70 -22
  133. package/lib/binding.d.ts.map +1 -1
  134. package/lib/binding.js.map +1 -1
  135. package/lib/capability.d.ts +38 -0
  136. package/lib/capability.d.ts.map +1 -1
  137. package/lib/cli/components/Plan.d.ts.map +1 -1
  138. package/lib/cli/components/Plan.js +3 -1
  139. package/lib/cli/components/Plan.js.map +1 -1
  140. package/lib/cli/index.d.ts +204 -116
  141. package/lib/cli/index.d.ts.map +1 -1
  142. package/lib/cli/index.js +25707 -11055
  143. package/lib/cli/index.js.map +1 -1
  144. package/lib/cli/progress.d.ts.map +1 -1
  145. package/lib/cli/progress.js +1 -0
  146. package/lib/cli/progress.js.map +1 -1
  147. package/lib/cloudflare/api.d.ts +29 -17
  148. package/lib/cloudflare/api.d.ts.map +1 -1
  149. package/lib/cloudflare/api.js +92 -27
  150. package/lib/cloudflare/api.js.map +1 -1
  151. package/lib/cloudflare/context.d.ts +27 -0
  152. package/lib/cloudflare/context.d.ts.map +1 -0
  153. package/lib/cloudflare/context.js +24 -0
  154. package/lib/cloudflare/context.js.map +1 -0
  155. package/lib/cloudflare/index.d.ts +5 -4
  156. package/lib/cloudflare/index.d.ts.map +1 -1
  157. package/lib/cloudflare/index.js +4 -4
  158. package/lib/cloudflare/index.js.map +1 -1
  159. package/lib/cloudflare/kv/index.d.ts +4 -0
  160. package/lib/cloudflare/kv/index.d.ts.map +1 -0
  161. package/lib/cloudflare/kv/index.js +4 -0
  162. package/lib/cloudflare/kv/index.js.map +1 -0
  163. package/lib/cloudflare/kv/namespace.binding.d.ts +8 -0
  164. package/lib/cloudflare/kv/namespace.binding.d.ts.map +1 -0
  165. package/lib/cloudflare/kv/namespace.binding.js +15 -0
  166. package/lib/cloudflare/kv/namespace.binding.js.map +1 -0
  167. package/lib/cloudflare/kv/namespace.client.d.ts +11 -0
  168. package/lib/cloudflare/kv/namespace.client.d.ts.map +1 -0
  169. package/lib/cloudflare/kv/namespace.client.js +31 -0
  170. package/lib/cloudflare/kv/namespace.client.js.map +1 -0
  171. package/lib/cloudflare/kv/namespace.d.ts +23 -0
  172. package/lib/cloudflare/kv/namespace.d.ts.map +1 -0
  173. package/lib/cloudflare/kv/namespace.js +3 -0
  174. package/lib/cloudflare/kv/namespace.js.map +1 -0
  175. package/lib/cloudflare/kv/namespace.provider.d.ts +5 -0
  176. package/lib/cloudflare/kv/namespace.provider.d.ts.map +1 -0
  177. package/lib/cloudflare/kv/namespace.provider.js +80 -0
  178. package/lib/cloudflare/kv/namespace.provider.js.map +1 -0
  179. package/lib/cloudflare/live.d.ts +11 -0
  180. package/lib/cloudflare/live.d.ts.map +1 -0
  181. package/lib/cloudflare/live.js +18 -0
  182. package/lib/cloudflare/live.js.map +1 -0
  183. package/lib/cloudflare/r2/bucket.binding.d.ts +8 -0
  184. package/lib/cloudflare/r2/bucket.binding.d.ts.map +1 -0
  185. package/lib/cloudflare/r2/bucket.binding.js +18 -0
  186. package/lib/cloudflare/r2/bucket.binding.js.map +1 -0
  187. package/lib/cloudflare/r2/bucket.client.d.ts +8 -0
  188. package/lib/cloudflare/r2/bucket.client.d.ts.map +1 -0
  189. package/lib/cloudflare/r2/bucket.client.js +9 -0
  190. package/lib/cloudflare/r2/bucket.client.js.map +1 -0
  191. package/lib/cloudflare/r2/bucket.d.ts +32 -0
  192. package/lib/cloudflare/r2/bucket.d.ts.map +1 -0
  193. package/lib/cloudflare/r2/bucket.del.d.ts +4 -0
  194. package/lib/cloudflare/r2/bucket.del.d.ts.map +1 -0
  195. package/lib/cloudflare/r2/bucket.del.js +7 -0
  196. package/lib/cloudflare/r2/bucket.del.js.map +1 -0
  197. package/lib/cloudflare/r2/bucket.get.d.ts +5 -0
  198. package/lib/cloudflare/r2/bucket.get.d.ts.map +1 -0
  199. package/lib/cloudflare/r2/bucket.get.js +7 -0
  200. package/lib/cloudflare/r2/bucket.get.js.map +1 -0
  201. package/lib/cloudflare/r2/bucket.head.d.ts +4 -0
  202. package/lib/cloudflare/r2/bucket.head.d.ts.map +1 -0
  203. package/lib/cloudflare/r2/bucket.head.js +7 -0
  204. package/lib/cloudflare/r2/bucket.head.js.map +1 -0
  205. package/lib/cloudflare/r2/bucket.js +3 -0
  206. package/lib/cloudflare/r2/bucket.js.map +1 -0
  207. package/lib/cloudflare/r2/bucket.list.d.ts +5 -0
  208. package/lib/cloudflare/r2/bucket.list.d.ts.map +1 -0
  209. package/lib/cloudflare/r2/bucket.list.js +7 -0
  210. package/lib/cloudflare/r2/bucket.list.js.map +1 -0
  211. package/lib/cloudflare/r2/bucket.multipart.d.ts +19 -0
  212. package/lib/cloudflare/r2/bucket.multipart.d.ts.map +1 -0
  213. package/lib/cloudflare/r2/bucket.multipart.js +25 -0
  214. package/lib/cloudflare/r2/bucket.multipart.js.map +1 -0
  215. package/lib/cloudflare/r2/bucket.provider.d.ts +5 -0
  216. package/lib/cloudflare/r2/bucket.provider.d.ts.map +1 -0
  217. package/lib/cloudflare/r2/bucket.provider.js +66 -0
  218. package/lib/cloudflare/r2/bucket.provider.js.map +1 -0
  219. package/lib/cloudflare/r2/bucket.put.d.ts +6 -0
  220. package/lib/cloudflare/r2/bucket.put.d.ts.map +1 -0
  221. package/lib/cloudflare/r2/bucket.put.js +8 -0
  222. package/lib/cloudflare/r2/bucket.put.js.map +1 -0
  223. package/lib/cloudflare/r2/index.d.ts +10 -0
  224. package/lib/cloudflare/r2/index.d.ts.map +1 -0
  225. package/lib/cloudflare/r2/index.js +10 -0
  226. package/lib/cloudflare/r2/index.js.map +1 -0
  227. package/lib/cloudflare/stream.d.ts +10 -0
  228. package/lib/cloudflare/stream.d.ts.map +1 -0
  229. package/lib/cloudflare/stream.js +16 -0
  230. package/lib/cloudflare/stream.js.map +1 -0
  231. package/lib/cloudflare/worker/assets.fetch.d.ts +8 -0
  232. package/lib/cloudflare/worker/assets.fetch.d.ts.map +1 -0
  233. package/lib/cloudflare/worker/assets.fetch.js +11 -0
  234. package/lib/cloudflare/worker/assets.fetch.js.map +1 -0
  235. package/lib/cloudflare/worker/assets.provider.d.ts +66 -0
  236. package/lib/cloudflare/worker/assets.provider.d.ts.map +1 -0
  237. package/lib/cloudflare/worker/assets.provider.js +145 -0
  238. package/lib/cloudflare/worker/assets.provider.js.map +1 -0
  239. package/lib/cloudflare/worker/index.d.ts +6 -0
  240. package/lib/cloudflare/worker/index.d.ts.map +1 -0
  241. package/lib/cloudflare/worker/index.js +5 -0
  242. package/lib/cloudflare/worker/index.js.map +1 -0
  243. package/lib/cloudflare/worker/worker.d.ts +67 -0
  244. package/lib/cloudflare/worker/worker.d.ts.map +1 -0
  245. package/lib/cloudflare/worker/worker.handler.d.ts +11 -0
  246. package/lib/cloudflare/worker/worker.handler.d.ts.map +1 -0
  247. package/lib/cloudflare/worker/worker.handler.js +15 -0
  248. package/lib/cloudflare/worker/worker.handler.js.map +1 -0
  249. package/lib/cloudflare/worker/worker.js +4 -0
  250. package/lib/cloudflare/worker/worker.js.map +1 -0
  251. package/lib/cloudflare/worker/worker.provider.d.ts +10 -0
  252. package/lib/cloudflare/worker/worker.provider.d.ts.map +1 -0
  253. package/lib/cloudflare/worker/worker.provider.js +193 -0
  254. package/lib/cloudflare/worker/worker.provider.js.map +1 -0
  255. package/lib/cloudflare/worker/worker.serve.d.ts +39 -0
  256. package/lib/cloudflare/worker/worker.serve.d.ts.map +1 -0
  257. package/lib/cloudflare/worker/worker.serve.js +4 -0
  258. package/lib/cloudflare/worker/worker.serve.js.map +1 -0
  259. package/lib/destroy.d.ts +1 -3
  260. package/lib/destroy.d.ts.map +1 -1
  261. package/lib/destroy.js +5 -0
  262. package/lib/destroy.js.map +1 -1
  263. package/lib/dot-alchemy.d.ts +3 -2
  264. package/lib/dot-alchemy.d.ts.map +1 -1
  265. package/lib/dot-alchemy.js +3 -2
  266. package/lib/dot-alchemy.js.map +1 -1
  267. package/lib/esbuild.d.ts +28 -0
  268. package/lib/esbuild.d.ts.map +1 -0
  269. package/lib/esbuild.js +63 -0
  270. package/lib/esbuild.js.map +1 -0
  271. package/lib/index.d.ts +1 -3
  272. package/lib/index.d.ts.map +1 -1
  273. package/lib/index.js +4 -3
  274. package/lib/index.js.map +1 -1
  275. package/lib/plan.d.ts +19 -8
  276. package/lib/plan.d.ts.map +1 -1
  277. package/lib/plan.js +144 -72
  278. package/lib/plan.js.map +1 -1
  279. package/lib/policy.d.ts +19 -1
  280. package/lib/policy.d.ts.map +1 -1
  281. package/lib/policy.js +10 -1
  282. package/lib/policy.js.map +1 -1
  283. package/lib/provider.d.ts +2 -2
  284. package/lib/provider.d.ts.map +1 -1
  285. package/lib/resource.d.ts +2 -10
  286. package/lib/resource.d.ts.map +1 -1
  287. package/lib/resource.js +1 -0
  288. package/lib/resource.js.map +1 -1
  289. package/lib/runtime.d.ts +1 -1
  290. package/lib/runtime.d.ts.map +1 -1
  291. package/lib/schema.d.ts +37 -0
  292. package/lib/schema.d.ts.map +1 -0
  293. package/lib/schema.js +61 -0
  294. package/lib/schema.js.map +1 -0
  295. package/lib/sha256.d.ts +5 -0
  296. package/lib/sha256.d.ts.map +1 -0
  297. package/lib/sha256.js +16 -0
  298. package/lib/sha256.js.map +1 -0
  299. package/lib/state.d.ts +3 -2
  300. package/lib/state.d.ts.map +1 -1
  301. package/lib/state.js +3 -2
  302. package/lib/state.js.map +1 -1
  303. package/lib/tags.d.ts +17 -0
  304. package/lib/tags.d.ts.map +1 -0
  305. package/lib/tags.js +22 -0
  306. package/lib/tags.js.map +1 -0
  307. package/lib/test.d.ts +14 -0
  308. package/lib/test.d.ts.map +1 -0
  309. package/lib/test.js +28 -0
  310. package/lib/test.js.map +1 -0
  311. package/lib/tsconfig.test.tsbuildinfo +1 -0
  312. package/lib/type.d.ts +3 -0
  313. package/lib/type.d.ts.map +1 -0
  314. package/lib/type.js +3 -0
  315. package/lib/type.js.map +1 -0
  316. package/package.json +48 -3
  317. package/src/app.ts +8 -7
  318. package/src/apply.ts +251 -93
  319. package/src/aws/account.ts +6 -4
  320. package/src/aws/arn.ts +1 -7
  321. package/src/aws/client.ts +15 -1
  322. package/src/aws/credentials.ts +1 -0
  323. package/src/aws/dynamodb/attribute-value.ts +240 -0
  324. package/src/aws/{sqs/queue.client.ts → dynamodb/client.ts} +9 -9
  325. package/src/aws/dynamodb/expr.ts +90 -0
  326. package/src/aws/dynamodb/index.ts +12 -0
  327. package/src/aws/dynamodb/projection.ts +159 -0
  328. package/src/aws/dynamodb/secondary-index.ts +45 -0
  329. package/src/aws/dynamodb/table.get-item.ts +177 -0
  330. package/src/aws/dynamodb/table.provider.ts +280 -0
  331. package/src/aws/dynamodb/table.ts +156 -0
  332. package/src/aws/ec2/client.ts +20 -0
  333. package/src/aws/ec2/index.ts +3 -0
  334. package/src/aws/ec2/vpc.provider.ts +285 -0
  335. package/src/aws/ec2/vpc.ts +152 -0
  336. package/src/aws/index.ts +15 -16
  337. package/src/aws/lambda/client.ts +14 -0
  338. package/src/aws/lambda/consume.ts +0 -1
  339. package/src/aws/lambda/function.invoke.ts +2 -2
  340. package/src/aws/lambda/function.provider.ts +197 -105
  341. package/src/aws/lambda/function.ts +16 -10
  342. package/src/aws/lambda/index.ts +1 -4
  343. package/src/aws/lambda/serve.ts +1 -1
  344. package/src/aws/region.ts +3 -1
  345. package/src/aws/sqs/client.ts +20 -0
  346. package/src/aws/sqs/index.ts +2 -1
  347. package/src/aws/sqs/queue.consume.ts +1 -34
  348. package/src/aws/sqs/queue.event-source.ts +253 -0
  349. package/src/aws/sqs/queue.provider.ts +4 -4
  350. package/src/aws/sqs/queue.send-message.ts +2 -2
  351. package/src/binding.ts +121 -25
  352. package/src/capability.ts +44 -0
  353. package/src/cli/components/Plan.tsx +4 -2
  354. package/src/cli/progress.tsx +1 -0
  355. package/src/cloudflare/api.ts +141 -61
  356. package/src/cloudflare/context.ts +49 -0
  357. package/src/cloudflare/index.ts +6 -4
  358. package/src/cloudflare/kv/index.ts +3 -0
  359. package/src/cloudflare/kv/namespace.binding.ts +25 -0
  360. package/src/cloudflare/kv/namespace.client.ts +70 -0
  361. package/src/cloudflare/kv/namespace.provider.ts +99 -0
  362. package/src/cloudflare/kv/namespace.ts +29 -0
  363. package/src/cloudflare/live.ts +38 -0
  364. package/src/cloudflare/r2/bucket.binding.ts +27 -0
  365. package/src/cloudflare/r2/bucket.client.ts +22 -0
  366. package/src/cloudflare/r2/bucket.del.ts +11 -0
  367. package/src/cloudflare/r2/bucket.get.ts +13 -0
  368. package/src/cloudflare/r2/bucket.head.ts +11 -0
  369. package/src/cloudflare/r2/bucket.list.ts +12 -0
  370. package/src/cloudflare/r2/bucket.multipart.ts +55 -0
  371. package/src/cloudflare/r2/bucket.provider.ts +83 -0
  372. package/src/cloudflare/r2/bucket.put.ts +17 -0
  373. package/src/cloudflare/r2/bucket.ts +38 -0
  374. package/src/cloudflare/r2/index.ts +9 -0
  375. package/src/cloudflare/stream.ts +21 -0
  376. package/src/cloudflare/worker/assets.fetch.ts +27 -0
  377. package/src/cloudflare/worker/assets.provider.ts +249 -0
  378. package/src/cloudflare/worker/index.ts +6 -0
  379. package/src/cloudflare/worker/worker.handler.ts +39 -0
  380. package/src/cloudflare/worker/worker.provider.ts +246 -0
  381. package/src/cloudflare/worker/worker.serve.ts +19 -0
  382. package/src/cloudflare/worker/worker.ts +76 -0
  383. package/src/destroy.ts +6 -3
  384. package/src/dot-alchemy.ts +3 -2
  385. package/src/esbuild.ts +98 -0
  386. package/src/index.ts +5 -4
  387. package/src/plan.ts +233 -120
  388. package/src/policy.ts +55 -2
  389. package/src/provider.ts +2 -2
  390. package/src/resource.ts +3 -2
  391. package/src/runtime.ts +1 -1
  392. package/src/schema.ts +102 -0
  393. package/src/sha256.ts +23 -0
  394. package/src/state.ts +3 -2
  395. package/src/tags.ts +38 -0
  396. package/src/test.ts +71 -0
  397. package/src/type.ts +2 -0
  398. package/lib/aws/lambda/function.client.d.ts +0 -8
  399. package/lib/aws/lambda/function.client.d.ts.map +0 -1
  400. package/lib/aws/lambda/function.client.js +0 -7
  401. package/lib/aws/lambda/function.client.js.map +0 -1
  402. package/lib/aws/sqs/queue.client.d.ts +0 -12
  403. package/lib/aws/sqs/queue.client.d.ts.map +0 -1
  404. package/lib/aws/sqs/queue.client.js.map +0 -1
  405. package/lib/cloudflare/kv.d.ts +0 -29
  406. package/lib/cloudflare/kv.d.ts.map +0 -1
  407. package/lib/cloudflare/kv.js +0 -3
  408. package/lib/cloudflare/kv.js.map +0 -1
  409. package/lib/cloudflare/kv.provider.d.ts +0 -4
  410. package/lib/cloudflare/kv.provider.d.ts.map +0 -1
  411. package/lib/cloudflare/kv.provider.js +0 -39
  412. package/lib/cloudflare/kv.provider.js.map +0 -1
  413. package/lib/cloudflare/worker.d.ts +0 -33
  414. package/lib/cloudflare/worker.d.ts.map +0 -1
  415. package/lib/cloudflare/worker.js +0 -4
  416. package/lib/cloudflare/worker.js.map +0 -1
  417. package/src/aws/lambda/function.client.ts +0 -14
  418. package/src/cloudflare/kv.provider.ts +0 -51
  419. package/src/cloudflare/kv.ts +0 -20
  420. package/src/cloudflare/worker.ts +0 -34
package/lib/type.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ export type type<T> = new () => T;
2
+ export declare const type: new <T>() => T;
3
+ //# sourceMappingURL=type.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type.d.ts","sourceRoot":"","sources":["../src/type.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,IAAI,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC;AAClC,eAAO,MAAM,IAAI,EAAe,KAAK,CAAC,OAAO,CAAC,CAAC"}
package/lib/type.js ADDED
@@ -0,0 +1,3 @@
1
+ export const type = class {
2
+ };
3
+ //# sourceMappingURL=type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type.js","sourceRoot":"","sources":["../src/type.ts"],"names":[],"mappings":"AACA,MAAM,CAAC,MAAM,IAAI,GAAG;CAA0B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "alchemy-effect",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "license": "Apache-2.0",
5
5
  "author": "Sam Goodwin <sam@alchemy.run>",
6
6
  "homepage": "https://alchemy.run",
@@ -23,7 +23,7 @@
23
23
  "build": "bun bundle && bun pm pack",
24
24
  "bundle": "tsdown",
25
25
  "bundle:watch": "tsdown --watch",
26
- "publish": "cp ../README.md . && bun publish && rm README.md"
26
+ "publish:npm": "cp ../README.md . && bun publish && rm README.md"
27
27
  },
28
28
  "exports": {
29
29
  ".": {
@@ -36,6 +36,16 @@
36
36
  "import": "./lib/aws/index.js",
37
37
  "types": "./lib/aws/index.d.ts"
38
38
  },
39
+ "./aws/dynamodb": {
40
+ "bun": "./src/aws/dynamodb/index.ts",
41
+ "import": "./lib/aws/dynamodb/index.js",
42
+ "types": "./lib/aws/dynamodb/index.d.ts"
43
+ },
44
+ "./aws/ec2": {
45
+ "bun": "./src/aws/ec2/index.ts",
46
+ "import": "./lib/aws/ec2/index.js",
47
+ "types": "./lib/aws/ec2/index.d.ts"
48
+ },
39
49
  "./aws/lambda": {
40
50
  "bun": "./src/aws/lambda/index.ts",
41
51
  "import": "./lib/aws/lambda/index.js",
@@ -61,14 +71,45 @@
61
71
  "import": "./lib/aws/credentials.js",
62
72
  "types": "./lib/aws/credentials.d.ts"
63
73
  },
74
+ "./cli": {
75
+ "bun": "./src/cli/index.ts",
76
+ "import": "./lib/cli/index.js",
77
+ "types": "./lib/cli/index.d.ts"
78
+ },
64
79
  "./cloudflare": {
65
80
  "bun": "./src/cloudflare/index.ts",
66
81
  "import": "./lib/cloudflare/index.js",
67
82
  "types": "./lib/cloudflare/index.d.ts"
83
+ },
84
+ "./cloudflare/live": {
85
+ "bun": "./src/cloudflare/live.ts",
86
+ "import": "./lib/cloudflare/live.js",
87
+ "types": "./lib/cloudflare/live.d.ts"
88
+ },
89
+ "./cloudflare/assets": {
90
+ "bun": "./src/cloudflare/worker/assets.fetch.ts",
91
+ "import": "./lib/cloudflare/worker/assets.fetch.js",
92
+ "types": "./lib/cloudflare/worker/assets.fetch.d.ts"
93
+ },
94
+ "./cloudflare/worker": {
95
+ "bun": "./src/cloudflare/worker/index.ts",
96
+ "import": "./lib/cloudflare/worker/index.js",
97
+ "types": "./lib/cloudflare/worker/index.d.ts"
98
+ },
99
+ "./cloudflare/kv": {
100
+ "bun": "./src/cloudflare/kv/index.ts",
101
+ "import": "./lib/cloudflare/kv/index.js",
102
+ "types": "./lib/cloudflare/kv/index.d.ts"
103
+ },
104
+ "./cloudflare/r2": {
105
+ "bun": "./src/cloudflare/r2/index.ts",
106
+ "import": "./lib/cloudflare/r2/index.js",
107
+ "types": "./lib/cloudflare/r2/index.d.ts"
68
108
  }
69
109
  },
70
110
  "dependencies": {
71
111
  "@aws-sdk/credential-providers": "^3.0.0",
112
+ "@effect/vitest": "^0.27.0",
72
113
  "@smithy/node-config-provider": "^4.0.0",
73
114
  "@smithy/shared-ini-file-loader": "^4.3.4",
74
115
  "@smithy/types": "^4.8.1",
@@ -77,12 +118,14 @@
77
118
  "cloudflare": "^5.2.0",
78
119
  "esbuild": "^0.25.12",
79
120
  "fast-xml-parser": "^5.2.5",
80
- "itty-aws": "0.4.1",
121
+ "ignore": "^7.0.5",
122
+ "itty-aws": "^0.6.1",
81
123
  "jszip": "^3.10.1",
82
124
  "yaml": "^2.0.0"
83
125
  },
84
126
  "devDependencies": {
85
127
  "@clack/prompts": "^0.11.0",
128
+ "@cloudflare/workers-types": "^4.20250805.0",
86
129
  "@effect/platform": "^0.92.1",
87
130
  "@effect/platform-node": "^0.98.3",
88
131
  "@types/aws-lambda": "^8.10.152",
@@ -92,6 +135,8 @@
92
135
  "effect": "^3.18.4",
93
136
  "ink": "^6.3.1",
94
137
  "react": "^19.2.0",
138
+ "react-devtools-core": "^7.0.1",
139
+ "tsconfig-paths": "^4.2.0",
95
140
  "tsdown": "^0.15.4"
96
141
  },
97
142
  "peerDependencies": {
package/src/app.ts CHANGED
@@ -3,13 +3,12 @@ import * as Data from "effect/Data";
3
3
  import * as Effect from "effect/Effect";
4
4
  import * as Layer from "effect/Layer";
5
5
 
6
- export class App extends Context.Tag("App")<
7
- App,
8
- {
9
- name: string;
10
- stage: string;
11
- }
12
- >() {}
6
+ export interface AppProps {
7
+ name: string;
8
+ stage: string;
9
+ }
10
+
11
+ export class App extends Context.Tag("App")<App, AppProps>() {}
13
12
 
14
13
  export class FailedToParseArg extends Data.TaggedError("FailedToParseArg")<{
15
14
  message: string;
@@ -41,3 +40,5 @@ export const fromArgs = Layer.effect(
41
40
 
42
41
  export const app = (input: { name: string; stage: string }) =>
43
42
  Layer.succeed(App, App.of(input));
43
+
44
+ export const make = app;
package/src/apply.ts CHANGED
@@ -5,8 +5,17 @@ import type { Simplify } from "effect/Types";
5
5
  import { PlanReviewer, type PlanRejected } from "./approve.ts";
6
6
  import type { AnyBinding, BindingService } from "./binding.ts";
7
7
  import type { ApplyEvent, ApplyStatus } from "./event.ts";
8
- import { type BindNode, type CRUD, type Delete, type Plan } from "./plan.ts";
8
+ import {
9
+ plan,
10
+ type BindNode,
11
+ type Create,
12
+ type CRUD,
13
+ type Delete,
14
+ type Plan,
15
+ type Update,
16
+ } from "./plan.ts";
9
17
  import type { Resource } from "./resource.ts";
18
+ import type { Service } from "./service.ts";
10
19
  import { State } from "./state.ts";
11
20
 
12
21
  export interface PlanStatusSession {
@@ -25,7 +34,34 @@ export class PlanStatusReporter extends Context.Tag("PlanStatusReporter")<
25
34
  }
26
35
  >() {}
27
36
 
28
- export const apply = <P extends Plan, Err, Req>(
37
+ export const apply: typeof applyPlan &
38
+ typeof applyResources &
39
+ typeof applyResourcesPhase = (...args: any[]): any =>
40
+ Effect.isEffect(args[0])
41
+ ? applyPlan(args[0] as any)
42
+ : args.length === 1 && "phase" in args[0]
43
+ ? applyResourcesPhase(args[0])
44
+ : applyResources(...args);
45
+
46
+ export const applyResourcesPhase = <
47
+ const Phase extends "update" | "destroy",
48
+ const Resources extends (Service | Resource)[],
49
+ >(props: {
50
+ resources: Resources;
51
+ phase: Phase;
52
+ }) => applyPlan(plan(props));
53
+
54
+ export const applyResources = <const Resources extends (Service | Resource)[]>(
55
+ ...resources: Resources
56
+ ) =>
57
+ applyPlan(
58
+ plan({
59
+ phase: "update",
60
+ resources,
61
+ }),
62
+ );
63
+
64
+ export const applyPlan = <P extends Plan, Err, Req>(
29
65
  plan: Effect.Effect<P, Err, Req>,
30
66
  ) =>
31
67
  plan.pipe(
@@ -49,48 +85,137 @@ export const apply = <P extends Plan, Err, Req>(
49
85
  } satisfies PlanStatusSession);
50
86
  const { emit, done } = session;
51
87
 
52
- const applyBindings = Effect.fn(function* (
53
- resource: Resource,
54
- bindings: BindNode[],
88
+ const constOrEffect = <T, Err = never, Req = never>(
89
+ effect: T | Effect.Effect<T>,
90
+ ): Effect.Effect<T, Err, Req> =>
91
+ Effect.isEffect(effect) ? effect : Effect.succeed(effect);
92
+
93
+ const resolveBindingUpstream = Effect.fn(function* ({
94
+ node,
95
+ resource,
96
+ }: {
97
+ node: BindNode;
98
+ resource: Resource;
99
+ }) {
100
+ const binding = node.binding as AnyBinding & {
101
+ // smuggled property (because it interacts poorly with inference)
102
+ Tag: Context.Tag<never, BindingService>;
103
+ };
104
+ const provider = yield* binding.Tag;
105
+
106
+ const resourceId: string = node.binding.capability.resource.id;
107
+ const upstreamNode = plan.resources[resourceId];
108
+ const upstreamAttr = resource
109
+ ? yield* apply(upstreamNode)
110
+ : yield* Effect.dieMessage(`Resource ${resourceId} not found`);
111
+
112
+ return {
113
+ resourceId,
114
+ upstreamAttr,
115
+ upstreamNode,
116
+ provider,
117
+ };
118
+ });
119
+
120
+ const attachBindings = ({
121
+ resource,
122
+ bindings,
123
+ target,
124
+ }: {
125
+ resource: Resource;
126
+ bindings: BindNode[];
55
127
  target: {
56
128
  id: string;
57
129
  props: any;
58
130
  attr: any;
59
- },
60
- ) {
61
- return yield* Effect.all(
131
+ };
132
+ }) =>
133
+ Effect.all(
62
134
  bindings.map(
63
135
  Effect.fn(function* (node) {
64
- const binding = node.binding as AnyBinding & {
65
- // smuggled property (because it interacts poorly with inference)
66
- Tag: Context.Tag<never, BindingService>;
67
- };
68
- const provider = yield* binding.Tag;
69
-
70
- const resourceId: string = node.binding.capability.resource.id;
71
- const upstreamNode = plan.resources[resourceId];
72
- const upstreamAttr = resource
73
- ? yield* apply(upstreamNode)
74
- : yield* Effect.dieMessage(
75
- `Resource ${resourceId} not found`,
76
- );
136
+ const { resourceId, upstreamAttr, upstreamNode, provider } =
137
+ yield* resolveBindingUpstream({ node, resource });
77
138
 
78
- const attach = provider.attach({
139
+ const input = {
79
140
  source: {
80
141
  id: resourceId,
81
142
  attr: upstreamAttr,
82
143
  props: upstreamNode.resource.props,
83
144
  },
84
145
  props: node.binding.props,
146
+ attr: node.attr,
85
147
  target,
86
- });
87
- return Effect.isEffect(attach)
88
- ? yield* attach as Effect.Effect<any, never, never>
89
- : attach;
148
+ } as const;
149
+ if (node.action === "attach") {
150
+ return yield* constOrEffect(provider.attach(input));
151
+ } else if (node.action === "reattach") {
152
+ // reattach is optional, we fall back to attach if it's not available
153
+ return yield* constOrEffect(
154
+ (provider.reattach ? provider.reattach : provider.attach)(
155
+ input,
156
+ ),
157
+ );
158
+ } else if (node.action === "detach" && provider.detach) {
159
+ return yield* constOrEffect(
160
+ provider.detach({
161
+ ...input,
162
+ target,
163
+ }),
164
+ );
165
+ }
166
+ return node.attr;
167
+ }),
168
+ ),
169
+ );
170
+
171
+ const postAttachBindings = ({
172
+ bindings,
173
+ bindingOutputs,
174
+ resource,
175
+ target,
176
+ }: {
177
+ bindings: BindNode[];
178
+ bindingOutputs: any[];
179
+ resource: Resource;
180
+ target: {
181
+ id: string;
182
+ props: any;
183
+ attr: any;
184
+ };
185
+ }) =>
186
+ Effect.all(
187
+ bindings.map(
188
+ Effect.fn(function* (node, i) {
189
+ const { resourceId, upstreamAttr, upstreamNode, provider } =
190
+ yield* resolveBindingUpstream({ node, resource });
191
+
192
+ const oldBindingOutput = bindingOutputs[i];
193
+
194
+ if (
195
+ provider.postattach &&
196
+ (node.action === "attach" || node.action === "reattach")
197
+ ) {
198
+ const bindingOutput = yield* constOrEffect(
199
+ provider.postattach({
200
+ source: {
201
+ id: resourceId,
202
+ attr: upstreamAttr,
203
+ props: upstreamNode.resource.props,
204
+ },
205
+ props: node.binding.props,
206
+ attr: oldBindingOutput,
207
+ target,
208
+ } as const),
209
+ );
210
+ return {
211
+ ...oldBindingOutput,
212
+ ...bindingOutput,
213
+ };
214
+ }
215
+ return oldBindingOutput;
90
216
  }),
91
217
  ),
92
218
  );
93
- });
94
219
 
95
220
  const apply: (node: CRUD) => Effect.Effect<any, never, never> = (
96
221
  node,
@@ -98,21 +223,25 @@ export const apply = <P extends Plan, Err, Req>(
98
223
  Effect.gen(function* () {
99
224
  const checkpoint = <Out, Err>(
100
225
  effect: Effect.Effect<Out, Err, never>,
101
- ) =>
102
- effect.pipe(
103
- Effect.flatMap((output) =>
104
- state
105
- .set(node.resource.id, {
106
- id: node.resource.id,
107
- type: node.resource.type,
108
- status: node.action === "create" ? "created" : "updated",
109
- props: node.resource.props,
110
- output,
111
- bindings: node.bindings,
112
- })
113
- .pipe(Effect.map(() => output)),
114
- ),
115
- );
226
+ ) => effect.pipe(Effect.flatMap((output) => saveState({ output })));
227
+
228
+ const saveState = <Output>({
229
+ output,
230
+ bindings = node.bindings,
231
+ }: {
232
+ output: Output;
233
+ bindings?: BindNode[];
234
+ }) =>
235
+ state
236
+ .set(node.resource.id, {
237
+ id: node.resource.id,
238
+ type: node.resource.type,
239
+ status: node.action === "create" ? "created" : "updated",
240
+ props: node.resource.props,
241
+ output,
242
+ bindings,
243
+ })
244
+ .pipe(Effect.map(() => output));
116
245
 
117
246
  const id = node.resource.id;
118
247
  const resource = node.resource;
@@ -137,71 +266,101 @@ export const apply = <P extends Plan, Err, Req>(
137
266
  status,
138
267
  });
139
268
 
140
- if (node.action === "noop") {
141
- return (yield* state.get(id))?.output;
142
- } else if (node.action === "create") {
143
- let attr: any;
144
- if (node.provider.stub) {
145
- // stub the resource prior to resolving upstream resources or bindings if a stub is available
146
- attr = yield* node.provider.stub({
147
- id,
148
- news: node.news,
149
- session: scopedSession,
150
- });
151
- }
269
+ const createOrUpdate = Effect.fn(function* ({
270
+ node,
271
+ attr,
272
+ phase,
273
+ }: {
274
+ node: Create<Resource> | Update<Resource>;
275
+ attr: any;
276
+ phase: "create" | "update";
277
+ }) {
278
+ yield* report(phase === "create" ? "creating" : "updating");
152
279
 
153
- const bindings = yield* applyBindings(
280
+ let bindingOutputs = yield* attachBindings({
154
281
  resource,
155
- node.bindings,
156
- {
282
+ bindings: node.bindings,
283
+ target: {
157
284
  id,
158
285
  props: node.news,
159
286
  attr,
160
287
  },
161
- );
288
+ });
162
289
 
163
- yield* report("creating");
290
+ const output: any = yield* (
291
+ phase === "create"
292
+ ? node.provider.create
293
+ : node.provider.update
294
+ )({
295
+ id,
296
+ news: node.news,
297
+ bindings: bindingOutputs,
298
+ session: scopedSession,
299
+ ...(node.action === "update"
300
+ ? {
301
+ output: node.output,
302
+ olds: node.olds,
303
+ }
304
+ : {}),
305
+ }).pipe(
306
+ // TODO(sam): partial checkpoints
307
+ // checkpoint,
308
+ Effect.tap(() =>
309
+ report(phase === "create" ? "created" : "updated"),
310
+ ),
311
+ );
164
312
 
165
- return yield* node.provider
166
- .create({
167
- id,
168
- news: node.news,
169
- bindings,
170
- session: scopedSession,
171
- })
172
- .pipe(
173
- checkpoint,
174
- Effect.tap(() => report("created")),
175
- );
176
- } else if (node.action === "update") {
177
- const bindings = yield* applyBindings(
313
+ bindingOutputs = yield* postAttachBindings({
178
314
  resource,
179
- node.bindings,
180
- {
315
+ bindings: node.bindings,
316
+ bindingOutputs,
317
+ target: {
181
318
  id,
182
319
  props: node.news,
183
- attr: node.attributes,
320
+ attr,
184
321
  },
185
- );
322
+ });
186
323
 
187
- yield* report("updating");
324
+ yield* saveState({
325
+ output,
326
+ bindings: node.bindings.map((binding, i) => ({
327
+ ...binding,
328
+ attr: bindingOutputs[i],
329
+ })),
330
+ });
188
331
 
189
- // const bindings = yield* applyDependencies(node.bindings);
332
+ return output;
333
+ });
190
334
 
191
- return yield* node.provider
192
- .update({
335
+ if (node.action === "noop") {
336
+ return (yield* state.get(id))?.output;
337
+ } else if (node.action === "create") {
338
+ let attr: any;
339
+ if (node.provider.precreate) {
340
+ yield* Effect.logDebug("precreate", id);
341
+ // stub the resource prior to resolving upstream resources or bindings if a stub is available
342
+ attr = yield* node.provider.precreate({
193
343
  id,
194
344
  news: node.news,
195
- olds: node.olds,
196
- output: node.output,
197
- bindings,
198
345
  session: scopedSession,
199
- })
200
- .pipe(
201
- checkpoint,
202
- Effect.tap(() => report("updated")),
203
- );
346
+ });
347
+ }
348
+
349
+ yield* Effect.logDebug("create", id);
350
+ return yield* createOrUpdate({
351
+ node,
352
+ attr,
353
+ phase: "create",
354
+ });
355
+ } else if (node.action === "update") {
356
+ yield* Effect.logDebug("update", id);
357
+ return yield* createOrUpdate({
358
+ node,
359
+ attr: node.attributes,
360
+ phase: "update",
361
+ });
204
362
  } else if (node.action === "delete") {
363
+ yield* Effect.logDebug("delete", id);
205
364
  yield* Effect.all(
206
365
  node.downstream.map((dep) =>
207
366
  dep in plan.resources
@@ -246,15 +405,15 @@ export const apply = <P extends Plan, Err, Req>(
246
405
  id,
247
406
  news: node.news,
248
407
  // TODO(sam): these need to only include attach actions
249
- bindings: yield* applyBindings(
408
+ bindings: yield* attachBindings({
250
409
  resource,
251
- node.bindings,
252
- {
410
+ bindings: node.bindings,
411
+ target: {
253
412
  id,
254
413
  props: node.news,
255
414
  attr: node.attributes,
256
415
  },
257
- ),
416
+ }),
258
417
  session: scopedSession,
259
418
  })
260
419
  // TODO(sam): delete and create will conflict here, we need to extend the state store for replace
@@ -265,7 +424,6 @@ export const apply = <P extends Plan, Err, Req>(
265
424
  );
266
425
  });
267
426
  if (!node.deleteFirst) {
268
- const outputs = yield* create;
269
427
  yield* destroy;
270
428
  return outputs;
271
429
  } else {
@@ -11,14 +11,16 @@ export class FailedToGetAccount extends Data.TaggedError(
11
11
  cause: Error;
12
12
  }> {}
13
13
 
14
- export class AccountID extends Context.Tag("AWS::AccountID")<
15
- AccountID,
16
- string
14
+ export type AccountID = string;
15
+
16
+ export class Account extends Context.Tag("AWS::AccountID")<
17
+ Account,
18
+ AccountID
17
19
  >() {}
18
20
 
19
21
  export const fromIdentity = () =>
20
22
  Layer.effect(
21
- AccountID,
23
+ Account,
22
24
  Effect.gen(function* () {
23
25
  const sts = yield* STS.STSClient;
24
26
  const identity = yield* sts.getCallerIdentity({}).pipe(
package/src/aws/arn.ts CHANGED
@@ -1,7 +1 @@
1
- import type * as Context from "effect/Context";
2
-
3
- export interface Arn<Self> {
4
- arn: Self;
5
- }
6
-
7
- export type Tag<Self, A extends string> = Context.Tag<Arn<Self>, A>;
1
+ export type Arn = string;
package/src/aws/client.ts CHANGED
@@ -1,6 +1,8 @@
1
+ import { LogLevel } from "effect";
1
2
  import type * as Context from "effect/Context";
2
3
  import * as Effect from "effect/Effect";
3
4
  import * as Layer from "effect/Layer";
5
+ import * as Logger from "effect/Logger";
4
6
  import * as Redacted from "effect/Redacted";
5
7
  import type { AWSClientConfig } from "itty-aws";
6
8
  import { Credentials } from "./credentials.ts";
@@ -19,7 +21,8 @@ export const createAWSServiceClientLayer =
19
21
  Effect.gen(function* () {
20
22
  const region = yield* Region;
21
23
  const credentials = yield* Credentials;
22
- return new clss({
24
+ //
25
+ const client = new clss({
23
26
  region,
24
27
  credentials: {
25
28
  accessKeyId: Redacted.value(credentials.accessKeyId),
@@ -29,5 +32,16 @@ export const createAWSServiceClientLayer =
29
32
  : undefined,
30
33
  },
31
34
  });
35
+ return new Proxy(client as any, {
36
+ get:
37
+ (target: any, prop) =>
38
+ (...args: any[]) =>
39
+ target[prop](...args).pipe(
40
+ // TODO(sam): make it easier to set log lever for a client
41
+ Logger.withMinimumLogLevel(
42
+ process.env.DEBUG ? LogLevel.Debug : LogLevel.Info,
43
+ ),
44
+ ),
45
+ });
32
46
  }),
33
47
  ) as Layer.Layer<TagInstance<Tag>, never, Region | Credentials>;
@@ -9,6 +9,7 @@ import {
9
9
  fromTokenFile as _fromTokenFile,
10
10
  fromWebToken as _fromWebToken,
11
11
  } from "@aws-sdk/credential-providers";
12
+
12
13
  import { FileSystem, HttpClient } from "@effect/platform";
13
14
  import * as ini from "@smithy/shared-ini-file-loader";
14
15
  import {