alchemy 2.0.0-beta.10 → 2.0.0-beta.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (420) hide show
  1. package/bin/alchemy.js +1122 -450
  2. package/bin/alchemy.js.map +1 -1
  3. package/bin/alchemy.sh +15 -0
  4. package/bin/alchemy.ts +22 -727
  5. package/bin/commands/_shared.ts +237 -0
  6. package/bin/commands/bootstrap.ts +117 -0
  7. package/bin/commands/deploy.ts +144 -0
  8. package/bin/commands/login.ts +93 -0
  9. package/bin/commands/logs.ts +157 -0
  10. package/bin/commands/tail.ts +138 -0
  11. package/lib/AWS/AuthProvider.d.ts +7 -71
  12. package/lib/AWS/AuthProvider.d.ts.map +1 -1
  13. package/lib/AWS/AuthProvider.js +27 -22
  14. package/lib/AWS/AuthProvider.js.map +1 -1
  15. package/lib/AWS/AutoScaling/LaunchTemplate.d.ts +3 -3
  16. package/lib/AWS/AutoScaling/LaunchTemplate.d.ts.map +1 -1
  17. package/lib/AWS/AutoScaling/LaunchTemplate.js +2 -2
  18. package/lib/AWS/AutoScaling/LaunchTemplate.js.map +1 -1
  19. package/lib/AWS/Bootstrap.d.ts +2 -1
  20. package/lib/AWS/Bootstrap.d.ts.map +1 -1
  21. package/lib/AWS/Bootstrap.js +27 -29
  22. package/lib/AWS/Bootstrap.js.map +1 -1
  23. package/lib/AWS/CloudWatch/Alarm.d.ts +2 -2
  24. package/lib/AWS/CloudWatch/Alarm.d.ts.map +1 -1
  25. package/lib/AWS/CloudWatch/Alarm.js +2 -2
  26. package/lib/AWS/CloudWatch/Alarm.js.map +1 -1
  27. package/lib/AWS/CloudWatch/AlarmMuteRule.d.ts +2 -2
  28. package/lib/AWS/CloudWatch/AlarmMuteRule.d.ts.map +1 -1
  29. package/lib/AWS/CloudWatch/AlarmMuteRule.js +2 -2
  30. package/lib/AWS/CloudWatch/AlarmMuteRule.js.map +1 -1
  31. package/lib/AWS/CloudWatch/CompositeAlarm.d.ts +2 -2
  32. package/lib/AWS/CloudWatch/CompositeAlarm.d.ts.map +1 -1
  33. package/lib/AWS/CloudWatch/CompositeAlarm.js +2 -2
  34. package/lib/AWS/CloudWatch/CompositeAlarm.js.map +1 -1
  35. package/lib/AWS/CloudWatch/Dashboard.d.ts +2 -2
  36. package/lib/AWS/CloudWatch/Dashboard.d.ts.map +1 -1
  37. package/lib/AWS/CloudWatch/Dashboard.js +2 -2
  38. package/lib/AWS/CloudWatch/Dashboard.js.map +1 -1
  39. package/lib/AWS/CloudWatch/InsightRule.d.ts +2 -2
  40. package/lib/AWS/CloudWatch/InsightRule.d.ts.map +1 -1
  41. package/lib/AWS/CloudWatch/InsightRule.js +2 -2
  42. package/lib/AWS/CloudWatch/InsightRule.js.map +1 -1
  43. package/lib/AWS/CloudWatch/MetricStream.d.ts +2 -2
  44. package/lib/AWS/CloudWatch/MetricStream.d.ts.map +1 -1
  45. package/lib/AWS/CloudWatch/MetricStream.js +2 -2
  46. package/lib/AWS/CloudWatch/MetricStream.js.map +1 -1
  47. package/lib/AWS/Credentials.d.ts +5 -10
  48. package/lib/AWS/Credentials.d.ts.map +1 -1
  49. package/lib/AWS/Credentials.js +6 -30
  50. package/lib/AWS/Credentials.js.map +1 -1
  51. package/lib/AWS/DynamoDB/Table.d.ts +1 -1
  52. package/lib/AWS/DynamoDB/Table.d.ts.map +1 -1
  53. package/lib/AWS/EC2/EIP.d.ts +3 -3
  54. package/lib/AWS/EC2/EIP.d.ts.map +1 -1
  55. package/lib/AWS/EC2/EIP.js +2 -2
  56. package/lib/AWS/EC2/EIP.js.map +1 -1
  57. package/lib/AWS/EC2/EgressOnlyInternetGateway.d.ts +3 -3
  58. package/lib/AWS/EC2/EgressOnlyInternetGateway.d.ts.map +1 -1
  59. package/lib/AWS/EC2/EgressOnlyInternetGateway.js +2 -2
  60. package/lib/AWS/EC2/EgressOnlyInternetGateway.js.map +1 -1
  61. package/lib/AWS/EC2/Instance.d.ts +3 -3
  62. package/lib/AWS/EC2/Instance.d.ts.map +1 -1
  63. package/lib/AWS/EC2/Instance.js +2 -2
  64. package/lib/AWS/EC2/Instance.js.map +1 -1
  65. package/lib/AWS/EC2/InternetGateway.d.ts +3 -3
  66. package/lib/AWS/EC2/InternetGateway.d.ts.map +1 -1
  67. package/lib/AWS/EC2/InternetGateway.js +2 -2
  68. package/lib/AWS/EC2/InternetGateway.js.map +1 -1
  69. package/lib/AWS/EC2/NatGateway.d.ts +3 -3
  70. package/lib/AWS/EC2/NatGateway.d.ts.map +1 -1
  71. package/lib/AWS/EC2/NatGateway.js +2 -2
  72. package/lib/AWS/EC2/NatGateway.js.map +1 -1
  73. package/lib/AWS/EC2/Network.d.ts +1 -1
  74. package/lib/AWS/EC2/NetworkAcl.d.ts +3 -3
  75. package/lib/AWS/EC2/NetworkAcl.d.ts.map +1 -1
  76. package/lib/AWS/EC2/NetworkAcl.js +2 -2
  77. package/lib/AWS/EC2/NetworkAcl.js.map +1 -1
  78. package/lib/AWS/EC2/RouteTable.d.ts +3 -3
  79. package/lib/AWS/EC2/RouteTable.d.ts.map +1 -1
  80. package/lib/AWS/EC2/RouteTable.js +2 -2
  81. package/lib/AWS/EC2/RouteTable.js.map +1 -1
  82. package/lib/AWS/EC2/SecurityGroup.d.ts +3 -3
  83. package/lib/AWS/EC2/SecurityGroup.d.ts.map +1 -1
  84. package/lib/AWS/EC2/SecurityGroup.js +2 -2
  85. package/lib/AWS/EC2/SecurityGroup.js.map +1 -1
  86. package/lib/AWS/EC2/Subnet.d.ts +1 -1
  87. package/lib/AWS/EC2/Subnet.d.ts.map +1 -1
  88. package/lib/AWS/EC2/Vpc.d.ts +3 -3
  89. package/lib/AWS/EC2/Vpc.d.ts.map +1 -1
  90. package/lib/AWS/EC2/Vpc.js +2 -2
  91. package/lib/AWS/EC2/Vpc.js.map +1 -1
  92. package/lib/AWS/EC2/VpcEndpoint.d.ts +3 -3
  93. package/lib/AWS/EC2/VpcEndpoint.d.ts.map +1 -1
  94. package/lib/AWS/EC2/VpcEndpoint.js +2 -2
  95. package/lib/AWS/EC2/VpcEndpoint.js.map +1 -1
  96. package/lib/AWS/ECR/Repository.d.ts +1 -1
  97. package/lib/AWS/ECR/Repository.d.ts.map +1 -1
  98. package/lib/AWS/ECR/Repository.js +0 -1
  99. package/lib/AWS/ECR/Repository.js.map +1 -1
  100. package/lib/AWS/ECS/Cluster.d.ts +2 -2
  101. package/lib/AWS/ECS/Cluster.d.ts.map +1 -1
  102. package/lib/AWS/ECS/Cluster.js +2 -2
  103. package/lib/AWS/ECS/Cluster.js.map +1 -1
  104. package/lib/AWS/ECS/Service.d.ts +1 -1
  105. package/lib/AWS/ECS/Service.d.ts.map +1 -1
  106. package/lib/AWS/ECS/Task.d.ts +2 -2
  107. package/lib/AWS/ECS/Task.d.ts.map +1 -1
  108. package/lib/AWS/ECS/Task.js +2 -2
  109. package/lib/AWS/ECS/Task.js.map +1 -1
  110. package/lib/AWS/EKS/Cluster.d.ts +1 -1
  111. package/lib/AWS/EKS/Cluster.d.ts.map +1 -1
  112. package/lib/AWS/ELBv2/Listener.d.ts +1 -1
  113. package/lib/AWS/ELBv2/Listener.d.ts.map +1 -1
  114. package/lib/AWS/ELBv2/LoadBalancer.d.ts +1 -1
  115. package/lib/AWS/ELBv2/LoadBalancer.d.ts.map +1 -1
  116. package/lib/AWS/ELBv2/TargetGroup.d.ts +1 -1
  117. package/lib/AWS/ELBv2/TargetGroup.d.ts.map +1 -1
  118. package/lib/AWS/Endpoint.d.ts +7 -2
  119. package/lib/AWS/Endpoint.d.ts.map +1 -1
  120. package/lib/AWS/Endpoint.js +7 -2
  121. package/lib/AWS/Endpoint.js.map +1 -1
  122. package/lib/AWS/Environment.d.ts +68 -0
  123. package/lib/AWS/Environment.d.ts.map +1 -0
  124. package/lib/AWS/Environment.js +53 -0
  125. package/lib/AWS/Environment.js.map +1 -0
  126. package/lib/AWS/EventBridge/EventBus.d.ts +2 -2
  127. package/lib/AWS/EventBridge/EventBus.d.ts.map +1 -1
  128. package/lib/AWS/EventBridge/EventBus.js +2 -2
  129. package/lib/AWS/EventBridge/EventBus.js.map +1 -1
  130. package/lib/AWS/EventBridge/ListRules.d.ts +2 -2
  131. package/lib/AWS/EventBridge/ListRules.d.ts.map +1 -1
  132. package/lib/AWS/EventBridge/ListRules.js +2 -2
  133. package/lib/AWS/EventBridge/ListRules.js.map +1 -1
  134. package/lib/AWS/EventBridge/PutEvents.d.ts +2 -2
  135. package/lib/AWS/EventBridge/PutEvents.d.ts.map +1 -1
  136. package/lib/AWS/EventBridge/PutEvents.js +2 -2
  137. package/lib/AWS/EventBridge/PutEvents.js.map +1 -1
  138. package/lib/AWS/EventBridge/Rule.d.ts +2 -2
  139. package/lib/AWS/EventBridge/Rule.d.ts.map +1 -1
  140. package/lib/AWS/EventBridge/Rule.js +2 -2
  141. package/lib/AWS/EventBridge/Rule.js.map +1 -1
  142. package/lib/AWS/IAM/OpenIDConnectProvider.d.ts +2 -2
  143. package/lib/AWS/IAM/OpenIDConnectProvider.d.ts.map +1 -1
  144. package/lib/AWS/IAM/OpenIDConnectProvider.js +2 -2
  145. package/lib/AWS/IAM/OpenIDConnectProvider.js.map +1 -1
  146. package/lib/AWS/IAM/Policy.d.ts +3 -3
  147. package/lib/AWS/IAM/Policy.d.ts.map +1 -1
  148. package/lib/AWS/IAM/Policy.js +2 -2
  149. package/lib/AWS/IAM/Policy.js.map +1 -1
  150. package/lib/AWS/IAM/Role.d.ts +3 -3
  151. package/lib/AWS/IAM/Role.d.ts.map +1 -1
  152. package/lib/AWS/IAM/Role.js +3 -3
  153. package/lib/AWS/IAM/Role.js.map +1 -1
  154. package/lib/AWS/Kinesis/Stream.d.ts +2 -2
  155. package/lib/AWS/Kinesis/Stream.d.ts.map +1 -1
  156. package/lib/AWS/Kinesis/Stream.js +2 -2
  157. package/lib/AWS/Kinesis/Stream.js.map +1 -1
  158. package/lib/AWS/Lambda/BucketEventSource.d.ts +1 -1
  159. package/lib/AWS/Lambda/BucketEventSource.d.ts.map +1 -1
  160. package/lib/AWS/Lambda/EventBridgeEventSource.d.ts +1 -1
  161. package/lib/AWS/Lambda/EventBridgeEventSource.d.ts.map +1 -1
  162. package/lib/AWS/Lambda/EventSourceMapping.d.ts +2 -2
  163. package/lib/AWS/Lambda/EventSourceMapping.d.ts.map +1 -1
  164. package/lib/AWS/Lambda/EventSourceMapping.js +2 -2
  165. package/lib/AWS/Lambda/EventSourceMapping.js.map +1 -1
  166. package/lib/AWS/Lambda/Function.d.ts +2 -2
  167. package/lib/AWS/Lambda/Function.d.ts.map +1 -1
  168. package/lib/AWS/Lambda/Function.js +2 -2
  169. package/lib/AWS/Lambda/Function.js.map +1 -1
  170. package/lib/AWS/Lambda/Permission.d.ts +1 -1
  171. package/lib/AWS/Lambda/Permission.js +1 -1
  172. package/lib/AWS/Lambda/QueueEventSource.d.ts +1 -1
  173. package/lib/AWS/Lambda/QueueEventSource.d.ts.map +1 -1
  174. package/lib/AWS/Lambda/StreamEventSource.d.ts +1 -1
  175. package/lib/AWS/Lambda/StreamEventSource.d.ts.map +1 -1
  176. package/lib/AWS/Lambda/TableEventSource.d.ts +1 -1
  177. package/lib/AWS/Lambda/TableEventSource.d.ts.map +1 -1
  178. package/lib/AWS/Lambda/TopicEventSource.d.ts +1 -1
  179. package/lib/AWS/Lambda/TopicEventSource.d.ts.map +1 -1
  180. package/lib/AWS/Logs/LogGroup.d.ts +3 -3
  181. package/lib/AWS/Logs/LogGroup.d.ts.map +1 -1
  182. package/lib/AWS/Logs/LogGroup.js +2 -2
  183. package/lib/AWS/Logs/LogGroup.js.map +1 -1
  184. package/lib/AWS/Providers.d.ts +1 -2
  185. package/lib/AWS/Providers.d.ts.map +1 -1
  186. package/lib/AWS/Providers.js +3 -3
  187. package/lib/AWS/Providers.js.map +1 -1
  188. package/lib/AWS/Region.d.ts +6 -22
  189. package/lib/AWS/Region.d.ts.map +1 -1
  190. package/lib/AWS/Region.js +6 -39
  191. package/lib/AWS/Region.js.map +1 -1
  192. package/lib/AWS/S3/Bucket.d.ts +2 -2
  193. package/lib/AWS/S3/Bucket.d.ts.map +1 -1
  194. package/lib/AWS/S3/Bucket.js +2 -2
  195. package/lib/AWS/S3/Bucket.js.map +1 -1
  196. package/lib/AWS/SNS/Topic.d.ts +1 -1
  197. package/lib/AWS/SNS/Topic.d.ts.map +1 -1
  198. package/lib/AWS/SQS/Queue.d.ts +3 -3
  199. package/lib/AWS/SQS/Queue.d.ts.map +1 -1
  200. package/lib/AWS/SQS/Queue.js +2 -2
  201. package/lib/AWS/SQS/Queue.js.map +1 -1
  202. package/lib/AWS/index.d.ts +1 -3
  203. package/lib/AWS/index.d.ts.map +1 -1
  204. package/lib/AWS/index.js +1 -3
  205. package/lib/AWS/index.js.map +1 -1
  206. package/lib/Apply.d.ts.map +1 -1
  207. package/lib/Apply.js +2 -2
  208. package/lib/Apply.js.map +1 -1
  209. package/lib/Auth/AuthProvider.d.ts +51 -7
  210. package/lib/Auth/AuthProvider.d.ts.map +1 -1
  211. package/lib/Auth/AuthProvider.js +37 -0
  212. package/lib/Auth/AuthProvider.js.map +1 -1
  213. package/lib/Auth/Profile.d.ts +71 -10
  214. package/lib/Auth/Profile.d.ts.map +1 -1
  215. package/lib/Auth/Profile.js +47 -30
  216. package/lib/Auth/Profile.js.map +1 -1
  217. package/lib/Auth/index.d.ts +1 -1
  218. package/lib/Auth/index.d.ts.map +1 -1
  219. package/lib/Cloudflare/Auth/AuthProvider.d.ts +14 -31
  220. package/lib/Cloudflare/Auth/AuthProvider.d.ts.map +1 -1
  221. package/lib/Cloudflare/Auth/AuthProvider.js +59 -38
  222. package/lib/Cloudflare/Auth/AuthProvider.js.map +1 -1
  223. package/lib/Cloudflare/CloudflareEnvironment.d.ts +11 -0
  224. package/lib/Cloudflare/CloudflareEnvironment.d.ts.map +1 -0
  225. package/lib/Cloudflare/CloudflareEnvironment.js +26 -0
  226. package/lib/Cloudflare/CloudflareEnvironment.js.map +1 -0
  227. package/lib/Cloudflare/Container/ContainerApplication.d.ts +70 -42
  228. package/lib/Cloudflare/Container/ContainerApplication.d.ts.map +1 -1
  229. package/lib/Cloudflare/Container/ContainerApplication.js +49 -24
  230. package/lib/Cloudflare/Container/ContainerApplication.js.map +1 -1
  231. package/lib/Cloudflare/Credentials.d.ts +11 -0
  232. package/lib/Cloudflare/Credentials.d.ts.map +1 -0
  233. package/lib/Cloudflare/Credentials.js +34 -0
  234. package/lib/Cloudflare/Credentials.js.map +1 -0
  235. package/lib/Cloudflare/D1/D1Database.d.ts +2 -2
  236. package/lib/Cloudflare/D1/D1Database.d.ts.map +1 -1
  237. package/lib/Cloudflare/D1/D1Database.js +2 -2
  238. package/lib/Cloudflare/D1/D1Database.js.map +1 -1
  239. package/lib/Cloudflare/KV/KVNamespace.d.ts +2 -2
  240. package/lib/Cloudflare/KV/KVNamespace.d.ts.map +1 -1
  241. package/lib/Cloudflare/KV/KVNamespace.js +2 -2
  242. package/lib/Cloudflare/KV/KVNamespace.js.map +1 -1
  243. package/lib/Cloudflare/Providers.d.ts +2 -3
  244. package/lib/Cloudflare/Providers.d.ts.map +1 -1
  245. package/lib/Cloudflare/Providers.js +12 -4
  246. package/lib/Cloudflare/Providers.js.map +1 -1
  247. package/lib/Cloudflare/Queue/Queue.d.ts +52 -0
  248. package/lib/Cloudflare/Queue/Queue.d.ts.map +1 -0
  249. package/lib/Cloudflare/Queue/Queue.js +136 -0
  250. package/lib/Cloudflare/Queue/Queue.js.map +1 -0
  251. package/lib/Cloudflare/Queue/QueueBinding.d.ts +35 -0
  252. package/lib/Cloudflare/Queue/QueueBinding.d.ts.map +1 -0
  253. package/lib/Cloudflare/Queue/QueueBinding.js +51 -0
  254. package/lib/Cloudflare/Queue/QueueBinding.js.map +1 -0
  255. package/lib/Cloudflare/Queue/QueueConsumer.d.ts +86 -0
  256. package/lib/Cloudflare/Queue/QueueConsumer.d.ts.map +1 -0
  257. package/lib/Cloudflare/Queue/QueueConsumer.js +138 -0
  258. package/lib/Cloudflare/Queue/QueueConsumer.js.map +1 -0
  259. package/lib/Cloudflare/Queue/index.d.ts +4 -0
  260. package/lib/Cloudflare/Queue/index.d.ts.map +1 -0
  261. package/lib/Cloudflare/Queue/index.js +4 -0
  262. package/lib/Cloudflare/Queue/index.js.map +1 -0
  263. package/lib/Cloudflare/R2/R2Bucket.d.ts +2 -2
  264. package/lib/Cloudflare/R2/R2Bucket.d.ts.map +1 -1
  265. package/lib/Cloudflare/R2/R2Bucket.js +2 -2
  266. package/lib/Cloudflare/R2/R2Bucket.js.map +1 -1
  267. package/lib/Cloudflare/SecretsStore/Secret.d.ts +74 -0
  268. package/lib/Cloudflare/SecretsStore/Secret.d.ts.map +1 -0
  269. package/lib/Cloudflare/SecretsStore/Secret.js +161 -0
  270. package/lib/Cloudflare/SecretsStore/Secret.js.map +1 -0
  271. package/lib/Cloudflare/SecretsStore/SecretBinding.d.ts +42 -0
  272. package/lib/Cloudflare/SecretsStore/SecretBinding.d.ts.map +1 -0
  273. package/lib/Cloudflare/SecretsStore/SecretBinding.js +49 -0
  274. package/lib/Cloudflare/SecretsStore/SecretBinding.js.map +1 -0
  275. package/lib/Cloudflare/SecretsStore/SecretsStore.d.ts +37 -0
  276. package/lib/Cloudflare/SecretsStore/SecretsStore.d.ts.map +1 -0
  277. package/lib/Cloudflare/SecretsStore/SecretsStore.js +88 -0
  278. package/lib/Cloudflare/SecretsStore/SecretsStore.js.map +1 -0
  279. package/lib/Cloudflare/SecretsStore/index.d.ts +4 -0
  280. package/lib/Cloudflare/SecretsStore/index.d.ts.map +1 -0
  281. package/lib/Cloudflare/SecretsStore/index.js +4 -0
  282. package/lib/Cloudflare/SecretsStore/index.js.map +1 -0
  283. package/lib/Cloudflare/Workers/InferEnv.d.ts +1 -1
  284. package/lib/Cloudflare/Workers/InferEnv.d.ts.map +1 -1
  285. package/lib/Cloudflare/Workers/Worker.d.ts +5 -3
  286. package/lib/Cloudflare/Workers/Worker.d.ts.map +1 -1
  287. package/lib/Cloudflare/Workers/Worker.js +61 -7
  288. package/lib/Cloudflare/Workers/Worker.js.map +1 -1
  289. package/lib/Cloudflare/Workers/Workflow.d.ts +10 -4
  290. package/lib/Cloudflare/Workers/Workflow.d.ts.map +1 -1
  291. package/lib/Cloudflare/Workers/Workflow.js +3 -3
  292. package/lib/Cloudflare/Workers/Workflow.js.map +1 -1
  293. package/lib/Cloudflare/index.d.ts +3 -1
  294. package/lib/Cloudflare/index.d.ts.map +1 -1
  295. package/lib/Cloudflare/index.js +3 -1
  296. package/lib/Cloudflare/index.js.map +1 -1
  297. package/lib/Stack.d.ts +3 -2
  298. package/lib/Stack.d.ts.map +1 -1
  299. package/lib/Stack.js +10 -7
  300. package/lib/Stack.js.map +1 -1
  301. package/lib/State/LocalState.d.ts.map +1 -1
  302. package/lib/State/LocalState.js +40 -12
  303. package/lib/State/LocalState.js.map +1 -1
  304. package/lib/Test/Bun.d.ts.map +1 -1
  305. package/lib/Test/Bun.js +3 -2
  306. package/lib/Test/Bun.js.map +1 -1
  307. package/lib/Test/Vitest.d.ts +3 -1
  308. package/lib/Test/Vitest.d.ts.map +1 -1
  309. package/lib/Test/Vitest.js +19 -16
  310. package/lib/Test/Vitest.js.map +1 -1
  311. package/lib/Util/PlatformServices.d.ts +14 -3
  312. package/lib/Util/PlatformServices.d.ts.map +1 -1
  313. package/lib/Util/PlatformServices.js +21 -3
  314. package/lib/Util/PlatformServices.js.map +1 -1
  315. package/package.json +5 -5
  316. package/src/AWS/AuthProvider.ts +67 -67
  317. package/src/AWS/AutoScaling/LaunchTemplate.ts +3 -3
  318. package/src/AWS/Bootstrap.ts +32 -37
  319. package/src/AWS/CloudWatch/Alarm.ts +2 -2
  320. package/src/AWS/CloudWatch/AlarmMuteRule.ts +2 -2
  321. package/src/AWS/CloudWatch/CompositeAlarm.ts +2 -2
  322. package/src/AWS/CloudWatch/Dashboard.ts +2 -2
  323. package/src/AWS/CloudWatch/InsightRule.ts +2 -2
  324. package/src/AWS/CloudWatch/MetricStream.ts +2 -2
  325. package/src/AWS/Credentials.ts +9 -44
  326. package/src/AWS/DynamoDB/Table.ts +1 -1
  327. package/src/AWS/EC2/EIP.ts +3 -3
  328. package/src/AWS/EC2/EgressOnlyInternetGateway.ts +3 -3
  329. package/src/AWS/EC2/Instance.ts +3 -3
  330. package/src/AWS/EC2/InternetGateway.ts +3 -3
  331. package/src/AWS/EC2/NatGateway.ts +3 -3
  332. package/src/AWS/EC2/NetworkAcl.ts +3 -3
  333. package/src/AWS/EC2/RouteTable.ts +3 -3
  334. package/src/AWS/EC2/SecurityGroup.ts +3 -3
  335. package/src/AWS/EC2/Subnet.ts +1 -1
  336. package/src/AWS/EC2/Vpc.ts +3 -3
  337. package/src/AWS/EC2/VpcEndpoint.ts +3 -3
  338. package/src/AWS/ECR/Repository.ts +1 -1
  339. package/src/AWS/ECS/Cluster.ts +2 -2
  340. package/src/AWS/ECS/Service.ts +1 -1
  341. package/src/AWS/ECS/Task.ts +2 -2
  342. package/src/AWS/EKS/Cluster.ts +1 -1
  343. package/src/AWS/ELBv2/Listener.ts +1 -1
  344. package/src/AWS/ELBv2/LoadBalancer.ts +1 -1
  345. package/src/AWS/ELBv2/TargetGroup.ts +1 -1
  346. package/src/AWS/Endpoint.ts +12 -8
  347. package/src/AWS/Environment.ts +123 -0
  348. package/src/AWS/EventBridge/EventBus.ts +2 -2
  349. package/src/AWS/EventBridge/ListRules.ts +2 -2
  350. package/src/AWS/EventBridge/PutEvents.ts +2 -2
  351. package/src/AWS/EventBridge/Rule.ts +2 -2
  352. package/src/AWS/IAM/OpenIDConnectProvider.ts +2 -2
  353. package/src/AWS/IAM/Policy.ts +3 -3
  354. package/src/AWS/IAM/Role.ts +4 -4
  355. package/src/AWS/Kinesis/Stream.ts +2 -2
  356. package/src/AWS/Lambda/EventSourceMapping.ts +2 -2
  357. package/src/AWS/Lambda/Function.ts +2 -2
  358. package/src/AWS/Lambda/Permission.ts +1 -1
  359. package/src/AWS/Logs/LogGroup.ts +3 -3
  360. package/src/AWS/Providers.ts +7 -7
  361. package/src/AWS/Region.ts +9 -66
  362. package/src/AWS/S3/Bucket.ts +2 -2
  363. package/src/AWS/SNS/Topic.ts +1 -1
  364. package/src/AWS/SQS/Queue.ts +3 -3
  365. package/src/AWS/index.ts +1 -3
  366. package/src/Apply.ts +55 -57
  367. package/src/Auth/AuthProvider.ts +188 -8
  368. package/src/Auth/Profile.ts +117 -54
  369. package/src/Auth/index.ts +1 -1
  370. package/src/Cloudflare/Auth/AuthProvider.ts +127 -98
  371. package/src/Cloudflare/CloudflareEnvironment.ts +49 -0
  372. package/src/Cloudflare/Container/ContainerApplication.ts +172 -94
  373. package/src/Cloudflare/Credentials.ts +75 -0
  374. package/src/Cloudflare/D1/D1Database.ts +2 -2
  375. package/src/Cloudflare/KV/KVNamespace.ts +2 -2
  376. package/src/Cloudflare/Providers.ts +20 -10
  377. package/src/Cloudflare/Queue/Queue.ts +174 -0
  378. package/src/Cloudflare/Queue/QueueBinding.ts +110 -0
  379. package/src/Cloudflare/Queue/QueueConsumer.ts +219 -0
  380. package/src/Cloudflare/Queue/index.ts +3 -0
  381. package/src/Cloudflare/R2/R2Bucket.ts +2 -2
  382. package/src/Cloudflare/SecretsStore/Secret.ts +229 -0
  383. package/src/Cloudflare/SecretsStore/SecretBinding.ts +107 -0
  384. package/src/Cloudflare/SecretsStore/SecretsStore.ts +106 -0
  385. package/src/Cloudflare/SecretsStore/index.ts +3 -0
  386. package/src/Cloudflare/Workers/InferEnv.ts +5 -3
  387. package/src/Cloudflare/Workers/Worker.ts +63 -7
  388. package/src/Cloudflare/Workers/Workflow.ts +19 -9
  389. package/src/Cloudflare/index.ts +3 -1
  390. package/src/Stack.ts +40 -29
  391. package/src/State/LocalState.ts +43 -16
  392. package/src/Test/Bun.ts +3 -0
  393. package/src/Test/Vitest.ts +31 -23
  394. package/src/Util/PlatformServices.ts +54 -13
  395. package/bin/process-manager.ts +0 -10
  396. package/lib/AWS/Account.d.ts +0 -26
  397. package/lib/AWS/Account.d.ts.map +0 -1
  398. package/lib/AWS/Account.js +0 -32
  399. package/lib/AWS/Account.js.map +0 -1
  400. package/lib/AWS/Profile.d.ts +0 -6
  401. package/lib/AWS/Profile.d.ts.map +0 -1
  402. package/lib/AWS/Profile.js +0 -4
  403. package/lib/AWS/Profile.js.map +0 -1
  404. package/lib/AWS/StageConfig.d.ts +0 -25
  405. package/lib/AWS/StageConfig.d.ts.map +0 -1
  406. package/lib/AWS/StageConfig.js +0 -23
  407. package/lib/AWS/StageConfig.js.map +0 -1
  408. package/lib/Cloudflare/Account.d.ts +0 -10
  409. package/lib/Cloudflare/Account.d.ts.map +0 -1
  410. package/lib/Cloudflare/Account.js +0 -24
  411. package/lib/Cloudflare/Account.js.map +0 -1
  412. package/lib/Cloudflare/StageConfig.d.ts +0 -8
  413. package/lib/Cloudflare/StageConfig.d.ts.map +0 -1
  414. package/lib/Cloudflare/StageConfig.js +0 -4
  415. package/lib/Cloudflare/StageConfig.js.map +0 -1
  416. package/src/AWS/Account.ts +0 -56
  417. package/src/AWS/Profile.ts +0 -5
  418. package/src/AWS/StageConfig.ts +0 -44
  419. package/src/Cloudflare/Account.ts +0 -38
  420. package/src/Cloudflare/StageConfig.ts +0 -8
@@ -6,28 +6,29 @@ import * as Effect from "effect/Effect";
6
6
  import * as FileSystem from "effect/FileSystem";
7
7
  import * as Layer from "effect/Layer";
8
8
  import * as Match from "effect/Match";
9
- import * as Path from "effect/Path";
10
9
  import * as Redacted from "effect/Redacted";
11
10
  import * as FetchHttpClient from "effect/unstable/http/FetchHttpClient";
12
11
  import * as HttpClient from "effect/unstable/http/HttpClient";
13
- import * as ChildProcessSpawner from "effect/unstable/process/ChildProcessSpawner";
14
- import { AuthError, type AuthProvider } from "../../Auth/AuthProvider.ts";
12
+ import {
13
+ AuthError,
14
+ AuthProviderLayer,
15
+ type ConfigureContext,
16
+ } from "../../Auth/AuthProvider.ts";
15
17
  import {
16
18
  deleteCredentials,
17
19
  displayRedacted,
18
20
  readCredentials,
19
21
  writeCredentials,
20
22
  } from "../../Auth/Credentials.ts";
21
- import { getEnv, getEnvRedacted, retryOnce } from "../../Auth/Env.ts";
23
+ import {
24
+ getEnv,
25
+ getEnvRedacted,
26
+ getEnvRequired,
27
+ retryOnce,
28
+ } from "../../Auth/Env.ts";
22
29
  import * as Clank from "../../Util/Clank.ts";
23
30
  import * as OAuthClient from "./OAuthClient.ts";
24
31
 
25
- export type CloudflareAuthConfig =
26
- | { method: "env"; accountId?: string }
27
- | { method: "stored"; credentialType: "apiToken"; accountId?: string }
28
- | { method: "stored"; credentialType: "apiKey"; accountId?: string }
29
- | { method: "oauth"; scopes: string[]; accountId?: string };
30
-
31
32
  const options: Array<{
32
33
  value: CloudflareAuthConfig["method"];
33
34
  label: string;
@@ -50,69 +51,77 @@ const options: Array<{
50
51
  },
51
52
  ];
52
53
 
54
+ export type CloudflareAuthConfig =
55
+ | { method: "env" }
56
+ | { method: "stored"; credentialType: "apiToken" }
57
+ | { method: "stored"; credentialType: "apiKey" }
58
+ | { method: "oauth"; scopes: string[]; accountId: string };
59
+
53
60
  export type CloudflareStoredCredentials =
54
- | { type: "apiToken"; apiToken: string }
55
- | { type: "apiKey"; apiKey: string; email: string };
61
+ | { type: "apiToken"; apiToken: string; accountId: string }
62
+ | { type: "apiKey"; apiKey: string; email: string; accountId: string };
56
63
 
57
64
  export type CloudflareResolvedCredentials =
58
65
  | {
59
66
  type: "apiToken";
60
67
  apiToken: Redacted.Redacted<string>;
68
+ accountId: string;
61
69
  source: { type: CloudflareAuthConfig["method"]; details?: string };
62
70
  }
63
71
  | {
64
72
  type: "apiKey";
65
73
  apiKey: Redacted.Redacted<string>;
66
74
  email: Redacted.Redacted<string>;
75
+ accountId: string;
67
76
  source: { type: CloudflareAuthConfig["method"]; details?: string };
68
77
  }
69
78
  | {
70
79
  type: "oauth";
71
80
  accessToken: Redacted.Redacted<string>;
72
81
  expires: number;
82
+ accountId: string;
73
83
  source: { type: CloudflareAuthConfig["method"]; details?: string };
74
84
  };
75
85
 
76
- export const CloudflareAuth = Effect.gen(function* () {
77
- const context = yield* Effect.context<
78
- FileSystem.FileSystem | Path.Path | ChildProcessSpawner.ChildProcessSpawner
79
- >();
80
-
81
- return {
82
- name: "Cloudflare",
83
-
84
- configure: (profileName) =>
85
- configureCredentials(profileName).pipe(Effect.provide(context)),
86
-
87
- logout: (profileName, config) =>
88
- logout(profileName, config).pipe(Effect.provide(context)),
89
-
90
- login: (profileName, config) =>
91
- login(profileName, config).pipe(Effect.provide(context)),
92
-
93
- prettyPrint: (profileName, config) =>
94
- prettyPrint(profileName, config).pipe(Effect.provide(context)),
95
-
96
- read: (profileName, config) =>
97
- resolveCredentials(profileName, config).pipe(Effect.provide(context)),
98
- } satisfies AuthProvider<CloudflareAuthConfig, CloudflareResolvedCredentials>;
86
+ export const CLOUDFLARE_AUTH_PROVIDER_NAME = "Cloudflare";
87
+
88
+ /**
89
+ * Layer that registers the Cloudflare {@link AuthProvider} into the
90
+ * {@link AuthProviders} registry when built. Include this in the Cloudflare
91
+ * `providers()` layer so `alchemy login` can discover it.
92
+ */
93
+ export const CloudflareAuth = AuthProviderLayer<
94
+ CloudflareAuthConfig,
95
+ CloudflareResolvedCredentials
96
+ >()(CLOUDFLARE_AUTH_PROVIDER_NAME, {
97
+ configure: (profileName, ctx) => configureCredentials(profileName, ctx),
98
+ logout: (profileName, config) => logout(profileName, config),
99
+ login: (profileName, config) => login(profileName, config),
100
+ prettyPrint: (profileName, config) => prettyPrint(profileName, config),
101
+ read: (profileName, config) => resolveCredentials(profileName, config),
99
102
  });
100
103
 
101
104
  const resolveCredentials = (
102
105
  profileName: string,
103
106
  config: CloudflareAuthConfig,
104
- ) =>
107
+ ): Effect.Effect<
108
+ CloudflareResolvedCredentials,
109
+ AuthError,
110
+ FileSystem.FileSystem
111
+ > =>
105
112
  Match.value(config).pipe(
106
113
  Match.when(
107
114
  { method: "env" },
108
115
  Effect.fnUntraced(function* () {
116
+ const accountId = yield* getEnvRequired("CLOUDFLARE_ACCOUNT_ID");
109
117
  const apiToken = yield* getEnvRedacted("CLOUDFLARE_API_TOKEN");
110
118
  if (apiToken) {
111
119
  return {
112
120
  type: "apiToken" as const,
113
121
  apiToken,
114
- source: { type: "env" },
115
- } as CloudflareResolvedCredentials;
122
+ accountId,
123
+ source: { type: "env" as const },
124
+ };
116
125
  }
117
126
  const apiKey = yield* getEnvRedacted("CLOUDFLARE_API_KEY");
118
127
  const email = yield* getEnvRedacted("CLOUDFLARE_EMAIL");
@@ -121,8 +130,9 @@ const resolveCredentials = (
121
130
  type: "apiKey" as const,
122
131
  apiKey,
123
132
  email,
124
- source: { type: "env" },
125
- } as CloudflareResolvedCredentials;
133
+ accountId,
134
+ source: { type: "env" as const },
135
+ };
126
136
  }
127
137
  return yield* new AuthError({
128
138
  message:
@@ -148,41 +158,63 @@ const resolveCredentials = (
148
158
  Match.when({ type: "apiToken" }, (c) => ({
149
159
  type: "apiToken" as const,
150
160
  apiToken: Redacted.make(c.apiToken),
161
+ accountId: c.accountId,
151
162
  source: { type: "stored" as const },
152
163
  })),
153
164
  Match.when({ type: "apiKey" }, (c) => ({
154
165
  type: "apiKey" as const,
155
166
  apiKey: Redacted.make(c.apiKey),
156
167
  email: Redacted.make(c.email),
168
+ accountId: c.accountId,
157
169
  source: { type: "stored" as const },
158
170
  })),
159
171
  Match.exhaustive,
160
- ) as CloudflareResolvedCredentials,
172
+ ),
161
173
  ),
162
174
  ),
163
175
  ),
164
176
  ),
165
- Match.when({ method: "oauth" }, () =>
166
- readCredentials<OAuthClient.OAuthCredentials>(
167
- profileName,
168
- "cf-oauth",
169
- ).pipe(
170
- Effect.flatMap((creds) =>
171
- creds == null || creds.type !== "oauth"
172
- ? Effect.fail(
173
- new AuthError({
174
- message:
175
- "Cloudflare OAuth credentials not found. Run: alchemy-effect login",
176
- }),
177
- )
178
- : Effect.succeed({
179
- type: "oauth" as const,
180
- accessToken: Redacted.make(creds.access),
181
- expires: creds.expires,
182
- source: { type: "oauth" as const },
183
- } as CloudflareResolvedCredentials),
184
- ),
185
- ),
177
+ Match.when({ method: "oauth" }, (cfg) =>
178
+ Effect.gen(function* () {
179
+ const creds = yield* readCredentials<OAuthClient.OAuthCredentials>(
180
+ profileName,
181
+ "cf-oauth",
182
+ );
183
+ if (creds == null || creds.type !== "oauth") {
184
+ return yield* Effect.fail(
185
+ new AuthError({
186
+ message:
187
+ "Cloudflare OAuth credentials not found. Run: alchemy login",
188
+ }),
189
+ );
190
+ }
191
+ // Refresh proactively if the token has expired (or is within
192
+ // 10s of expiring). Persist the refreshed creds so subsequent
193
+ // resolves don't repeat the round-trip.
194
+ const fresh =
195
+ creds.expires > Date.now() + 10_000
196
+ ? creds
197
+ : yield* OAuthClient.refresh(creds).pipe(
198
+ Effect.tap((refreshed) =>
199
+ writeCredentials(profileName, "cf-oauth", refreshed),
200
+ ),
201
+ Effect.mapError(
202
+ (e) =>
203
+ new AuthError({
204
+ message:
205
+ "Cloudflare OAuth refresh failed. Run: alchemy login",
206
+ cause: e,
207
+ }),
208
+ ),
209
+ );
210
+ return {
211
+ type: "oauth" as const,
212
+ accessToken: Redacted.make(fresh.access),
213
+ expires: fresh.expires,
214
+ accountId: cfg.accountId,
215
+ source: { type: "oauth" as const },
216
+ };
217
+ }),
186
218
  ),
187
219
  Match.exhaustive,
188
220
  );
@@ -272,30 +304,36 @@ const login = (profileName: string, config: CloudflareAuthConfig) =>
272
304
  ),
273
305
  );
274
306
 
275
- const configureCredentials = (profileName: string) =>
307
+ const configureCredentials = (profileName: string, ctx: ConfigureContext) =>
308
+ Effect.gen(function* () {
309
+ if (ctx.ci) {
310
+ return { method: "env" as const };
311
+ }
312
+ return yield* configureInteractive(profileName);
313
+ }).pipe(
314
+ Effect.mapError(
315
+ (e) =>
316
+ new AuthError({
317
+ message: "failed to configure credentials",
318
+ cause: e,
319
+ }),
320
+ ),
321
+ );
322
+
323
+ const configureInteractive = (profileName: string) =>
276
324
  Clank.select({
277
325
  message: "Cloudflare authentication method",
278
326
  options,
279
- })
280
- .pipe(
281
- Effect.flatMap((method) =>
282
- Match.value(method).pipe(
283
- Match.when("env", () => Effect.succeed({ method: "env" as const })),
284
- Match.when("oauth", () => configureOAuth(profileName)),
285
- Match.when("stored", () => loginStored(profileName)),
286
- Match.exhaustive,
287
- ),
288
- ),
289
- )
290
- .pipe(
291
- Effect.mapError(
292
- (e) =>
293
- new AuthError({
294
- message: "failed to configure credentials",
295
- cause: e,
296
- }),
327
+ }).pipe(
328
+ Effect.flatMap((method) =>
329
+ Match.value(method).pipe(
330
+ Match.when("env", () => Effect.succeed({ method: "env" as const })),
331
+ Match.when("oauth", () => configureOAuth(profileName)),
332
+ Match.when("stored", () => loginStored(profileName)),
333
+ Match.exhaustive,
297
334
  ),
298
- );
335
+ ),
336
+ );
299
337
 
300
338
  const configureOAuth = Effect.fnUntraced(function* (profileName: string) {
301
339
  const scopes = yield* promptOAuthScopes();
@@ -335,18 +373,17 @@ const loginStored = Effect.fnUntraced(function* (profileName: string) {
335
373
  message: "Cloudflare API Token",
336
374
  validate: (v) => (v.length === 0 ? "Required" : undefined),
337
375
  }).pipe(retryOnce);
376
+ const accountId = yield* promptAccountId();
338
377
 
339
378
  yield* writeCredentials<CloudflareStoredCredentials>(
340
379
  profileName,
341
380
  "cf-stored",
342
- { type: "apiToken", apiToken },
381
+ { type: "apiToken", apiToken, accountId },
343
382
  );
344
383
  yield* Clank.success("Cloudflare: credentials saved.");
345
- const accountId = yield* promptAccountId();
346
384
  return {
347
385
  method: "stored" as const,
348
386
  credentialType: "apiToken" as const,
349
- ...(accountId ? { accountId } : {}),
350
387
  };
351
388
  }),
352
389
  ),
@@ -361,18 +398,17 @@ const loginStored = Effect.fnUntraced(function* (profileName: string) {
361
398
  message: "Cloudflare Email",
362
399
  validate: (v) => (v.length === 0 ? "Required" : undefined),
363
400
  }).pipe(retryOnce);
401
+ const accountId = yield* promptAccountId();
364
402
 
365
403
  yield* writeCredentials<CloudflareStoredCredentials>(
366
404
  profileName,
367
405
  "cf-stored",
368
- { type: "apiKey", apiKey, email },
406
+ { type: "apiKey", apiKey, email, accountId },
369
407
  );
370
408
  yield* Clank.success("Cloudflare: credentials saved.");
371
- const accountId = yield* promptAccountId();
372
409
  return {
373
410
  method: "stored" as const,
374
411
  credentialType: "apiKey" as const,
375
- ...(accountId ? { accountId } : {}),
376
412
  };
377
413
  }),
378
414
  ),
@@ -495,6 +531,7 @@ const prettyPrint = (profileName: string, config: CloudflareAuthConfig) =>
495
531
  Match.when({ type: "apiToken" }, (c) =>
496
532
  Effect.all([
497
533
  Console.log(` apiToken: ${displayRedacted(c.apiToken, 9)}`),
534
+ Console.log(` accountId: ${c.accountId}`),
498
535
  Console.log(` source: ${sourceStr}`),
499
536
  ]),
500
537
  ),
@@ -502,6 +539,7 @@ const prettyPrint = (profileName: string, config: CloudflareAuthConfig) =>
502
539
  Effect.all([
503
540
  Console.log(` apiKey: ${displayRedacted(c.apiKey)}`),
504
541
  Console.log(` email: ${displayRedacted(c.email)}`),
542
+ Console.log(` accountId: ${c.accountId}`),
505
543
  Console.log(` source: ${sourceStr}`),
506
544
  ]),
507
545
  ),
@@ -515,22 +553,13 @@ const prettyPrint = (profileName: string, config: CloudflareAuthConfig) =>
515
553
  return Effect.all([
516
554
  Console.log(` accessToken: ${displayRedacted(c.accessToken)}`),
517
555
  Console.log(` expires: ${expiresStr}`),
556
+ Console.log(` accountId: ${c.accountId}`),
518
557
  Console.log(` source: ${sourceStr}`),
519
558
  ]);
520
559
  }),
521
560
  Match.exhaustive,
522
561
  );
523
562
  }),
524
- Effect.andThen(
525
- getEnv("CLOUDFLARE_ACCOUNT_ID").pipe(
526
- Effect.flatMap((envAccountId) => {
527
- const resolved = config.accountId ?? envAccountId;
528
- return Console.log(
529
- ` accountId: ${resolved ?? "(not set — configure or set CLOUDFLARE_ACCOUNT_ID)"}`,
530
- );
531
- }),
532
- ),
533
- ),
534
563
  Effect.catch((e) =>
535
564
  Console.error(` Failed to retrieve credentials: ${e}`),
536
565
  ),
@@ -0,0 +1,49 @@
1
+ import * as Config from "effect/Config";
2
+ import * as Context from "effect/Context";
3
+ import * as Effect from "effect/Effect";
4
+ import * as Layer from "effect/Layer";
5
+ import * as Option from "effect/Option";
6
+ import { getAuthProvider } from "../Auth/AuthProvider.ts";
7
+ import { ALCHEMY_PROFILE, loadOrConfigure } from "../Auth/Profile.ts";
8
+ import {
9
+ CLOUDFLARE_AUTH_PROVIDER_NAME,
10
+ type CloudflareAuthConfig,
11
+ type CloudflareResolvedCredentials,
12
+ } from "./Auth/AuthProvider.ts";
13
+
14
+ export class CloudflareEnvironment extends Context.Service<
15
+ CloudflareEnvironment,
16
+ CloudflareResolvedCredentials
17
+ >()("Cloudflare::CloudflareEnvironment") {}
18
+
19
+ const CLOUDFLARE_ACCOUNT_ID = Config.string("CLOUDFLARE_ACCOUNT_ID");
20
+
21
+ export const fromEnv = () =>
22
+ Layer.effect(
23
+ CloudflareEnvironment,
24
+ Effect.gen(function* () {
25
+ const accountId = yield* CLOUDFLARE_ACCOUNT_ID.pipe(
26
+ Config.option,
27
+ Config.map(Option.getOrUndefined),
28
+ );
29
+ return { account: accountId } as any;
30
+ }),
31
+ );
32
+
33
+ export const fromProfile = () =>
34
+ Layer.effect(
35
+ CloudflareEnvironment,
36
+ Effect.gen(function* () {
37
+ const auth = yield* getAuthProvider<
38
+ CloudflareAuthConfig,
39
+ CloudflareResolvedCredentials
40
+ >(CLOUDFLARE_AUTH_PROVIDER_NAME);
41
+ const profileName = yield* ALCHEMY_PROFILE;
42
+ const ci = yield* Config.boolean("CI").pipe(Config.withDefault(false));
43
+ // `loadOrConfigure` reads the persisted config under the canonical
44
+ // provider name (`Cloudflare`); only runs `configure` (and persists the
45
+ // result) if no stored config exists.
46
+ const config = yield* loadOrConfigure(auth, profileName, { ci });
47
+ return yield* auth.read(profileName, config as CloudflareAuthConfig);
48
+ }),
49
+ );