alchemy-effect 0.2.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 (428) 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 +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 +14 -74
  13. package/lib/apply.d.ts.map +1 -1
  14. package/lib/apply.js +62 -57
  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 +17 -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 +3 -0
  57. package/lib/aws/ec2/index.d.ts.map +1 -1
  58. package/lib/aws/ec2/index.js +3 -0
  59. package/lib/aws/ec2/index.js.map +1 -1
  60. package/lib/aws/ec2/subnet.d.ts +175 -0
  61. package/lib/aws/ec2/subnet.d.ts.map +1 -0
  62. package/lib/aws/ec2/subnet.js +4 -0
  63. package/lib/aws/ec2/subnet.js.map +1 -0
  64. package/lib/aws/ec2/subnet.provider.d.ts +4 -0
  65. package/lib/aws/ec2/subnet.provider.d.ts.map +1 -0
  66. package/lib/aws/ec2/subnet.provider.js +250 -0
  67. package/lib/aws/ec2/subnet.provider.js.map +1 -0
  68. package/lib/aws/ec2/vpc.d.ts +12 -8
  69. package/lib/aws/ec2/vpc.d.ts.map +1 -1
  70. package/lib/aws/ec2/vpc.js +1 -0
  71. package/lib/aws/ec2/vpc.js.map +1 -1
  72. package/lib/aws/ec2/vpc.provider.d.ts +3 -4
  73. package/lib/aws/ec2/vpc.provider.d.ts.map +1 -1
  74. package/lib/aws/ec2/vpc.provider.js +11 -26
  75. package/lib/aws/ec2/vpc.provider.js.map +1 -1
  76. package/lib/aws/index.d.ts +16 -19
  77. package/lib/aws/index.d.ts.map +1 -1
  78. package/lib/aws/index.js +7 -10
  79. package/lib/aws/index.js.map +1 -1
  80. package/lib/aws/lambda/consume.d.ts +10 -11
  81. package/lib/aws/lambda/consume.d.ts.map +1 -1
  82. package/lib/aws/lambda/consume.js +3 -3
  83. package/lib/aws/lambda/consume.js.map +1 -1
  84. package/lib/aws/lambda/function.d.ts +7 -7
  85. package/lib/aws/lambda/function.d.ts.map +1 -1
  86. package/lib/aws/lambda/function.handler.d.ts +1 -1
  87. package/lib/aws/lambda/function.handler.d.ts.map +1 -1
  88. package/lib/aws/lambda/function.handler.js.map +1 -1
  89. package/lib/aws/lambda/function.invoke.d.ts +6 -4
  90. package/lib/aws/lambda/function.invoke.d.ts.map +1 -1
  91. package/lib/aws/lambda/function.invoke.js +3 -1
  92. package/lib/aws/lambda/function.invoke.js.map +1 -1
  93. package/lib/aws/lambda/function.js +1 -1
  94. package/lib/aws/lambda/function.js.map +1 -1
  95. package/lib/aws/lambda/function.provider.d.ts +5 -4
  96. package/lib/aws/lambda/function.provider.d.ts.map +1 -1
  97. package/lib/aws/lambda/function.provider.js +16 -14
  98. package/lib/aws/lambda/function.provider.js.map +1 -1
  99. package/lib/aws/lambda/index.d.ts +1 -0
  100. package/lib/aws/lambda/index.d.ts.map +1 -1
  101. package/lib/aws/lambda/index.js +1 -0
  102. package/lib/aws/lambda/index.js.map +1 -1
  103. package/lib/aws/lambda/serve.d.ts +2 -4
  104. package/lib/aws/lambda/serve.d.ts.map +1 -1
  105. package/lib/aws/profile.d.ts +2 -2
  106. package/lib/aws/profile.d.ts.map +1 -1
  107. package/lib/aws/profile.js +1 -1
  108. package/lib/aws/profile.js.map +1 -1
  109. package/lib/aws/region.d.ts +14 -2
  110. package/lib/aws/region.d.ts.map +1 -1
  111. package/lib/aws/region.js +26 -1
  112. package/lib/aws/region.js.map +1 -1
  113. package/lib/aws/sqs/client.d.ts +1 -1
  114. package/lib/aws/sqs/client.d.ts.map +1 -1
  115. package/lib/aws/sqs/index.d.ts +1 -0
  116. package/lib/aws/sqs/index.d.ts.map +1 -1
  117. package/lib/aws/sqs/index.js +1 -0
  118. package/lib/aws/sqs/index.js.map +1 -1
  119. package/lib/aws/sqs/queue.consume.d.ts +1 -1
  120. package/lib/aws/sqs/queue.consume.d.ts.map +1 -1
  121. package/lib/aws/sqs/queue.consume.js +0 -1
  122. package/lib/aws/sqs/queue.consume.js.map +1 -1
  123. package/lib/aws/sqs/queue.d.ts +6 -4
  124. package/lib/aws/sqs/queue.d.ts.map +1 -1
  125. package/lib/aws/sqs/queue.event-source.d.ts +8 -6
  126. package/lib/aws/sqs/queue.event-source.d.ts.map +1 -1
  127. package/lib/aws/sqs/queue.event-source.js +26 -44
  128. package/lib/aws/sqs/queue.event-source.js.map +1 -1
  129. package/lib/aws/sqs/queue.js +1 -1
  130. package/lib/aws/sqs/queue.js.map +1 -1
  131. package/lib/aws/sqs/queue.provider.d.ts +4 -4
  132. package/lib/aws/sqs/queue.provider.d.ts.map +1 -1
  133. package/lib/aws/sqs/queue.provider.js +3 -3
  134. package/lib/aws/sqs/queue.provider.js.map +1 -1
  135. package/lib/aws/sqs/queue.send-message.d.ts +7 -5
  136. package/lib/aws/sqs/queue.send-message.d.ts.map +1 -1
  137. package/lib/aws/sqs/queue.send-message.js +4 -2
  138. package/lib/aws/sqs/queue.send-message.js.map +1 -1
  139. package/lib/binding.d.ts +12 -12
  140. package/lib/binding.d.ts.map +1 -1
  141. package/lib/binding.js.map +1 -1
  142. package/lib/cli/components/ApprovePlan.d.ts +2 -2
  143. package/lib/cli/components/ApprovePlan.d.ts.map +1 -1
  144. package/lib/cli/components/ApprovePlan.js.map +1 -1
  145. package/lib/cli/components/Plan.d.ts +2 -2
  146. package/lib/cli/components/Plan.d.ts.map +1 -1
  147. package/lib/cli/components/Plan.js.map +1 -1
  148. package/lib/cli/components/PlanProgress.d.ts +8 -4
  149. package/lib/cli/components/PlanProgress.d.ts.map +1 -1
  150. package/lib/cli/components/PlanProgress.js +11 -1
  151. package/lib/cli/components/PlanProgress.js.map +1 -1
  152. package/lib/cli/index.d.ts +265 -224
  153. package/lib/cli/index.d.ts.map +1 -1
  154. package/lib/cli/index.js +57 -65
  155. package/lib/cli/index.js.map +1 -1
  156. package/lib/cli/ink-service.d.ts +4 -0
  157. package/lib/cli/ink-service.d.ts.map +1 -0
  158. package/lib/cli/ink-service.js +43 -0
  159. package/lib/cli/ink-service.js.map +1 -0
  160. package/lib/cli/service.d.ts +21 -0
  161. package/lib/cli/service.d.ts.map +1 -0
  162. package/lib/cli/service.js +5 -0
  163. package/lib/cli/service.js.map +1 -0
  164. package/lib/cloudflare/account.d.ts +10 -0
  165. package/lib/cloudflare/account.d.ts.map +1 -0
  166. package/lib/cloudflare/account.js +24 -0
  167. package/lib/cloudflare/account.js.map +1 -0
  168. package/lib/cloudflare/api.d.ts +7 -7
  169. package/lib/cloudflare/api.d.ts.map +1 -1
  170. package/lib/cloudflare/api.js +18 -17
  171. package/lib/cloudflare/api.js.map +1 -1
  172. package/lib/cloudflare/config.d.ts +9 -0
  173. package/lib/cloudflare/config.d.ts.map +1 -0
  174. package/lib/cloudflare/config.js +1 -0
  175. package/lib/cloudflare/config.js.map +1 -0
  176. package/lib/cloudflare/index.d.ts +3 -1
  177. package/lib/cloudflare/index.d.ts.map +1 -1
  178. package/lib/cloudflare/index.js +3 -0
  179. package/lib/cloudflare/index.js.map +1 -1
  180. package/lib/cloudflare/kv/namespace.binding.d.ts +5 -3
  181. package/lib/cloudflare/kv/namespace.binding.d.ts.map +1 -1
  182. package/lib/cloudflare/kv/namespace.binding.js +1 -1
  183. package/lib/cloudflare/kv/namespace.binding.js.map +1 -1
  184. package/lib/cloudflare/kv/namespace.d.ts +3 -2
  185. package/lib/cloudflare/kv/namespace.d.ts.map +1 -1
  186. package/lib/cloudflare/kv/namespace.js.map +1 -1
  187. package/lib/cloudflare/kv/namespace.provider.d.ts +3 -2
  188. package/lib/cloudflare/kv/namespace.provider.d.ts.map +1 -1
  189. package/lib/cloudflare/kv/namespace.provider.js +8 -7
  190. package/lib/cloudflare/kv/namespace.provider.js.map +1 -1
  191. package/lib/cloudflare/live.d.ts +5 -5
  192. package/lib/cloudflare/live.d.ts.map +1 -1
  193. package/lib/cloudflare/live.js +5 -8
  194. package/lib/cloudflare/live.js.map +1 -1
  195. package/lib/cloudflare/r2/bucket.binding.d.ts +5 -3
  196. package/lib/cloudflare/r2/bucket.binding.d.ts.map +1 -1
  197. package/lib/cloudflare/r2/bucket.binding.js +1 -1
  198. package/lib/cloudflare/r2/bucket.binding.js.map +1 -1
  199. package/lib/cloudflare/r2/bucket.d.ts +3 -2
  200. package/lib/cloudflare/r2/bucket.d.ts.map +1 -1
  201. package/lib/cloudflare/r2/bucket.js.map +1 -1
  202. package/lib/cloudflare/r2/bucket.provider.d.ts +3 -2
  203. package/lib/cloudflare/r2/bucket.provider.d.ts.map +1 -1
  204. package/lib/cloudflare/r2/bucket.provider.js +8 -7
  205. package/lib/cloudflare/r2/bucket.provider.js.map +1 -1
  206. package/lib/cloudflare/worker/assets.fetch.d.ts +3 -2
  207. package/lib/cloudflare/worker/assets.fetch.d.ts.map +1 -1
  208. package/lib/cloudflare/worker/assets.fetch.js +2 -1
  209. package/lib/cloudflare/worker/assets.fetch.js.map +1 -1
  210. package/lib/cloudflare/worker/assets.provider.d.ts +1 -1
  211. package/lib/cloudflare/worker/assets.provider.d.ts.map +1 -1
  212. package/lib/cloudflare/worker/index.d.ts +0 -1
  213. package/lib/cloudflare/worker/index.d.ts.map +1 -1
  214. package/lib/cloudflare/worker/worker.d.ts +5 -6
  215. package/lib/cloudflare/worker/worker.d.ts.map +1 -1
  216. package/lib/cloudflare/worker/worker.handler.d.ts +1 -1
  217. package/lib/cloudflare/worker/worker.handler.d.ts.map +1 -1
  218. package/lib/cloudflare/worker/worker.handler.js.map +1 -1
  219. package/lib/cloudflare/worker/worker.js.map +1 -1
  220. package/lib/cloudflare/worker/worker.provider.d.ts +3 -2
  221. package/lib/cloudflare/worker/worker.provider.d.ts.map +1 -1
  222. package/lib/cloudflare/worker/worker.provider.js +7 -6
  223. package/lib/cloudflare/worker/worker.provider.js.map +1 -1
  224. package/lib/cloudflare/worker/worker.serve.d.ts +7 -7
  225. package/lib/cloudflare/worker/worker.serve.d.ts.map +1 -1
  226. package/lib/cloudflare/worker/worker.serve.js.map +1 -1
  227. package/lib/data.d.ts +3 -0
  228. package/lib/data.d.ts.map +1 -0
  229. package/lib/data.js +8 -0
  230. package/lib/data.js.map +1 -0
  231. package/lib/destroy.d.ts +1 -1
  232. package/lib/destroy.d.ts.map +1 -1
  233. package/lib/destroy.js +1 -4
  234. package/lib/destroy.js.map +1 -1
  235. package/lib/diff.d.ts +16 -0
  236. package/lib/diff.d.ts.map +1 -0
  237. package/lib/diff.js +9 -0
  238. package/lib/diff.js.map +1 -0
  239. package/lib/env.d.ts +5 -0
  240. package/lib/env.d.ts.map +1 -1
  241. package/lib/env.js +15 -29
  242. package/lib/env.js.map +1 -1
  243. package/lib/exports.d.ts +9 -0
  244. package/lib/exports.d.ts.map +1 -0
  245. package/lib/exports.js +13 -0
  246. package/lib/exports.js.map +1 -0
  247. package/lib/index.d.ts +10 -2
  248. package/lib/index.d.ts.map +1 -1
  249. package/lib/index.js +10 -5
  250. package/lib/index.js.map +1 -1
  251. package/lib/input.d.ts +32 -0
  252. package/lib/input.d.ts.map +1 -0
  253. package/lib/input.js +1 -0
  254. package/lib/input.js.map +1 -0
  255. package/lib/output.d.ts +143 -0
  256. package/lib/output.d.ts.map +1 -0
  257. package/lib/output.js +269 -0
  258. package/lib/output.js.map +1 -0
  259. package/lib/plan.d.ts +47 -28
  260. package/lib/plan.d.ts.map +1 -1
  261. package/lib/plan.js +257 -151
  262. package/lib/plan.js.map +1 -1
  263. package/lib/policy.d.ts +3 -4
  264. package/lib/policy.d.ts.map +1 -1
  265. package/lib/policy.js +0 -1
  266. package/lib/policy.js.map +1 -1
  267. package/lib/provider.d.ts +14 -16
  268. package/lib/provider.d.ts.map +1 -1
  269. package/lib/ref.d.ts +14 -0
  270. package/lib/ref.d.ts.map +1 -0
  271. package/lib/ref.js +21 -0
  272. package/lib/ref.js.map +1 -0
  273. package/lib/resource.d.ts +11 -6
  274. package/lib/resource.d.ts.map +1 -1
  275. package/lib/resource.js.map +1 -1
  276. package/lib/runtime.d.ts +7 -6
  277. package/lib/runtime.d.ts.map +1 -1
  278. package/lib/runtime.js.map +1 -1
  279. package/lib/service.d.ts +9 -6
  280. package/lib/service.d.ts.map +1 -1
  281. package/lib/service.js.map +1 -1
  282. package/lib/stack.d.ts +60 -0
  283. package/lib/stack.d.ts.map +1 -0
  284. package/lib/stack.js +11 -0
  285. package/lib/stack.js.map +1 -0
  286. package/lib/stage.d.ts +39 -0
  287. package/lib/stage.d.ts.map +1 -0
  288. package/lib/stage.js +32 -0
  289. package/lib/stage.js.map +1 -0
  290. package/lib/state.d.ts +51 -10
  291. package/lib/state.d.ts.map +1 -1
  292. package/lib/state.js +30 -29
  293. package/lib/state.js.map +1 -1
  294. package/lib/test.d.ts +25 -4
  295. package/lib/test.d.ts.map +1 -1
  296. package/lib/test.js +54 -14
  297. package/lib/test.js.map +1 -1
  298. package/lib/tsconfig.test.tsbuildinfo +1 -1
  299. package/lib/type.d.ts +3 -0
  300. package/lib/type.d.ts.map +1 -1
  301. package/lib/unknown.d.ts +4 -0
  302. package/lib/unknown.d.ts.map +1 -0
  303. package/lib/unknown.js +4 -0
  304. package/lib/unknown.js.map +1 -0
  305. package/lib/user.d.ts +3 -0
  306. package/lib/user.d.ts.map +1 -0
  307. package/lib/user.js +3 -0
  308. package/lib/user.js.map +1 -0
  309. package/lib/util.d.ts +6 -0
  310. package/lib/util.d.ts.map +1 -0
  311. package/lib/util.js +9 -0
  312. package/lib/util.js.map +1 -0
  313. package/package.json +18 -12
  314. package/src/$.ts +17 -0
  315. package/src/app.ts +3 -32
  316. package/src/apply.ts +429 -441
  317. package/src/assert-never.ts +18 -0
  318. package/src/aws/account.ts +23 -3
  319. package/src/aws/client.ts +0 -1
  320. package/src/aws/config.ts +16 -0
  321. package/src/aws/credentials.ts +212 -177
  322. package/src/aws/dynamodb/index.ts +3 -3
  323. package/src/aws/dynamodb/table.get-item.ts +5 -9
  324. package/src/aws/dynamodb/table.provider.ts +35 -39
  325. package/src/aws/dynamodb/table.ts +29 -84
  326. package/src/aws/ec2/index.ts +4 -0
  327. package/src/aws/ec2/subnet.provider.ts +358 -0
  328. package/src/aws/ec2/subnet.ts +213 -0
  329. package/src/aws/ec2/vpc.provider.ts +20 -36
  330. package/src/aws/ec2/vpc.ts +19 -8
  331. package/src/aws/index.ts +46 -40
  332. package/src/aws/lambda/consume.ts +8 -7
  333. package/src/aws/lambda/function.handler.ts +1 -1
  334. package/src/aws/lambda/function.invoke.ts +6 -2
  335. package/src/aws/lambda/function.provider.ts +28 -21
  336. package/src/aws/lambda/function.ts +7 -4
  337. package/src/aws/lambda/index.ts +2 -0
  338. package/src/aws/profile.ts +1 -4
  339. package/src/aws/region.ts +42 -3
  340. package/src/aws/sqs/index.ts +2 -0
  341. package/src/aws/sqs/queue.consume.ts +1 -1
  342. package/src/aws/sqs/queue.event-source.ts +29 -55
  343. package/src/aws/sqs/queue.provider.ts +11 -4
  344. package/src/aws/sqs/queue.send-message.ts +5 -8
  345. package/src/aws/sqs/queue.ts +9 -4
  346. package/src/binding.ts +19 -19
  347. package/src/cli/components/ApprovePlan.tsx +2 -2
  348. package/src/cli/components/Plan.tsx +3 -2
  349. package/src/cli/components/PlanProgress.tsx +32 -14
  350. package/src/cli/index.ts +2 -6
  351. package/src/cli/ink-service.tsx +61 -0
  352. package/src/cli/service.ts +23 -0
  353. package/src/cloudflare/account.ts +37 -0
  354. package/src/cloudflare/api.ts +33 -29
  355. package/src/cloudflare/config.ts +7 -0
  356. package/src/cloudflare/index.ts +3 -1
  357. package/src/cloudflare/kv/namespace.binding.ts +3 -1
  358. package/src/cloudflare/kv/namespace.provider.ts +9 -8
  359. package/src/cloudflare/kv/namespace.ts +3 -2
  360. package/src/cloudflare/live.ts +11 -17
  361. package/src/cloudflare/r2/bucket.binding.ts +3 -1
  362. package/src/cloudflare/r2/bucket.provider.ts +9 -8
  363. package/src/cloudflare/r2/bucket.ts +8 -2
  364. package/src/cloudflare/worker/assets.fetch.ts +3 -1
  365. package/src/cloudflare/worker/assets.provider.ts +1 -1
  366. package/src/cloudflare/worker/index.ts +0 -2
  367. package/src/cloudflare/worker/worker.handler.ts +1 -1
  368. package/src/cloudflare/worker/worker.provider.ts +16 -13
  369. package/src/cloudflare/worker/worker.serve.ts +5 -2
  370. package/src/cloudflare/worker/worker.ts +4 -3
  371. package/src/data.ts +18 -0
  372. package/src/destroy.ts +1 -5
  373. package/src/diff.ts +30 -0
  374. package/src/env.ts +20 -32
  375. package/src/exports.ts +21 -0
  376. package/src/index.ts +10 -5
  377. package/src/input.ts +81 -0
  378. package/src/output.ts +518 -0
  379. package/src/plan.ts +380 -192
  380. package/src/policy.ts +3 -5
  381. package/src/provider.ts +25 -23
  382. package/src/ref.ts +48 -0
  383. package/src/resource.ts +20 -6
  384. package/src/runtime.ts +15 -8
  385. package/src/service.ts +11 -7
  386. package/src/stack.ts +116 -0
  387. package/src/stage.ts +85 -0
  388. package/src/state.ts +138 -60
  389. package/src/test.ts +117 -16
  390. package/src/type.ts +4 -0
  391. package/src/unknown.ts +6 -0
  392. package/src/user.ts +4 -0
  393. package/src/util.ts +21 -0
  394. package/lib/approve.d.ts +0 -15
  395. package/lib/approve.d.ts.map +0 -1
  396. package/lib/approve.js +0 -7
  397. package/lib/approve.js.map +0 -1
  398. package/lib/cli/approve.d.ts +0 -4
  399. package/lib/cli/approve.d.ts.map +0 -1
  400. package/lib/cli/approve.js +0 -18
  401. package/lib/cli/approve.js.map +0 -1
  402. package/lib/cli/clack.d.ts +0 -14
  403. package/lib/cli/clack.d.ts.map +0 -1
  404. package/lib/cli/clack.js +0 -12
  405. package/lib/cli/clack.js.map +0 -1
  406. package/lib/cli/main.d.ts +0 -2
  407. package/lib/cli/main.d.ts.map +0 -1
  408. package/lib/cli/main.js +0 -1
  409. package/lib/cli/main.js.map +0 -1
  410. package/lib/cli/plan.d.ts +0 -13
  411. package/lib/cli/plan.d.ts.map +0 -1
  412. package/lib/cli/plan.js +0 -1
  413. package/lib/cli/plan.js.map +0 -1
  414. package/lib/cli/progress.d.ts +0 -7
  415. package/lib/cli/progress.d.ts.map +0 -1
  416. package/lib/cli/progress.js +0 -30
  417. package/lib/cli/progress.js.map +0 -1
  418. package/lib/cli/spinner.d.ts +0 -2
  419. package/lib/cli/spinner.d.ts.map +0 -1
  420. package/lib/cli/spinner.js +0 -13
  421. package/lib/cli/spinner.js.map +0 -1
  422. package/src/approve.ts +0 -13
  423. package/src/cli/approve.tsx +0 -30
  424. package/src/cli/clack.ts +0 -22
  425. package/src/cli/main.ts +0 -0
  426. package/src/cli/plan.ts +0 -16
  427. package/src/cli/progress.tsx +0 -46
  428. package/src/cli/spinner.ts +0 -14
@@ -0,0 +1,18 @@
1
+ import * as Effect from "effect/Effect";
2
+ import * as Data from "effect/Data";
3
+
4
+ export class UnexpectedValueError extends Data.TaggedError(
5
+ "UnexpectedValueError",
6
+ )<{
7
+ message: string;
8
+ value: never;
9
+ }> {}
10
+
11
+ export const assertNeverOrDie = (value: never): Effect.Effect<never> => {
12
+ return Effect.die(
13
+ new UnexpectedValueError({
14
+ message: `Unexpected value: ${value}`,
15
+ value,
16
+ }),
17
+ );
18
+ };
@@ -3,6 +3,8 @@ import * as Data from "effect/Data";
3
3
  import * as Effect from "effect/Effect";
4
4
  import * as Layer from "effect/Layer";
5
5
  import * as STS from "./sts.ts";
6
+ import { App } from "../app.ts";
7
+ import { loadProfile } from "./credentials.ts";
6
8
 
7
9
  export class FailedToGetAccount extends Data.TaggedError(
8
10
  "AWS::Account::FailedToGetAccount",
@@ -18,12 +20,30 @@ export class Account extends Context.Tag("AWS::AccountID")<
18
20
  AccountID
19
21
  >() {}
20
22
 
21
- export const fromIdentity = () =>
23
+ export class AWSStageConfigAccountMissing extends Data.TaggedError(
24
+ "AWSStageConfigAccountMissing",
25
+ )<{
26
+ message: string;
27
+ stage: string;
28
+ }> {}
29
+
30
+ export const fromStageConfig = () =>
22
31
  Layer.effect(
23
32
  Account,
24
33
  Effect.gen(function* () {
25
- const sts = yield* STS.STSClient;
26
- const identity = yield* sts.getCallerIdentity({}).pipe(
34
+ const app = yield* App;
35
+ if (app.config.aws?.account) {
36
+ return app.config.aws.account;
37
+ }
38
+ const profileName = app.config.aws?.profile;
39
+ if (profileName) {
40
+ const profile = yield* loadProfile(profileName);
41
+ if (profile.sso_account_id) {
42
+ return profile.sso_account_id;
43
+ }
44
+ }
45
+ const client = yield* STS.STSClient;
46
+ const identity = yield* client.getCallerIdentity({}).pipe(
27
47
  Effect.catchAll(
28
48
  (err) =>
29
49
  new FailedToGetAccount({
package/src/aws/client.ts CHANGED
@@ -21,7 +21,6 @@ export const createAWSServiceClientLayer =
21
21
  Effect.gen(function* () {
22
22
  const region = yield* Region;
23
23
  const credentials = yield* Credentials;
24
- //
25
24
  const client = new clss({
26
25
  region,
27
26
  credentials: {
@@ -0,0 +1,16 @@
1
+ import type { AccountID } from "./account.ts";
2
+ import type { RegionID } from "./region.ts";
3
+ import type { AwsCredentialIdentity } from "@smithy/types";
4
+
5
+ export interface AwsStageConfig {
6
+ account?: AccountID;
7
+ region?: RegionID;
8
+ profile?: string;
9
+ credentials?: AwsCredentialIdentity;
10
+ }
11
+
12
+ declare module "../stage.ts" {
13
+ interface StageConfig {
14
+ aws?: AwsStageConfig;
15
+ }
16
+ }
@@ -26,7 +26,8 @@ import * as Redacted from "effect/Redacted";
26
26
  import { createHash } from "node:crypto";
27
27
  import * as path from "node:path";
28
28
  import { parseIni, parseSSOSessionData } from "./parse-ini.ts";
29
- import { AwsProfile } from "./profile.ts";
29
+ import { Profile } from "./profile.ts";
30
+ import { App } from "../app.ts";
30
31
 
31
32
  export class Credentials extends Context.Tag("AWS::Credentials")<
32
33
  Credentials,
@@ -164,201 +165,235 @@ export interface SsoProfileConfig extends AwsProfileConfig {
164
165
  sso_role_name: string;
165
166
  }
166
167
 
168
+ export const fromStageConfig = () =>
169
+ Layer.effect(
170
+ Credentials,
171
+ Effect.gen(function* () {
172
+ const app = yield* App;
173
+ if (app.config.aws?.profile) {
174
+ return yield* loadSSOCredentials(app.config.aws.profile);
175
+ } else if (app.config.aws?.credentials) {
176
+ return fromAwsCredentialIdentity(app.config.aws.credentials);
177
+ }
178
+ return yield* Effect.dieMessage(
179
+ "No AWS credentials found in stage config",
180
+ );
181
+ }),
182
+ );
183
+
167
184
  export const fromSSO = () =>
168
185
  Layer.effect(
169
186
  Credentials,
170
187
  Effect.gen(function* () {
171
- const client = yield* HttpClient.HttpClient;
172
- const fs = yield* FileSystem.FileSystem;
173
188
  const profileName = Option.getOrElse(
174
- yield* Effect.serviceOption(AwsProfile),
189
+ yield* Effect.serviceOption(Profile),
175
190
  () => "default",
176
191
  );
192
+ return yield* loadSSOCredentials(profileName);
193
+ }),
194
+ );
177
195
 
178
- const profiles: {
179
- [profileName: string]: AwsProfileConfig;
180
- } = yield* Effect.promise(() =>
181
- ini.parseKnownFiles({ profile: profileName }),
196
+ export const loadSSOCredentials = Effect.fn(function* (profileName: string) {
197
+ const client = yield* HttpClient.HttpClient;
198
+ const fs = yield* FileSystem.FileSystem;
199
+ const awsDir = path.join(ini.getHomeDir(), ".aws");
200
+ const cachePath = path.join(awsDir, "sso", "cache");
201
+
202
+ const profile = yield* loadProfile(profileName);
203
+
204
+ if (profile.sso_session) {
205
+ const hasher = createHash("sha1");
206
+ const cacheName = hasher.update(profile.sso_session).digest("hex");
207
+ const ssoTokenFilepath = path.join(cachePath, `${cacheName}.json`);
208
+ const cachedCredsFilePath = path.join(
209
+ cachePath,
210
+ `${cacheName}.credentials.json`,
211
+ );
212
+
213
+ const cachedCreds = yield* fs.readFileString(cachedCredsFilePath).pipe(
214
+ Effect.map((text) => JSON.parse(text)),
215
+ Effect.catchAll(() => Effect.void),
216
+ );
217
+
218
+ const isExpired = (expiry: number | string | undefined) => {
219
+ return (
220
+ expiry === undefined ||
221
+ new Date(expiry).getTime() - Date.now() <= EXPIRE_WINDOW_MS
182
222
  );
183
-
184
- const profile = profiles[profileName];
185
-
186
- if (!profile) {
187
- yield* Effect.fail(
188
- new ProfileNotFound({
189
- message: `Profile ${profileName} not found`,
190
- profile: profileName,
223
+ };
224
+
225
+ if (cachedCreds && !isExpired(cachedCreds.expiry)) {
226
+ return Credentials.of({
227
+ accessKeyId: Redacted.make(cachedCreds.accessKeyId),
228
+ secretAccessKey: Redacted.make(cachedCreds.secretAccessKey),
229
+ sessionToken: cachedCreds.sessionToken
230
+ ? Redacted.make(cachedCreds.sessionToken)
231
+ : undefined,
232
+ expiration: cachedCreds.expiry,
233
+ });
234
+ }
235
+
236
+ const ssoToken = yield* fs.readFileString(ssoTokenFilepath).pipe(
237
+ Effect.map((text) => JSON.parse(text) as SSOToken),
238
+ Effect.catchAll(() =>
239
+ Effect.fail(
240
+ new InvalidSSOToken({
241
+ message: `The SSO session token associated with profile=${profileName} was not found or is invalid. ${REFRESH_MESSAGE}`,
242
+ sso_session: profile.sso_session!,
191
243
  }),
192
- );
193
- }
244
+ ),
245
+ ),
246
+ );
194
247
 
195
- const awsDir = path.join(ini.getHomeDir(), ".aws");
196
- const configPath = path.join(awsDir, "config");
197
- const cachePath = path.join(awsDir, "sso", "cache");
198
-
199
- if (profile.sso_session) {
200
- const ssoRegion = Option.getOrUndefined(
201
- yield* Effect.serviceOption(SsoRegion),
202
- );
203
- const ssoStartUrl = Option.getOrElse(
204
- yield* Effect.serviceOption(SsoStartUrl),
205
- () => profile.sso_start_url,
206
- );
207
-
208
- const ssoSessions = yield* fs.readFileString(configPath).pipe(
209
- Effect.flatMap((config) =>
210
- Effect.promise(async () => parseIni(config)),
211
- ),
212
- Effect.map(parseSSOSessionData),
213
- );
214
- const session = ssoSessions[profile.sso_session];
215
- if (ssoRegion && ssoRegion !== session.sso_region) {
216
- yield* Effect.fail(
217
- new ConflictingSSORegion({
218
- message: `Conflicting SSO region`,
219
- ssoRegion: ssoRegion,
220
- profile: profile.sso_session,
221
- }),
222
- );
223
- }
224
- if (ssoStartUrl && ssoStartUrl !== session.sso_start_url) {
225
- yield* Effect.fail(
226
- new ConflictingSSOStartUrl({
227
- message: `Conflicting SSO start url`,
228
- ssoStartUrl: ssoStartUrl,
229
- profile: profile.sso_session,
230
- }),
231
- );
232
- }
233
- profile.sso_region = session.sso_region;
234
- profile.sso_start_url = session.sso_start_url;
235
-
236
- const ssoFields = [
237
- "sso_start_url",
238
- "sso_account_id",
239
- "sso_region",
240
- "sso_role_name",
241
- ] as const satisfies (keyof SsoProfileConfig)[];
242
- const missingFields = ssoFields.filter((field) => !profile[field]);
243
- if (missingFields.length > 0) {
244
- yield* Effect.fail(
245
- new InvalidSSOProfile({
246
- profile: profileName,
247
- missingFields,
248
- message:
249
- `Profile is configured with invalid SSO credentials. Required parameters "sso_account_id", ` +
250
- `"sso_region", "sso_role_name", "sso_start_url". Got ${Object.keys(
251
- profile,
252
- ).join(
253
- ", ",
254
- )}\nReference: https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-sso.html`,
255
- }),
256
- );
257
- }
258
-
259
- const hasher = createHash("sha1");
260
- const cacheName = hasher.update(profile.sso_session).digest("hex");
261
- const ssoTokenFilepath = path.join(cachePath, `${cacheName}.json`);
262
- const cachedCredsFilePath = path.join(
263
- cachePath,
264
- `${cacheName}.credentials.json`,
265
- );
266
-
267
- const cachedCreds = yield* fs.readFileString(cachedCredsFilePath).pipe(
268
- Effect.map((text) => JSON.parse(text)),
269
- Effect.catchAll(() => Effect.void),
270
- );
271
-
272
- const isExpired = (expiry: number | string | undefined) => {
273
- return (
274
- expiry === undefined ||
275
- new Date(expiry).getTime() - Date.now() <= EXPIRE_WINDOW_MS
276
- );
248
+ if (isExpired(ssoToken.expiresAt)) {
249
+ yield* Console.log(
250
+ `The SSO session token associated with profile=${profileName} was not found or is invalid. ${REFRESH_MESSAGE}`,
251
+ );
252
+ yield* Effect.fail(
253
+ new ExpiredSSOToken({
254
+ message: `The SSO session token associated with profile=${profileName} was not found or is invalid. ${REFRESH_MESSAGE}`,
255
+ profile: profileName,
256
+ }),
257
+ );
258
+ }
259
+
260
+ const response = yield* client.get(
261
+ `https://portal.sso.${profile.sso_region}.amazonaws.com/federation/credentials?account_id=${profile.sso_account_id}&role_name=${profile.sso_role_name}`,
262
+ {
263
+ headers: {
264
+ "User-Agent": "alchemy.run",
265
+ "Content-Type": "application/json",
266
+ "x-amz-sso_bearer_token": ssoToken.accessToken,
267
+ },
268
+ },
269
+ );
270
+
271
+ const credentials = (
272
+ (yield* response.json) as {
273
+ roleCredentials: {
274
+ accessKeyId: string;
275
+ secretAccessKey: string;
276
+ sessionToken: string;
277
+ expiration: number;
277
278
  };
278
-
279
- if (cachedCreds && !isExpired(cachedCreds.expiry)) {
280
- return Credentials.of({
281
- accessKeyId: Redacted.make(cachedCreds.accessKeyId),
282
- secretAccessKey: Redacted.make(cachedCreds.secretAccessKey),
283
- sessionToken: cachedCreds.sessionToken
284
- ? Redacted.make(cachedCreds.sessionToken)
285
- : undefined,
286
- expiration: cachedCreds.expiry,
287
- });
288
- }
289
-
290
- const ssoToken = yield* fs.readFileString(ssoTokenFilepath).pipe(
291
- Effect.map((text) => JSON.parse(text) as SSOToken),
292
- Effect.catchAll(() =>
293
- Effect.fail(
294
- new InvalidSSOToken({
295
- message: `The SSO session token associated with profile=${profileName} was not found or is invalid. ${REFRESH_MESSAGE}`,
296
- sso_session: profile.sso_session!,
297
- }),
298
- ),
299
- ),
300
- );
301
-
302
- if (isExpired(ssoToken.expiresAt)) {
303
- yield* Console.log(
304
- `The SSO session token associated with profile=${profileName} was not found or is invalid. ${REFRESH_MESSAGE}`,
305
- );
306
- yield* Effect.fail(
307
- new ExpiredSSOToken({
308
- message: `The SSO session token associated with profile=${profileName} was not found or is invalid. ${REFRESH_MESSAGE}`,
309
- profile: profileName,
310
- }),
311
- );
312
- }
313
-
314
- const response = yield* client.get(
315
- `https://portal.sso.${profile.sso_region}.amazonaws.com/federation/credentials?account_id=${profile.sso_account_id}&role_name=${profile.sso_role_name}`,
316
- {
317
- headers: {
318
- "User-Agent": "alchemy.run",
319
- "Content-Type": "application/json",
320
- "x-amz-sso_bearer_token": ssoToken.accessToken,
321
- },
322
- },
323
- );
324
-
325
- const credentials = (
326
- (yield* response.json) as {
327
- roleCredentials: {
328
- accessKeyId: string;
329
- secretAccessKey: string;
330
- sessionToken: string;
331
- expiration: number;
332
- };
333
- }
334
- ).roleCredentials;
335
-
336
- yield* fs.writeFileString(
337
- cachedCredsFilePath,
338
- JSON.stringify({
339
- accessKeyId: credentials.accessKeyId,
340
- secretAccessKey: credentials.secretAccessKey,
341
- sessionToken: credentials.sessionToken,
342
- expiry: credentials.expiration,
343
- }),
344
- );
345
-
346
- return Credentials.of({
347
- accessKeyId: Redacted.make(credentials.accessKeyId),
348
- secretAccessKey: Redacted.make(credentials.secretAccessKey),
349
- sessionToken: Redacted.make(credentials.sessionToken),
350
- expiration: credentials.expiration,
351
- });
352
279
  }
280
+ ).roleCredentials;
281
+
282
+ yield* fs.writeFileString(
283
+ cachedCredsFilePath,
284
+ JSON.stringify({
285
+ accessKeyId: credentials.accessKeyId,
286
+ secretAccessKey: credentials.secretAccessKey,
287
+ sessionToken: credentials.sessionToken,
288
+ expiry: credentials.expiration,
289
+ }),
290
+ );
291
+
292
+ return Credentials.of({
293
+ accessKeyId: Redacted.make(credentials.accessKeyId),
294
+ secretAccessKey: Redacted.make(credentials.secretAccessKey),
295
+ sessionToken: Redacted.make(credentials.sessionToken),
296
+ expiration: credentials.expiration,
297
+ });
298
+ }
299
+
300
+ return yield* Effect.fail(
301
+ new ProfileNotFound({
302
+ message: `Profile ${profileName} not found`,
303
+ profile: profileName,
304
+ }),
305
+ );
306
+ });
307
+
308
+ export const loadProfile = Effect.fn(function* (profileName: string) {
309
+ const fs = yield* FileSystem.FileSystem;
310
+ const profiles: {
311
+ [profileName: string]: AwsProfileConfig;
312
+ } = yield* Effect.promise(() =>
313
+ ini.parseKnownFiles({ profile: profileName }),
314
+ );
315
+
316
+ const profile = profiles[profileName];
353
317
 
354
- return yield* Effect.fail(
355
- new ProfileNotFound({
356
- message: `Profile ${profileName} not found`,
318
+ if (!profile) {
319
+ yield* Effect.fail(
320
+ new ProfileNotFound({
321
+ message: `Profile ${profileName} not found`,
322
+ profile: profileName,
323
+ }),
324
+ );
325
+ }
326
+
327
+ const awsDir = path.join(ini.getHomeDir(), ".aws");
328
+ const configPath = path.join(awsDir, "config");
329
+
330
+ if (profile.sso_session) {
331
+ const ssoRegion = Option.getOrUndefined(
332
+ yield* Effect.serviceOption(SsoRegion),
333
+ );
334
+ const ssoStartUrl = Option.getOrElse(
335
+ yield* Effect.serviceOption(SsoStartUrl),
336
+ () => profile.sso_start_url,
337
+ );
338
+
339
+ const ssoSessions = yield* fs.readFileString(configPath).pipe(
340
+ Effect.flatMap((config) => Effect.promise(async () => parseIni(config))),
341
+ Effect.map(parseSSOSessionData),
342
+ );
343
+ const session = ssoSessions[profile.sso_session];
344
+ if (ssoRegion && ssoRegion !== session.sso_region) {
345
+ yield* Effect.fail(
346
+ new ConflictingSSORegion({
347
+ message: `Conflicting SSO region`,
348
+ ssoRegion: ssoRegion,
349
+ profile: profile.sso_session,
350
+ }),
351
+ );
352
+ }
353
+ if (ssoStartUrl && ssoStartUrl !== session.sso_start_url) {
354
+ yield* Effect.fail(
355
+ new ConflictingSSOStartUrl({
356
+ message: `Conflicting SSO start url`,
357
+ ssoStartUrl: ssoStartUrl,
358
+ profile: profile.sso_session,
359
+ }),
360
+ );
361
+ }
362
+ profile.sso_region = session.sso_region;
363
+ profile.sso_start_url = session.sso_start_url;
364
+
365
+ const ssoFields = [
366
+ "sso_start_url",
367
+ "sso_account_id",
368
+ "sso_region",
369
+ "sso_role_name",
370
+ ] as const satisfies (keyof SsoProfileConfig)[];
371
+ const missingFields = ssoFields.filter((field) => !profile[field]);
372
+ if (missingFields.length > 0) {
373
+ yield* Effect.fail(
374
+ new InvalidSSOProfile({
357
375
  profile: profileName,
376
+ missingFields,
377
+ message:
378
+ `Profile is configured with invalid SSO credentials. Required parameters "sso_account_id", ` +
379
+ `"sso_region", "sso_role_name", "sso_start_url". Got ${Object.keys(
380
+ profile,
381
+ ).join(
382
+ ", ",
383
+ )}\nReference: https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-sso.html`,
358
384
  }),
359
385
  );
386
+ }
387
+ return profile;
388
+ }
389
+
390
+ return yield* Effect.fail(
391
+ new ProfileNotFound({
392
+ message: `Profile ${profileName} not found`,
393
+ profile: profileName,
360
394
  }),
361
395
  );
396
+ });
362
397
 
363
398
  /**
364
399
  * Cached SSO token retrieved from SSO login flow.
@@ -6,7 +6,7 @@ export * from "./table.get-item.ts";
6
6
  export * from "./table.provider.ts";
7
7
  export * from "./table.ts";
8
8
 
9
- export type * as Alchemy from "../../index.ts";
10
-
11
9
  // TODO(sam): figure out a better strategy to workaround non-portable types
12
- // export type * as _ from "../../index.ts";
10
+ export type * from "../../exports.ts";
11
+
12
+ import "../config.ts";
@@ -1,14 +1,10 @@
1
- import {
2
- Binding,
3
- declare,
4
- Policy,
5
- toEnvKey,
6
- type Capability,
7
- type From,
8
- } from "alchemy-effect";
9
1
  import { Effect } from "effect";
10
2
  import type { ReturnConsumedCapacity } from "itty-aws/dynamodb";
11
- 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 From, type Policy } from "../../policy.ts";
7
+ import { Function } from "../lambda/function.ts";
12
8
  import { fromAttributeValue } from "./attribute-value.ts";
13
9
  import { DynamoDBClient } from "./client.ts";
14
10
  import type { Identifier } from "./expr.ts";