alchemy-effect 0.1.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 (590) 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 +7 -15
  9. package/lib/app.d.ts.map +1 -1
  10. package/lib/app.js +1 -20
  11. package/lib/app.js.map +1 -1
  12. package/lib/apply.d.ts +15 -19
  13. package/lib/apply.d.ts.map +1 -1
  14. package/lib/apply.js +173 -82
  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 +13 -3
  21. package/lib/aws/account.d.ts.map +1 -1
  22. package/lib/aws/account.js +19 -4
  23. package/lib/aws/account.js.map +1 -1
  24. package/lib/aws/arn.d.ts +1 -5
  25. package/lib/aws/arn.d.ts.map +1 -1
  26. package/lib/aws/client.d.ts.map +1 -1
  27. package/lib/aws/client.js +8 -1
  28. package/lib/aws/client.js.map +1 -1
  29. package/lib/aws/config.d.ts +15 -0
  30. package/lib/aws/config.d.ts.map +1 -0
  31. package/lib/aws/config.js +1 -0
  32. package/lib/aws/config.js.map +1 -0
  33. package/lib/aws/credentials.d.ts +11 -1
  34. package/lib/aws/credentials.d.ts.map +1 -1
  35. package/lib/aws/credentials.js +73 -47
  36. package/lib/aws/credentials.js.map +1 -1
  37. package/lib/aws/dynamodb/attribute-value.d.ts +20 -0
  38. package/lib/aws/dynamodb/attribute-value.d.ts.map +1 -0
  39. package/lib/aws/dynamodb/attribute-value.js +217 -0
  40. package/lib/aws/dynamodb/attribute-value.js.map +1 -0
  41. package/lib/aws/dynamodb/client.d.ts +12 -0
  42. package/lib/aws/dynamodb/client.d.ts.map +1 -0
  43. package/lib/aws/{sqs/queue.client.js → dynamodb/client.js} +6 -6
  44. package/lib/aws/dynamodb/client.js.map +1 -0
  45. package/lib/aws/dynamodb/expr.d.ts +41 -0
  46. package/lib/aws/dynamodb/expr.d.ts.map +1 -0
  47. package/lib/aws/dynamodb/expr.js +1 -0
  48. package/lib/aws/dynamodb/expr.js.map +1 -0
  49. package/lib/aws/dynamodb/index.d.ts +10 -0
  50. package/lib/aws/dynamodb/index.d.ts.map +1 -0
  51. package/lib/aws/dynamodb/index.js +9 -0
  52. package/lib/aws/dynamodb/index.js.map +1 -0
  53. package/lib/aws/dynamodb/projection.d.ts +25 -0
  54. package/lib/aws/dynamodb/projection.d.ts.map +1 -0
  55. package/lib/aws/dynamodb/projection.js +1 -0
  56. package/lib/aws/dynamodb/projection.js.map +1 -0
  57. package/lib/aws/dynamodb/secondary-index.d.ts +26 -0
  58. package/lib/aws/dynamodb/secondary-index.d.ts.map +1 -0
  59. package/lib/aws/dynamodb/secondary-index.js +4 -0
  60. package/lib/aws/dynamodb/secondary-index.js.map +1 -0
  61. package/lib/aws/dynamodb/table.d.ts +59 -0
  62. package/lib/aws/dynamodb/table.d.ts.map +1 -0
  63. package/lib/aws/dynamodb/table.get-item.d.ts +57 -0
  64. package/lib/aws/dynamodb/table.get-item.d.ts.map +1 -0
  65. package/lib/aws/dynamodb/table.get-item.js +77 -0
  66. package/lib/aws/dynamodb/table.get-item.js.map +1 -0
  67. package/lib/aws/dynamodb/table.js +4 -0
  68. package/lib/aws/dynamodb/table.js.map +1 -0
  69. package/lib/aws/dynamodb/table.provider.d.ts +7 -0
  70. package/lib/aws/dynamodb/table.provider.d.ts.map +1 -0
  71. package/lib/aws/dynamodb/table.provider.js +187 -0
  72. package/lib/aws/dynamodb/table.provider.js.map +1 -0
  73. package/lib/aws/ec2/client.d.ts +12 -0
  74. package/lib/aws/ec2/client.d.ts.map +1 -0
  75. package/lib/aws/ec2/client.js +11 -0
  76. package/lib/aws/ec2/client.js.map +1 -0
  77. package/lib/aws/ec2/index.d.ts +7 -0
  78. package/lib/aws/ec2/index.d.ts.map +1 -0
  79. package/lib/aws/ec2/index.js +7 -0
  80. package/lib/aws/ec2/index.js.map +1 -0
  81. package/lib/aws/ec2/subnet.d.ts +175 -0
  82. package/lib/aws/ec2/subnet.d.ts.map +1 -0
  83. package/lib/aws/ec2/subnet.js +4 -0
  84. package/lib/aws/ec2/subnet.js.map +1 -0
  85. package/lib/aws/ec2/subnet.provider.d.ts +4 -0
  86. package/lib/aws/ec2/subnet.provider.d.ts.map +1 -0
  87. package/lib/aws/ec2/subnet.provider.js +250 -0
  88. package/lib/aws/ec2/subnet.provider.js.map +1 -0
  89. package/lib/aws/ec2/vpc.d.ts +135 -0
  90. package/lib/aws/ec2/vpc.d.ts.map +1 -0
  91. package/lib/aws/ec2/vpc.js +4 -0
  92. package/lib/aws/ec2/vpc.js.map +1 -0
  93. package/lib/aws/ec2/vpc.provider.d.ts +6 -0
  94. package/lib/aws/ec2/vpc.provider.d.ts.map +1 -0
  95. package/lib/aws/ec2/vpc.provider.js +183 -0
  96. package/lib/aws/ec2/vpc.provider.js.map +1 -0
  97. package/lib/aws/index.d.ts +23 -16
  98. package/lib/aws/index.d.ts.map +1 -1
  99. package/lib/aws/index.js +10 -18
  100. package/lib/aws/index.js.map +1 -1
  101. package/lib/aws/lambda/client.d.ts +8 -0
  102. package/lib/aws/lambda/client.d.ts.map +1 -0
  103. package/lib/aws/lambda/client.js +7 -0
  104. package/lib/aws/lambda/client.js.map +1 -0
  105. package/lib/aws/lambda/consume.d.ts +10 -11
  106. package/lib/aws/lambda/consume.d.ts.map +1 -1
  107. package/lib/aws/lambda/consume.js +3 -3
  108. package/lib/aws/lambda/consume.js.map +1 -1
  109. package/lib/aws/lambda/function.d.ts +18 -15
  110. package/lib/aws/lambda/function.d.ts.map +1 -1
  111. package/lib/aws/lambda/function.handler.d.ts +1 -1
  112. package/lib/aws/lambda/function.handler.d.ts.map +1 -1
  113. package/lib/aws/lambda/function.handler.js.map +1 -1
  114. package/lib/aws/lambda/function.invoke.d.ts +7 -5
  115. package/lib/aws/lambda/function.invoke.d.ts.map +1 -1
  116. package/lib/aws/lambda/function.invoke.js +5 -3
  117. package/lib/aws/lambda/function.invoke.js.map +1 -1
  118. package/lib/aws/lambda/function.js +1 -1
  119. package/lib/aws/lambda/function.js.map +1 -1
  120. package/lib/aws/lambda/function.provider.d.ts +6 -5
  121. package/lib/aws/lambda/function.provider.d.ts.map +1 -1
  122. package/lib/aws/lambda/function.provider.js +150 -58
  123. package/lib/aws/lambda/function.provider.js.map +1 -1
  124. package/lib/aws/lambda/index.d.ts +2 -2
  125. package/lib/aws/lambda/index.d.ts.map +1 -1
  126. package/lib/aws/lambda/index.js +2 -1
  127. package/lib/aws/lambda/index.js.map +1 -1
  128. package/lib/aws/lambda/serve.d.ts +2 -4
  129. package/lib/aws/lambda/serve.d.ts.map +1 -1
  130. package/lib/aws/lambda/serve.js.map +1 -1
  131. package/lib/aws/profile.d.ts +2 -2
  132. package/lib/aws/profile.d.ts.map +1 -1
  133. package/lib/aws/profile.js +1 -1
  134. package/lib/aws/profile.js.map +1 -1
  135. package/lib/aws/region.d.ts +14 -1
  136. package/lib/aws/region.d.ts.map +1 -1
  137. package/lib/aws/region.js +26 -1
  138. package/lib/aws/region.js.map +1 -1
  139. package/lib/aws/sqs/client.d.ts +12 -0
  140. package/lib/aws/sqs/client.d.ts.map +1 -0
  141. package/lib/aws/sqs/client.js +11 -0
  142. package/lib/aws/sqs/client.js.map +1 -0
  143. package/lib/aws/sqs/index.d.ts +3 -1
  144. package/lib/aws/sqs/index.d.ts.map +1 -1
  145. package/lib/aws/sqs/index.js +3 -1
  146. package/lib/aws/sqs/index.js.map +1 -1
  147. package/lib/aws/sqs/queue.consume.d.ts +1 -10
  148. package/lib/aws/sqs/queue.consume.d.ts.map +1 -1
  149. package/lib/aws/sqs/queue.consume.js +0 -19
  150. package/lib/aws/sqs/queue.consume.js.map +1 -1
  151. package/lib/aws/sqs/queue.d.ts +6 -12
  152. package/lib/aws/sqs/queue.d.ts.map +1 -1
  153. package/lib/aws/sqs/queue.event-source.d.ts +22 -0
  154. package/lib/aws/sqs/queue.event-source.d.ts.map +1 -0
  155. package/lib/aws/sqs/queue.event-source.js +130 -0
  156. package/lib/aws/sqs/queue.event-source.js.map +1 -0
  157. package/lib/aws/sqs/queue.js +1 -1
  158. package/lib/aws/sqs/queue.js.map +1 -1
  159. package/lib/aws/sqs/queue.provider.d.ts +5 -4
  160. package/lib/aws/sqs/queue.provider.d.ts.map +1 -1
  161. package/lib/aws/sqs/queue.provider.js +6 -6
  162. package/lib/aws/sqs/queue.provider.js.map +1 -1
  163. package/lib/aws/sqs/queue.send-message.d.ts +8 -6
  164. package/lib/aws/sqs/queue.send-message.d.ts.map +1 -1
  165. package/lib/aws/sqs/queue.send-message.js +6 -4
  166. package/lib/aws/sqs/queue.send-message.js.map +1 -1
  167. package/lib/binding.d.ts +74 -26
  168. package/lib/binding.d.ts.map +1 -1
  169. package/lib/binding.js.map +1 -1
  170. package/lib/capability.d.ts +38 -0
  171. package/lib/capability.d.ts.map +1 -1
  172. package/lib/cli/components/ApprovePlan.d.ts +2 -2
  173. package/lib/cli/components/ApprovePlan.d.ts.map +1 -1
  174. package/lib/cli/components/ApprovePlan.js.map +1 -1
  175. package/lib/cli/components/Plan.d.ts +2 -2
  176. package/lib/cli/components/Plan.d.ts.map +1 -1
  177. package/lib/cli/components/Plan.js +3 -1
  178. package/lib/cli/components/Plan.js.map +1 -1
  179. package/lib/cli/components/PlanProgress.d.ts +8 -4
  180. package/lib/cli/components/PlanProgress.d.ts.map +1 -1
  181. package/lib/cli/components/PlanProgress.js +11 -1
  182. package/lib/cli/components/PlanProgress.js.map +1 -1
  183. package/lib/cli/index.d.ts +342 -213
  184. package/lib/cli/index.d.ts.map +1 -1
  185. package/lib/cli/index.js +26047 -11403
  186. package/lib/cli/index.js.map +1 -1
  187. package/lib/cli/ink-service.d.ts +4 -0
  188. package/lib/cli/ink-service.d.ts.map +1 -0
  189. package/lib/cli/ink-service.js +43 -0
  190. package/lib/cli/ink-service.js.map +1 -0
  191. package/lib/cli/service.d.ts +21 -0
  192. package/lib/cli/service.d.ts.map +1 -0
  193. package/lib/cli/service.js +5 -0
  194. package/lib/cli/service.js.map +1 -0
  195. package/lib/cloudflare/account.d.ts +10 -0
  196. package/lib/cloudflare/account.d.ts.map +1 -0
  197. package/lib/cloudflare/account.js +24 -0
  198. package/lib/cloudflare/account.js.map +1 -0
  199. package/lib/cloudflare/api.d.ts +31 -19
  200. package/lib/cloudflare/api.d.ts.map +1 -1
  201. package/lib/cloudflare/api.js +95 -29
  202. package/lib/cloudflare/api.js.map +1 -1
  203. package/lib/cloudflare/config.d.ts +9 -0
  204. package/lib/cloudflare/config.d.ts.map +1 -0
  205. package/lib/cloudflare/config.js +1 -0
  206. package/lib/cloudflare/config.js.map +1 -0
  207. package/lib/cloudflare/context.d.ts +27 -0
  208. package/lib/cloudflare/context.d.ts.map +1 -0
  209. package/lib/cloudflare/context.js +24 -0
  210. package/lib/cloudflare/context.js.map +1 -0
  211. package/lib/cloudflare/index.d.ts +7 -4
  212. package/lib/cloudflare/index.d.ts.map +1 -1
  213. package/lib/cloudflare/index.js +7 -4
  214. package/lib/cloudflare/index.js.map +1 -1
  215. package/lib/cloudflare/kv/index.d.ts +4 -0
  216. package/lib/cloudflare/kv/index.d.ts.map +1 -0
  217. package/lib/cloudflare/kv/index.js +4 -0
  218. package/lib/cloudflare/kv/index.js.map +1 -0
  219. package/lib/cloudflare/kv/namespace.binding.d.ts +10 -0
  220. package/lib/cloudflare/kv/namespace.binding.d.ts.map +1 -0
  221. package/lib/cloudflare/kv/namespace.binding.js +15 -0
  222. package/lib/cloudflare/kv/namespace.binding.js.map +1 -0
  223. package/lib/cloudflare/kv/namespace.client.d.ts +11 -0
  224. package/lib/cloudflare/kv/namespace.client.d.ts.map +1 -0
  225. package/lib/cloudflare/kv/namespace.client.js +31 -0
  226. package/lib/cloudflare/kv/namespace.client.js.map +1 -0
  227. package/lib/cloudflare/kv/namespace.d.ts +24 -0
  228. package/lib/cloudflare/kv/namespace.d.ts.map +1 -0
  229. package/lib/cloudflare/kv/namespace.js +3 -0
  230. package/lib/cloudflare/kv/namespace.js.map +1 -0
  231. package/lib/cloudflare/kv/namespace.provider.d.ts +6 -0
  232. package/lib/cloudflare/kv/namespace.provider.d.ts.map +1 -0
  233. package/lib/cloudflare/kv/namespace.provider.js +81 -0
  234. package/lib/cloudflare/kv/namespace.provider.js.map +1 -0
  235. package/lib/cloudflare/live.d.ts +11 -0
  236. package/lib/cloudflare/live.d.ts.map +1 -0
  237. package/lib/cloudflare/live.js +15 -0
  238. package/lib/cloudflare/live.js.map +1 -0
  239. package/lib/cloudflare/r2/bucket.binding.d.ts +10 -0
  240. package/lib/cloudflare/r2/bucket.binding.d.ts.map +1 -0
  241. package/lib/cloudflare/r2/bucket.binding.js +18 -0
  242. package/lib/cloudflare/r2/bucket.binding.js.map +1 -0
  243. package/lib/cloudflare/r2/bucket.client.d.ts +8 -0
  244. package/lib/cloudflare/r2/bucket.client.d.ts.map +1 -0
  245. package/lib/cloudflare/r2/bucket.client.js +9 -0
  246. package/lib/cloudflare/r2/bucket.client.js.map +1 -0
  247. package/lib/cloudflare/r2/bucket.d.ts +33 -0
  248. package/lib/cloudflare/r2/bucket.d.ts.map +1 -0
  249. package/lib/cloudflare/r2/bucket.del.d.ts +4 -0
  250. package/lib/cloudflare/r2/bucket.del.d.ts.map +1 -0
  251. package/lib/cloudflare/r2/bucket.del.js +7 -0
  252. package/lib/cloudflare/r2/bucket.del.js.map +1 -0
  253. package/lib/cloudflare/r2/bucket.get.d.ts +5 -0
  254. package/lib/cloudflare/r2/bucket.get.d.ts.map +1 -0
  255. package/lib/cloudflare/r2/bucket.get.js +7 -0
  256. package/lib/cloudflare/r2/bucket.get.js.map +1 -0
  257. package/lib/cloudflare/r2/bucket.head.d.ts +4 -0
  258. package/lib/cloudflare/r2/bucket.head.d.ts.map +1 -0
  259. package/lib/cloudflare/r2/bucket.head.js +7 -0
  260. package/lib/cloudflare/r2/bucket.head.js.map +1 -0
  261. package/lib/cloudflare/r2/bucket.js +3 -0
  262. package/lib/cloudflare/r2/bucket.js.map +1 -0
  263. package/lib/cloudflare/r2/bucket.list.d.ts +5 -0
  264. package/lib/cloudflare/r2/bucket.list.d.ts.map +1 -0
  265. package/lib/cloudflare/r2/bucket.list.js +7 -0
  266. package/lib/cloudflare/r2/bucket.list.js.map +1 -0
  267. package/lib/cloudflare/r2/bucket.multipart.d.ts +19 -0
  268. package/lib/cloudflare/r2/bucket.multipart.d.ts.map +1 -0
  269. package/lib/cloudflare/r2/bucket.multipart.js +25 -0
  270. package/lib/cloudflare/r2/bucket.multipart.js.map +1 -0
  271. package/lib/cloudflare/r2/bucket.provider.d.ts +6 -0
  272. package/lib/cloudflare/r2/bucket.provider.d.ts.map +1 -0
  273. package/lib/cloudflare/r2/bucket.provider.js +67 -0
  274. package/lib/cloudflare/r2/bucket.provider.js.map +1 -0
  275. package/lib/cloudflare/r2/bucket.put.d.ts +6 -0
  276. package/lib/cloudflare/r2/bucket.put.d.ts.map +1 -0
  277. package/lib/cloudflare/r2/bucket.put.js +8 -0
  278. package/lib/cloudflare/r2/bucket.put.js.map +1 -0
  279. package/lib/cloudflare/r2/index.d.ts +10 -0
  280. package/lib/cloudflare/r2/index.d.ts.map +1 -0
  281. package/lib/cloudflare/r2/index.js +10 -0
  282. package/lib/cloudflare/r2/index.js.map +1 -0
  283. package/lib/cloudflare/stream.d.ts +10 -0
  284. package/lib/cloudflare/stream.d.ts.map +1 -0
  285. package/lib/cloudflare/stream.js +16 -0
  286. package/lib/cloudflare/stream.js.map +1 -0
  287. package/lib/cloudflare/worker/assets.fetch.d.ts +9 -0
  288. package/lib/cloudflare/worker/assets.fetch.d.ts.map +1 -0
  289. package/lib/cloudflare/worker/assets.fetch.js +12 -0
  290. package/lib/cloudflare/worker/assets.fetch.js.map +1 -0
  291. package/lib/cloudflare/worker/assets.provider.d.ts +66 -0
  292. package/lib/cloudflare/worker/assets.provider.d.ts.map +1 -0
  293. package/lib/cloudflare/worker/assets.provider.js +145 -0
  294. package/lib/cloudflare/worker/assets.provider.js.map +1 -0
  295. package/lib/cloudflare/worker/index.d.ts +5 -0
  296. package/lib/cloudflare/worker/index.d.ts.map +1 -0
  297. package/lib/cloudflare/worker/index.js +5 -0
  298. package/lib/cloudflare/worker/index.js.map +1 -0
  299. package/lib/cloudflare/worker/worker.d.ts +66 -0
  300. package/lib/cloudflare/worker/worker.d.ts.map +1 -0
  301. package/lib/cloudflare/worker/worker.handler.d.ts +11 -0
  302. package/lib/cloudflare/worker/worker.handler.d.ts.map +1 -0
  303. package/lib/cloudflare/worker/worker.handler.js +15 -0
  304. package/lib/cloudflare/worker/worker.handler.js.map +1 -0
  305. package/lib/cloudflare/worker/worker.js +4 -0
  306. package/lib/cloudflare/worker/worker.js.map +1 -0
  307. package/lib/cloudflare/worker/worker.provider.d.ts +11 -0
  308. package/lib/cloudflare/worker/worker.provider.d.ts.map +1 -0
  309. package/lib/cloudflare/worker/worker.provider.js +194 -0
  310. package/lib/cloudflare/worker/worker.provider.js.map +1 -0
  311. package/lib/cloudflare/worker/worker.serve.d.ts +39 -0
  312. package/lib/cloudflare/worker/worker.serve.d.ts.map +1 -0
  313. package/lib/cloudflare/worker/worker.serve.js +4 -0
  314. package/lib/cloudflare/worker/worker.serve.js.map +1 -0
  315. package/lib/data.d.ts +3 -0
  316. package/lib/data.d.ts.map +1 -0
  317. package/lib/data.js +8 -0
  318. package/lib/data.js.map +1 -0
  319. package/lib/destroy.d.ts +1 -3
  320. package/lib/destroy.d.ts.map +1 -1
  321. package/lib/destroy.js +2 -0
  322. package/lib/destroy.js.map +1 -1
  323. package/lib/diff.d.ts +16 -0
  324. package/lib/diff.d.ts.map +1 -0
  325. package/lib/diff.js +9 -0
  326. package/lib/diff.js.map +1 -0
  327. package/lib/dot-alchemy.d.ts +3 -2
  328. package/lib/dot-alchemy.d.ts.map +1 -1
  329. package/lib/dot-alchemy.js +3 -2
  330. package/lib/dot-alchemy.js.map +1 -1
  331. package/lib/env.d.ts +5 -0
  332. package/lib/env.d.ts.map +1 -1
  333. package/lib/env.js +15 -29
  334. package/lib/env.js.map +1 -1
  335. package/lib/esbuild.d.ts +28 -0
  336. package/lib/esbuild.d.ts.map +1 -0
  337. package/lib/esbuild.js +63 -0
  338. package/lib/esbuild.js.map +1 -0
  339. package/lib/exports.d.ts +9 -0
  340. package/lib/exports.d.ts.map +1 -0
  341. package/lib/exports.js +13 -0
  342. package/lib/exports.js.map +1 -0
  343. package/lib/index.d.ts +11 -5
  344. package/lib/index.d.ts.map +1 -1
  345. package/lib/index.js +11 -5
  346. package/lib/index.js.map +1 -1
  347. package/lib/input.d.ts +32 -0
  348. package/lib/input.d.ts.map +1 -0
  349. package/lib/input.js +1 -0
  350. package/lib/input.js.map +1 -0
  351. package/lib/output.d.ts +143 -0
  352. package/lib/output.d.ts.map +1 -0
  353. package/lib/output.js +269 -0
  354. package/lib/output.js.map +1 -0
  355. package/lib/plan.d.ts +59 -29
  356. package/lib/plan.d.ts.map +1 -1
  357. package/lib/plan.js +347 -169
  358. package/lib/plan.js.map +1 -1
  359. package/lib/policy.d.ts +22 -5
  360. package/lib/policy.d.ts.map +1 -1
  361. package/lib/policy.js +10 -2
  362. package/lib/policy.js.map +1 -1
  363. package/lib/provider.d.ts +16 -18
  364. package/lib/provider.d.ts.map +1 -1
  365. package/lib/ref.d.ts +14 -0
  366. package/lib/ref.d.ts.map +1 -0
  367. package/lib/ref.js +21 -0
  368. package/lib/ref.js.map +1 -0
  369. package/lib/resource.d.ts +13 -16
  370. package/lib/resource.d.ts.map +1 -1
  371. package/lib/resource.js +1 -0
  372. package/lib/resource.js.map +1 -1
  373. package/lib/runtime.d.ts +8 -7
  374. package/lib/runtime.d.ts.map +1 -1
  375. package/lib/runtime.js.map +1 -1
  376. package/lib/schema.d.ts +37 -0
  377. package/lib/schema.d.ts.map +1 -0
  378. package/lib/schema.js +61 -0
  379. package/lib/schema.js.map +1 -0
  380. package/lib/service.d.ts +9 -6
  381. package/lib/service.d.ts.map +1 -1
  382. package/lib/service.js.map +1 -1
  383. package/lib/sha256.d.ts +5 -0
  384. package/lib/sha256.d.ts.map +1 -0
  385. package/lib/sha256.js +16 -0
  386. package/lib/sha256.js.map +1 -0
  387. package/lib/stack.d.ts +60 -0
  388. package/lib/stack.d.ts.map +1 -0
  389. package/lib/stack.js +11 -0
  390. package/lib/stack.js.map +1 -0
  391. package/lib/stage.d.ts +39 -0
  392. package/lib/stage.d.ts.map +1 -0
  393. package/lib/stage.js +32 -0
  394. package/lib/stage.js.map +1 -0
  395. package/lib/state.d.ts +53 -11
  396. package/lib/state.d.ts.map +1 -1
  397. package/lib/state.js +33 -31
  398. package/lib/state.js.map +1 -1
  399. package/lib/tags.d.ts +17 -0
  400. package/lib/tags.d.ts.map +1 -0
  401. package/lib/tags.js +22 -0
  402. package/lib/tags.js.map +1 -0
  403. package/lib/test.d.ts +35 -0
  404. package/lib/test.d.ts.map +1 -0
  405. package/lib/test.js +68 -0
  406. package/lib/test.js.map +1 -0
  407. package/lib/tsconfig.test.tsbuildinfo +1 -0
  408. package/lib/type.d.ts +6 -0
  409. package/lib/type.d.ts.map +1 -0
  410. package/lib/type.js +3 -0
  411. package/lib/type.js.map +1 -0
  412. package/lib/unknown.d.ts +4 -0
  413. package/lib/unknown.d.ts.map +1 -0
  414. package/lib/unknown.js +4 -0
  415. package/lib/unknown.js.map +1 -0
  416. package/lib/user.d.ts +3 -0
  417. package/lib/user.d.ts.map +1 -0
  418. package/lib/user.js +3 -0
  419. package/lib/user.js.map +1 -0
  420. package/lib/util.d.ts +6 -0
  421. package/lib/util.d.ts.map +1 -0
  422. package/lib/util.js +9 -0
  423. package/lib/util.js.map +1 -0
  424. package/package.json +58 -7
  425. package/src/$.ts +17 -0
  426. package/src/app.ts +9 -37
  427. package/src/apply.ts +435 -289
  428. package/src/assert-never.ts +18 -0
  429. package/src/aws/account.ts +29 -7
  430. package/src/aws/arn.ts +1 -7
  431. package/src/aws/client.ts +14 -1
  432. package/src/aws/config.ts +16 -0
  433. package/src/aws/credentials.ts +213 -177
  434. package/src/aws/dynamodb/attribute-value.ts +240 -0
  435. package/src/aws/{sqs/queue.client.ts → dynamodb/client.ts} +9 -9
  436. package/src/aws/dynamodb/expr.ts +90 -0
  437. package/src/aws/dynamodb/index.ts +12 -0
  438. package/src/aws/dynamodb/projection.ts +159 -0
  439. package/src/aws/dynamodb/secondary-index.ts +45 -0
  440. package/src/aws/dynamodb/table.get-item.ts +173 -0
  441. package/src/aws/dynamodb/table.provider.ts +276 -0
  442. package/src/aws/dynamodb/table.ts +101 -0
  443. package/src/aws/ec2/client.ts +20 -0
  444. package/src/aws/ec2/index.ts +7 -0
  445. package/src/aws/ec2/subnet.provider.ts +358 -0
  446. package/src/aws/ec2/subnet.ts +213 -0
  447. package/src/aws/ec2/vpc.provider.ts +269 -0
  448. package/src/aws/ec2/vpc.ts +163 -0
  449. package/src/aws/index.ts +50 -45
  450. package/src/aws/lambda/client.ts +14 -0
  451. package/src/aws/lambda/consume.ts +8 -8
  452. package/src/aws/lambda/function.handler.ts +1 -1
  453. package/src/aws/lambda/function.invoke.ts +8 -4
  454. package/src/aws/lambda/function.provider.ts +208 -109
  455. package/src/aws/lambda/function.ts +21 -12
  456. package/src/aws/lambda/index.ts +3 -4
  457. package/src/aws/lambda/serve.ts +1 -1
  458. package/src/aws/profile.ts +1 -4
  459. package/src/aws/region.ts +43 -2
  460. package/src/aws/sqs/client.ts +20 -0
  461. package/src/aws/sqs/index.ts +4 -1
  462. package/src/aws/sqs/queue.consume.ts +1 -34
  463. package/src/aws/sqs/queue.event-source.ts +227 -0
  464. package/src/aws/sqs/queue.provider.ts +14 -7
  465. package/src/aws/sqs/queue.send-message.ts +7 -10
  466. package/src/aws/sqs/queue.ts +9 -4
  467. package/src/binding.ts +130 -34
  468. package/src/capability.ts +44 -0
  469. package/src/cli/components/ApprovePlan.tsx +2 -2
  470. package/src/cli/components/Plan.tsx +6 -3
  471. package/src/cli/components/PlanProgress.tsx +32 -14
  472. package/src/cli/index.ts +2 -6
  473. package/src/cli/ink-service.tsx +61 -0
  474. package/src/cli/service.ts +23 -0
  475. package/src/cloudflare/account.ts +37 -0
  476. package/src/cloudflare/api.ts +147 -63
  477. package/src/cloudflare/config.ts +7 -0
  478. package/src/cloudflare/context.ts +49 -0
  479. package/src/cloudflare/index.ts +8 -4
  480. package/src/cloudflare/kv/index.ts +3 -0
  481. package/src/cloudflare/kv/namespace.binding.ts +27 -0
  482. package/src/cloudflare/kv/namespace.client.ts +70 -0
  483. package/src/cloudflare/kv/namespace.provider.ts +100 -0
  484. package/src/cloudflare/kv/namespace.ts +30 -0
  485. package/src/cloudflare/live.ts +32 -0
  486. package/src/cloudflare/r2/bucket.binding.ts +29 -0
  487. package/src/cloudflare/r2/bucket.client.ts +22 -0
  488. package/src/cloudflare/r2/bucket.del.ts +11 -0
  489. package/src/cloudflare/r2/bucket.get.ts +13 -0
  490. package/src/cloudflare/r2/bucket.head.ts +11 -0
  491. package/src/cloudflare/r2/bucket.list.ts +12 -0
  492. package/src/cloudflare/r2/bucket.multipart.ts +55 -0
  493. package/src/cloudflare/r2/bucket.provider.ts +84 -0
  494. package/src/cloudflare/r2/bucket.put.ts +17 -0
  495. package/src/cloudflare/r2/bucket.ts +44 -0
  496. package/src/cloudflare/r2/index.ts +9 -0
  497. package/src/cloudflare/stream.ts +21 -0
  498. package/src/cloudflare/worker/assets.fetch.ts +29 -0
  499. package/src/cloudflare/worker/assets.provider.ts +249 -0
  500. package/src/cloudflare/worker/index.ts +4 -0
  501. package/src/cloudflare/worker/worker.handler.ts +39 -0
  502. package/src/cloudflare/worker/worker.provider.ts +249 -0
  503. package/src/cloudflare/worker/worker.serve.ts +22 -0
  504. package/src/cloudflare/worker/worker.ts +77 -0
  505. package/src/data.ts +18 -0
  506. package/src/destroy.ts +2 -3
  507. package/src/diff.ts +30 -0
  508. package/src/dot-alchemy.ts +3 -2
  509. package/src/env.ts +20 -32
  510. package/src/esbuild.ts +98 -0
  511. package/src/exports.ts +21 -0
  512. package/src/index.ts +12 -6
  513. package/src/input.ts +81 -0
  514. package/src/output.ts +518 -0
  515. package/src/plan.ts +544 -243
  516. package/src/policy.ts +58 -7
  517. package/src/provider.ts +27 -25
  518. package/src/ref.ts +48 -0
  519. package/src/resource.ts +23 -8
  520. package/src/runtime.ts +16 -9
  521. package/src/schema.ts +102 -0
  522. package/src/service.ts +11 -7
  523. package/src/sha256.ts +23 -0
  524. package/src/stack.ts +116 -0
  525. package/src/stage.ts +85 -0
  526. package/src/state.ts +141 -62
  527. package/src/tags.ts +38 -0
  528. package/src/test.ts +172 -0
  529. package/src/type.ts +6 -0
  530. package/src/unknown.ts +6 -0
  531. package/src/user.ts +4 -0
  532. package/src/util.ts +21 -0
  533. package/lib/approve.d.ts +0 -15
  534. package/lib/approve.d.ts.map +0 -1
  535. package/lib/approve.js +0 -7
  536. package/lib/approve.js.map +0 -1
  537. package/lib/aws/lambda/function.client.d.ts +0 -8
  538. package/lib/aws/lambda/function.client.d.ts.map +0 -1
  539. package/lib/aws/lambda/function.client.js +0 -7
  540. package/lib/aws/lambda/function.client.js.map +0 -1
  541. package/lib/aws/sqs/queue.client.d.ts +0 -12
  542. package/lib/aws/sqs/queue.client.d.ts.map +0 -1
  543. package/lib/aws/sqs/queue.client.js.map +0 -1
  544. package/lib/cli/approve.d.ts +0 -4
  545. package/lib/cli/approve.d.ts.map +0 -1
  546. package/lib/cli/approve.js +0 -18
  547. package/lib/cli/approve.js.map +0 -1
  548. package/lib/cli/clack.d.ts +0 -14
  549. package/lib/cli/clack.d.ts.map +0 -1
  550. package/lib/cli/clack.js +0 -12
  551. package/lib/cli/clack.js.map +0 -1
  552. package/lib/cli/main.d.ts +0 -2
  553. package/lib/cli/main.d.ts.map +0 -1
  554. package/lib/cli/main.js +0 -1
  555. package/lib/cli/main.js.map +0 -1
  556. package/lib/cli/plan.d.ts +0 -13
  557. package/lib/cli/plan.d.ts.map +0 -1
  558. package/lib/cli/plan.js +0 -1
  559. package/lib/cli/plan.js.map +0 -1
  560. package/lib/cli/progress.d.ts +0 -7
  561. package/lib/cli/progress.d.ts.map +0 -1
  562. package/lib/cli/progress.js +0 -29
  563. package/lib/cli/progress.js.map +0 -1
  564. package/lib/cli/spinner.d.ts +0 -2
  565. package/lib/cli/spinner.d.ts.map +0 -1
  566. package/lib/cli/spinner.js +0 -13
  567. package/lib/cli/spinner.js.map +0 -1
  568. package/lib/cloudflare/kv.d.ts +0 -29
  569. package/lib/cloudflare/kv.d.ts.map +0 -1
  570. package/lib/cloudflare/kv.js +0 -3
  571. package/lib/cloudflare/kv.js.map +0 -1
  572. package/lib/cloudflare/kv.provider.d.ts +0 -4
  573. package/lib/cloudflare/kv.provider.d.ts.map +0 -1
  574. package/lib/cloudflare/kv.provider.js +0 -39
  575. package/lib/cloudflare/kv.provider.js.map +0 -1
  576. package/lib/cloudflare/worker.d.ts +0 -33
  577. package/lib/cloudflare/worker.d.ts.map +0 -1
  578. package/lib/cloudflare/worker.js +0 -4
  579. package/lib/cloudflare/worker.js.map +0 -1
  580. package/src/approve.ts +0 -13
  581. package/src/aws/lambda/function.client.ts +0 -14
  582. package/src/cli/approve.tsx +0 -30
  583. package/src/cli/clack.ts +0 -22
  584. package/src/cli/main.ts +0 -0
  585. package/src/cli/plan.ts +0 -16
  586. package/src/cli/progress.tsx +0 -45
  587. package/src/cli/spinner.ts +0 -14
  588. package/src/cloudflare/kv.provider.ts +0 -51
  589. package/src/cloudflare/kv.ts +0 -20
  590. package/src/cloudflare/worker.ts +0 -34
package/src/policy.ts CHANGED
@@ -1,8 +1,9 @@
1
1
  import * as Context from "effect/Context";
2
2
  import * as Effect from "effect/Effect";
3
+ import * as S from "effect/Schema";
3
4
  import { type AnyBinding, type Bind } from "./binding.ts";
4
5
  import type { Capability } from "./capability.ts";
5
- import type { Runtime } from "./runtime.ts";
6
+ import type { IRuntime, Runtime } from "./runtime.ts";
6
7
 
7
8
  /**
8
9
  * A Policy binds a set of Capbilities (e.g SQS.SendMessage, SQS.Consume, etc.) to a
@@ -14,10 +15,11 @@ import type { Runtime } from "./runtime.ts";
14
15
  * A Policy is invariant over the set of Capabilities to ensure least-privilege.
15
16
  */
16
17
  export interface Policy<
17
- F extends Runtime,
18
+ F extends IRuntime,
18
19
  in out Capabilities,
19
20
  Tags = unknown,
20
21
  > {
22
+ readonly kind: "alchemy/Policy";
21
23
  readonly runtime: F;
22
24
  readonly tags: Tags[];
23
25
  readonly capabilities: Capabilities[];
@@ -26,12 +28,13 @@ export interface Policy<
26
28
  /** Add more Capabilities to a Policy */
27
29
  and<B extends AnyBinding[]>(
28
30
  ...bindings: B
29
- ): Policy<F, B[number]["capability"] | Capabilities, Tags>;
31
+ ): Policy<
32
+ F,
33
+ B[number]["capability"] | Capabilities,
34
+ BindingTags<B[number]> | Exclude<Tags, unknown>
35
+ >;
30
36
  }
31
37
 
32
- export type $<T> = Instance<T>;
33
- export const $ = Policy;
34
-
35
38
  type BindingTags<B extends AnyBinding> = B extends any
36
39
  ? Bind<B["runtime"], B["capability"], Extract<B["tag"], string>>
37
40
  : never;
@@ -46,7 +49,7 @@ export function Policy<B extends AnyBinding[]>(
46
49
  >;
47
50
  export function Policy(...bindings: AnyBinding[]): any {
48
51
  return {
49
- runtime: bindings[0]["runtime"],
52
+ runtime: bindings[0]?.["runtime"],
50
53
  capabilities: bindings.map((b) => b.capability),
51
54
  tags: bindings.map((b) => Context.Tag(b.tag as any)()),
52
55
  bindings,
@@ -57,6 +60,54 @@ export function Policy(...bindings: AnyBinding[]): any {
57
60
  };
58
61
  }
59
62
 
63
+ export namespace Policy {
64
+ export interface AnyOf<in out T> {
65
+ readonly anyOf: T[];
66
+ }
67
+ type Generalize<T> = T extends S.Schema<infer U> ? U : T;
68
+
69
+ export const anyOf = <const T>(...anyOf: T[]): AnyOf<Generalize<T>> => ({
70
+ anyOf: anyOf as Generalize<T>[],
71
+ });
72
+
73
+ export const join = <
74
+ const Strings extends readonly string[],
75
+ const Delimiter extends string,
76
+ >(
77
+ strings: Strings,
78
+ delimiter: Delimiter,
79
+ ) => strings.join(delimiter) as Join<Strings, Delimiter>;
80
+
81
+ type ___ = Join<string[], ",">;
82
+ type Join<
83
+ T extends readonly string[],
84
+ Delimiter extends string,
85
+ > = T extends readonly [infer First extends string]
86
+ ? First
87
+ : T extends readonly [
88
+ infer First extends string,
89
+ ...infer Rest extends readonly string[],
90
+ ]
91
+ ? `${First}${Delimiter}${Join<Rest, Delimiter>}`
92
+ : T extends string[]
93
+ ? string
94
+ : "";
95
+
96
+ export type Constraint<T> = Pick<
97
+ T,
98
+ {
99
+ [k in keyof T]: T[k] extends never
100
+ ? never
101
+ : T[k] extends AnyOf<never>
102
+ ? never
103
+ : k;
104
+ }[keyof T]
105
+ >;
106
+
107
+ // TODO(sam): one day we might infer policies using a compiler plugin, this is a placeholder
108
+ export const infer = <T>(): T => undefined!;
109
+ }
110
+
60
111
  /** declare a Policy requiring Capabilities in some context */
61
112
  export const declare = <S extends Capability>() =>
62
113
  Effect.gen(function* () {}) as Effect.Effect<void, never, S>;
package/src/provider.ts CHANGED
@@ -1,39 +1,39 @@
1
1
  import * as Context from "effect/Context";
2
2
  import type * as Effect from "effect/Effect";
3
- import type { ScopedPlanStatusSession } from "./apply.ts";
3
+ import type { Diff } from "./diff.ts";
4
+ import type { Input } from "./input.ts";
4
5
  import type { Resource } from "./resource.ts";
5
6
  import type { Runtime } from "./runtime.ts";
7
+ import type { Service } from "./service.ts";
8
+ import type { ScopedPlanStatusSession } from "./cli/service.ts";
6
9
 
7
- export type Provider<R extends Resource> = Context.TagClass<
8
- Provider<R>,
9
- R["type"],
10
- ProviderService<R>
11
- >;
10
+ export interface Provider<R extends Resource | Service>
11
+ extends Context.TagClass<
12
+ Provider<R>,
13
+ R["type"],
14
+ ProviderService<any>
15
+ // TODO(sam): we are using any here because the R["type"] is enough and gaining access to the sub type (e.g. SQS.Queue)
16
+ // is currently not possible in the current approach
12
17
 
13
- export type Diff =
14
- | {
15
- action: "update" | "noop";
16
- deleteFirst?: undefined;
17
- }
18
- | {
19
- action: "replace";
20
- deleteFirst?: boolean;
21
- };
18
+ // preferred:
19
+ // ProviderService<R>
20
+ > {}
22
21
 
23
22
  type BindingData<Res extends Resource> = [Res] extends [Runtime]
24
23
  ? Res["binding"][]
25
24
  : any[];
26
25
 
26
+ type Props<Res extends Resource> = Input.ResolveOpaque<Res["props"]>;
27
+
27
28
  export interface ProviderService<Res extends Resource = Resource> {
28
29
  // tail();
29
30
  // watch();
30
31
  // replace(): Effect.Effect<void, never, never>;
31
-
32
32
  // different interface that is persistent, watching, reloads
33
33
  // run?() {}
34
34
  read?(input: {
35
35
  id: string;
36
- olds: Res["props"] | undefined;
36
+ olds: Props<Res> | undefined;
37
37
  // what is the ARN?
38
38
  output: Res["attr"] | undefined; // current state -> synced state
39
39
  session: ScopedPlanStatusSession;
@@ -41,32 +41,34 @@ export interface ProviderService<Res extends Resource = Resource> {
41
41
  }): Effect.Effect<Res["attr"] | undefined, any, never>;
42
42
  diff?(input: {
43
43
  id: string;
44
- olds: Res["props"];
44
+ olds: Props<Res>;
45
+ // Note: we do not resolve (Props<Res>) here because diff runs during plan
46
+ // -> we need a way for the diff handlers to work with Outputs
45
47
  news: Res["props"];
46
48
  output: Res["attr"];
47
- }): Effect.Effect<Diff, never, never>;
48
- stub?(input: {
49
+ }): Effect.Effect<Diff | void, never, never>;
50
+ precreate?(input: {
49
51
  id: string;
50
- news: Res["props"];
52
+ news: Props<Res>;
51
53
  session: ScopedPlanStatusSession;
52
54
  }): Effect.Effect<Res["attr"], any, never>;
53
55
  create(input: {
54
56
  id: string;
55
- news: Res["props"];
57
+ news: Props<Res>;
56
58
  session: ScopedPlanStatusSession;
57
59
  bindings: BindingData<Res>;
58
60
  }): Effect.Effect<Res["attr"], any, never>;
59
61
  update(input: {
60
62
  id: string;
61
- news: Res["props"];
62
- olds: Res["props"];
63
+ news: Props<Res>;
64
+ olds: Props<Res>;
63
65
  output: Res["attr"];
64
66
  session: ScopedPlanStatusSession;
65
67
  bindings: BindingData<Res>;
66
68
  }): Effect.Effect<Res["attr"], any, never>;
67
69
  delete(input: {
68
70
  id: string;
69
- olds: Res["props"];
71
+ olds: Props<Res>;
70
72
  output: Res["attr"];
71
73
  session: ScopedPlanStatusSession;
72
74
  bindings: BindingData<Res>;
package/src/ref.ts ADDED
@@ -0,0 +1,48 @@
1
+ import type { Resource, AnyResource } from "./resource.ts";
2
+ import * as Output from "./output.ts";
3
+
4
+ // special runtime-only symbol for probing the Ref proxy for its metadata
5
+ const RefMetadata = Symbol.for("alchemy/RefMetadata");
6
+
7
+ export const isRef = (s: any): s is Ref<any> =>
8
+ s && s[RefMetadata] !== undefined;
9
+
10
+ export const getRefMetadata = <R extends Resource<string, string, any, any>>(
11
+ ref: Ref<R>,
12
+ ): RefMetadata<R> => (ref as any)[RefMetadata];
13
+
14
+ export interface Ref<
15
+ R extends Resource<string, string, any, any> = AnyResource,
16
+ > {
17
+ /** @internal phantom */
18
+ Ref: R;
19
+ }
20
+
21
+ export interface RefMetadata<R extends Resource<string, string, any, any>> {
22
+ stack?: string;
23
+ stage?: string;
24
+ resourceId: R["id"];
25
+ }
26
+
27
+ export const ref = <R extends Resource<string, string, any, any>>({
28
+ stack,
29
+ resourceId,
30
+ stage,
31
+ }: RefMetadata<R>): Ref<R> => {
32
+ const ref = new Proxy(
33
+ {},
34
+ {
35
+ get: (_, prop) => {
36
+ if (prop === RefMetadata) {
37
+ return {
38
+ stack,
39
+ stage,
40
+ resourceId,
41
+ };
42
+ }
43
+ return (Output.of(ref) as any)[prop];
44
+ },
45
+ },
46
+ ) as Ref<R>;
47
+ return ref;
48
+ };
package/src/resource.ts CHANGED
@@ -9,24 +9,37 @@ export const isResource = (r: any): r is Resource => {
9
9
  );
10
10
  };
11
11
 
12
- export interface Resource<
12
+ export type AnyResource = Resource<string, string, any, any>;
13
+
14
+ export interface IResource<
13
15
  Type extends string = string,
14
16
  ID extends string = string,
15
17
  Props = unknown,
16
18
  Attrs = unknown,
19
+ Base = unknown,
17
20
  > {
18
21
  id: ID;
19
22
  type: Type;
23
+ Props: unknown;
20
24
  props: Props;
25
+ base: Base;
26
+ /** @internal phantom */
21
27
  attr: Attrs;
22
- parent: unknown;
23
- // oxlint-disable-next-line no-misused-new
24
- new (): Resource<Type, ID, Props, Attrs>;
25
28
  }
26
29
 
27
- export interface ResourceTags<R extends Resource> {
30
+ export interface Resource<
31
+ Type extends string = string,
32
+ ID extends string = string,
33
+ Props = unknown,
34
+ Attrs = unknown,
35
+ Base = unknown,
36
+ > extends IResource<Type, ID, Props, Attrs, Base> {
37
+ new (): Resource<Type, ID, Props, Attrs, Base>;
38
+ }
39
+
40
+ export interface ResourceTags<R extends Resource<string, string, any, any>> {
28
41
  of<S extends ProviderService<R>>(service: S): S;
29
- tag: Context.TagClass<Provider<R>, R["type"], ProviderService<R>>;
42
+ tag: Provider<R>;
30
43
  effect<Err, Req>(
31
44
  eff: Effect<ProviderService<R>, Err, Req>,
32
45
  ): Layer.Layer<Provider<R>, Err, Req>;
@@ -37,13 +50,14 @@ export const Resource = <Ctor extends (id: string, props: any) => Resource>(
37
50
  type: ReturnType<Ctor>["type"],
38
51
  ) => {
39
52
  const Tag = Context.Tag(type)();
40
- const provider = {
41
- tag: Tag,
53
+ const provider: ResourceTags<ReturnType<Ctor>> = {
54
+ tag: Tag as any,
42
55
  effect: <Err, Req>(
43
56
  eff: Effect<ProviderService<ReturnType<Ctor>>, Err, Req>,
44
57
  ) => Layer.effect(Tag, eff),
45
58
  succeed: (service: ProviderService<ReturnType<Ctor>>) =>
46
59
  Layer.succeed(Tag, service),
60
+ of: (service) => service,
47
61
  };
48
62
  return Object.assign(
49
63
  function (id: string, props: any) {
@@ -55,6 +69,7 @@ export const Resource = <Ctor extends (id: string, props: any) => Resource>(
55
69
  };
56
70
  } as unknown as Ctor & {
57
71
  type: ReturnType<Ctor>["type"];
72
+ parent: ReturnType<Ctor>;
58
73
  new (): ReturnType<Ctor> & {
59
74
  parent: ReturnType<Ctor>;
60
75
  };
package/src/runtime.ts CHANGED
@@ -5,7 +5,7 @@ import * as Layer from "effect/Layer";
5
5
  import type { Capability } from "./capability.ts";
6
6
  import type { Policy } from "./policy.ts";
7
7
  import type { ProviderService } from "./provider.ts";
8
- import type { Resource, ResourceTags } from "./resource.ts";
8
+ import type { IResource, Resource, ResourceTags } from "./resource.ts";
9
9
  import type { IService, Service } from "./service.ts";
10
10
 
11
11
  export type RuntimeHandler<
@@ -37,21 +37,30 @@ export declare namespace Runtime {
37
37
 
38
38
  export type AnyRuntime = Runtime<string>;
39
39
 
40
- export interface RuntimeProps<Run extends Runtime, Req> {
41
- bindings: Policy<Run, Extract<Req, Capability>>;
40
+ export interface RuntimeProps<Run extends IRuntime, Req> {
41
+ bindings: Policy<Run, Extract<Req, Capability>, unknown>;
42
42
  }
43
43
 
44
- export interface Runtime<
44
+ export interface IRuntime<
45
45
  Type extends string = string,
46
46
  Handler = unknown,
47
47
  Props = unknown,
48
- > extends Resource<Type, string, Props, unknown> {
48
+ > extends IResource<Type, string, Props> {
49
49
  type: Type;
50
50
  props: Props;
51
51
  handler: Handler;
52
52
  binding: unknown;
53
53
  /** @internal phantom */
54
54
  capability: unknown;
55
+ }
56
+
57
+ export interface Runtime<
58
+ Type extends string = string,
59
+ Handler = unknown,
60
+ Props = unknown,
61
+ > extends IRuntime<Type, Handler, Props>,
62
+ Resource<Type, string, Props> {
63
+ provider: ResourceTags<this>;
55
64
  <
56
65
  const ID extends string,
57
66
  Inputs extends any[],
@@ -75,9 +84,7 @@ export interface Runtime<
75
84
 
76
85
  export const Runtime =
77
86
  <const Type extends string>(type: Type) =>
78
- <Self extends Runtime>(): Self & {
79
- provider: ResourceTags<Self>;
80
- } => {
87
+ <Self extends Runtime>(): Self => {
81
88
  const Tag = Context.Tag(type)();
82
89
  const provider = {
83
90
  tag: Tag,
@@ -122,7 +129,7 @@ export const Runtime =
122
129
  parent: self,
123
130
  // @ts-expect-error
124
131
  provider,
125
- } satisfies IService<string, Self, any, any>,
132
+ } satisfies IService<string, Self, any, any, Self>,
126
133
  );
127
134
  }
128
135
  },
package/src/schema.ts ADDED
@@ -0,0 +1,102 @@
1
+ import * as S from "effect/Schema";
2
+ import type { AST } from "effect/SchemaAST";
3
+
4
+ const Description = Symbol.for("effect/annotation/Description");
5
+
6
+ export const isTag = <T extends S.Schema<any>>(tag: T["ast"]["_tag"]) =>
7
+ ((schema) =>
8
+ S.isSchema(schema)
9
+ ? S.encodedSchema(schema).ast._tag === tag
10
+ : schema._tag === tag) as {
11
+ (schema: S.Schema<any>): schema is T;
12
+ (schema: AST): boolean;
13
+ };
14
+
15
+ export const hasGenericAnnotation =
16
+ (type: string) => (ast: AST | undefined) => {
17
+ const description: string | undefined = ast?.annotations?.[
18
+ Description
19
+ ] as string;
20
+ return (
21
+ description &&
22
+ description?.startsWith(`${type}<`) &&
23
+ description?.endsWith(">")
24
+ );
25
+ };
26
+
27
+ export const isNullishSchema = (schema: S.Schema<any>) =>
28
+ isNullSchema(schema) || isUndefinedSchema(schema);
29
+ export const isNullSchema = (schema: S.Schema<any>) =>
30
+ schema.ast._tag === "Literal" && schema.ast.literal === null;
31
+ export const isUndefinedSchema = isTag("UndefinedKeyword");
32
+ export const isBooleanSchema = isTag<S.Schema<boolean>>("BooleanKeyword");
33
+ export const isStringSchema = isTag<S.Schema<string>>("StringKeyword");
34
+ export const isNumberSchema = isTag<S.Schema<number>>("NumberKeyword");
35
+
36
+ export const hasMapAnnotation = hasGenericAnnotation("Map");
37
+
38
+ export const isRecordLikeSchema = (schema: S.Schema<any>) =>
39
+ isMapSchema(schema) ||
40
+ isRecordSchema(schema) ||
41
+ isStructSchema(schema) ||
42
+ isClassSchema(schema) ||
43
+ false;
44
+
45
+ export const isMapSchema = (schema: S.Schema<any>) =>
46
+ hasMapAnnotation(schema.ast) ||
47
+ // @ts-expect-error - ast.to?. is not narrowed, we don't care
48
+ hasMapAnnotation(schema.ast.to) ||
49
+ false;
50
+
51
+ export const isClassSchema = (schema: S.Schema<any>) => {
52
+ const encoded = S.encodedSchema(schema);
53
+ return (
54
+ encoded.ast._tag === "TypeLiteral" &&
55
+ encoded.ast.propertySignatures !== undefined
56
+ );
57
+ };
58
+
59
+ export const isStructSchema = (schema: S.Schema<any>) => {
60
+ return (
61
+ schema.ast._tag === "TypeLiteral" &&
62
+ schema.ast.propertySignatures !== undefined
63
+ );
64
+ };
65
+
66
+ export const isRecordSchema = (schema: S.Schema<any>) => {
67
+ const encoded = S.encodedSchema(schema);
68
+ return (
69
+ encoded.ast._tag === "TypeLiteral" &&
70
+ encoded.ast.indexSignatures?.[0] !== undefined
71
+ );
72
+ };
73
+
74
+ export const isListSchema = (schema: S.Schema<any>) => {
75
+ return (
76
+ hasListAnnotation(schema.ast) ||
77
+ (S.encodedSchema(schema).ast._tag === "TupleType" && !isMapSchema(schema))
78
+ );
79
+ };
80
+ export const hasListAnnotation = (ast: AST | undefined) => {
81
+ const description: string | undefined = ast?.annotations?.[
82
+ Description
83
+ ] as string;
84
+ return (
85
+ description &&
86
+ description?.startsWith("List<") &&
87
+ description?.endsWith(">")
88
+ );
89
+ };
90
+
91
+ export const isSetSchema = (schema: S.Schema<any>) => {
92
+ return (
93
+ // @ts-expect-error - ast.to?. is not narrowed, we don't care
94
+ hasSetAnnotation(schema.ast) || hasSetAnnotation(schema.ast.to) || false
95
+ );
96
+ };
97
+
98
+ export const hasSetAnnotation = hasGenericAnnotation("Set");
99
+
100
+ export const getSetValueAST = (schema: S.Schema<any>): AST =>
101
+ // @ts-expect-error - ast.to?. is not narrowed, we don't care
102
+ isSetSchema(schema) && schema.ast.to?.typeParameters[0];
package/src/service.ts CHANGED
@@ -1,15 +1,16 @@
1
1
  import type { Effect } from "effect/Effect";
2
2
  import type { Capability } from "./capability.ts";
3
- import type { Resource } from "./resource.ts";
4
- import type { Runtime, RuntimeHandler, RuntimeProps } from "./runtime.ts";
3
+ import type { IResource } from "./resource.ts";
4
+ import type { IRuntime, RuntimeHandler, RuntimeProps } from "./runtime.ts";
5
5
 
6
6
  export interface IService<
7
7
  ID extends string = string,
8
- F extends Runtime = Runtime,
8
+ F extends IRuntime = IRuntime,
9
9
  Handler extends RuntimeHandler = RuntimeHandler,
10
10
  Props extends RuntimeProps<F, any> = RuntimeProps<F, any>,
11
11
  Attr = (F & { props: Props })["attr"],
12
- > extends Resource<F["type"], ID, Props, Attr> {
12
+ Base = unknown,
13
+ > extends IResource<F["type"], ID, Props, Attr, F> {
13
14
  kind: "Service";
14
15
  type: F["type"];
15
16
  id: ID;
@@ -39,16 +40,19 @@ export interface IService<
39
40
  attr: Attr;
40
41
  /** @internal phantom type of this resource's parent */
41
42
  parent: unknown;
43
+ new (): Service<ID, F, Handler, Props, Attr, Base>;
42
44
  }
43
45
 
46
+ export interface AnyService extends IService {}
47
+
44
48
  export interface Service<
45
49
  ID extends string = string,
46
- F extends Runtime = Runtime,
50
+ F extends IRuntime = IRuntime,
47
51
  Handler extends RuntimeHandler = RuntimeHandler,
48
52
  Props extends RuntimeProps<F, any> = RuntimeProps<F, any>,
49
53
  Attr = (F & { props: Props })["attr"],
50
- > extends IService<ID, F, Handler, Props, Attr>,
51
- Resource<F["type"], ID, Props, Attr> {}
54
+ Base = unknown,
55
+ > extends IService<ID, F, Handler, Props, Attr, Base> {}
52
56
 
53
57
  export const isService = (resource: any): resource is IService => {
54
58
  return resource && resource.kind === "Service";
package/src/sha256.ts ADDED
@@ -0,0 +1,23 @@
1
+ import * as Effect from "effect/Effect";
2
+
3
+ type Input = ArrayBuffer | Uint8Array | string;
4
+
5
+ export const sha256 = (input: Input) =>
6
+ Effect.promise(async () => {
7
+ const digest = await crypto.subtle.digest("SHA-256", toArrayBuffer(input));
8
+ const hashArray = Array.from(new Uint8Array(digest));
9
+ return hashArray.map((b) => b.toString(16).padStart(2, "0")).join("");
10
+ });
11
+
12
+ const toArrayBuffer = (input: Input) => {
13
+ if (input instanceof ArrayBuffer) {
14
+ return input;
15
+ }
16
+ if (typeof input === "string") {
17
+ return new TextEncoder().encode(input);
18
+ }
19
+ return input.buffer.slice(
20
+ input.byteOffset,
21
+ input.byteOffset + input.byteLength,
22
+ ) as ArrayBuffer;
23
+ };
package/src/stack.ts ADDED
@@ -0,0 +1,116 @@
1
+ import type { HttpClient } from "@effect/platform/HttpClient";
2
+ import { FileSystem } from "@effect/platform/FileSystem";
3
+ import { Path } from "@effect/platform/Path";
4
+ import * as Effect from "effect/Effect";
5
+ import * as Layer from "effect/Layer";
6
+ import * as App from "./app.ts";
7
+ import { type AppliedPlan } from "./apply.ts";
8
+ import { DotAlchemy } from "./dot-alchemy.ts";
9
+ import type { DerivePlan, Providers, TraverseResources } from "./plan.ts";
10
+ import type { Instance } from "./policy.ts";
11
+ import type { AnyResource } from "./resource.ts";
12
+ import type { AnyService } from "./service.ts";
13
+ import { type StageConfig, type Stages } from "./stage.ts";
14
+ import * as State from "./state.ts";
15
+ import type { Ref } from "./ref.ts";
16
+ import type { CLI } from "./cli/service.ts";
17
+
18
+ export const defineStack = <
19
+ const Name extends string,
20
+ Resources extends (AnyResource | AnyService)[],
21
+ Req = never,
22
+ Err = never,
23
+ >(
24
+ stack: StackConfig<Name, Resources, Req, Err>,
25
+ ): Stack<Name, Instance<Resources[number]>, Req, Err> => stack as any;
26
+
27
+ export type StackConfig<
28
+ Name extends string,
29
+ Resources extends (AnyResource | AnyService)[] = (AnyResource | AnyService)[],
30
+ StagesReq = never,
31
+ StagesErr = never,
32
+ TapReq = never,
33
+ TapErr = never,
34
+ > = {
35
+ name: Name;
36
+ stages: Stages<StagesReq, StagesErr>;
37
+ resources: Resources;
38
+ providers: Layer.Layer<
39
+ Providers<Instance<Resources[number]>>,
40
+ any,
41
+ App.App | FileSystem | Path | DotAlchemy | HttpClient
42
+ >;
43
+ state?: Layer.Layer<State.State>;
44
+ tap?: (
45
+ output: StackOutput<Instance<Resources[number]>>,
46
+ ) => Effect.Effect<any, TapErr, TapReq>;
47
+ } & (Exclude<NoInfer<StagesReq | TapReq>, BuiltInServices> extends never
48
+ ? {
49
+ layers?: never;
50
+ }
51
+ : {
52
+ layers: Layer.Layer<
53
+ Exclude<StagesReq | TapReq, BuiltInServices>,
54
+ never,
55
+ never
56
+ >;
57
+ });
58
+
59
+ export type StackOutput<Resources extends AnyResource | AnyService> =
60
+ AppliedPlan<DerivePlan<Resources>>;
61
+
62
+ export type Stack<
63
+ Name extends string = string,
64
+ Resources extends AnyResource | AnyService = any,
65
+ StagesReq = any,
66
+ StagesErr = any,
67
+ TapReq = any,
68
+ TapErr = any,
69
+ > = {
70
+ name: Name;
71
+ stages: Stages<StagesReq, StagesErr>;
72
+ resources: Resources[];
73
+ providers: Layer.Layer<Providers<Resources>, any, BuiltInServices>;
74
+ state?: Layer.Layer<State.State>;
75
+ cli?: Layer.Layer<CLI>;
76
+ tap?: (output: StackOutput<Resources>) => Effect.Effect<void, TapErr, TapReq>;
77
+ } & (Exclude<StagesReq | TapReq, BuiltInServices> extends never
78
+ ? {
79
+ layers?: never;
80
+ }
81
+ : {
82
+ layers: Layer.Layer<
83
+ Exclude<StagesReq | TapReq, BuiltInServices>,
84
+ never,
85
+ never
86
+ >;
87
+ });
88
+
89
+ export type StackName<S extends Stack> =
90
+ S extends Stack<infer Name, infer _> ? Name : never;
91
+
92
+ export type StackResources<S extends Stack> =
93
+ S extends Stack<infer _, infer Resources> ? Resources : never;
94
+
95
+ export type BuiltInServices =
96
+ | App.App
97
+ | FileSystem
98
+ | Path
99
+ | DotAlchemy
100
+ | HttpClient;
101
+
102
+ export interface StackRefConfig<S extends Stack> extends StageConfig {
103
+ stack: S extends Stack<infer Name, any> ? Name : never;
104
+ stage?: string;
105
+ }
106
+
107
+ export type StackRef<Resources extends AnyResource | AnyService> = {
108
+ [Id in keyof AsRecord<Resources>]: Ref<AsRecord<Resources>[Id]>;
109
+ };
110
+
111
+ type AsRecord<Resources extends AnyResource | AnyService> = {
112
+ [Id in TraverseResources<Resources>["id"]]: Extract<
113
+ TraverseResources<Resources>,
114
+ { id: Id }
115
+ >;
116
+ };