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
package/lib/apply.js CHANGED
@@ -1,45 +1,51 @@
1
1
  import * as Context from "effect/Context";
2
2
  import * as Effect from "effect/Effect";
3
- import * as Option from "effect/Option";
4
- import { PlanReviewer } from "./approve.js";
3
+ import { App } from "./app.js";
4
+ import { CLI, } from "./cli/service.js";
5
+ import { generateInstanceId } from "./instance-id.js";
6
+ import * as Output from "./output.js";
5
7
  import { plan, } from "./plan.js";
6
- import { State } from "./state.js";
7
- export class PlanStatusReporter extends Context.Tag("PlanStatusReporter")() {
8
- }
9
- export const apply = (...args) => Effect.isEffect(args[0])
10
- ? applyPlan(args[0])
11
- : args.length === 1 && "phase" in args[0]
12
- ? applyResourcesPhase(args[0])
13
- : applyResources(...args);
14
- export const applyResourcesPhase = (props) => applyPlan(plan(props));
15
- export const applyResources = (...resources) => applyPlan(plan({
16
- phase: "update",
17
- resources,
18
- }));
19
- export const applyPlan = (plan) => plan.pipe(Effect.flatMap((plan) => Effect.gen(function* () {
8
+ import { State, StateStoreError, } from "./state.js";
9
+ import { asEffect } from "./util.js";
10
+ import { getProviderByType } from "./provider.js";
11
+ export const apply = (...resources) => plan(...resources).pipe(Effect.flatMap((p) => applyPlan(p)));
12
+ export const applyPlan = (plan) => Effect.gen(function* () {
13
+ const cli = yield* CLI;
14
+ const session = yield* cli.startApplySession(plan);
15
+ // 1. expand the graph (create new resources, update existing and create replacements)
16
+ const resources = yield* expandAndPivot(plan, session);
17
+ // TODO(sam): support roll back to previous state if errors occur during expansion
18
+ // -> RISK: some UPDATEs may not be reverisble (i.e. trigger replacements)
19
+ // TODO(sam): should pivot be done separately? E.g shift traffic?
20
+ // 2. delete orphans and replaced resources
21
+ yield* collectGarbage(plan, session);
22
+ yield* session.done();
23
+ if (Object.keys(plan.resources).length === 0) {
24
+ // all resources are deleted, return undefined
25
+ return undefined;
26
+ }
27
+ return resources;
28
+ });
29
+ const expandAndPivot = Effect.fnUntraced(function* (plan, session) {
20
30
  const state = yield* State;
31
+ const app = yield* App;
21
32
  const outputs = {};
22
- const reviewer = yield* Effect.serviceOption(PlanReviewer);
23
- if (Option.isSome(reviewer)) {
24
- yield* reviewer.value.approve(plan);
25
- }
26
- const events = yield* Effect.serviceOption(PlanStatusReporter);
27
- const session = Option.isSome(events)
28
- ? yield* events.value.start(plan)
29
- : {
30
- emit: () => Effect.void,
31
- done: () => Effect.void,
33
+ const resolveUpstream = Effect.fn(function* (resourceId) {
34
+ const upstreamNode = plan.resources[resourceId];
35
+ const upstreamAttr = upstreamNode
36
+ ? yield* apply(upstreamNode)
37
+ : yield* Effect.dieMessage(`Resource ${resourceId} not found`);
38
+ return {
39
+ resourceId,
40
+ upstreamAttr,
41
+ upstreamNode,
32
42
  };
33
- const { emit, done } = session;
34
- const constOrEffect = (effect) => Effect.isEffect(effect) ? effect : Effect.succeed(effect);
35
- const resolveBindingUpstream = Effect.fn(function* ({ node, resource, }) {
43
+ });
44
+ const resolveBindingUpstream = Effect.fn(function* ({ node, }) {
36
45
  const binding = node.binding;
37
46
  const provider = yield* binding.Tag;
38
47
  const resourceId = node.binding.capability.resource.id;
39
- const upstreamNode = plan.resources[resourceId];
40
- const upstreamAttr = resource
41
- ? yield* apply(upstreamNode)
42
- : yield* Effect.dieMessage(`Resource ${resourceId} not found`);
48
+ const { upstreamAttr, upstreamNode } = yield* resolveUpstream(resourceId);
43
49
  return {
44
50
  resourceId,
45
51
  upstreamAttr,
@@ -60,14 +66,14 @@ export const applyPlan = (plan) => plan.pipe(Effect.flatMap((plan) => Effect.gen
60
66
  target,
61
67
  };
62
68
  if (node.action === "attach") {
63
- return yield* constOrEffect(provider.attach(input));
69
+ return yield* asEffect(provider.attach(input));
64
70
  }
65
71
  else if (node.action === "reattach") {
66
72
  // reattach is optional, we fall back to attach if it's not available
67
- return yield* constOrEffect((provider.reattach ? provider.reattach : provider.attach)(input));
73
+ return yield* asEffect((provider.reattach ? provider.reattach : provider.attach)(input));
68
74
  }
69
75
  else if (node.action === "detach" && provider.detach) {
70
- return yield* constOrEffect(provider.detach({
76
+ return yield* asEffect(provider.detach({
71
77
  ...input,
72
78
  target,
73
79
  }));
@@ -79,7 +85,7 @@ export const applyPlan = (plan) => plan.pipe(Effect.flatMap((plan) => Effect.gen
79
85
  const oldBindingOutput = bindingOutputs[i];
80
86
  if (provider.postattach &&
81
87
  (node.action === "attach" || node.action === "reattach")) {
82
- const bindingOutput = yield* constOrEffect(provider.postattach({
88
+ const bindingOutput = yield* asEffect(provider.postattach({
83
89
  source: {
84
90
  id: resourceId,
85
91
  attr: upstreamAttr,
@@ -97,17 +103,12 @@ export const applyPlan = (plan) => plan.pipe(Effect.flatMap((plan) => Effect.gen
97
103
  return oldBindingOutput;
98
104
  })));
99
105
  const apply = (node) => Effect.gen(function* () {
100
- const checkpoint = (effect) => effect.pipe(Effect.flatMap((output) => saveState({ output })));
101
- const saveState = ({ output, bindings = node.bindings, }) => state
102
- .set(node.resource.id, {
103
- id: node.resource.id,
104
- type: node.resource.type,
105
- status: node.action === "create" ? "created" : "updated",
106
- props: node.resource.props,
107
- output,
108
- bindings,
109
- })
110
- .pipe(Effect.map(() => output));
106
+ const commit = (value) => state.set({
107
+ stack: app.name,
108
+ stage: app.stage,
109
+ resourceId: node.resource.id,
110
+ value,
111
+ });
111
112
  const id = node.resource.id;
112
113
  const resource = node.resource;
113
114
  const scopedSession = {
@@ -119,159 +120,443 @@ export const applyPlan = (plan) => plan.pipe(Effect.flatMap((plan) => Effect.gen
119
120
  }),
120
121
  };
121
122
  return yield* (outputs[id] ??= yield* Effect.cached(Effect.gen(function* () {
122
- const report = (status) => emit({
123
+ const report = (status) => session.emit({
123
124
  kind: "status-change",
124
125
  id,
125
126
  type: node.resource.type,
126
127
  status,
127
128
  });
128
- const createOrUpdate = Effect.fn(function* ({ node, attr, phase, }) {
129
- yield* report(phase === "create" ? "creating" : "updating");
129
+ if (node.action === "noop") {
130
+ return node.state.attr;
131
+ }
132
+ // resolve upstream dependencies before committing any changes to state
133
+ const upstream = Object.fromEntries(yield* Effect.all(Object.entries(Output.resolveUpstream(node.props)).map(([id]) => resolveUpstream(id).pipe(Effect.map(({ upstreamAttr }) => [id, upstreamAttr])))));
134
+ const instanceId = yield* Effect.gen(function* () {
135
+ if (node.action === "create" && !node.state?.instanceId) {
136
+ const instanceId = yield* generateInstanceId();
137
+ yield* commit({
138
+ status: "creating",
139
+ instanceId,
140
+ logicalId: id,
141
+ downstream: node.downstream,
142
+ props: node.props,
143
+ providerVersion: node.provider.version ?? 0,
144
+ resourceType: node.resource.type,
145
+ bindings: node.bindings,
146
+ });
147
+ return instanceId;
148
+ }
149
+ else if (node.action === "replace") {
150
+ if (node.state.status === "replaced" ||
151
+ node.state.status === "replacing") {
152
+ // replace has already begun and we have the new instanceId, do not re-create it
153
+ return node.state.instanceId;
154
+ }
155
+ const instanceId = yield* generateInstanceId();
156
+ yield* commit({
157
+ status: "replacing",
158
+ instanceId,
159
+ logicalId: id,
160
+ downstream: node.downstream,
161
+ props: node.props,
162
+ providerVersion: node.provider.version ?? 0,
163
+ resourceType: node.resource.type,
164
+ bindings: node.bindings,
165
+ old: node.state,
166
+ deleteFirst: node.deleteFirst,
167
+ });
168
+ return instanceId;
169
+ }
170
+ else if (node.state?.instanceId) {
171
+ // we're in a create, update or delete state with a stable instanceId, use it
172
+ return node.state.instanceId;
173
+ }
174
+ // this should never happen
175
+ return yield* Effect.dieMessage(`Instance ID not found for resource '${id}' and action is '${node.action}'`);
176
+ });
177
+ if (node.action === "create") {
178
+ const news = (yield* Output.evaluate(node.props, upstream));
179
+ const checkpoint = (attr) => commit({
180
+ status: "creating",
181
+ logicalId: id,
182
+ instanceId,
183
+ resourceType: node.resource.type,
184
+ props: news,
185
+ attr,
186
+ providerVersion: node.provider.version ?? 0,
187
+ bindings: node.bindings,
188
+ downstream: node.downstream,
189
+ });
190
+ if (!node.state) {
191
+ yield* checkpoint(undefined);
192
+ }
193
+ let attr;
194
+ if (node.action === "create" &&
195
+ node.provider.precreate &&
196
+ // pre-create is only designed to ensure the resource exists, if we have state.attr, then it already exists and should be skipped
197
+ node.state?.attr === undefined) {
198
+ yield* report("pre-creating");
199
+ // stub the resource prior to resolving upstream resources or bindings if a stub is available
200
+ attr = yield* node.provider.precreate({
201
+ id,
202
+ news: node.props,
203
+ session: scopedSession,
204
+ instanceId,
205
+ });
206
+ yield* checkpoint(attr);
207
+ }
208
+ yield* report("attaching");
130
209
  let bindingOutputs = yield* attachBindings({
131
210
  resource,
132
211
  bindings: node.bindings,
133
212
  target: {
134
213
  id,
135
- props: node.news,
214
+ props: news,
136
215
  attr,
137
216
  },
138
217
  });
139
- const output = yield* (phase === "create"
140
- ? node.provider.create
141
- : node.provider.update)({
218
+ yield* report("creating");
219
+ attr = yield* node.provider.create({
142
220
  id,
143
- news: node.news,
221
+ news,
222
+ instanceId,
144
223
  bindings: bindingOutputs,
145
224
  session: scopedSession,
146
- ...(node.action === "update"
147
- ? {
148
- output: node.output,
149
- olds: node.olds,
150
- }
151
- : {}),
152
- }).pipe(
153
- // TODO(sam): partial checkpoints
154
- // checkpoint,
155
- Effect.tap(() => report(phase === "create" ? "created" : "updated")));
225
+ });
226
+ yield* checkpoint(attr);
227
+ yield* report("post-attach");
156
228
  bindingOutputs = yield* postAttachBindings({
157
229
  resource,
158
230
  bindings: node.bindings,
159
231
  bindingOutputs,
160
232
  target: {
161
233
  id,
162
- props: node.news,
234
+ props: news,
163
235
  attr,
164
236
  },
165
237
  });
166
- yield* saveState({
167
- output,
238
+ yield* commit({
239
+ status: "created",
240
+ logicalId: id,
241
+ instanceId,
242
+ resourceType: node.resource.type,
243
+ props: news,
244
+ attr,
168
245
  bindings: node.bindings.map((binding, i) => ({
169
246
  ...binding,
170
247
  attr: bindingOutputs[i],
171
248
  })),
249
+ providerVersion: node.provider.version ?? 0,
250
+ downstream: node.downstream,
172
251
  });
173
- return output;
174
- });
175
- if (node.action === "noop") {
176
- return (yield* state.get(id))?.output;
252
+ yield* report("created");
253
+ return attr;
254
+ }
255
+ else if (node.action === "update") {
256
+ const upstream = Object.fromEntries(yield* Effect.all(Object.entries(Output.resolveUpstream(node.props)).map(([id]) => resolveUpstream(id).pipe(Effect.map(({ upstreamAttr }) => [id, upstreamAttr])))));
257
+ const news = (yield* Output.evaluate(node.props, upstream));
258
+ const checkpoint = (attr) => {
259
+ if (node.state.status === "replaced") {
260
+ return commit({
261
+ ...node.state,
262
+ attr,
263
+ props: news,
264
+ });
265
+ }
266
+ else {
267
+ return commit({
268
+ status: "updating",
269
+ logicalId: id,
270
+ instanceId,
271
+ resourceType: node.resource.type,
272
+ props: news,
273
+ attr,
274
+ providerVersion: node.provider.version ?? 0,
275
+ bindings: node.bindings,
276
+ downstream: node.downstream,
277
+ old: node.state.status === "updating"
278
+ ? node.state.old
279
+ : node.state,
280
+ });
281
+ }
282
+ };
283
+ yield* checkpoint(node.state.attr);
284
+ yield* report("attaching");
285
+ let bindingOutputs = yield* attachBindings({
286
+ resource,
287
+ bindings: node.bindings,
288
+ target: {
289
+ id,
290
+ props: news,
291
+ attr: node.state.attr,
292
+ },
293
+ });
294
+ yield* report("updating");
295
+ const attr = yield* node.provider.update({
296
+ id,
297
+ news,
298
+ instanceId,
299
+ bindings: bindingOutputs,
300
+ session: scopedSession,
301
+ olds: node.state.status === "created" ||
302
+ node.state.status === "updated" ||
303
+ node.state.status === "replaced"
304
+ ? node.state.props
305
+ : node.state.old.props,
306
+ output: node.state.attr,
307
+ });
308
+ yield* checkpoint(attr);
309
+ yield* report("post-attach");
310
+ bindingOutputs = yield* postAttachBindings({
311
+ resource,
312
+ bindings: node.bindings,
313
+ bindingOutputs,
314
+ target: {
315
+ id,
316
+ props: news,
317
+ attr,
318
+ },
319
+ });
320
+ if (node.state.status === "replaced") {
321
+ yield* commit({
322
+ ...node.state,
323
+ attr,
324
+ props: news,
325
+ });
326
+ }
327
+ else {
328
+ yield* commit({
329
+ status: "updated",
330
+ logicalId: id,
331
+ instanceId,
332
+ resourceType: node.resource.type,
333
+ props: news,
334
+ attr,
335
+ bindings: node.bindings.map((binding, i) => ({
336
+ ...binding,
337
+ attr: bindingOutputs[i],
338
+ })),
339
+ providerVersion: node.provider.version ?? 0,
340
+ downstream: node.downstream,
341
+ });
342
+ }
343
+ yield* report("updated");
344
+ return attr;
177
345
  }
178
- else if (node.action === "create") {
346
+ else if (node.action === "replace") {
347
+ if (node.state.status === "replaced") {
348
+ // we've already created the replacement resource, return the output
349
+ return node.state.attr;
350
+ }
351
+ let state;
352
+ if (node.state.status !== "replacing") {
353
+ yield* commit((state = {
354
+ status: "replacing",
355
+ logicalId: id,
356
+ instanceId,
357
+ resourceType: node.resource.type,
358
+ props: node.props,
359
+ attr: node.state.attr,
360
+ providerVersion: node.provider.version ?? 0,
361
+ deleteFirst: node.deleteFirst,
362
+ old: node.state,
363
+ downstream: node.downstream,
364
+ }));
365
+ }
366
+ else {
367
+ state = node.state;
368
+ }
369
+ const upstream = Object.fromEntries(yield* Effect.all(Object.entries(Output.resolveUpstream(node.props)).map(([id]) => resolveUpstream(id).pipe(Effect.map(({ upstreamAttr }) => [id, upstreamAttr])))));
370
+ const news = (yield* Output.evaluate(node.props, upstream));
371
+ const checkpoint = ({ status, attr, bindings, }) => commit({
372
+ status,
373
+ logicalId: id,
374
+ instanceId,
375
+ resourceType: node.resource.type,
376
+ props: news,
377
+ attr,
378
+ providerVersion: node.provider.version ?? 0,
379
+ bindings: bindings ?? node.bindings,
380
+ downstream: node.downstream,
381
+ old: state.old,
382
+ deleteFirst: node.deleteFirst,
383
+ });
179
384
  let attr;
180
- if (node.provider.precreate) {
181
- yield* Effect.logDebug("precreate", id);
385
+ if (node.provider.precreate &&
386
+ // pre-create is only designed to ensure the resource exists, if we have state.attr, then it already exists and should be skipped
387
+ node.state?.attr === undefined) {
388
+ yield* report("pre-creating");
182
389
  // stub the resource prior to resolving upstream resources or bindings if a stub is available
183
390
  attr = yield* node.provider.precreate({
184
391
  id,
185
- news: node.news,
392
+ news: node.props,
186
393
  session: scopedSession,
394
+ instanceId,
395
+ });
396
+ yield* checkpoint({
397
+ status: "replacing",
398
+ attr,
187
399
  });
188
400
  }
189
- yield* Effect.logDebug("create", id);
190
- return yield* createOrUpdate({
191
- node,
192
- attr,
193
- phase: "create",
194
- });
195
- }
196
- else if (node.action === "update") {
197
- yield* Effect.logDebug("update", id);
198
- return yield* createOrUpdate({
199
- node,
200
- attr: node.attributes,
201
- phase: "update",
401
+ yield* report("attaching");
402
+ let bindingOutputs = yield* attachBindings({
403
+ resource,
404
+ bindings: node.bindings,
405
+ target: {
406
+ id,
407
+ props: news,
408
+ attr,
409
+ },
202
410
  });
203
- }
204
- else if (node.action === "delete") {
205
- yield* Effect.logDebug("delete", id);
206
- yield* Effect.all(node.downstream.map((dep) => dep in plan.resources
207
- ? apply(plan.resources[dep])
208
- : Effect.void));
209
- yield* report("deleting");
210
- return yield* node.provider
211
- .delete({
411
+ yield* report("creating replacement");
412
+ attr = yield* node.provider.create({
212
413
  id,
213
- olds: node.olds,
214
- output: node.output,
414
+ news,
415
+ instanceId,
416
+ bindings: bindingOutputs,
215
417
  session: scopedSession,
216
- bindings: [],
217
- })
218
- .pipe(Effect.flatMap(() => state.delete(id)), Effect.tap(() => report("deleted")));
219
- }
220
- else if (node.action === "replace") {
221
- const destroy = Effect.gen(function* () {
222
- yield* report("deleting");
223
- return yield* node.provider.delete({
224
- id,
225
- olds: node.olds,
226
- output: node.output,
227
- session: scopedSession,
228
- bindings: [],
229
- });
230
418
  });
231
- const create = Effect.gen(function* () {
232
- yield* report("creating");
233
- return yield* (node.provider
234
- .create({
419
+ yield* checkpoint({
420
+ status: "replacing",
421
+ attr,
422
+ });
423
+ yield* report("post-attach");
424
+ bindingOutputs = yield* postAttachBindings({
425
+ resource,
426
+ bindings: node.bindings,
427
+ bindingOutputs,
428
+ target: {
235
429
  id,
236
- news: node.news,
237
- // TODO(sam): these need to only include attach actions
238
- bindings: yield* attachBindings({
239
- resource,
240
- bindings: node.bindings,
241
- target: {
242
- id,
243
- props: node.news,
244
- attr: node.attributes,
245
- },
246
- }),
247
- session: scopedSession,
248
- })
249
- // TODO(sam): delete and create will conflict here, we need to extend the state store for replace
250
- .pipe(checkpoint, Effect.tap(() => report("created"))));
430
+ props: news,
431
+ attr,
432
+ },
251
433
  });
252
- if (!node.deleteFirst) {
253
- yield* destroy;
254
- return outputs;
255
- }
256
- else {
257
- yield* destroy;
258
- return yield* create;
259
- }
434
+ yield* checkpoint({
435
+ status: "replaced",
436
+ attr,
437
+ bindings: node.bindings.map((binding, i) => ({
438
+ ...binding,
439
+ attr: bindingOutputs[i],
440
+ })),
441
+ });
442
+ yield* report("created");
443
+ return attr;
260
444
  }
445
+ // @ts-expect-error
446
+ return yield* Effect.dieMessage(`Unknown action: ${node.action}`);
261
447
  })));
262
448
  });
263
- const nodes = [
264
- ...Object.entries(plan.resources),
265
- ...Object.entries(plan.deletions),
266
- ];
267
- const resources = Object.fromEntries(yield* Effect.all(nodes.map(Effect.fn(function* ([id, node]) {
449
+ return Object.fromEntries(yield* Effect.all(Object.entries(plan.resources).map(Effect.fn(function* ([id, node]) {
268
450
  return [id, yield* apply(node)];
269
451
  }))));
270
- yield* done();
271
- if (Object.keys(plan.resources).length === 0) {
272
- // all resources are deleted, return undefined
273
- return undefined;
274
- }
275
- return resources;
276
- })));
452
+ });
453
+ const collectGarbage = Effect.fnUntraced(function* (plan, session) {
454
+ const state = yield* State;
455
+ const app = yield* App;
456
+ const deletions = {};
457
+ // delete all replaced resources
458
+ const replacedResources = yield* state.getReplacedResources({
459
+ stack: app.name,
460
+ stage: app.stage,
461
+ });
462
+ const deletionGraph = {
463
+ ...plan.deletions,
464
+ ...Object.fromEntries(replacedResources.map((replaced) => [replaced.logicalId, replaced])),
465
+ };
466
+ const deleteResource = Effect.fnUntraced(function* (node) {
467
+ const isDeleteNode = (node) => "action" in node;
468
+ const { logicalId, resourceType, instanceId, downstream, props, attr, provider, } = isDeleteNode(node)
469
+ ? {
470
+ logicalId: node.resource.id,
471
+ resourceType: node.resource.type,
472
+ instanceId: node.state.instanceId,
473
+ downstream: node.downstream,
474
+ props: node.state.props,
475
+ attr: node.state.attr,
476
+ provider: node.provider,
477
+ }
478
+ : {
479
+ logicalId: node.logicalId,
480
+ resourceType: node.old.resourceType,
481
+ instanceId: node.old.instanceId,
482
+ downstream: node.old.downstream,
483
+ props: node.old.props,
484
+ attr: node.old.attr,
485
+ provider: yield* getProviderByType(node.old.resourceType),
486
+ };
487
+ const commit = (value) => state.set({
488
+ stack: app.name,
489
+ stage: app.stage,
490
+ resourceId: logicalId,
491
+ value,
492
+ });
493
+ const report = (status) => session.emit({
494
+ kind: "status-change",
495
+ id: logicalId,
496
+ type: resourceType,
497
+ status,
498
+ });
499
+ const scopedSession = {
500
+ ...session,
501
+ note: (note) => session.emit({
502
+ id: logicalId,
503
+ kind: "annotate",
504
+ message: note,
505
+ }),
506
+ };
507
+ return yield* (deletions[logicalId] ??= yield* Effect.cached(Effect.gen(function* () {
508
+ yield* Effect.all(downstream.map((dep) => dep in deletionGraph
509
+ ? deleteResource(deletionGraph[dep])
510
+ : Effect.void));
511
+ yield* report("deleting");
512
+ if (isDeleteNode(node)) {
513
+ yield* commit({
514
+ status: "deleting",
515
+ logicalId,
516
+ instanceId,
517
+ resourceType,
518
+ props,
519
+ attr,
520
+ downstream,
521
+ providerVersion: provider.version ?? 0,
522
+ bindings: node.bindings,
523
+ });
524
+ }
525
+ yield* provider.delete({
526
+ id: logicalId,
527
+ instanceId,
528
+ olds: props,
529
+ output: attr,
530
+ session: scopedSession,
531
+ bindings: [],
532
+ });
533
+ if (isDeleteNode(node)) {
534
+ // TODO(sam): should we commit a tombstone instead? and then clean up tombstones after all deletions are complete?
535
+ yield* state.delete({
536
+ stack: app.name,
537
+ stage: app.stage,
538
+ resourceId: logicalId,
539
+ });
540
+ yield* report("deleted");
541
+ }
542
+ else {
543
+ yield* commit({
544
+ status: "created",
545
+ logicalId,
546
+ instanceId,
547
+ resourceType,
548
+ props: node.props,
549
+ attr: node.attr,
550
+ providerVersion: provider.version ?? 0,
551
+ downstream: node.downstream,
552
+ bindings: node.bindings,
553
+ });
554
+ yield* report("replaced");
555
+ }
556
+ })));
557
+ });
558
+ yield* Effect.all(Object.values(deletionGraph)
559
+ .filter((node) => node !== undefined)
560
+ .map(deleteResource));
561
+ });
277
562
  //# sourceMappingURL=apply.js.map