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
@@ -0,0 +1,177 @@
1
+ import {
2
+ Binding,
3
+ declare,
4
+ Policy,
5
+ toEnvKey,
6
+ type Capability,
7
+ type From,
8
+ } from "alchemy-effect";
9
+ import { Effect } from "effect";
10
+ import type { ReturnConsumedCapacity } from "itty-aws/dynamodb";
11
+ import { Function } from "../lambda/index.ts";
12
+ import { fromAttributeValue } from "./attribute-value.ts";
13
+ import { DynamoDBClient } from "./client.ts";
14
+ import type { Identifier } from "./expr.ts";
15
+ import type { ParseProjectionExpression } from "./projection.ts";
16
+ import { Table } from "./table.ts";
17
+
18
+ export interface GetItemConstraint<
19
+ LeadingKeys extends Policy.AnyOf<any> = Policy.AnyOf<any>,
20
+ Attributes extends Policy.AnyOf<any> = Policy.AnyOf<any>,
21
+ ReturnConsumedCapacity extends Policy.AnyOf<any> = Policy.AnyOf<any>,
22
+ > {
23
+ leadingKeys?: LeadingKeys;
24
+ attributes?: Attributes;
25
+ returnConsumedCapacity?: ReturnConsumedCapacity;
26
+ }
27
+
28
+ export interface GetItem<
29
+ T = unknown,
30
+ Constraint extends GetItemConstraint | unknown = unknown,
31
+ > extends Capability<"AWS.DynamoDB.GetItem", T, Constraint> {
32
+ Constructor: GetItem;
33
+ Reduce: GetItem<
34
+ this["resource"],
35
+ {
36
+ [k in keyof Capability.Constraint.Simplify<
37
+ this["constraint"]
38
+ >]: Capability.Constraint.Simplify<this["constraint"]>[k];
39
+ }
40
+ >;
41
+ }
42
+
43
+ export const GetItem = Binding<
44
+ <
45
+ T extends Table,
46
+ const LeadingKeys extends Policy.AnyOf<any> = Policy.AnyOf<string>,
47
+ const Attributes extends Policy.AnyOf<any> = never,
48
+ const ReturnConsumedCapacity extends Policy.AnyOf<any> = never,
49
+ >(
50
+ table: T,
51
+ constraint?: GetItemConstraint<
52
+ LeadingKeys,
53
+ Attributes,
54
+ ReturnConsumedCapacity
55
+ >,
56
+ ) => Binding<
57
+ Function,
58
+ GetItem<
59
+ From<T>,
60
+ Policy.Constraint<{
61
+ leadingKeys: LeadingKeys;
62
+ attributes: Attributes;
63
+ returnConsumedCapacity: ReturnConsumedCapacity;
64
+ }>
65
+ >
66
+ >
67
+ >(Function, "AWS.DynamoDB.GetItem");
68
+
69
+ // see: https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazondynamodb.html
70
+ export const getItem = <
71
+ T extends Table<string, any>,
72
+ const Key extends Table.Key<T>,
73
+ const ProjectionExpression extends string = never,
74
+ const Capacity extends ReturnConsumedCapacity = never,
75
+ >({
76
+ table,
77
+ key,
78
+ projectionExpression,
79
+ returnConsumedCapacity,
80
+ }: {
81
+ table: T;
82
+ key: Key;
83
+ projectionExpression?: ProjectionExpression;
84
+ returnConsumedCapacity?: Capacity;
85
+ }) =>
86
+ Effect.gen(function* () {
87
+ type Parsed = ParseProjectionExpression<ProjectionExpression>;
88
+ type Attributes = Extract<Parsed[number], Identifier>["name"];
89
+ type LeadingKeys = Extract<Key[T["props"]["partitionKey"]], string>;
90
+ type Constraint = Policy.Constraint<{
91
+ leadingKeys: Policy.AnyOf<LeadingKeys>;
92
+ attributes: Policy.AnyOf<Attributes>;
93
+ returnConsumedCapacity: Policy.AnyOf<Capacity>;
94
+ }>;
95
+ yield* declare<
96
+ GetItem<
97
+ From<T>,
98
+ {
99
+ [k in keyof Constraint]: Constraint[k];
100
+ }
101
+ >
102
+ >();
103
+ const tableNameEnv = toEnvKey(table.id, "TABLE_NAME");
104
+ const tableName = process.env[tableNameEnv];
105
+ if (!tableName) {
106
+ return yield* Effect.die(new Error(`${tableNameEnv} is not set`));
107
+ }
108
+ const ddb = yield* DynamoDBClient;
109
+ const { Item, ...rest } = yield* ddb.getItem({
110
+ TableName: tableName,
111
+ Key: {
112
+ [table.props.partitionKey]: {
113
+ S: (key as any)[table.props.partitionKey] as string,
114
+ },
115
+ ...(table.props.sortKey
116
+ ? {
117
+ [table.props.sortKey]: {
118
+ S: (key as any)[table.props.sortKey] as string,
119
+ },
120
+ }
121
+ : {}),
122
+ },
123
+ ProjectionExpression: projectionExpression,
124
+ ReturnConsumedCapacity: returnConsumedCapacity,
125
+ });
126
+
127
+ return {
128
+ ...rest,
129
+ Item: Item
130
+ ? (Object.fromEntries(
131
+ yield* Effect.promise(() =>
132
+ Promise.all(
133
+ Object.entries(Item!).map(async ([key, value]) => [
134
+ key,
135
+ await fromAttributeValue(value),
136
+ ]),
137
+ ),
138
+ ),
139
+ ) as InstanceType<T["props"]["items"]> & Key)
140
+ : undefined,
141
+ };
142
+ });
143
+
144
+ export const getItemFromLambdaFunction = () =>
145
+ GetItem.provider.succeed({
146
+ attach: ({ source: table, props }) => ({
147
+ env: {
148
+ [toEnvKey(table.id, "TABLE_NAME")]: table.attr.tableName,
149
+ [toEnvKey(table.id, "TABLE_ARN")]: table.attr.tableArn,
150
+ },
151
+ policyStatements: [
152
+ {
153
+ Sid: "GetItem",
154
+ Effect: "Allow",
155
+ Action: ["dynamodb:GetItem"],
156
+ Resource: [table.attr.tableArn],
157
+ Condition:
158
+ props?.leadingKeys ||
159
+ props?.attributes ||
160
+ props?.returnConsumedCapacity
161
+ ? {
162
+ // https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazondynamodb.html#amazondynamodb-dynamodb_LeadingKeys
163
+
164
+ // TODO(sam): add StringLike for prefixes, templates, etc.
165
+ "ForAllValues:StringEquals": {
166
+ "dynamodb:LeadingKeys": props.leadingKeys
167
+ ?.anyOf as string[],
168
+ "dynamodb:Attributes": props.attributes?.anyOf as string[],
169
+ "dynamodb:ReturnConsumedCapacity": props
170
+ .returnConsumedCapacity?.anyOf as string[],
171
+ },
172
+ }
173
+ : undefined,
174
+ },
175
+ ],
176
+ }),
177
+ });
@@ -0,0 +1,280 @@
1
+ import * as Data from "effect/Data";
2
+ import * as Effect from "effect/Effect";
3
+ import * as Layer from "effect/Layer";
4
+ import * as Schedule from "effect/Schedule";
5
+
6
+ import { App, type Provider, type ProviderService } from "alchemy-effect";
7
+ import type { TimeToLiveSpecification } from "itty-aws/dynamodb";
8
+ import { createTagger, hasTags } from "../../tags.ts";
9
+ import { Account } from "../account.ts";
10
+ import { Region } from "../region.ts";
11
+ import { isScalarAttributeType, toAttributeType } from "./attribute-value.ts";
12
+ import { DynamoDBClient } from "./client.ts";
13
+ import {
14
+ Table,
15
+ type AnyTable,
16
+ type TableAttrs,
17
+ type TableProps,
18
+ } from "./table.ts";
19
+
20
+ // we add an explict type to simplify the Layer type errors because the Table interface has a lot of type args
21
+ export const tableProvider = (): Layer.Layer<
22
+ Provider<AnyTable>,
23
+ any,
24
+ App | DynamoDBClient | Region | Account
25
+ > =>
26
+ Table.provider.effect(
27
+ // @ts-expect-error
28
+ Effect.gen(function* () {
29
+ const dynamodb = yield* DynamoDBClient;
30
+ const app = yield* App;
31
+ const region = yield* Region;
32
+ const accountId = yield* Account;
33
+
34
+ const createTableName = (id: string, props: TableProps) =>
35
+ props.tableName ?? `${app.name}-${id}-${app.stage}`;
36
+
37
+ const tagged = yield* createTagger();
38
+
39
+ const toKeySchema = (props: TableProps) => [
40
+ {
41
+ AttributeName: props.partitionKey as string,
42
+ KeyType: "HASH" as const,
43
+ },
44
+ ...(props.sortKey
45
+ ? [
46
+ {
47
+ AttributeName: props.sortKey as string,
48
+ KeyType: "RANGE" as const,
49
+ },
50
+ ]
51
+ : []),
52
+ ];
53
+
54
+ const toAttributeDefinitions = (props: TableProps) =>
55
+ Object.entries(props.attributes)
56
+ .flatMap(([name, schema]) => {
57
+ const type = toAttributeType(schema);
58
+ if (isScalarAttributeType(type)) {
59
+ // only scalars can be included in the attribute definitions
60
+ return [
61
+ {
62
+ AttributeName: name,
63
+ AttributeType: type,
64
+ } as const,
65
+ ];
66
+ } else {
67
+ return [];
68
+ }
69
+ })
70
+ .sort((a, b) => a.AttributeName.localeCompare(b.AttributeName));
71
+
72
+ const toAttributeDefinitionsMap = (props: TableProps) =>
73
+ Object.fromEntries(
74
+ toAttributeDefinitions(props).map(
75
+ (def) => [def.AttributeName, def.AttributeType] as const,
76
+ ),
77
+ );
78
+
79
+ const resolveTableIfOwned = (id: string, tableName: string) =>
80
+ // if it already exists, let's see if it contains tags indicating we (this app+stage) owns it
81
+ // that would indicate we are in a partial state and can safely take control
82
+ dynamodb.describeTable({ TableName: tableName }).pipe(
83
+ Effect.flatMap((r) =>
84
+ dynamodb
85
+ .listTagsOfResource({
86
+ ResourceArn: r.Table?.TableArn!,
87
+ })
88
+ .pipe(
89
+ Effect.map((tags) => [r, tags.Tags] as const),
90
+ Effect.flatMap(([r, tags]) => {
91
+ if (hasTags(tagged(id), tags)) {
92
+ return Effect.succeed(r.Table!);
93
+ }
94
+ return Effect.fail(
95
+ new Error("Table tags do not match expected values"),
96
+ );
97
+ }),
98
+ ),
99
+ ),
100
+ );
101
+
102
+ const updateTimeToLive = (
103
+ tableName: string,
104
+ timeToLiveSpecification: TimeToLiveSpecification,
105
+ ) =>
106
+ dynamodb
107
+ .updateTimeToLive({
108
+ TableName: tableName,
109
+ TimeToLiveSpecification: timeToLiveSpecification!,
110
+ })
111
+ .pipe(
112
+ Effect.retry({
113
+ while: (e) => e.name === "ResourceInUseException",
114
+ schedule: Schedule.exponential(100),
115
+ }),
116
+ );
117
+
118
+ return {
119
+ diff: Effect.fn(function* ({ id, news, olds }) {
120
+ const oldTableName = createTableName(id, olds);
121
+ const newTableName = createTableName(id, news);
122
+ if (oldTableName !== newTableName) {
123
+ // TODO(sam): if the name is hard-coded, REPLACE is impossible - we need a suffix
124
+ return { action: "replace" } as const;
125
+ }
126
+
127
+ if (
128
+ olds.partitionKey !== news.partitionKey ||
129
+ olds.sortKey !== news.sortKey
130
+ ) {
131
+ return { action: "replace" } as const;
132
+ }
133
+ const oldAttributeDefinitions = toAttributeDefinitionsMap(olds);
134
+ const newAttributeDefinitions = toAttributeDefinitionsMap(news);
135
+ for (const [name, type] of Object.entries(oldAttributeDefinitions)) {
136
+ // CloudFormation requires that editing an existing AttributeDefinition is a replace
137
+ if (newAttributeDefinitions[name] !== type) {
138
+ return { action: "replace" } as const;
139
+ }
140
+ }
141
+
142
+ // TODO(sam):
143
+ // Replacements:
144
+ // 1. if you change ImportSourceSpecification
145
+
146
+ return { action: "noop" } as const;
147
+ }),
148
+
149
+ create: Effect.fn(function* ({ id, news, session }) {
150
+ const tableName = createTableName(id, news);
151
+
152
+ const response = yield* dynamodb
153
+ .createTable({
154
+ TableName: tableName,
155
+ TableClass: news.tableClass,
156
+ KeySchema: toKeySchema(news),
157
+ AttributeDefinitions: toAttributeDefinitions(news),
158
+ BillingMode: news.billingMode ?? "PAY_PER_REQUEST",
159
+ SSESpecification: news.sseSpecification,
160
+ WarmThroughput: news.warmThroughput,
161
+ DeletionProtectionEnabled: news.deletionProtectionEnabled,
162
+ OnDemandThroughput: news.onDemandThroughput,
163
+ ProvisionedThroughput: news.provisionedThroughput,
164
+ // ResourcePolicy: (this should be determined by bindings maybe?)
165
+
166
+ // TODO(sam): this should come from Lambda.consume ?
167
+ // TODO(sam): that would require Lambda.consume mutates the Table declaration?
168
+ // StreamSpecification: news.streamSpecification,
169
+ Tags: [
170
+ { Key: "alchemy::app", Value: app.name },
171
+ { Key: "alchemy::stage", Value: app.stage },
172
+ { Key: "alchemy::id", Value: id },
173
+ ],
174
+ })
175
+ .pipe(
176
+ Effect.map((r) => r.TableDescription!),
177
+ Effect.retry({
178
+ while: (e) =>
179
+ e.name === "LimitExceededException" ||
180
+ e.name === "InternalServerError",
181
+ schedule: Schedule.exponential(100),
182
+ }),
183
+ Effect.catchTag("ResourceInUseException", () =>
184
+ resolveTableIfOwned(id, tableName),
185
+ ),
186
+ );
187
+
188
+ if (news.timeToLiveSpecification) {
189
+ yield* updateTimeToLive(tableName, news.timeToLiveSpecification);
190
+ }
191
+
192
+ yield* session.note(response.TableArn!);
193
+
194
+ return {
195
+ tableName,
196
+ tableId: response.TableId!,
197
+ tableArn: response.TableArn! as TableAttrs<TableProps>["tableArn"],
198
+ partitionKey: news.partitionKey,
199
+ sortKey: news.sortKey,
200
+ } satisfies TableAttrs<TableProps> as TableAttrs<any>;
201
+ }),
202
+
203
+ update: Effect.fn(function* ({ output, news, olds }) {
204
+ yield* dynamodb.updateTable({
205
+ TableName: output.tableName,
206
+ TableClass: news.tableClass,
207
+ AttributeDefinitions: toAttributeDefinitions(news),
208
+ BillingMode: news.billingMode ?? "PAY_PER_REQUEST",
209
+ SSESpecification: news.sseSpecification,
210
+ WarmThroughput: news.warmThroughput,
211
+ DeletionProtectionEnabled: news.deletionProtectionEnabled,
212
+ OnDemandThroughput: news.onDemandThroughput,
213
+ ProvisionedThroughput: news.provisionedThroughput,
214
+
215
+ //
216
+ // StreamSpecification: news.streamSpecification,
217
+ // TimeToLiveSpecification: news.timeToLiveSpecification,
218
+
219
+ // TODO(sam): GSIs
220
+ // GlobalSecondaryIndexUpdates
221
+
222
+ // TODO(sam): Global Tables
223
+ // MultiRegionConsistency: news.multiRegionConsistency,
224
+ // ReplicaUpdates: [{}]
225
+ // GlobalTableWitnessUpdates: [{Create}]
226
+ });
227
+
228
+ if (
229
+ news.timeToLiveSpecification &&
230
+ (news.timeToLiveSpecification.AttributeName !==
231
+ olds.timeToLiveSpecification?.AttributeName ||
232
+ news.timeToLiveSpecification?.Enabled !==
233
+ olds.timeToLiveSpecification?.Enabled)
234
+ ) {
235
+ // TODO(sam): can this run in parallel?
236
+ yield* updateTimeToLive(
237
+ output.tableName,
238
+ news.timeToLiveSpecification,
239
+ );
240
+ }
241
+
242
+ return output;
243
+ }),
244
+
245
+ delete: Effect.fn(function* ({ output }) {
246
+ yield* dynamodb
247
+ .deleteTable({
248
+ TableName: output.tableName,
249
+ })
250
+ .pipe(
251
+ Effect.timeout(1000),
252
+ Effect.catchTag("ResourceNotFoundException", () => Effect.void),
253
+ Effect.retry({
254
+ while: (e) =>
255
+ e._tag === "ResourceInUseException" ||
256
+ e._tag === "InternalServerError" ||
257
+ e._tag === "TimeoutException",
258
+ schedule: Schedule.fixed(100),
259
+ }),
260
+ );
261
+
262
+ class TableStillExists extends Data.TaggedError("TableStillExists") {}
263
+
264
+ while (true) {
265
+ const table = yield* dynamodb
266
+ .describeTable({
267
+ TableName: output.tableName,
268
+ })
269
+ .pipe(
270
+ Effect.catchTag("ResourceNotFoundException", () => Effect.void),
271
+ );
272
+
273
+ if (table === undefined) {
274
+ break;
275
+ }
276
+ }
277
+ }),
278
+ } satisfies ProviderService<Table<string, TableProps>>;
279
+ }),
280
+ );
@@ -0,0 +1,156 @@
1
+ import * as S from "effect/Schema";
2
+ import { Resource } from "../../resource.ts";
3
+ import type { type } from "../../type.ts";
4
+ import type { AccountID } from "../account.ts";
5
+ import type { RegionID } from "../region.ts";
6
+
7
+ import type * as DynamoDB from "itty-aws/dynamodb";
8
+
9
+ export interface TableProps<
10
+ Items = any,
11
+ Attributes extends AttributesSchema<
12
+ Items,
13
+ PartitionKey,
14
+ SortKey
15
+ > = AttributesSchema<Items, keyof Items, keyof Items | undefined>,
16
+ PartitionKey extends keyof Items = keyof Items,
17
+ SortKey extends keyof Items | undefined = keyof Items | undefined,
18
+ BillingMode extends DynamoDB.BillingMode = DynamoDB.BillingMode,
19
+ SSESpecification extends DynamoDB.SSESpecification | undefined =
20
+ | DynamoDB.SSESpecification
21
+ | undefined,
22
+ TimeToLiveSpecification extends
23
+ | DynamoDB.TimeToLiveSpecification
24
+ | undefined = DynamoDB.TimeToLiveSpecification | undefined,
25
+ WarmThroughput extends DynamoDB.WarmThroughput | undefined =
26
+ | DynamoDB.WarmThroughput
27
+ | undefined,
28
+ OnDemandThroughput extends DynamoDB.OnDemandThroughput | undefined =
29
+ | DynamoDB.OnDemandThroughput
30
+ | undefined,
31
+ ProvisionedThroughput extends DynamoDB.ProvisionedThroughput | undefined =
32
+ | DynamoDB.ProvisionedThroughput
33
+ | undefined,
34
+ TableClass extends DynamoDB.TableClass | undefined =
35
+ | DynamoDB.TableClass
36
+ | undefined,
37
+ > {
38
+ items: type<Items>;
39
+ tableName?: string;
40
+ attributes: Attributes;
41
+ partitionKey: PartitionKey;
42
+ sortKey?: SortKey;
43
+ billingMode?: BillingMode;
44
+ deletionProtectionEnabled?: boolean;
45
+ onDemandThroughput?: OnDemandThroughput;
46
+ provisionedThroughput?: ProvisionedThroughput;
47
+ sseSpecification?: SSESpecification;
48
+ timeToLiveSpecification?: TimeToLiveSpecification;
49
+ warmThroughput?: WarmThroughput;
50
+ tableClass?: TableClass;
51
+ }
52
+
53
+ export interface TableAttrs<Props extends TableProps> {
54
+ tableName: Props["tableName"] extends string ? Props["tableName"] : string;
55
+ tableId: string;
56
+ tableArn: `arn:aws:dynamodb:${RegionID}:${AccountID}:table/${this["tableName"]}`;
57
+ partitionKey: Props["partitionKey"];
58
+ sortKey: Props["sortKey"];
59
+ // etc...
60
+ }
61
+
62
+ export type AttributesSchema<
63
+ Items,
64
+ PartitionKey extends keyof Items,
65
+ SortKey extends keyof Items | undefined,
66
+ > = {
67
+ [k in PartitionKey | (SortKey extends undefined ? never : SortKey)]: S.Schema<
68
+ ToAttribute<Items[k]>
69
+ >;
70
+ };
71
+
72
+ export type ToAttribute<S> = S extends string
73
+ ? string
74
+ : S extends number
75
+ ? number
76
+ : S extends Uint8Array | Buffer | File | Blob
77
+ ? Uint8Array
78
+ : S;
79
+
80
+ export const Table = Resource<{
81
+ <
82
+ const ID extends string,
83
+ const Items,
84
+ const Attributes extends NoInfer<
85
+ AttributesSchema<Items, PartitionKey, SortKey>
86
+ >,
87
+ const PartitionKey extends keyof Items,
88
+ const SortKey extends keyof Items | undefined = undefined,
89
+ const BillingMode extends DynamoDB.BillingMode = "PAY_PER_REQUEST",
90
+ const SSESpecification extends
91
+ | DynamoDB.SSESpecification
92
+ | undefined = undefined,
93
+ const TimeToLiveSpecification extends
94
+ | DynamoDB.TimeToLiveSpecification
95
+ | undefined = undefined,
96
+ const WarmThroughput extends
97
+ | DynamoDB.WarmThroughput
98
+ | undefined = undefined,
99
+ const OnDemandThroughput extends
100
+ | DynamoDB.OnDemandThroughput
101
+ | undefined = undefined,
102
+ const ProvisionedThroughput extends
103
+ | DynamoDB.ProvisionedThroughput
104
+ | undefined = undefined,
105
+ const TableClass extends DynamoDB.TableClass | undefined = undefined,
106
+ >(
107
+ id: ID,
108
+ props: TableProps<
109
+ Items,
110
+ Attributes,
111
+ PartitionKey,
112
+ SortKey,
113
+ BillingMode,
114
+ SSESpecification,
115
+ TimeToLiveSpecification,
116
+ WarmThroughput,
117
+ OnDemandThroughput,
118
+ ProvisionedThroughput,
119
+ TableClass
120
+ >,
121
+ ): Table<
122
+ ID,
123
+ TableProps<
124
+ Items,
125
+ Attributes,
126
+ PartitionKey,
127
+ SortKey,
128
+ BillingMode,
129
+ SSESpecification,
130
+ TimeToLiveSpecification,
131
+ WarmThroughput,
132
+ OnDemandThroughput,
133
+ ProvisionedThroughput,
134
+ TableClass
135
+ >
136
+ >;
137
+ }>("AWS.DynamoDB.Table");
138
+
139
+ export interface AnyTable extends Table<string, any> {}
140
+
141
+ export interface Table<
142
+ ID extends string = string,
143
+ Props extends TableProps = TableProps,
144
+ > extends Resource<"AWS.DynamoDB.Table", ID, Props, TableAttrs<Props>> {}
145
+
146
+ export declare namespace Table {
147
+ export type PartitionKey<T extends Table> = T["props"]["partitionKey"];
148
+ export type SortKey<T extends Table> = T["props"]["sortKey"];
149
+ export type Key<T extends Table> = {
150
+ [K in PartitionKey<T>]: T["props"]["attributes"][K];
151
+ } & SortKey<T> extends infer S extends string
152
+ ? {
153
+ [K in S]: T["props"]["attributes"][K];
154
+ }
155
+ : {};
156
+ }
@@ -0,0 +1,20 @@
1
+ import * as Context from "effect/Context";
2
+ import * as Layer from "effect/Layer";
3
+
4
+ import { EC2 } from "itty-aws/ec2";
5
+ import { createAWSServiceClientLayer } from "../client.ts";
6
+ import * as Credentials from "../credentials.ts";
7
+ import * as Region from "../region.ts";
8
+
9
+ export class EC2Client extends Context.Tag("AWS.EC2.Client")<
10
+ EC2Client,
11
+ EC2
12
+ >() {}
13
+
14
+ export const client = createAWSServiceClientLayer<typeof EC2Client, EC2>(
15
+ EC2Client,
16
+ EC2,
17
+ );
18
+
19
+ export const clientFromEnv = () =>
20
+ Layer.provide(client(), Layer.merge(Credentials.fromEnv(), Region.fromEnv()));
@@ -0,0 +1,3 @@
1
+ export * from "./client.ts";
2
+ export * from "./vpc.provider.ts";
3
+ export * from "./vpc.ts";