alchemy-effect 0.2.0 → 0.4.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 (494) hide show
  1. package/bin/alchemy-effect.js +55354 -8
  2. package/bin/alchemy-effect.js.map +1 -1
  3. package/bin/alchemy-effect.ts +266 -10
  4. package/lib/$.d.ts +5 -0
  5. package/lib/$.d.ts.map +1 -0
  6. package/lib/$.js +9 -0
  7. package/lib/$.js.map +1 -0
  8. package/lib/app.d.ts +4 -17
  9. package/lib/app.d.ts.map +1 -1
  10. package/lib/app.js +0 -20
  11. package/lib/app.js.map +1 -1
  12. package/lib/apply.d.ts +15 -75
  13. package/lib/apply.d.ts.map +1 -1
  14. package/lib/apply.js +439 -154
  15. package/lib/apply.js.map +1 -1
  16. package/lib/assert-never.d.ts +12 -0
  17. package/lib/assert-never.d.ts.map +1 -0
  18. package/lib/assert-never.js +11 -0
  19. package/lib/assert-never.js.map +1 -0
  20. package/lib/aws/account.d.ts +10 -1
  21. package/lib/aws/account.d.ts.map +1 -1
  22. package/lib/aws/account.js +18 -3
  23. package/lib/aws/account.js.map +1 -1
  24. package/lib/aws/client.d.ts.map +1 -1
  25. package/lib/aws/client.js +0 -1
  26. package/lib/aws/client.js.map +1 -1
  27. package/lib/aws/config.d.ts +15 -0
  28. package/lib/aws/config.d.ts.map +1 -0
  29. package/lib/aws/config.js +1 -0
  30. package/lib/aws/config.js.map +1 -0
  31. package/lib/aws/credentials.d.ts +10 -0
  32. package/lib/aws/credentials.d.ts.map +1 -1
  33. package/lib/aws/credentials.js +73 -47
  34. package/lib/aws/credentials.js.map +1 -1
  35. package/lib/aws/dynamodb/client.d.ts +1 -1
  36. package/lib/aws/dynamodb/client.d.ts.map +1 -1
  37. package/lib/aws/dynamodb/index.d.ts +2 -1
  38. package/lib/aws/dynamodb/index.d.ts.map +1 -1
  39. package/lib/aws/dynamodb/index.js +1 -2
  40. package/lib/aws/dynamodb/index.js.map +1 -1
  41. package/lib/aws/dynamodb/secondary-index.d.ts +5 -4
  42. package/lib/aws/dynamodb/secondary-index.d.ts.map +1 -1
  43. package/lib/aws/dynamodb/table.d.ts +23 -20
  44. package/lib/aws/dynamodb/table.d.ts.map +1 -1
  45. package/lib/aws/dynamodb/table.get-item.d.ts +8 -6
  46. package/lib/aws/dynamodb/table.get-item.d.ts.map +1 -1
  47. package/lib/aws/dynamodb/table.get-item.js +4 -2
  48. package/lib/aws/dynamodb/table.get-item.js.map +1 -1
  49. package/lib/aws/dynamodb/table.js.map +1 -1
  50. package/lib/aws/dynamodb/table.provider.d.ts +3 -4
  51. package/lib/aws/dynamodb/table.provider.d.ts.map +1 -1
  52. package/lib/aws/dynamodb/table.provider.js +18 -29
  53. package/lib/aws/dynamodb/table.provider.js.map +1 -1
  54. package/lib/aws/ec2/client.d.ts +1 -1
  55. package/lib/aws/ec2/client.d.ts.map +1 -1
  56. package/lib/aws/ec2/index.d.ts +11 -0
  57. package/lib/aws/ec2/index.d.ts.map +1 -1
  58. package/lib/aws/ec2/index.js +11 -0
  59. package/lib/aws/ec2/index.js.map +1 -1
  60. package/lib/aws/ec2/internet-gateway.d.ts +65 -0
  61. package/lib/aws/ec2/internet-gateway.d.ts.map +1 -0
  62. package/lib/aws/ec2/internet-gateway.js +4 -0
  63. package/lib/aws/ec2/internet-gateway.js.map +1 -0
  64. package/lib/aws/ec2/internet-gateway.provider.d.ts +6 -0
  65. package/lib/aws/ec2/internet-gateway.provider.d.ts.map +1 -0
  66. package/lib/aws/ec2/internet-gateway.provider.js +193 -0
  67. package/lib/aws/ec2/internet-gateway.provider.js.map +1 -0
  68. package/lib/aws/ec2/route-table-association.d.ts +63 -0
  69. package/lib/aws/ec2/route-table-association.d.ts.map +1 -0
  70. package/lib/aws/ec2/route-table-association.js +4 -0
  71. package/lib/aws/ec2/route-table-association.js.map +1 -0
  72. package/lib/aws/ec2/route-table-association.provider.d.ts +4 -0
  73. package/lib/aws/ec2/route-table-association.provider.d.ts.map +1 -0
  74. package/lib/aws/ec2/route-table-association.provider.js +121 -0
  75. package/lib/aws/ec2/route-table-association.provider.js.map +1 -0
  76. package/lib/aws/ec2/route-table.d.ts +159 -0
  77. package/lib/aws/ec2/route-table.d.ts.map +1 -0
  78. package/lib/aws/ec2/route-table.js +4 -0
  79. package/lib/aws/ec2/route-table.js.map +1 -0
  80. package/lib/aws/ec2/route-table.provider.d.ts +6 -0
  81. package/lib/aws/ec2/route-table.provider.d.ts.map +1 -0
  82. package/lib/aws/ec2/route-table.provider.js +213 -0
  83. package/lib/aws/ec2/route-table.provider.js.map +1 -0
  84. package/lib/aws/ec2/route.d.ts +155 -0
  85. package/lib/aws/ec2/route.d.ts.map +1 -0
  86. package/lib/aws/ec2/route.js +3 -0
  87. package/lib/aws/ec2/route.js.map +1 -0
  88. package/lib/aws/ec2/route.provider.d.ts +4 -0
  89. package/lib/aws/ec2/route.provider.d.ts.map +1 -0
  90. package/lib/aws/ec2/route.provider.js +166 -0
  91. package/lib/aws/ec2/route.provider.js.map +1 -0
  92. package/lib/aws/ec2/subnet.d.ts +175 -0
  93. package/lib/aws/ec2/subnet.d.ts.map +1 -0
  94. package/lib/aws/ec2/subnet.js +4 -0
  95. package/lib/aws/ec2/subnet.js.map +1 -0
  96. package/lib/aws/ec2/subnet.provider.d.ts +4 -0
  97. package/lib/aws/ec2/subnet.provider.d.ts.map +1 -0
  98. package/lib/aws/ec2/subnet.provider.js +250 -0
  99. package/lib/aws/ec2/subnet.provider.js.map +1 -0
  100. package/lib/aws/ec2/vpc.d.ts +13 -8
  101. package/lib/aws/ec2/vpc.d.ts.map +1 -1
  102. package/lib/aws/ec2/vpc.js +1 -0
  103. package/lib/aws/ec2/vpc.js.map +1 -1
  104. package/lib/aws/ec2/vpc.provider.d.ts +1 -2
  105. package/lib/aws/ec2/vpc.provider.d.ts.map +1 -1
  106. package/lib/aws/ec2/vpc.provider.js +45 -37
  107. package/lib/aws/ec2/vpc.provider.js.map +1 -1
  108. package/lib/aws/index.d.ts +15 -19
  109. package/lib/aws/index.d.ts.map +1 -1
  110. package/lib/aws/index.js +8 -10
  111. package/lib/aws/index.js.map +1 -1
  112. package/lib/aws/lambda/consume.d.ts +10 -11
  113. package/lib/aws/lambda/consume.d.ts.map +1 -1
  114. package/lib/aws/lambda/consume.js +3 -3
  115. package/lib/aws/lambda/consume.js.map +1 -1
  116. package/lib/aws/lambda/function.d.ts +7 -7
  117. package/lib/aws/lambda/function.d.ts.map +1 -1
  118. package/lib/aws/lambda/function.handler.d.ts +1 -1
  119. package/lib/aws/lambda/function.handler.d.ts.map +1 -1
  120. package/lib/aws/lambda/function.handler.js.map +1 -1
  121. package/lib/aws/lambda/function.invoke.d.ts +6 -4
  122. package/lib/aws/lambda/function.invoke.d.ts.map +1 -1
  123. package/lib/aws/lambda/function.invoke.js +3 -1
  124. package/lib/aws/lambda/function.invoke.js.map +1 -1
  125. package/lib/aws/lambda/function.js +1 -1
  126. package/lib/aws/lambda/function.js.map +1 -1
  127. package/lib/aws/lambda/function.provider.d.ts +3 -2
  128. package/lib/aws/lambda/function.provider.d.ts.map +1 -1
  129. package/lib/aws/lambda/function.provider.js +28 -25
  130. package/lib/aws/lambda/function.provider.js.map +1 -1
  131. package/lib/aws/lambda/index.d.ts +1 -0
  132. package/lib/aws/lambda/index.d.ts.map +1 -1
  133. package/lib/aws/lambda/index.js +1 -0
  134. package/lib/aws/lambda/index.js.map +1 -1
  135. package/lib/aws/lambda/serve.d.ts +2 -4
  136. package/lib/aws/lambda/serve.d.ts.map +1 -1
  137. package/lib/aws/profile.d.ts +2 -2
  138. package/lib/aws/profile.d.ts.map +1 -1
  139. package/lib/aws/profile.js +1 -1
  140. package/lib/aws/profile.js.map +1 -1
  141. package/lib/aws/region.d.ts +14 -2
  142. package/lib/aws/region.d.ts.map +1 -1
  143. package/lib/aws/region.js +26 -1
  144. package/lib/aws/region.js.map +1 -1
  145. package/lib/aws/sqs/client.d.ts +1 -1
  146. package/lib/aws/sqs/client.d.ts.map +1 -1
  147. package/lib/aws/sqs/index.d.ts +1 -0
  148. package/lib/aws/sqs/index.d.ts.map +1 -1
  149. package/lib/aws/sqs/index.js +1 -0
  150. package/lib/aws/sqs/index.js.map +1 -1
  151. package/lib/aws/sqs/queue.consume.d.ts +1 -1
  152. package/lib/aws/sqs/queue.consume.d.ts.map +1 -1
  153. package/lib/aws/sqs/queue.consume.js +0 -1
  154. package/lib/aws/sqs/queue.consume.js.map +1 -1
  155. package/lib/aws/sqs/queue.d.ts +6 -4
  156. package/lib/aws/sqs/queue.d.ts.map +1 -1
  157. package/lib/aws/sqs/queue.event-source.d.ts +8 -6
  158. package/lib/aws/sqs/queue.event-source.d.ts.map +1 -1
  159. package/lib/aws/sqs/queue.event-source.js +26 -44
  160. package/lib/aws/sqs/queue.event-source.js.map +1 -1
  161. package/lib/aws/sqs/queue.js +1 -1
  162. package/lib/aws/sqs/queue.js.map +1 -1
  163. package/lib/aws/sqs/queue.provider.d.ts +2 -2
  164. package/lib/aws/sqs/queue.provider.d.ts.map +1 -1
  165. package/lib/aws/sqs/queue.provider.js +2 -1
  166. package/lib/aws/sqs/queue.provider.js.map +1 -1
  167. package/lib/aws/sqs/queue.send-message.d.ts +7 -5
  168. package/lib/aws/sqs/queue.send-message.d.ts.map +1 -1
  169. package/lib/aws/sqs/queue.send-message.js +4 -2
  170. package/lib/aws/sqs/queue.send-message.js.map +1 -1
  171. package/lib/binding.d.ts +12 -12
  172. package/lib/binding.d.ts.map +1 -1
  173. package/lib/binding.js.map +1 -1
  174. package/lib/cli/components/ApprovePlan.d.ts +2 -2
  175. package/lib/cli/components/ApprovePlan.d.ts.map +1 -1
  176. package/lib/cli/components/ApprovePlan.js.map +1 -1
  177. package/lib/cli/components/Plan.d.ts +2 -2
  178. package/lib/cli/components/Plan.d.ts.map +1 -1
  179. package/lib/cli/components/Plan.js.map +1 -1
  180. package/lib/cli/components/PlanProgress.d.ts +8 -4
  181. package/lib/cli/components/PlanProgress.d.ts.map +1 -1
  182. package/lib/cli/components/PlanProgress.js +11 -1
  183. package/lib/cli/components/PlanProgress.js.map +1 -1
  184. package/lib/cli/index.d.ts +384 -264
  185. package/lib/cli/index.d.ts.map +1 -1
  186. package/lib/cli/index.js +57 -65
  187. package/lib/cli/index.js.map +1 -1
  188. package/lib/cli/ink-service.d.ts +4 -0
  189. package/lib/cli/ink-service.d.ts.map +1 -0
  190. package/lib/cli/ink-service.js +43 -0
  191. package/lib/cli/ink-service.js.map +1 -0
  192. package/lib/cli/service.d.ts +21 -0
  193. package/lib/cli/service.d.ts.map +1 -0
  194. package/lib/cli/service.js +5 -0
  195. package/lib/cli/service.js.map +1 -0
  196. package/lib/cloudflare/account.d.ts +10 -0
  197. package/lib/cloudflare/account.d.ts.map +1 -0
  198. package/lib/cloudflare/account.js +24 -0
  199. package/lib/cloudflare/account.js.map +1 -0
  200. package/lib/cloudflare/api.d.ts +7 -7
  201. package/lib/cloudflare/api.d.ts.map +1 -1
  202. package/lib/cloudflare/api.js +18 -17
  203. package/lib/cloudflare/api.js.map +1 -1
  204. package/lib/cloudflare/config.d.ts +9 -0
  205. package/lib/cloudflare/config.d.ts.map +1 -0
  206. package/lib/cloudflare/config.js +1 -0
  207. package/lib/cloudflare/config.js.map +1 -0
  208. package/lib/cloudflare/index.d.ts +3 -1
  209. package/lib/cloudflare/index.d.ts.map +1 -1
  210. package/lib/cloudflare/index.js +3 -0
  211. package/lib/cloudflare/index.js.map +1 -1
  212. package/lib/cloudflare/kv/namespace.binding.d.ts +5 -3
  213. package/lib/cloudflare/kv/namespace.binding.d.ts.map +1 -1
  214. package/lib/cloudflare/kv/namespace.binding.js +1 -1
  215. package/lib/cloudflare/kv/namespace.binding.js.map +1 -1
  216. package/lib/cloudflare/kv/namespace.client.d.ts +1 -1
  217. package/lib/cloudflare/kv/namespace.d.ts +3 -2
  218. package/lib/cloudflare/kv/namespace.d.ts.map +1 -1
  219. package/lib/cloudflare/kv/namespace.js.map +1 -1
  220. package/lib/cloudflare/kv/namespace.provider.d.ts +3 -2
  221. package/lib/cloudflare/kv/namespace.provider.d.ts.map +1 -1
  222. package/lib/cloudflare/kv/namespace.provider.js +9 -7
  223. package/lib/cloudflare/kv/namespace.provider.js.map +1 -1
  224. package/lib/cloudflare/live.d.ts +5 -5
  225. package/lib/cloudflare/live.d.ts.map +1 -1
  226. package/lib/cloudflare/live.js +5 -8
  227. package/lib/cloudflare/live.js.map +1 -1
  228. package/lib/cloudflare/r2/bucket.binding.d.ts +5 -3
  229. package/lib/cloudflare/r2/bucket.binding.d.ts.map +1 -1
  230. package/lib/cloudflare/r2/bucket.binding.js +1 -1
  231. package/lib/cloudflare/r2/bucket.binding.js.map +1 -1
  232. package/lib/cloudflare/r2/bucket.d.ts +3 -2
  233. package/lib/cloudflare/r2/bucket.d.ts.map +1 -1
  234. package/lib/cloudflare/r2/bucket.js.map +1 -1
  235. package/lib/cloudflare/r2/bucket.provider.d.ts +3 -2
  236. package/lib/cloudflare/r2/bucket.provider.d.ts.map +1 -1
  237. package/lib/cloudflare/r2/bucket.provider.js +14 -8
  238. package/lib/cloudflare/r2/bucket.provider.js.map +1 -1
  239. package/lib/cloudflare/worker/assets.fetch.d.ts +3 -2
  240. package/lib/cloudflare/worker/assets.fetch.d.ts.map +1 -1
  241. package/lib/cloudflare/worker/assets.fetch.js +2 -1
  242. package/lib/cloudflare/worker/assets.fetch.js.map +1 -1
  243. package/lib/cloudflare/worker/assets.provider.d.ts +1 -1
  244. package/lib/cloudflare/worker/assets.provider.d.ts.map +1 -1
  245. package/lib/cloudflare/worker/index.d.ts +0 -1
  246. package/lib/cloudflare/worker/index.d.ts.map +1 -1
  247. package/lib/cloudflare/worker/worker.d.ts +5 -6
  248. package/lib/cloudflare/worker/worker.d.ts.map +1 -1
  249. package/lib/cloudflare/worker/worker.handler.d.ts +1 -1
  250. package/lib/cloudflare/worker/worker.handler.d.ts.map +1 -1
  251. package/lib/cloudflare/worker/worker.handler.js.map +1 -1
  252. package/lib/cloudflare/worker/worker.js.map +1 -1
  253. package/lib/cloudflare/worker/worker.provider.d.ts +3 -2
  254. package/lib/cloudflare/worker/worker.provider.d.ts.map +1 -1
  255. package/lib/cloudflare/worker/worker.provider.js +12 -7
  256. package/lib/cloudflare/worker/worker.provider.js.map +1 -1
  257. package/lib/cloudflare/worker/worker.serve.d.ts +7 -7
  258. package/lib/cloudflare/worker/worker.serve.d.ts.map +1 -1
  259. package/lib/cloudflare/worker/worker.serve.js.map +1 -1
  260. package/lib/data.d.ts +3 -0
  261. package/lib/data.d.ts.map +1 -0
  262. package/lib/data.js +8 -0
  263. package/lib/data.js.map +1 -0
  264. package/lib/destroy.d.ts +1 -1
  265. package/lib/destroy.d.ts.map +1 -1
  266. package/lib/destroy.js +1 -4
  267. package/lib/destroy.js.map +1 -1
  268. package/lib/diff.d.ts +18 -0
  269. package/lib/diff.d.ts.map +1 -0
  270. package/lib/diff.js +22 -0
  271. package/lib/diff.js.map +1 -0
  272. package/lib/env.d.ts +5 -0
  273. package/lib/env.d.ts.map +1 -1
  274. package/lib/env.js +15 -29
  275. package/lib/env.js.map +1 -1
  276. package/lib/event.d.ts +1 -1
  277. package/lib/event.d.ts.map +1 -1
  278. package/lib/exports.d.ts +9 -0
  279. package/lib/exports.d.ts.map +1 -0
  280. package/lib/exports.js +13 -0
  281. package/lib/exports.js.map +1 -0
  282. package/lib/index.d.ts +10 -2
  283. package/lib/index.d.ts.map +1 -1
  284. package/lib/index.js +10 -5
  285. package/lib/index.js.map +1 -1
  286. package/lib/input.d.ts +32 -0
  287. package/lib/input.d.ts.map +1 -0
  288. package/lib/input.js +1 -0
  289. package/lib/input.js.map +1 -0
  290. package/lib/instance-id.d.ts +8 -0
  291. package/lib/instance-id.d.ts.map +1 -0
  292. package/lib/instance-id.js +12 -0
  293. package/lib/instance-id.js.map +1 -0
  294. package/lib/output.d.ts +145 -0
  295. package/lib/output.d.ts.map +1 -0
  296. package/lib/output.js +283 -0
  297. package/lib/output.js.map +1 -0
  298. package/lib/physical-name.d.ts +14 -1
  299. package/lib/physical-name.d.ts.map +1 -1
  300. package/lib/physical-name.js +41 -2
  301. package/lib/physical-name.js.map +1 -1
  302. package/lib/plan.d.ts +84 -58
  303. package/lib/plan.d.ts.map +1 -1
  304. package/lib/plan.js +504 -166
  305. package/lib/plan.js.map +1 -1
  306. package/lib/policy.d.ts +3 -4
  307. package/lib/policy.d.ts.map +1 -1
  308. package/lib/policy.js +0 -1
  309. package/lib/policy.js.map +1 -1
  310. package/lib/provider.d.ts +39 -24
  311. package/lib/provider.d.ts.map +1 -1
  312. package/lib/provider.js +9 -0
  313. package/lib/provider.js.map +1 -1
  314. package/lib/ref.d.ts +14 -0
  315. package/lib/ref.d.ts.map +1 -0
  316. package/lib/ref.js +21 -0
  317. package/lib/ref.js.map +1 -0
  318. package/lib/resource.d.ts +13 -8
  319. package/lib/resource.d.ts.map +1 -1
  320. package/lib/resource.js.map +1 -1
  321. package/lib/runtime.d.ts +7 -6
  322. package/lib/runtime.d.ts.map +1 -1
  323. package/lib/runtime.js.map +1 -1
  324. package/lib/service.d.ts +9 -6
  325. package/lib/service.d.ts.map +1 -1
  326. package/lib/service.js.map +1 -1
  327. package/lib/stack.d.ts +60 -0
  328. package/lib/stack.d.ts.map +1 -0
  329. package/lib/stack.js +11 -0
  330. package/lib/stack.js.map +1 -0
  331. package/lib/stage.d.ts +39 -0
  332. package/lib/stage.d.ts.map +1 -0
  333. package/lib/stage.js +32 -0
  334. package/lib/stage.js.map +1 -0
  335. package/lib/state.d.ts +135 -17
  336. package/lib/state.d.ts.map +1 -1
  337. package/lib/state.js +34 -30
  338. package/lib/state.js.map +1 -1
  339. package/lib/tags.d.ts +15 -0
  340. package/lib/tags.d.ts.map +1 -1
  341. package/lib/tags.js +27 -0
  342. package/lib/tags.js.map +1 -1
  343. package/lib/test.d.ts +25 -4
  344. package/lib/test.d.ts.map +1 -1
  345. package/lib/test.js +54 -14
  346. package/lib/test.js.map +1 -1
  347. package/lib/todo.d.ts +3 -0
  348. package/lib/todo.d.ts.map +1 -0
  349. package/lib/todo.js +3 -0
  350. package/lib/todo.js.map +1 -0
  351. package/lib/tsconfig.test.tsbuildinfo +1 -1
  352. package/lib/type.d.ts +3 -0
  353. package/lib/type.d.ts.map +1 -1
  354. package/lib/unknown.d.ts +4 -0
  355. package/lib/unknown.d.ts.map +1 -0
  356. package/lib/unknown.js +4 -0
  357. package/lib/unknown.js.map +1 -0
  358. package/lib/user.d.ts +3 -0
  359. package/lib/user.d.ts.map +1 -0
  360. package/lib/user.js +3 -0
  361. package/lib/user.js.map +1 -0
  362. package/lib/util.d.ts +6 -0
  363. package/lib/util.d.ts.map +1 -0
  364. package/lib/util.js +9 -0
  365. package/lib/util.js.map +1 -0
  366. package/package.json +18 -12
  367. package/src/$.ts +17 -0
  368. package/src/app.ts +3 -32
  369. package/src/apply.ts +824 -452
  370. package/src/assert-never.ts +18 -0
  371. package/src/aws/account.ts +23 -3
  372. package/src/aws/client.ts +0 -1
  373. package/src/aws/config.ts +16 -0
  374. package/src/aws/credentials.ts +212 -177
  375. package/src/aws/dynamodb/index.ts +3 -3
  376. package/src/aws/dynamodb/table.get-item.ts +5 -9
  377. package/src/aws/dynamodb/table.provider.ts +36 -39
  378. package/src/aws/dynamodb/table.ts +29 -84
  379. package/src/aws/ec2/index.ts +12 -0
  380. package/src/aws/ec2/internet-gateway.provider.ts +316 -0
  381. package/src/aws/ec2/internet-gateway.ts +79 -0
  382. package/src/aws/ec2/route-table-association.provider.ts +214 -0
  383. package/src/aws/ec2/route-table-association.ts +82 -0
  384. package/src/aws/ec2/route-table.provider.ts +306 -0
  385. package/src/aws/ec2/route-table.ts +175 -0
  386. package/src/aws/ec2/route.provider.ts +213 -0
  387. package/src/aws/ec2/route.ts +192 -0
  388. package/src/aws/ec2/subnet.provider.ts +358 -0
  389. package/src/aws/ec2/subnet.ts +213 -0
  390. package/src/aws/ec2/vpc.provider.ts +58 -50
  391. package/src/aws/ec2/vpc.ts +21 -8
  392. package/src/aws/index.ts +49 -40
  393. package/src/aws/lambda/consume.ts +8 -7
  394. package/src/aws/lambda/function.handler.ts +1 -1
  395. package/src/aws/lambda/function.invoke.ts +6 -2
  396. package/src/aws/lambda/function.provider.ts +41 -32
  397. package/src/aws/lambda/function.ts +7 -4
  398. package/src/aws/lambda/index.ts +2 -0
  399. package/src/aws/profile.ts +1 -4
  400. package/src/aws/region.ts +42 -3
  401. package/src/aws/sqs/index.ts +2 -0
  402. package/src/aws/sqs/queue.consume.ts +1 -1
  403. package/src/aws/sqs/queue.event-source.ts +29 -55
  404. package/src/aws/sqs/queue.provider.ts +10 -2
  405. package/src/aws/sqs/queue.send-message.ts +5 -8
  406. package/src/aws/sqs/queue.ts +9 -4
  407. package/src/binding.ts +19 -19
  408. package/src/cli/components/ApprovePlan.tsx +2 -2
  409. package/src/cli/components/Plan.tsx +3 -2
  410. package/src/cli/components/PlanProgress.tsx +32 -14
  411. package/src/cli/index.ts +2 -6
  412. package/src/cli/ink-service.tsx +61 -0
  413. package/src/cli/service.ts +23 -0
  414. package/src/cloudflare/account.ts +37 -0
  415. package/src/cloudflare/api.ts +33 -29
  416. package/src/cloudflare/config.ts +7 -0
  417. package/src/cloudflare/index.ts +3 -1
  418. package/src/cloudflare/kv/namespace.binding.ts +3 -1
  419. package/src/cloudflare/kv/namespace.provider.ts +10 -8
  420. package/src/cloudflare/kv/namespace.ts +3 -2
  421. package/src/cloudflare/live.ts +11 -17
  422. package/src/cloudflare/r2/bucket.binding.ts +3 -1
  423. package/src/cloudflare/r2/bucket.provider.ts +16 -9
  424. package/src/cloudflare/r2/bucket.ts +8 -2
  425. package/src/cloudflare/worker/assets.fetch.ts +3 -1
  426. package/src/cloudflare/worker/assets.provider.ts +1 -1
  427. package/src/cloudflare/worker/index.ts +0 -2
  428. package/src/cloudflare/worker/worker.handler.ts +1 -1
  429. package/src/cloudflare/worker/worker.provider.ts +21 -14
  430. package/src/cloudflare/worker/worker.serve.ts +5 -2
  431. package/src/cloudflare/worker/worker.ts +4 -3
  432. package/src/data.ts +18 -0
  433. package/src/destroy.ts +1 -5
  434. package/src/diff.ts +48 -0
  435. package/src/env.ts +20 -32
  436. package/src/event.ts +6 -0
  437. package/src/exports.ts +21 -0
  438. package/src/index.ts +10 -5
  439. package/src/input.ts +81 -0
  440. package/src/instance-id.ts +16 -0
  441. package/src/output.ts +542 -0
  442. package/src/physical-name.ts +57 -2
  443. package/src/plan.ts +757 -278
  444. package/src/policy.ts +3 -5
  445. package/src/provider.ts +70 -31
  446. package/src/ref.ts +48 -0
  447. package/src/resource.ts +70 -10
  448. package/src/runtime.ts +15 -8
  449. package/src/service.ts +11 -7
  450. package/src/stack.ts +116 -0
  451. package/src/stage.ts +85 -0
  452. package/src/state.ts +269 -76
  453. package/src/tags.ts +31 -0
  454. package/src/test.ts +118 -17
  455. package/src/todo.ts +4 -0
  456. package/src/type.ts +4 -0
  457. package/src/unknown.ts +6 -0
  458. package/src/user.ts +4 -0
  459. package/src/util.ts +21 -0
  460. package/lib/approve.d.ts +0 -15
  461. package/lib/approve.d.ts.map +0 -1
  462. package/lib/approve.js +0 -7
  463. package/lib/approve.js.map +0 -1
  464. package/lib/cli/approve.d.ts +0 -4
  465. package/lib/cli/approve.d.ts.map +0 -1
  466. package/lib/cli/approve.js +0 -18
  467. package/lib/cli/approve.js.map +0 -1
  468. package/lib/cli/clack.d.ts +0 -14
  469. package/lib/cli/clack.d.ts.map +0 -1
  470. package/lib/cli/clack.js +0 -12
  471. package/lib/cli/clack.js.map +0 -1
  472. package/lib/cli/main.d.ts +0 -2
  473. package/lib/cli/main.d.ts.map +0 -1
  474. package/lib/cli/main.js +0 -1
  475. package/lib/cli/main.js.map +0 -1
  476. package/lib/cli/plan.d.ts +0 -13
  477. package/lib/cli/plan.d.ts.map +0 -1
  478. package/lib/cli/plan.js +0 -1
  479. package/lib/cli/plan.js.map +0 -1
  480. package/lib/cli/progress.d.ts +0 -7
  481. package/lib/cli/progress.d.ts.map +0 -1
  482. package/lib/cli/progress.js +0 -30
  483. package/lib/cli/progress.js.map +0 -1
  484. package/lib/cli/spinner.d.ts +0 -2
  485. package/lib/cli/spinner.d.ts.map +0 -1
  486. package/lib/cli/spinner.js +0 -13
  487. package/lib/cli/spinner.js.map +0 -1
  488. package/src/approve.ts +0 -13
  489. package/src/cli/approve.tsx +0 -30
  490. package/src/cli/clack.ts +0 -22
  491. package/src/cli/main.ts +0 -0
  492. package/src/cli/plan.ts +0 -16
  493. package/src/cli/progress.tsx +0 -46
  494. package/src/cli/spinner.ts +0 -14
@@ -4,3 +4,5 @@ export * from "./queue.event-source.ts";
4
4
  export * from "./queue.provider.ts";
5
5
  export * from "./queue.send-message.ts";
6
6
  export * from "./queue.ts";
7
+
8
+ import "../config.ts";
@@ -1,5 +1,5 @@
1
- import { type Capability } from "alchemy-effect";
2
1
  import type * as lambda from "aws-lambda";
2
+ import type { Capability } from "../../capability.ts";
3
3
  import { Queue } from "./queue.ts";
4
4
 
5
5
  export type QueueRecord<Data> = Omit<lambda.SQSRecord, "body"> & {
@@ -1,17 +1,15 @@
1
- import { Binding, type From } from "alchemy-effect";
2
1
  import * as Effect from "effect/Effect";
3
2
  import * as Schedule from "effect/Schedule";
4
3
  import type * as Lambda from "itty-aws/lambda";
4
+ import { Binding } from "../../binding.ts";
5
+ import type { From } from "../../policy.ts";
5
6
  import { createTagger, hasTags } from "../../tags.ts";
6
- import { Account } from "../account.ts";
7
- import {
8
- Function,
9
- LambdaClient,
10
- type FunctionBinding,
11
- } from "../lambda/index.ts";
12
- import { Region } from "../region.ts";
13
7
  import type { Consume } from "./queue.consume.ts";
14
8
  import { Queue, type QueueAttrs, type QueueProps } from "./queue.ts";
9
+ import { Function, type FunctionBinding } from "../lambda/function.ts";
10
+ import { LambdaClient } from "../lambda/client.ts";
11
+ import { Account } from "../account.ts";
12
+ import { Region } from "../region.ts";
15
13
 
16
14
  export interface QueueEventSourceProps {
17
15
  batchSize?: number;
@@ -43,10 +41,9 @@ export const QueueEventSource = Binding<
43
41
 
44
42
  export const queueEventSourceProvider = () =>
45
43
  QueueEventSource.provider.effect(
46
- // @ts-expect-error
47
44
  Effect.gen(function* () {
48
- const region = yield* Region;
49
45
  const accountId = yield* Account;
46
+ const region = yield* Region;
50
47
  const lambda = yield* LambdaClient;
51
48
  const tagged = yield* createTagger();
52
49
 
@@ -113,45 +110,26 @@ export const queueEventSourceProvider = () =>
113
110
  return undefined;
114
111
  });
115
112
 
116
- const createFunctionBinding = (queue: {
117
- attr: { queueArn: string };
118
- }) => ({
119
- // we need the policies to be present before the event source mapping is created
120
- policyStatements: [
121
- {
122
- Sid: "AWS.SQS.Consume",
123
- Effect: "Allow" as const,
124
- Action: [
125
- "sqs:ReceiveMessage",
126
- "sqs:DeleteMessage",
127
- "sqs:ChangeMessageVisibility",
128
- ],
129
- Resource: [queue.attr.queueArn],
130
- },
131
- ],
132
- });
133
-
134
113
  return {
135
- attach: ({ source: queue }) => {
136
- console.log("attaching queue event source", queue.id);
137
- return {
138
- // we need the policies to be present before the event source mapping is created
139
- policyStatements: [
140
- {
141
- Sid: "AWS.SQS.Consume",
142
- Effect: "Allow" as const,
143
- Action: [
144
- "sqs:ReceiveMessage",
145
- "sqs:DeleteMessage",
146
- "sqs:ChangeMessageVisibility",
147
- "sqs:GetQueueAttributes",
148
- "sqs:GetQueueUrl",
149
- ],
150
- Resource: [queue.attr.queueArn],
151
- },
152
- ],
153
- };
154
- },
114
+ attach: ({ source: queue, attr }) => ({
115
+ // TODO(sam): bit of a broken model here - we can't know the UUID until post-attach
116
+ uuid: attr?.uuid ?? undefined!,
117
+ // we need the policies to be present before the event source mapping is created
118
+ policyStatements: [
119
+ {
120
+ Sid: "AWS.SQS.Consume",
121
+ Effect: "Allow" as const,
122
+ Action: [
123
+ "sqs:ReceiveMessage",
124
+ "sqs:DeleteMessage",
125
+ "sqs:ChangeMessageVisibility",
126
+ "sqs:GetQueueAttributes",
127
+ "sqs:GetQueueUrl",
128
+ ],
129
+ Resource: [queue.attr.queueArn],
130
+ },
131
+ ],
132
+ }),
155
133
  postattach: Effect.fn(function* ({
156
134
  source: queue,
157
135
  props: { batchSize, maxBatchingWindow, scalingConfig } = {},
@@ -160,11 +138,6 @@ export const queueEventSourceProvider = () =>
160
138
  attr: { functionName },
161
139
  },
162
140
  }) {
163
- console.log(
164
- "postattaching queue event source",
165
- queue.id,
166
- functionName,
167
- );
168
141
  const config:
169
142
  | Lambda.CreateEventSourceMappingRequest
170
143
  | Lambda.UpdateEventSourceMappingRequest = {
@@ -220,10 +193,11 @@ export const queueEventSourceProvider = () =>
220
193
  ),
221
194
  schedule: Schedule.exponential(100),
222
195
  }),
196
+ Effect.orDie,
223
197
  );
224
198
  return {
225
199
  ...attr,
226
- uuid: eventSourceMapping.UUID,
200
+ uuid: eventSourceMapping.UUID!,
227
201
  };
228
202
  }),
229
203
  detach: Effect.fn(function* ({
@@ -235,7 +209,7 @@ export const queueEventSourceProvider = () =>
235
209
  }) {
236
210
  const uuid =
237
211
  attr?.uuid ??
238
- (yield* findEventSourceMapping(queue, functionName))?.UUID!;
212
+ (yield* findEventSourceMapping(queue, functionName))?.UUID;
239
213
  if (uuid) {
240
214
  // we found (or were aware of) the event source mapping, so we can delete it
241
215
  yield* (
@@ -1,7 +1,8 @@
1
1
  import * as Effect from "effect/Effect";
2
2
  import * as Schedule from "effect/Schedule";
3
3
 
4
- import { App, type ProviderService } from "alchemy-effect";
4
+ import { App } from "../../app.ts";
5
+ import type { ProviderService } from "../../provider.ts";
5
6
  import { Account } from "../account.ts";
6
7
  import { Region } from "../region.ts";
7
8
  import { SQSClient } from "./client.ts";
@@ -14,7 +15,13 @@ export const queueProvider = () =>
14
15
  const app = yield* App;
15
16
  const region = yield* Region;
16
17
  const accountId = yield* Account;
17
- const createQueueName = (id: string, props: QueueProps) =>
18
+ const createQueueName = (
19
+ id: string,
20
+ props: {
21
+ queueName?: string | undefined;
22
+ fifo?: boolean;
23
+ },
24
+ ) =>
18
25
  props.queueName ??
19
26
  `${app.name}-${id}-${app.stage}${props.fifo ? ".fifo" : ""}`;
20
27
  const createAttributes = (props: QueueProps) => ({
@@ -32,6 +39,7 @@ export const queueProvider = () =>
32
39
  VisibilityTimeout: props.visibilityTimeout?.toString(),
33
40
  });
34
41
  return {
42
+ stables: ["queueName", "queueUrl", "queueArn"],
35
43
  diff: Effect.fn(function* ({ id, news, olds }) {
36
44
  const oldFifo = olds.fifo ?? false;
37
45
  const newFifo = news.fifo ?? false;
@@ -1,13 +1,10 @@
1
1
  import * as Effect from "effect/Effect";
2
2
 
3
- import {
4
- Binding,
5
- declare,
6
- toEnvKey,
7
- type Capability,
8
- type To,
9
- } from "alchemy-effect";
10
- import { Function } from "../lambda/index.ts";
3
+ import { Binding } from "../../binding.ts";
4
+ import type { Capability } from "../../capability.ts";
5
+ import { toEnvKey } from "../../env.ts";
6
+ import { declare, type To } from "../../policy.ts";
7
+ import { Function } from "../lambda/function.ts";
11
8
  import { SQSClient } from "./client.ts";
12
9
  import { Queue } from "./queue.ts";
13
10
 
@@ -1,7 +1,6 @@
1
1
  import type * as S from "effect/Schema";
2
-
3
- import { Resource } from "alchemy-effect";
4
-
2
+ import type { Input } from "../../input.ts";
3
+ import { Resource } from "../../resource.ts";
5
4
  // required to avoid this error in consumers: "The inferred type of 'Messages' cannot be named without a reference to '../../effect-aws/node_modules/@types/aws-lambda'. This is likely not portable. A type annotation is necessary.ts(2742)"
6
5
  export type * as lambda from "aws-lambda";
7
6
 
@@ -15,7 +14,13 @@ export const Queue = Resource<{
15
14
  export interface Queue<
16
15
  ID extends string = string,
17
16
  Props extends QueueProps = QueueProps,
18
- > extends Resource<"AWS.SQS.Queue", ID, Props, QueueAttrs<Props>> {}
17
+ > extends Resource<
18
+ "AWS.SQS.Queue",
19
+ ID,
20
+ Props,
21
+ QueueAttrs<Extract<Input.Resolve<Props>, QueueProps>>,
22
+ Queue
23
+ > {}
19
24
 
20
25
  export type QueueAttrs<Props extends QueueProps> = {
21
26
  queueName: Props["queueName"] extends string ? Props["queueName"] : string;
package/src/binding.ts CHANGED
@@ -2,9 +2,9 @@ import * as Context from "effect/Context";
2
2
  import type { Effect } from "effect/Effect";
3
3
  import * as Layer from "effect/Layer";
4
4
  import type { Capability, ICapability } from "./capability.ts";
5
- import type { Diff } from "./provider.ts";
6
- import type { Resource } from "./resource.ts";
7
- import type { Runtime } from "./runtime.ts";
5
+ import type { Diff } from "./diff.ts";
6
+ import type { IResource, Resource } from "./resource.ts";
7
+ import type { IRuntime } from "./runtime.ts";
8
8
 
9
9
  export interface BindingProps {
10
10
  [key: string]: any;
@@ -13,7 +13,7 @@ export interface BindingProps {
13
13
  export const isBinding = (b: any): b is AnyBinding =>
14
14
  "runtime" in b && "capability" in b && "tag" in b && "output" in b;
15
15
 
16
- export type AnyBinding<F extends Runtime = any> = Binding<
16
+ export type AnyBinding<F extends IRuntime = any> = Binding<
17
17
  F,
18
18
  any,
19
19
  any,
@@ -23,7 +23,7 @@ export type AnyBinding<F extends Runtime = any> = Binding<
23
23
  >;
24
24
 
25
25
  export interface Binding<
26
- Run extends Runtime<any, any, any>,
26
+ Run extends IRuntime<any, any, any>,
27
27
  Cap extends Capability = Capability,
28
28
  Props = any,
29
29
  Attr extends Run["binding"] = any,
@@ -40,14 +40,14 @@ export interface Binding<
40
40
 
41
41
  /** Tag for a Service that can bind a Capability to a Runtime */
42
42
  export interface Bind<
43
- F extends Runtime,
43
+ F extends IRuntime,
44
44
  Cap extends Capability,
45
45
  Tag extends string,
46
46
  > extends Context.Tag<
47
47
  `${F["type"]}(${Cap["type"]}, ${Tag})`,
48
48
  BindingService<
49
49
  F,
50
- Extract<Extract<Cap["resource"], Resource>["parent"], Resource>,
50
+ Extract<Extract<Cap["resource"], Resource>["base"], Resource>,
51
51
  F["props"]
52
52
  >
53
53
  > {
@@ -91,12 +91,12 @@ export const Binding: {
91
91
  effect: (eff) => Layer.effect(Tag, eff),
92
92
  succeed: (service) => Layer.succeed(Tag, service),
93
93
  },
94
- } satisfies BindingDeclaration<Runtime, any>,
94
+ } satisfies BindingDeclaration<IRuntime, any>,
95
95
  );
96
96
  };
97
97
 
98
98
  export interface BindingDeclaration<
99
- Run extends Runtime,
99
+ Run extends IRuntime,
100
100
  F extends (target: any, props?: any) => AnyBinding<Run>,
101
101
  Tag extends string = ReturnType<F>["tag"],
102
102
  Cap extends Capability = ReturnType<F>["capability"],
@@ -126,8 +126,8 @@ export interface BindingDeclaration<
126
126
  }
127
127
 
128
128
  export interface BindingDiffProps<
129
- Source extends Resource = Resource,
130
- Target extends Resource = Resource,
129
+ Source extends IResource = IResource,
130
+ Target extends IResource = IResource,
131
131
  Props = any,
132
132
  Attr = any,
133
133
  > {
@@ -148,8 +148,8 @@ export interface BindingDiffProps<
148
148
  }
149
149
 
150
150
  export interface BindingAttachProps<
151
- Source extends Resource,
152
- Target extends Resource,
151
+ Source extends IResource,
152
+ Target extends IResource,
153
153
  Props,
154
154
  Attr,
155
155
  > {
@@ -168,8 +168,8 @@ export interface BindingAttachProps<
168
168
  }
169
169
 
170
170
  export interface BindingReattachProps<
171
- Source extends Resource,
172
- Target extends Resource,
171
+ Source extends IResource,
172
+ Target extends IResource,
173
173
  Props,
174
174
  Attr,
175
175
  > {
@@ -188,8 +188,8 @@ export interface BindingReattachProps<
188
188
  }
189
189
 
190
190
  export interface BindingDetachProps<
191
- Source extends Resource,
192
- Target extends Resource,
191
+ Source extends IResource,
192
+ Target extends IResource,
193
193
  Props,
194
194
  Attr,
195
195
  > {
@@ -208,8 +208,8 @@ export interface BindingDetachProps<
208
208
  }
209
209
 
210
210
  export type BindingService<
211
- Target extends Runtime = any,
212
- Source extends Resource = Resource,
211
+ Target extends IRuntime = any,
212
+ Source extends IResource = IResource,
213
213
  Props = any,
214
214
  Attr extends Target["binding"] = any,
215
215
  DiffReq = never,
@@ -1,13 +1,13 @@
1
1
  // biome-ignore lint/style/useImportType: UMD global
2
2
  import React, { useState } from "react";
3
3
 
4
- import type * as Alchemy from "alchemy-effect";
5
4
  import { Box, Text, useApp, useInput } from "ink";
5
+ import type { IPlan as AlchemyPlan } from "../../plan.ts";
6
6
 
7
7
  import { Plan } from "./Plan.tsx";
8
8
 
9
9
  export interface ApprovePlanProps {
10
- plan: Alchemy.Plan;
10
+ plan: AlchemyPlan;
11
11
  approve: (result: boolean) => void;
12
12
  }
13
13
 
@@ -1,11 +1,12 @@
1
1
  // biome-ignore lint/style/useImportType: UMD global
2
2
  import React, { useMemo } from "react";
3
3
 
4
- import type { BindNode, Capability, CRUD, Plan } from "alchemy-effect";
5
4
  import { Box, Text } from "ink";
5
+ import type { Capability } from "../../capability.ts";
6
+ import type { IPlan as AlchemyPlan, BindNode, CRUD } from "../../plan.ts";
6
7
 
7
8
  export interface PlanProps {
8
- plan: Plan;
9
+ plan: AlchemyPlan;
9
10
  }
10
11
  export function Plan({ plan }: PlanProps): React.JSX.Element {
11
12
  const items = useMemo(
@@ -1,20 +1,27 @@
1
1
  // biome-ignore lint/style/useImportType: UMD global
2
2
  import React, { useEffect, useMemo, useRef, useState } from "react";
3
3
 
4
- import type * as Alchemy from "alchemy-effect";
5
4
  import { Box, Text } from "ink";
6
- import type { ProgressEventSource } from "../progress.tsx";
7
- import { useGlobalSpinner } from "../spinner.ts";
5
+ import type {
6
+ ApplyEvent,
7
+ ApplyStatus,
8
+ StatusChangeEvent,
9
+ } from "../../event.ts";
10
+ import type { IPlan } from "../../plan.ts";
11
+
12
+ interface ProgressEventSource {
13
+ subscribe(listener: (event: ApplyEvent) => void): () => void;
14
+ }
8
15
 
9
16
  interface PlanTask
10
- extends Required<Pick<Alchemy.StatusChangeEvent, "id" | "type" | "status">> {
17
+ extends Required<Pick<StatusChangeEvent, "id" | "type" | "status">> {
11
18
  message?: string;
12
19
  updatedAt: number;
13
20
  }
14
21
 
15
- export interface PlanProgressProps {
22
+ interface PlanProgressProps {
16
23
  source: ProgressEventSource;
17
- plan: Alchemy.Plan;
24
+ plan: IPlan;
18
25
  }
19
26
 
20
27
  export function PlanProgress(props: PlanProgressProps): React.JSX.Element {
@@ -29,7 +36,7 @@ export function PlanProgress(props: PlanProgressProps): React.JSX.Element {
29
36
  ];
30
37
  for (const [id, item] of nodes) {
31
38
  const planItem = item!;
32
- const status: Alchemy.ApplyStatus =
39
+ const status: ApplyStatus =
33
40
  planItem.action === "noop" ? "success" : "pending";
34
41
  initialTasks.set(id, {
35
42
  id,
@@ -89,7 +96,7 @@ export function PlanProgress(props: PlanProgressProps): React.JSX.Element {
89
96
  ];
90
97
  for (const [id, item] of nodes) {
91
98
  const planItem = item!;
92
- const status: Alchemy.ApplyStatus =
99
+ const status: ApplyStatus =
93
100
  planItem.action === "noop" ? "success" : "pending";
94
101
  initialTasks.set(id, {
95
102
  id,
@@ -146,7 +153,7 @@ export function PlanProgress(props: PlanProgressProps): React.JSX.Element {
146
153
  );
147
154
  }
148
155
 
149
- function statusPriority(status: Alchemy.ApplyStatus): number {
156
+ function statusPriority(status: ApplyStatus): number {
150
157
  switch (status) {
151
158
  case "success":
152
159
  case "created":
@@ -166,9 +173,7 @@ function statusPriority(status: Alchemy.ApplyStatus): number {
166
173
  }
167
174
  }
168
175
 
169
- function statusColor(
170
- status: Alchemy.ApplyStatus,
171
- ): Parameters<typeof Text>[0]["color"] {
176
+ function statusColor(status: ApplyStatus): Parameters<typeof Text>[0]["color"] {
172
177
  switch (status) {
173
178
  case "pending":
174
179
  return "gray";
@@ -190,13 +195,13 @@ function statusColor(
190
195
  }
191
196
  }
192
197
 
193
- function statusIcon(status: Alchemy.ApplyStatus, spinnerChar: string): string {
198
+ function statusIcon(status: ApplyStatus, spinnerChar: string): string {
194
199
  if (isInProgress(status)) return spinnerChar;
195
200
  if (status === "fail") return "✗";
196
201
  return "✓"; // created/updated/deleted/success
197
202
  }
198
203
 
199
- function isInProgress(status: Alchemy.ApplyStatus): boolean {
204
+ function isInProgress(status: ApplyStatus): boolean {
200
205
  return (
201
206
  status === "pending" ||
202
207
  status === "creating" ||
@@ -204,3 +209,16 @@ function isInProgress(status: Alchemy.ApplyStatus): boolean {
204
209
  status === "deleting"
205
210
  );
206
211
  }
212
+
213
+ const spinnerFrames = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
214
+
215
+ function useGlobalSpinner(intervalMs = 80): string {
216
+ const [index, setIndex] = useState(0);
217
+ useEffect(() => {
218
+ const timer = setInterval(() => {
219
+ setIndex((i) => (i + 1) % spinnerFrames.length);
220
+ }, intervalMs);
221
+ return () => clearInterval(timer);
222
+ }, [intervalMs]);
223
+ return spinnerFrames[index];
224
+ }
package/src/cli/index.ts CHANGED
@@ -1,6 +1,2 @@
1
- import * as Layer from "effect/Layer";
2
-
3
- import { requireApproval } from "./approve.tsx";
4
- import { reportProgress } from "./progress.tsx";
5
-
6
- export const layer = Layer.merge(requireApproval, reportProgress);
1
+ export * from "./service.ts";
2
+ export * from "./ink-service.tsx";
@@ -0,0 +1,61 @@
1
+ import React from "react";
2
+
3
+ import { type PlanStatusSession, CLI } from "./service.ts";
4
+ import * as Effect from "effect/Effect";
5
+ import * as Layer from "effect/Layer";
6
+ import type { IPlan } from "../plan.ts";
7
+ import { render } from "ink";
8
+ import { ApprovePlan } from "./components/ApprovePlan.tsx";
9
+ import { Plan } from "./components/Plan.tsx";
10
+ import { PlanProgress } from "./components/PlanProgress.tsx";
11
+ import type { ApplyEvent } from "../event.ts";
12
+
13
+ export const inkCLI = () =>
14
+ Layer.succeed(
15
+ CLI,
16
+ CLI.of({
17
+ approvePlan,
18
+ displayPlan,
19
+ startApplySession,
20
+ }),
21
+ );
22
+
23
+ const approvePlan = Effect.fn(function* <P extends IPlan>(plan: P) {
24
+ let approved = false;
25
+ const { waitUntilExit } = render(
26
+ <ApprovePlan plan={plan} approve={(a) => (approved = a)} />,
27
+ );
28
+ yield* Effect.promise(waitUntilExit);
29
+ return approved;
30
+ });
31
+
32
+ const displayPlan = <P extends IPlan>(plan: P): Effect.Effect<void> =>
33
+ Effect.sync(() => {
34
+ const { unmount } = render(<Plan plan={plan} />);
35
+ unmount();
36
+ });
37
+
38
+ const startApplySession = Effect.fn(function* <P extends IPlan>(plan: P) {
39
+ const listeners = new Set<(event: ApplyEvent) => void>();
40
+ const { unmount } = render(
41
+ <PlanProgress
42
+ plan={plan}
43
+ source={{
44
+ subscribe(listener) {
45
+ listeners.add(listener);
46
+ return () => listeners.delete(listener);
47
+ },
48
+ }}
49
+ />,
50
+ );
51
+ return {
52
+ done: Effect.fn(function* () {
53
+ yield* Effect.sleep(10); // give the react event loop time to re-render
54
+ yield* Effect.sync(() => unmount());
55
+ }),
56
+ emit: (event) =>
57
+ Effect.sync(() => {
58
+ for (const listener of listeners) listener(event);
59
+ }),
60
+ } satisfies PlanStatusSession;
61
+ });
@@ -0,0 +1,23 @@
1
+ import type { IPlan } from "../plan.ts";
2
+ import * as Effect from "effect/Effect";
3
+ import * as Context from "effect/Context";
4
+ import type { ApplyEvent } from "../event.ts";
5
+
6
+ export interface PlanStatusSession {
7
+ emit: (event: ApplyEvent) => Effect.Effect<void>;
8
+ done: () => Effect.Effect<void>;
9
+ }
10
+
11
+ export interface ScopedPlanStatusSession extends PlanStatusSession {
12
+ note: (note: string) => Effect.Effect<void>;
13
+ }
14
+
15
+ export interface CLIService {
16
+ approvePlan: <P extends IPlan>(plan: P) => Effect.Effect<boolean>;
17
+ displayPlan: <P extends IPlan>(plan: P) => Effect.Effect<void>;
18
+ startApplySession: <P extends IPlan>(
19
+ plan: P,
20
+ ) => Effect.Effect<PlanStatusSession>;
21
+ }
22
+
23
+ export class CLI extends Context.Tag("CLIService")<CLI, CLIService>() {}
@@ -0,0 +1,37 @@
1
+ import * as Layer from "effect/Layer";
2
+ import * as Context from "effect/Context";
3
+ import * as Effect from "effect/Effect";
4
+ import * as Config from "effect/Config";
5
+ import { App } from "../app.ts";
6
+
7
+ export class Account extends Context.Tag("cloudflare/account-id")<
8
+ Account,
9
+ string
10
+ >() {}
11
+
12
+ export const fromEnv = () =>
13
+ Layer.effect(
14
+ Account,
15
+ Effect.gen(function* () {
16
+ const accountId = yield* Config.string("CLOUDFLARE_ACCOUNT_ID");
17
+ if (!accountId) {
18
+ return yield* Effect.die("CLOUDFLARE_ACCOUNT_ID is not set");
19
+ }
20
+ return accountId;
21
+ }),
22
+ );
23
+
24
+ export const fromStageConfig = () =>
25
+ Layer.effect(
26
+ Account,
27
+ Effect.gen(function* () {
28
+ const app = yield* App;
29
+ const accountId =
30
+ app.config.cloudflare?.account ??
31
+ (yield* Config.string("CLOUDFLARE_ACCOUNT_ID"));
32
+ if (!accountId) {
33
+ return yield* Effect.die("CLOUDFLARE_ACCOUNT_ID is not set");
34
+ }
35
+ return accountId;
36
+ }),
37
+ );