alchemy 2.0.0-beta.84 → 2.0.0-beta.85

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 (758) hide show
  1. package/THIRD_PARTY_LICENSES.md +2 -2
  2. package/bin/cli.js +14 -6
  3. package/bin/register-oxc.js +16 -12
  4. package/lib/AdoptPolicy.d.ts +73 -0
  5. package/lib/AdoptPolicy.d.ts.map +1 -1
  6. package/lib/AdoptPolicy.js +54 -0
  7. package/lib/AdoptPolicy.js.map +1 -1
  8. package/lib/Alchemist/AuthRegistry.d.ts +31 -0
  9. package/lib/Alchemist/AuthRegistry.d.ts.map +1 -0
  10. package/lib/Alchemist/AuthRegistry.js +95 -0
  11. package/lib/Alchemist/AuthRegistry.js.map +1 -0
  12. package/lib/Alchemist/Drift.d.ts +70 -0
  13. package/lib/Alchemist/Drift.d.ts.map +1 -0
  14. package/lib/Alchemist/Drift.js +54 -0
  15. package/lib/Alchemist/Drift.js.map +1 -0
  16. package/lib/Alchemist/Entrypoint.d.ts +27 -3
  17. package/lib/Alchemist/Entrypoint.d.ts.map +1 -1
  18. package/lib/Alchemist/Entrypoint.js +34 -3
  19. package/lib/Alchemist/Entrypoint.js.map +1 -1
  20. package/lib/Alchemist/Errors.d.ts +1 -1
  21. package/lib/Alchemist/Errors.d.ts.map +1 -1
  22. package/lib/Alchemist/Errors.js +1 -1
  23. package/lib/Alchemist/Errors.js.map +1 -1
  24. package/lib/Alchemist/Logs.d.ts +46 -0
  25. package/lib/Alchemist/Logs.d.ts.map +1 -0
  26. package/lib/Alchemist/{routes/logs.js → Logs.js} +21 -26
  27. package/lib/Alchemist/Logs.js.map +1 -0
  28. package/lib/Alchemist/Nuke.d.ts +69 -0
  29. package/lib/Alchemist/Nuke.d.ts.map +1 -0
  30. package/lib/Alchemist/Nuke.js +35 -0
  31. package/lib/Alchemist/Nuke.js.map +1 -0
  32. package/lib/Alchemist/Operations.d.ts +168 -0
  33. package/lib/Alchemist/Operations.d.ts.map +1 -0
  34. package/lib/Alchemist/Operations.js +165 -0
  35. package/lib/Alchemist/Operations.js.map +1 -0
  36. package/lib/Alchemist/Profile.d.ts +132 -0
  37. package/lib/Alchemist/Profile.d.ts.map +1 -0
  38. package/lib/Alchemist/{routes/profile.js → Profile.js} +20 -21
  39. package/lib/Alchemist/Profile.js.map +1 -0
  40. package/lib/Alchemist/{routes/provider.d.ts → Provider.d.ts} +4 -4
  41. package/lib/Alchemist/Provider.d.ts.map +1 -0
  42. package/lib/Alchemist/{routes/provider.js → Provider.js} +7 -6
  43. package/lib/Alchemist/Provider.js.map +1 -0
  44. package/lib/Alchemist/Runtime.d.ts +10 -6
  45. package/lib/Alchemist/Runtime.d.ts.map +1 -1
  46. package/lib/Alchemist/Runtime.js +38 -2
  47. package/lib/Alchemist/Runtime.js.map +1 -1
  48. package/lib/Alchemist/{routes/state.d.ts → State.d.ts} +36 -16
  49. package/lib/Alchemist/State.d.ts.map +1 -0
  50. package/lib/Alchemist/{routes/state.js → State.js} +50 -15
  51. package/lib/Alchemist/State.js.map +1 -0
  52. package/lib/Alchemist/index.d.ts +11 -10
  53. package/lib/Alchemist/index.d.ts.map +1 -1
  54. package/lib/Alchemist/index.js +10 -9
  55. package/lib/Alchemist/index.js.map +1 -1
  56. package/lib/Apply.d.ts +2 -8
  57. package/lib/Apply.d.ts.map +1 -1
  58. package/lib/Apply.js +364 -184
  59. package/lib/Apply.js.map +1 -1
  60. package/lib/Auth/AuthProvider.d.ts +24 -11
  61. package/lib/Auth/AuthProvider.d.ts.map +1 -1
  62. package/lib/Auth/AuthProvider.js +28 -12
  63. package/lib/Auth/AuthProvider.js.map +1 -1
  64. package/lib/Auth/BrowserOAuth.d.ts +6 -8
  65. package/lib/Auth/BrowserOAuth.d.ts.map +1 -1
  66. package/lib/Auth/BrowserOAuth.js +25 -41
  67. package/lib/Auth/BrowserOAuth.js.map +1 -1
  68. package/lib/Auth/Credentials.d.ts.map +1 -1
  69. package/lib/Auth/Credentials.js +2 -2
  70. package/lib/Auth/Credentials.js.map +1 -1
  71. package/lib/Auth/Demand.d.ts +4 -4
  72. package/lib/Auth/Demand.d.ts.map +1 -1
  73. package/lib/Auth/Demand.js +16 -10
  74. package/lib/Auth/Demand.js.map +1 -1
  75. package/lib/Auth/Env.d.ts +2 -1
  76. package/lib/Auth/Env.d.ts.map +1 -1
  77. package/lib/Auth/Env.js +4 -2
  78. package/lib/Auth/Env.js.map +1 -1
  79. package/lib/Auth/Inspect.d.ts +2 -2
  80. package/lib/Auth/Inspect.d.ts.map +1 -1
  81. package/lib/Auth/Inspect.js +3 -1
  82. package/lib/Auth/Inspect.js.map +1 -1
  83. package/lib/Auth/Lock.d.ts.map +1 -1
  84. package/lib/Auth/Lock.js +4 -8
  85. package/lib/Auth/Lock.js.map +1 -1
  86. package/lib/Auth/OAuthFlow.d.ts +3 -12
  87. package/lib/Auth/OAuthFlow.d.ts.map +1 -1
  88. package/lib/Auth/OAuthFlow.js +7 -17
  89. package/lib/Auth/OAuthFlow.js.map +1 -1
  90. package/lib/Auth/Paths.d.ts +2 -1
  91. package/lib/Auth/Paths.d.ts.map +1 -1
  92. package/lib/Auth/Paths.js +3 -2
  93. package/lib/Auth/Paths.js.map +1 -1
  94. package/lib/Auth/Profile.d.ts +10 -0
  95. package/lib/Auth/Profile.d.ts.map +1 -1
  96. package/lib/Auth/Profile.js +19 -2
  97. package/lib/Auth/Profile.js.map +1 -1
  98. package/lib/Auth/Registry.d.ts +20 -0
  99. package/lib/Auth/Registry.d.ts.map +1 -0
  100. package/lib/Auth/Registry.js +17 -0
  101. package/lib/Auth/Registry.js.map +1 -0
  102. package/lib/Auth/Resolve.d.ts +34 -2
  103. package/lib/Auth/Resolve.d.ts.map +1 -1
  104. package/lib/Auth/Resolve.js +51 -3
  105. package/lib/Auth/Resolve.js.map +1 -1
  106. package/lib/Auth/StoredAuthProvider.d.ts +1 -1
  107. package/lib/Auth/StoredAuthProvider.d.ts.map +1 -1
  108. package/lib/Auth/StoredAuthProvider.js +1 -2
  109. package/lib/Auth/StoredAuthProvider.js.map +1 -1
  110. package/lib/Binding.d.ts.map +1 -1
  111. package/lib/Binding.js +3 -1
  112. package/lib/Binding.js.map +1 -1
  113. package/lib/Bundle/Bundle.d.ts +5 -0
  114. package/lib/Bundle/Bundle.d.ts.map +1 -1
  115. package/lib/Bundle/Bundle.js +36 -6
  116. package/lib/Bundle/Bundle.js.map +1 -1
  117. package/lib/Bundle/NamespaceImportPlugin.d.ts +55 -0
  118. package/lib/Bundle/NamespaceImportPlugin.d.ts.map +1 -0
  119. package/lib/Bundle/NamespaceImportPlugin.js +226 -0
  120. package/lib/Bundle/NamespaceImportPlugin.js.map +1 -0
  121. package/lib/Bundle/index.d.ts +1 -0
  122. package/lib/Bundle/index.d.ts.map +1 -1
  123. package/lib/Bundle/index.js +1 -0
  124. package/lib/Bundle/index.js.map +1 -1
  125. package/lib/Cli/Format.d.ts.map +1 -1
  126. package/lib/Cli/Format.js +2 -1
  127. package/lib/Cli/Format.js.map +1 -1
  128. package/lib/Cli/GlobalLog.d.ts +72 -26
  129. package/lib/Cli/GlobalLog.d.ts.map +1 -1
  130. package/lib/Cli/GlobalLog.js +151 -59
  131. package/lib/Cli/GlobalLog.js.map +1 -1
  132. package/lib/Cli/LoggingCli.d.ts.map +1 -1
  133. package/lib/Cli/LoggingCli.js +24 -18
  134. package/lib/Cli/LoggingCli.js.map +1 -1
  135. package/lib/Cli/PlainCliFormatter.d.ts.map +1 -1
  136. package/lib/Cli/PlainCliFormatter.js +4 -1
  137. package/lib/Cli/PlainCliFormatter.js.map +1 -1
  138. package/lib/Cli/Present.d.ts +14 -0
  139. package/lib/Cli/Present.d.ts.map +1 -0
  140. package/lib/Cli/Present.js +22 -0
  141. package/lib/Cli/Present.js.map +1 -0
  142. package/lib/Cli/SigilRenderer.d.ts +58 -0
  143. package/lib/Cli/SigilRenderer.d.ts.map +1 -0
  144. package/lib/Cli/SigilRenderer.js +39 -0
  145. package/lib/Cli/SigilRenderer.js.map +1 -0
  146. package/lib/Cli/checkVersion.d.ts +11 -14
  147. package/lib/Cli/checkVersion.d.ts.map +1 -1
  148. package/lib/Cli/checkVersion.js +19 -77
  149. package/lib/Cli/checkVersion.js.map +1 -1
  150. package/lib/Cli/commands/confirm.d.ts +2 -2
  151. package/lib/Cli/commands/confirm.d.ts.map +1 -1
  152. package/lib/Cli/commands/confirm.js +3 -3
  153. package/lib/Cli/commands/confirm.js.map +1 -1
  154. package/lib/Cli/commands/deploy.d.ts +4 -4
  155. package/lib/Cli/commands/deploy.d.ts.map +1 -1
  156. package/lib/Cli/commands/deploy.js +40 -39
  157. package/lib/Cli/commands/deploy.js.map +1 -1
  158. package/lib/Cli/commands/dev.d.ts.map +1 -1
  159. package/lib/Cli/commands/dev.js +41 -3
  160. package/lib/Cli/commands/dev.js.map +1 -1
  161. package/lib/Cli/commands/drift.d.ts +2 -2
  162. package/lib/Cli/commands/drift.d.ts.map +1 -1
  163. package/lib/Cli/commands/drift.js +14 -13
  164. package/lib/Cli/commands/drift.js.map +1 -1
  165. package/lib/Cli/commands/errors.d.ts.map +1 -1
  166. package/lib/Cli/commands/errors.js +2 -1
  167. package/lib/Cli/commands/errors.js.map +1 -1
  168. package/lib/Cli/commands/instrument.d.ts +15 -5
  169. package/lib/Cli/commands/instrument.d.ts.map +1 -1
  170. package/lib/Cli/commands/instrument.js +33 -8
  171. package/lib/Cli/commands/instrument.js.map +1 -1
  172. package/lib/Cli/commands/logs.d.ts +1 -1
  173. package/lib/Cli/commands/logs.d.ts.map +1 -1
  174. package/lib/Cli/commands/logs.js +22 -22
  175. package/lib/Cli/commands/logs.js.map +1 -1
  176. package/lib/Cli/commands/nuke.d.ts +3 -2
  177. package/lib/Cli/commands/nuke.d.ts.map +1 -1
  178. package/lib/Cli/commands/nuke.js +19 -17
  179. package/lib/Cli/commands/nuke.js.map +1 -1
  180. package/lib/Cli/commands/profile/commands.d.ts +3 -2
  181. package/lib/Cli/commands/profile/commands.d.ts.map +1 -1
  182. package/lib/Cli/commands/profile/commands.js +26 -27
  183. package/lib/Cli/commands/profile/commands.js.map +1 -1
  184. package/lib/Cli/commands/profile/flows.d.ts +6 -5
  185. package/lib/Cli/commands/profile/flows.d.ts.map +1 -1
  186. package/lib/Cli/commands/profile/flows.js +19 -17
  187. package/lib/Cli/commands/profile/flows.js.map +1 -1
  188. package/lib/Cli/commands/profile/hub.d.ts +1 -2
  189. package/lib/Cli/commands/profile/hub.d.ts.map +1 -1
  190. package/lib/Cli/commands/profile/hub.js +15 -17
  191. package/lib/Cli/commands/profile/hub.js.map +1 -1
  192. package/lib/Cli/commands/provider.d.ts +3 -1
  193. package/lib/Cli/commands/provider.d.ts.map +1 -1
  194. package/lib/Cli/commands/provider.js +4 -4
  195. package/lib/Cli/commands/provider.js.map +1 -1
  196. package/lib/Cli/commands/render.d.ts +2 -4
  197. package/lib/Cli/commands/render.d.ts.map +1 -1
  198. package/lib/Cli/commands/render.js +33 -56
  199. package/lib/Cli/commands/render.js.map +1 -1
  200. package/lib/Cli/commands/state.d.ts +1 -2
  201. package/lib/Cli/commands/state.d.ts.map +1 -1
  202. package/lib/Cli/commands/state.js +74 -27
  203. package/lib/Cli/commands/state.js.map +1 -1
  204. package/lib/Cli/components/capabilities.d.ts +4 -0
  205. package/lib/Cli/components/capabilities.d.ts.map +1 -0
  206. package/lib/Cli/components/capabilities.js +18 -0
  207. package/lib/Cli/components/capabilities.js.map +1 -0
  208. package/lib/Cli/components/types.d.ts +2 -81
  209. package/lib/Cli/components/types.d.ts.map +1 -1
  210. package/lib/Cli/components/types.js +1 -3
  211. package/lib/Cli/components/types.js.map +1 -1
  212. package/lib/Cli/components/ui/Environment.d.ts +3 -3
  213. package/lib/Cli/components/ui/Environment.d.ts.map +1 -1
  214. package/lib/Cli/components/ui/Environment.js.map +1 -1
  215. package/lib/Cli/components/ui/Interactive.d.ts +17 -4
  216. package/lib/Cli/components/ui/Interactive.d.ts.map +1 -1
  217. package/lib/Cli/components/ui/Interactive.js +7 -11
  218. package/lib/Cli/components/ui/Interactive.js.map +1 -1
  219. package/lib/Cli/components/ui/Layout.d.ts +1 -1
  220. package/lib/Cli/components/ui/Layout.d.ts.map +1 -1
  221. package/lib/Cli/components/ui/Layout.js +1 -1
  222. package/lib/Cli/components/ui/Layout.js.map +1 -1
  223. package/lib/Cli/components/ui/Typography.d.ts +1 -1
  224. package/lib/Cli/components/ui/Typography.d.ts.map +1 -1
  225. package/lib/Cli/components/ui/Typography.js +1 -1
  226. package/lib/Cli/components/ui/Typography.js.map +1 -1
  227. package/lib/Cli/components/ui/index.d.ts +2 -2
  228. package/lib/Cli/components/ui/index.js +2 -2
  229. package/lib/Cli/components/view/ApprovePlan.d.ts +1 -1
  230. package/lib/Cli/components/view/ApprovePlan.d.ts.map +1 -1
  231. package/lib/Cli/components/view/ApprovePlan.js +2 -1
  232. package/lib/Cli/components/view/ApprovePlan.js.map +1 -1
  233. package/lib/Cli/components/view/Format.d.ts +5 -0
  234. package/lib/Cli/components/view/Format.d.ts.map +1 -0
  235. package/lib/Cli/components/view/Format.js +39 -0
  236. package/lib/Cli/components/view/Format.js.map +1 -0
  237. package/lib/Cli/components/view/Help.d.ts +2 -2
  238. package/lib/Cli/components/view/Help.d.ts.map +1 -1
  239. package/lib/Cli/components/view/Help.js +7 -5
  240. package/lib/Cli/components/view/Help.js.map +1 -1
  241. package/lib/Cli/components/view/Logo.js +1 -1
  242. package/lib/Cli/components/view/Logo.js.map +1 -1
  243. package/lib/Cli/components/view/Nuke.d.ts +8 -9
  244. package/lib/Cli/components/view/Nuke.d.ts.map +1 -1
  245. package/lib/Cli/components/view/Nuke.js +49 -52
  246. package/lib/Cli/components/view/Nuke.js.map +1 -1
  247. package/lib/Cli/components/view/PlanDecision.d.ts +1 -1
  248. package/lib/Cli/components/view/PlanDecision.d.ts.map +1 -1
  249. package/lib/Cli/components/view/PlanDecision.js +1 -1
  250. package/lib/Cli/components/view/PlanDecision.js.map +1 -1
  251. package/lib/Cli/components/view/PlanRow.js +1 -1
  252. package/lib/Cli/components/view/PlanRow.js.map +1 -1
  253. package/lib/Cli/components/view/PlanTree.d.ts +1 -1
  254. package/lib/Cli/components/view/PlanTree.d.ts.map +1 -1
  255. package/lib/Cli/components/view/PlanTree.js +1 -1
  256. package/lib/Cli/components/view/PlanView.js +1 -1
  257. package/lib/Cli/components/view/PlanView.js.map +1 -1
  258. package/lib/Cli/components/view/Profile.d.ts +1 -1
  259. package/lib/Cli/components/view/Profile.js +2 -2
  260. package/lib/Cli/components/view/Profile.js.map +1 -1
  261. package/lib/Cli/components/view/ProfileDashboard.d.ts +4 -4
  262. package/lib/Cli/components/view/ProfileDashboard.d.ts.map +1 -1
  263. package/lib/Cli/components/view/ProfileDashboard.js +9 -8
  264. package/lib/Cli/components/view/ProfileDashboard.js.map +1 -1
  265. package/lib/Cli/components/view/Prompts.d.ts +3 -3
  266. package/lib/Cli/components/view/Prompts.d.ts.map +1 -1
  267. package/lib/Cli/components/view/Prompts.js +11 -18
  268. package/lib/Cli/components/view/Prompts.js.map +1 -1
  269. package/lib/Cli/components/view/Runtime.d.ts +5 -5
  270. package/lib/Cli/components/view/Runtime.d.ts.map +1 -1
  271. package/lib/Cli/components/view/Runtime.js +136 -219
  272. package/lib/Cli/components/view/Runtime.js.map +1 -1
  273. package/lib/Cli/components/view/SigilCli.d.ts +2 -2
  274. package/lib/Cli/components/view/SigilCli.d.ts.map +1 -1
  275. package/lib/Cli/components/view/SigilCli.js +7 -7
  276. package/lib/Cli/components/view/SigilCli.js.map +1 -1
  277. package/lib/Cli/components/view/StateExplorer.d.ts +1 -1
  278. package/lib/Cli/components/view/StateExplorer.d.ts.map +1 -1
  279. package/lib/Cli/components/view/StateExplorer.js +2 -1
  280. package/lib/Cli/components/view/StateExplorer.js.map +1 -1
  281. package/lib/Cli/components/view/statusStyle.d.ts +2 -2
  282. package/lib/Cli/components/view/statusStyle.d.ts.map +1 -1
  283. package/lib/Cli/components/view/statusStyle.js +1 -1
  284. package/lib/Cli/components/view/statusStyle.js.map +1 -1
  285. package/lib/Cli/exec.d.ts +6 -1
  286. package/lib/Cli/exec.d.ts.map +1 -1
  287. package/lib/Cli/exec.js +29 -34
  288. package/lib/Cli/exec.js.map +1 -1
  289. package/lib/Cli/main.d.ts.map +1 -1
  290. package/lib/Cli/main.js +35 -26
  291. package/lib/Cli/main.js.map +1 -1
  292. package/lib/Cli/selectCli.d.ts +2 -2
  293. package/lib/Cli/selectCli.d.ts.map +1 -1
  294. package/lib/Cli/selectCli.js +2 -2
  295. package/lib/Cli/selectCli.js.map +1 -1
  296. package/lib/Command/Command.js +1 -1
  297. package/lib/Command/Command.js.map +1 -1
  298. package/lib/Command/Dev.d.ts +58 -4
  299. package/lib/Command/Dev.d.ts.map +1 -1
  300. package/lib/Command/Dev.js +87 -30
  301. package/lib/Command/Dev.js.map +1 -1
  302. package/lib/Command/Local.d.ts +1 -1
  303. package/lib/Command/Memo.js +1 -1
  304. package/lib/Command/Memo.js.map +1 -1
  305. package/lib/Command/Providers.d.ts +1 -1
  306. package/lib/Command/Providers.d.ts.map +1 -1
  307. package/lib/Contributions.d.ts +2 -3
  308. package/lib/Contributions.d.ts.map +1 -1
  309. package/lib/Contributions.js +38 -6
  310. package/lib/Contributions.js.map +1 -1
  311. package/lib/DNS/Adapter.d.ts +204 -0
  312. package/lib/DNS/Adapter.d.ts.map +1 -0
  313. package/lib/DNS/Adapter.js +112 -0
  314. package/lib/DNS/Adapter.js.map +1 -0
  315. package/lib/DNS/index.d.ts +2 -0
  316. package/lib/DNS/index.d.ts.map +1 -0
  317. package/lib/DNS/index.js +2 -0
  318. package/lib/DNS/index.js.map +1 -0
  319. package/lib/Deploy.d.ts +7 -2
  320. package/lib/Deploy.d.ts.map +1 -1
  321. package/lib/Deploy.js +8 -3
  322. package/lib/Deploy.js.map +1 -1
  323. package/lib/Destroy.d.ts +5 -8
  324. package/lib/Destroy.d.ts.map +1 -1
  325. package/lib/Destroy.js +10 -7
  326. package/lib/Destroy.js.map +1 -1
  327. package/lib/Diff.d.ts.map +1 -1
  328. package/lib/Diff.js +14 -4
  329. package/lib/Diff.js.map +1 -1
  330. package/lib/Drift.d.ts +7 -7
  331. package/lib/Drift.d.ts.map +1 -1
  332. package/lib/Drift.js +184 -101
  333. package/lib/Drift.js.map +1 -1
  334. package/lib/EvalStack.d.ts +23 -0
  335. package/lib/EvalStack.d.ts.map +1 -0
  336. package/lib/EvalStack.js +47 -0
  337. package/lib/EvalStack.js.map +1 -0
  338. package/lib/Events.d.ts +210 -0
  339. package/lib/Events.d.ts.map +1 -0
  340. package/lib/Events.js +244 -0
  341. package/lib/Events.js.map +1 -0
  342. package/lib/Interaction.d.ts +159 -48
  343. package/lib/Interaction.d.ts.map +1 -1
  344. package/lib/Interaction.js +139 -58
  345. package/lib/Interaction.js.map +1 -1
  346. package/lib/Local/LocalProvider.d.ts.map +1 -1
  347. package/lib/Local/LocalProvider.js +31 -9
  348. package/lib/Local/LocalProvider.js.map +1 -1
  349. package/lib/Local/RpcProvider.d.ts.map +1 -1
  350. package/lib/Local/RpcProvider.js +10 -1
  351. package/lib/Local/RpcProvider.js.map +1 -1
  352. package/lib/Local/RpcProviderProxy.d.ts +16 -0
  353. package/lib/Local/RpcProviderProxy.d.ts.map +1 -1
  354. package/lib/Local/RpcProviderProxy.js +19 -10
  355. package/lib/Local/RpcProviderProxy.js.map +1 -1
  356. package/lib/Local/RpcSerialization.d.ts +3 -2
  357. package/lib/Local/RpcSerialization.d.ts.map +1 -1
  358. package/lib/Local/RpcSerialization.js +13 -10
  359. package/lib/Local/RpcSerialization.js.map +1 -1
  360. package/lib/Local/RpcServer.d.ts +2 -1
  361. package/lib/Local/RpcServer.d.ts.map +1 -1
  362. package/lib/Local/RpcServer.js +19 -14
  363. package/lib/Local/RpcServer.js.map +1 -1
  364. package/lib/Local/RpcServerBun.d.ts.map +1 -1
  365. package/lib/Local/RpcServerBun.js +8 -4
  366. package/lib/Local/RpcServerBun.js.map +1 -1
  367. package/lib/Local/RpcServerEnvironment.d.ts +2 -3
  368. package/lib/Local/RpcServerEnvironment.d.ts.map +1 -1
  369. package/lib/Local/RpcServerEnvironment.js +2 -2
  370. package/lib/Local/RpcServerEnvironment.js.map +1 -1
  371. package/lib/Local/RpcServerNode.d.ts.map +1 -1
  372. package/lib/Local/RpcServerNode.js +5 -1
  373. package/lib/Local/RpcServerNode.js.map +1 -1
  374. package/lib/Local/RpcServerSession.d.ts +1 -1
  375. package/lib/Local/RpcServerSession.d.ts.map +1 -1
  376. package/lib/Local/RpcServerSession.js.map +1 -1
  377. package/lib/Local/RpcSpawner.d.ts +6 -8
  378. package/lib/Local/RpcSpawner.d.ts.map +1 -1
  379. package/lib/Local/RpcSpawner.js +45 -36
  380. package/lib/Local/RpcSpawner.js.map +1 -1
  381. package/lib/Local/Sidecar.d.ts +23 -0
  382. package/lib/Local/Sidecar.d.ts.map +1 -1
  383. package/lib/Local/Sidecar.js +14 -9
  384. package/lib/Local/Sidecar.js.map +1 -1
  385. package/lib/Nuke.d.ts +5 -23
  386. package/lib/Nuke.d.ts.map +1 -1
  387. package/lib/Nuke.js +48 -13
  388. package/lib/Nuke.js.map +1 -1
  389. package/lib/Output.d.ts +19 -1
  390. package/lib/Output.d.ts.map +1 -1
  391. package/lib/Output.js +96 -3
  392. package/lib/Output.js.map +1 -1
  393. package/lib/Plan.d.ts +5 -1
  394. package/lib/Plan.d.ts.map +1 -1
  395. package/lib/Plan.js +111 -33
  396. package/lib/Plan.js.map +1 -1
  397. package/lib/Platform.d.ts.map +1 -1
  398. package/lib/Platform.js +31 -7
  399. package/lib/Platform.js.map +1 -1
  400. package/lib/Provider.d.ts +45 -0
  401. package/lib/Provider.d.ts.map +1 -1
  402. package/lib/Provider.js +2 -2
  403. package/lib/Provider.js.map +1 -1
  404. package/lib/Report.d.ts +17 -195
  405. package/lib/Report.d.ts.map +1 -1
  406. package/lib/Report.js +39 -12
  407. package/lib/Report.js.map +1 -1
  408. package/lib/Runtime/ManagedHttpShutdown.d.ts +17 -0
  409. package/lib/Runtime/ManagedHttpShutdown.d.ts.map +1 -1
  410. package/lib/Runtime/ManagedHttpShutdown.js +11 -2
  411. package/lib/Runtime/ManagedHttpShutdown.js.map +1 -1
  412. package/lib/RuntimeContext.js +1 -1
  413. package/lib/RuntimeContext.js.map +1 -1
  414. package/lib/Stack.d.ts +49 -29
  415. package/lib/Stack.d.ts.map +1 -1
  416. package/lib/Stack.js +25 -31
  417. package/lib/Stack.js.map +1 -1
  418. package/lib/State/BucketState.d.ts.map +1 -1
  419. package/lib/State/BucketState.js +43 -14
  420. package/lib/State/BucketState.js.map +1 -1
  421. package/lib/State/LocalState.d.ts.map +1 -1
  422. package/lib/State/LocalState.js +3 -3
  423. package/lib/State/LocalState.js.map +1 -1
  424. package/lib/State/Provisioning.d.ts +5 -0
  425. package/lib/State/Provisioning.d.ts.map +1 -1
  426. package/lib/State/Provisioning.js +3 -1
  427. package/lib/State/Provisioning.js.map +1 -1
  428. package/lib/State/ResourceState.d.ts +2 -0
  429. package/lib/State/ResourceState.d.ts.map +1 -1
  430. package/lib/State/State.d.ts +26 -0
  431. package/lib/State/State.d.ts.map +1 -1
  432. package/lib/State/StateEncoding.d.ts +7 -0
  433. package/lib/State/StateEncoding.d.ts.map +1 -1
  434. package/lib/State/StateEncoding.js +19 -0
  435. package/lib/State/StateEncoding.js.map +1 -1
  436. package/lib/State/index.js +2 -2
  437. package/lib/State/index.js.map +1 -1
  438. package/lib/Telemetry/Layer.d.ts +2 -5
  439. package/lib/Telemetry/Layer.d.ts.map +1 -1
  440. package/lib/Telemetry/Layer.js +3 -23
  441. package/lib/Telemetry/Layer.js.map +1 -1
  442. package/lib/Telemetry/Metrics.d.ts +1 -1
  443. package/lib/Telemetry/Metrics.d.ts.map +1 -1
  444. package/lib/TelemetryRelay.js +1 -1
  445. package/lib/TelemetryRelay.js.map +1 -1
  446. package/lib/TelemetryRuntime.d.ts +1 -1
  447. package/lib/TelemetryRuntime.d.ts.map +1 -1
  448. package/lib/TelemetryRuntime.js +4 -3
  449. package/lib/TelemetryRuntime.js.map +1 -1
  450. package/lib/Util/ConsoleSink.d.ts +23 -2
  451. package/lib/Util/ConsoleSink.d.ts.map +1 -1
  452. package/lib/Util/ConsoleSink.js +54 -14
  453. package/lib/Util/ConsoleSink.js.map +1 -1
  454. package/lib/Util/LogAnnotation.d.ts +19 -0
  455. package/lib/Util/LogAnnotation.d.ts.map +1 -0
  456. package/lib/Util/LogAnnotation.js +19 -0
  457. package/lib/Util/LogAnnotation.js.map +1 -0
  458. package/lib/Util/LogRecord.d.ts +281 -0
  459. package/lib/Util/LogRecord.d.ts.map +1 -0
  460. package/lib/Util/LogRecord.js +267 -0
  461. package/lib/Util/LogRecord.js.map +1 -0
  462. package/lib/Util/Node.d.ts +9 -0
  463. package/lib/Util/Node.d.ts.map +1 -1
  464. package/lib/Util/Node.js +10 -6
  465. package/lib/Util/Node.js.map +1 -1
  466. package/lib/Util/PlatformServices.d.ts +3 -2
  467. package/lib/Util/PlatformServices.d.ts.map +1 -1
  468. package/lib/Util/PlatformServices.js +6 -2
  469. package/lib/Util/PlatformServices.js.map +1 -1
  470. package/lib/Util/ResourceOutput.d.ts +18 -10
  471. package/lib/Util/ResourceOutput.d.ts.map +1 -1
  472. package/lib/Util/ResourceOutput.js +22 -23
  473. package/lib/Util/ResourceOutput.js.map +1 -1
  474. package/lib/Util/Shutdown.d.ts +10 -0
  475. package/lib/Util/Shutdown.d.ts.map +1 -0
  476. package/lib/Util/Shutdown.js +32 -0
  477. package/lib/Util/Shutdown.js.map +1 -0
  478. package/lib/Util/Terminal.d.ts +2 -4
  479. package/lib/Util/Terminal.d.ts.map +1 -1
  480. package/lib/Util/Terminal.js +3 -11
  481. package/lib/Util/Terminal.js.map +1 -1
  482. package/lib/Util/TraceParent.d.ts +32 -0
  483. package/lib/Util/TraceParent.d.ts.map +1 -0
  484. package/lib/Util/TraceParent.js +42 -0
  485. package/lib/Util/TraceParent.js.map +1 -0
  486. package/lib/Util/base64.d.ts +7 -0
  487. package/lib/Util/base64.d.ts.map +1 -0
  488. package/lib/Util/base64.js +24 -0
  489. package/lib/Util/base64.js.map +1 -0
  490. package/lib/Util/cached-function.d.ts +5 -0
  491. package/lib/Util/cached-function.d.ts.map +1 -1
  492. package/lib/Util/cached-function.js +13 -8
  493. package/lib/Util/cached-function.js.map +1 -1
  494. package/lib/Util/data.d.ts +1 -1
  495. package/lib/Util/data.d.ts.map +1 -1
  496. package/lib/Util/data.js +1 -1
  497. package/lib/Util/data.js.map +1 -1
  498. package/lib/Util/equal.d.ts.map +1 -1
  499. package/lib/Util/equal.js +3 -2
  500. package/lib/Util/equal.js.map +1 -1
  501. package/lib/Util/extraFiles.d.ts.map +1 -1
  502. package/lib/Util/extraFiles.js +5 -5
  503. package/lib/Util/extraFiles.js.map +1 -1
  504. package/lib/Util/interactive.js +1 -1
  505. package/lib/Website/AstroOutput.d.ts +42 -0
  506. package/lib/Website/AstroOutput.d.ts.map +1 -0
  507. package/lib/Website/AstroOutput.js +34 -0
  508. package/lib/Website/AstroOutput.js.map +1 -0
  509. package/lib/Website/FrontendCore.d.ts +1 -1
  510. package/lib/Workflows.d.ts +9 -0
  511. package/lib/Workflows.d.ts.map +1 -1
  512. package/lib/Workflows.js +8 -0
  513. package/lib/Workflows.js.map +1 -1
  514. package/lib/index.d.ts +1 -0
  515. package/lib/index.d.ts.map +1 -1
  516. package/lib/index.js +1 -0
  517. package/lib/index.js.map +1 -1
  518. package/package.json +21 -28
  519. package/src/AdoptPolicy.ts +76 -0
  520. package/src/Alchemist/AuthRegistry.ts +164 -0
  521. package/src/Alchemist/Drift.ts +103 -0
  522. package/src/Alchemist/Entrypoint.ts +51 -3
  523. package/src/Alchemist/Errors.ts +1 -1
  524. package/src/Alchemist/{routes/logs.ts → Logs.ts} +28 -30
  525. package/src/Alchemist/Nuke.ts +90 -0
  526. package/src/Alchemist/Operations.ts +309 -0
  527. package/src/Alchemist/{routes/profile.ts → Profile.ts} +22 -22
  528. package/src/Alchemist/{routes/provider.ts → Provider.ts} +7 -6
  529. package/src/Alchemist/Runtime.ts +46 -12
  530. package/src/Alchemist/{routes/state.ts → State.ts} +78 -21
  531. package/src/Alchemist/index.ts +32 -15
  532. package/src/Apply.ts +513 -274
  533. package/src/Auth/AuthProvider.ts +76 -23
  534. package/src/Auth/BrowserOAuth.ts +37 -60
  535. package/src/Auth/Credentials.ts +2 -4
  536. package/src/Auth/Demand.ts +27 -18
  537. package/src/Auth/Env.ts +13 -8
  538. package/src/Auth/Inspect.ts +5 -2
  539. package/src/Auth/Lock.ts +4 -8
  540. package/src/Auth/OAuthFlow.ts +12 -26
  541. package/src/Auth/Paths.ts +3 -2
  542. package/src/Auth/Profile.ts +30 -2
  543. package/src/Auth/Registry.ts +27 -0
  544. package/src/Auth/Resolve.ts +75 -3
  545. package/src/Auth/StoredAuthProvider.ts +1 -2
  546. package/src/Binding.ts +3 -4
  547. package/src/Bundle/Bundle.ts +58 -7
  548. package/src/Bundle/NamespaceImportPlugin.ts +259 -0
  549. package/src/Bundle/index.ts +1 -0
  550. package/src/Cli/Format.ts +2 -1
  551. package/src/Cli/GlobalLog.ts +206 -68
  552. package/src/Cli/LoggingCli.ts +33 -20
  553. package/src/Cli/PlainCliFormatter.ts +4 -1
  554. package/src/Cli/Present.ts +34 -0
  555. package/src/Cli/SigilRenderer.ts +75 -0
  556. package/src/Cli/checkVersion.ts +25 -78
  557. package/src/Cli/commands/confirm.ts +3 -3
  558. package/src/Cli/commands/deploy.ts +53 -44
  559. package/src/Cli/commands/dev.ts +65 -7
  560. package/src/Cli/commands/drift.ts +20 -16
  561. package/src/Cli/commands/errors.ts +2 -3
  562. package/src/Cli/commands/instrument.ts +39 -8
  563. package/src/Cli/commands/logs.ts +22 -30
  564. package/src/Cli/commands/nuke.ts +25 -26
  565. package/src/Cli/commands/profile/commands.ts +34 -34
  566. package/src/Cli/commands/profile/flows.ts +26 -20
  567. package/src/Cli/commands/profile/hub.ts +16 -18
  568. package/src/Cli/commands/provider.ts +4 -4
  569. package/src/Cli/commands/render.ts +43 -71
  570. package/src/Cli/commands/state.ts +113 -33
  571. package/src/Cli/components/capabilities.ts +20 -0
  572. package/src/Cli/components/types.ts +13 -99
  573. package/src/Cli/components/ui/Environment.tsx +5 -5
  574. package/src/Cli/components/ui/Interactive.tsx +24 -15
  575. package/src/Cli/components/ui/Layout.tsx +1 -1
  576. package/src/Cli/components/ui/Typography.tsx +1 -1
  577. package/src/Cli/components/ui/index.ts +2 -2
  578. package/src/Cli/components/view/ApprovePlan.tsx +2 -1
  579. package/src/Cli/components/view/Format.tsx +58 -0
  580. package/src/Cli/components/view/Help.tsx +14 -17
  581. package/src/Cli/components/view/Logo.tsx +1 -1
  582. package/src/Cli/components/view/Nuke.tsx +74 -49
  583. package/src/Cli/components/view/PlanDecision.tsx +1 -1
  584. package/src/Cli/components/view/PlanRow.tsx +1 -1
  585. package/src/Cli/components/view/PlanTree.ts +2 -2
  586. package/src/Cli/components/view/PlanView.tsx +2 -2
  587. package/src/Cli/components/view/Profile.tsx +2 -2
  588. package/src/Cli/components/view/ProfileDashboard.tsx +12 -11
  589. package/src/Cli/components/view/Prompts.tsx +37 -75
  590. package/src/Cli/components/view/Runtime.tsx +132 -238
  591. package/src/Cli/components/view/SigilCli.tsx +12 -12
  592. package/src/Cli/components/view/StateExplorer.tsx +2 -1
  593. package/src/Cli/components/view/statusStyle.ts +2 -2
  594. package/src/Cli/exec.ts +48 -41
  595. package/src/Cli/main.ts +52 -33
  596. package/src/Cli/selectCli.ts +3 -3
  597. package/src/Command/Command.ts +1 -1
  598. package/src/Command/Dev.ts +129 -36
  599. package/src/Command/Memo.ts +1 -1
  600. package/src/Contributions.ts +42 -8
  601. package/src/DNS/Adapter.ts +289 -0
  602. package/src/DNS/index.ts +1 -0
  603. package/src/Deploy.ts +11 -3
  604. package/src/Destroy.ts +19 -13
  605. package/src/Diff.ts +17 -4
  606. package/src/Drift.ts +256 -127
  607. package/src/EvalStack.ts +97 -0
  608. package/src/Events.ts +296 -0
  609. package/src/Interaction.ts +332 -97
  610. package/src/Local/LocalProvider.ts +40 -9
  611. package/src/Local/RpcProvider.ts +11 -1
  612. package/src/Local/RpcProviderProxy.ts +29 -21
  613. package/src/Local/RpcSerialization.ts +32 -17
  614. package/src/Local/RpcServer.ts +25 -17
  615. package/src/Local/RpcServerBun.ts +10 -6
  616. package/src/Local/RpcServerEnvironment.ts +2 -2
  617. package/src/Local/RpcServerNode.ts +8 -1
  618. package/src/Local/RpcServerSession.ts +2 -2
  619. package/src/Local/RpcSpawner.ts +61 -37
  620. package/src/Local/Sidecar.ts +10 -1
  621. package/src/Nuke.ts +66 -43
  622. package/src/Output.ts +120 -7
  623. package/src/Plan.ts +140 -52
  624. package/src/Platform.ts +47 -18
  625. package/src/Provider.ts +48 -3
  626. package/src/Report.ts +77 -275
  627. package/src/Runtime/ManagedHttpShutdown.ts +21 -4
  628. package/src/RuntimeContext.ts +1 -1
  629. package/src/Stack.ts +113 -135
  630. package/src/State/BucketState.ts +53 -21
  631. package/src/State/LocalState.ts +7 -9
  632. package/src/State/Provisioning.ts +8 -1
  633. package/src/State/ResourceState.ts +2 -0
  634. package/src/State/State.ts +30 -0
  635. package/src/State/StateEncoding.ts +22 -0
  636. package/src/State/index.ts +2 -2
  637. package/src/Telemetry/Layer.ts +3 -24
  638. package/src/Telemetry/Metrics.ts +1 -1
  639. package/src/TelemetryRelay.ts +1 -1
  640. package/src/TelemetryRuntime.ts +8 -8
  641. package/src/Util/ConsoleSink.ts +76 -13
  642. package/src/Util/LogAnnotation.ts +18 -0
  643. package/src/Util/LogRecord.ts +386 -0
  644. package/src/Util/Node.ts +20 -6
  645. package/src/Util/PlatformServices.ts +17 -4
  646. package/src/Util/ResourceOutput.ts +26 -25
  647. package/src/Util/Shutdown.ts +52 -0
  648. package/src/Util/Terminal.ts +3 -20
  649. package/src/Util/TraceParent.ts +70 -0
  650. package/src/Util/base64.ts +22 -0
  651. package/src/Util/cached-function.ts +30 -19
  652. package/src/Util/data.ts +2 -2
  653. package/src/Util/equal.ts +3 -2
  654. package/src/Util/extraFiles.ts +9 -8
  655. package/src/Util/interactive.ts +1 -1
  656. package/src/Website/AstroOutput.ts +83 -0
  657. package/src/Workflows.ts +11 -0
  658. package/src/index.ts +1 -0
  659. package/lib/Alchemist/Progress.d.ts +0 -16
  660. package/lib/Alchemist/Progress.d.ts.map +0 -1
  661. package/lib/Alchemist/Progress.js +0 -123
  662. package/lib/Alchemist/Progress.js.map +0 -1
  663. package/lib/Alchemist/Session.d.ts +0 -116
  664. package/lib/Alchemist/Session.d.ts.map +0 -1
  665. package/lib/Alchemist/Session.js +0 -212
  666. package/lib/Alchemist/Session.js.map +0 -1
  667. package/lib/Alchemist/routes/drift.d.ts +0 -55
  668. package/lib/Alchemist/routes/drift.d.ts.map +0 -1
  669. package/lib/Alchemist/routes/drift.js +0 -52
  670. package/lib/Alchemist/routes/drift.js.map +0 -1
  671. package/lib/Alchemist/routes/logs.d.ts +0 -41
  672. package/lib/Alchemist/routes/logs.d.ts.map +0 -1
  673. package/lib/Alchemist/routes/logs.js.map +0 -1
  674. package/lib/Alchemist/routes/nuke.d.ts +0 -46
  675. package/lib/Alchemist/routes/nuke.d.ts.map +0 -1
  676. package/lib/Alchemist/routes/nuke.js +0 -80
  677. package/lib/Alchemist/routes/nuke.js.map +0 -1
  678. package/lib/Alchemist/routes/profile.d.ts +0 -133
  679. package/lib/Alchemist/routes/profile.d.ts.map +0 -1
  680. package/lib/Alchemist/routes/profile.js.map +0 -1
  681. package/lib/Alchemist/routes/provider.d.ts.map +0 -1
  682. package/lib/Alchemist/routes/provider.js.map +0 -1
  683. package/lib/Alchemist/routes/stack.d.ts +0 -95
  684. package/lib/Alchemist/routes/stack.d.ts.map +0 -1
  685. package/lib/Alchemist/routes/stack.js +0 -73
  686. package/lib/Alchemist/routes/stack.js.map +0 -1
  687. package/lib/Alchemist/routes/state.d.ts.map +0 -1
  688. package/lib/Alchemist/routes/state.js.map +0 -1
  689. package/lib/Cli/CliKit/CliKit.d.ts +0 -92
  690. package/lib/Cli/CliKit/CliKit.d.ts.map +0 -1
  691. package/lib/Cli/CliKit/CliKit.js +0 -27
  692. package/lib/Cli/CliKit/CliKit.js.map +0 -1
  693. package/lib/Cli/CliKit/index.d.ts +0 -9
  694. package/lib/Cli/CliKit/index.d.ts.map +0 -1
  695. package/lib/Cli/CliKit/index.js +0 -9
  696. package/lib/Cli/CliKit/index.js.map +0 -1
  697. package/lib/Cli/CliKit/interaction.d.ts +0 -13
  698. package/lib/Cli/CliKit/interaction.d.ts.map +0 -1
  699. package/lib/Cli/CliKit/interaction.js +0 -17
  700. package/lib/Cli/CliKit/interaction.js.map +0 -1
  701. package/lib/Cli/CliKit/layer.d.ts +0 -7
  702. package/lib/Cli/CliKit/layer.d.ts.map +0 -1
  703. package/lib/Cli/CliKit/layer.js +0 -33
  704. package/lib/Cli/CliKit/layer.js.map +0 -1
  705. package/lib/Local/DevLog.d.ts +0 -32
  706. package/lib/Local/DevLog.d.ts.map +0 -1
  707. package/lib/Local/DevLog.js +0 -112
  708. package/lib/Local/DevLog.js.map +0 -1
  709. package/lib/Test/Alchemy.d.ts +0 -79
  710. package/lib/Test/Alchemy.d.ts.map +0 -1
  711. package/lib/Test/Alchemy.js +0 -193
  712. package/lib/Test/Alchemy.js.map +0 -1
  713. package/lib/Test/Bun.d.ts +0 -69
  714. package/lib/Test/Bun.d.ts.map +0 -1
  715. package/lib/Test/Bun.js +0 -126
  716. package/lib/Test/Bun.js.map +0 -1
  717. package/lib/Test/Core.d.ts +0 -277
  718. package/lib/Test/Core.d.ts.map +0 -1
  719. package/lib/Test/Core.js +0 -362
  720. package/lib/Test/Core.js.map +0 -1
  721. package/lib/Test/Http.d.ts +0 -109
  722. package/lib/Test/Http.d.ts.map +0 -1
  723. package/lib/Test/Http.js +0 -123
  724. package/lib/Test/Http.js.map +0 -1
  725. package/lib/Test/TestState.d.ts +0 -12
  726. package/lib/Test/TestState.d.ts.map +0 -1
  727. package/lib/Test/TestState.js +0 -15
  728. package/lib/Test/TestState.js.map +0 -1
  729. package/lib/Test/Vitest.d.ts +0 -60
  730. package/lib/Test/Vitest.d.ts.map +0 -1
  731. package/lib/Test/Vitest.js +0 -132
  732. package/lib/Test/Vitest.js.map +0 -1
  733. package/lib/Test/index.d.ts +0 -3
  734. package/lib/Test/index.d.ts.map +0 -1
  735. package/lib/Test/index.js +0 -3
  736. package/lib/Test/index.js.map +0 -1
  737. package/lib/Util/FileLogger.d.ts +0 -7
  738. package/lib/Util/FileLogger.d.ts.map +0 -1
  739. package/lib/Util/FileLogger.js +0 -16
  740. package/lib/Util/FileLogger.js.map +0 -1
  741. package/src/Alchemist/Progress.ts +0 -167
  742. package/src/Alchemist/Session.ts +0 -415
  743. package/src/Alchemist/routes/drift.ts +0 -87
  744. package/src/Alchemist/routes/nuke.ts +0 -131
  745. package/src/Alchemist/routes/stack.ts +0 -173
  746. package/src/Cli/CliKit/CliKit.ts +0 -159
  747. package/src/Cli/CliKit/index.ts +0 -41
  748. package/src/Cli/CliKit/interaction.ts +0 -19
  749. package/src/Cli/CliKit/layer.ts +0 -44
  750. package/src/Local/DevLog.ts +0 -122
  751. package/src/Test/Alchemy.ts +0 -334
  752. package/src/Test/Bun.ts +0 -230
  753. package/src/Test/Core.ts +0 -785
  754. package/src/Test/Http.ts +0 -201
  755. package/src/Test/TestState.ts +0 -35
  756. package/src/Test/Vitest.ts +0 -239
  757. package/src/Test/index.ts +0 -2
  758. package/src/Util/FileLogger.ts +0 -20
@@ -1,122 +0,0 @@
1
- import { stripVTControlCharacters } from "node:util";
2
- /**
3
- * Per-resource dev log files.
4
- *
5
- * Layout under `{dotAlchemy}/log`:
6
- *
7
- * log/{stage}/{fqn…}/{timestamp}.log — one file per instance start
8
- * (a restart opens a new file;
9
- * the FQN nests as directories,
10
- * e.g. log/dev/Site/Worker/)
11
- * log/{stage}/{timestamp}.log — the dev child's mixed tail
12
- *
13
- * Retention: opening a new log prunes its sibling `*.log` files first — the
14
- * newest `LOG_RETENTION_GENERATIONS` survive, and anything older than
15
- * `LOG_RETENTION_MS` (7 days, judged by stat mtime — file names are never
16
- * trusted) is deleted regardless. Pruning is best-effort: any failure is
17
- * swallowed so it can never break dev startup.
18
- */
19
- import * as Clock from "effect/Clock";
20
- import * as Duration from "effect/Duration";
21
- import * as Effect from "effect/Effect";
22
- import * as FileSystem from "effect/FileSystem";
23
- import * as Option from "effect/Option";
24
- import * as Path from "effect/Path";
25
- import * as Queue from "effect/Queue";
26
- import * as Stream from "effect/Stream";
27
- import { AlchemyContext } from "../AlchemyContext.ts";
28
-
29
- const LOG_RETENTION = Duration.days(7);
30
- const LOG_RETENTION_GENERATIONS = 10;
31
-
32
- /**
33
- * Delete a resource's stale sibling logs before a new one is opened: keep
34
- * the newest `LOG_RETENTION_GENERATIONS - 1` (the file about to be created
35
- * fills the last slot) and drop anything older than `LOG_RETENTION_MS`.
36
- * Ages come from stat mtime — file names are never trusted. Best-effort:
37
- * every step (including a missing directory) is swallowed.
38
- */
39
- const pruneDevLogs = (
40
- fs: FileSystem.FileSystem,
41
- path: Path.Path,
42
- dir: string,
43
- ): Effect.Effect<void> =>
44
- Effect.gen(function* () {
45
- const entries = yield* fs
46
- .readDirectory(dir)
47
- .pipe(Effect.orElseSucceed(() => [] as Array<string>));
48
- const logs: Array<{ file: string; mtime: number }> = [];
49
- for (const entry of entries) {
50
- if (!entry.endsWith(".log")) continue;
51
- const file = path.join(dir, entry);
52
- const info = yield* fs.stat(file).pipe(Effect.orElseSucceed(() => undefined));
53
- const mtime = info === undefined ? undefined : Option.getOrUndefined(info.mtime);
54
- if (mtime !== undefined) logs.push({ file, mtime: mtime.getTime() });
55
- }
56
- const cutoff = (yield* Clock.currentTimeMillis) - Duration.toMillis(LOG_RETENTION);
57
- logs.sort((a, b) => b.mtime - a.mtime);
58
- for (const [index, log] of logs.entries()) {
59
- if (index >= LOG_RETENTION_GENERATIONS - 1 || log.mtime < cutoff) {
60
- yield* fs.remove(log.file).pipe(Effect.ignore);
61
- }
62
- }
63
- }).pipe(Effect.ignore);
64
-
65
- /**
66
- * Resolves the directory a resource's dev logs land in, for surfacing in
67
- * startup messages ("Started … → url (logs: …)") without opening a file.
68
- * Must join the same segments the opener is later called with.
69
- */
70
- export const makeDevLogDirectory = Effect.gen(function* () {
71
- const path = yield* Path.Path;
72
- const { dotAlchemy } = yield* AlchemyContext;
73
- return (...segments: ReadonlyArray<string>) => path.join(dotAlchemy, "log", ...segments);
74
- });
75
-
76
- /**
77
- * Resolves the file-system services once (at provider/process init) and
78
- * returns an opener whose only requirement is the ambient `Scope` — local
79
- * provider `start` signatures are Scope-only, so the opener composes into
80
- * them without widening their requirements.
81
- *
82
- * The opener creates `{dotAlchemy}/log/{...segments}/{timestamp}.log`
83
- * (pruning stale siblings per the module retention policy first) and
84
- * returns the file's `path` plus synchronous `write`/`writeLine` sinks —
85
- * chunks queue through a drain fiber, so they're safe to call from
86
- * non-Effect callbacks (workerd output pumps, stream mirrors). The file and
87
- * drain close with the scope, which ties one log file to one
88
- * process/serve generation.
89
- */
90
- export const makeDevLogOpener = Effect.gen(function* () {
91
- const fs = yield* FileSystem.FileSystem;
92
- const path = yield* Path.Path;
93
- const devLogDirectory = yield* makeDevLogDirectory;
94
- const encoder = new TextEncoder();
95
-
96
- return Effect.fn(function* (...segments: ReadonlyArray<string>) {
97
- const dir = devLogDirectory(...segments);
98
- yield* fs.makeDirectory(dir, { recursive: true });
99
- yield* pruneDevLogs(fs, path, dir);
100
- const name = yield* Effect.sync(() => `${new Date().toISOString().replaceAll(":", "-")}.log`);
101
- const filePath = path.join(dir, name);
102
- const file = yield* fs.open(filePath, { flag: "a" });
103
- const queue = yield* Queue.make<Uint8Array>();
104
- yield* Stream.fromQueue(queue).pipe(
105
- Stream.runForEach((chunk) => file.write(chunk).pipe(Effect.ignore)),
106
- Effect.forkScoped,
107
- );
108
- // ANSI is stripped: colors belong to the terminal path (FORCE_COLOR
109
- // rides the sidecar pipes); the files stay plain-text grep-able.
110
- return {
111
- /** Absolute path of this generation's log file. */
112
- path: filePath,
113
- write: (chunk: string): void => {
114
- Queue.offerUnsafe(queue, encoder.encode(stripVTControlCharacters(chunk)));
115
- },
116
- /** `write` + a trailing newline — for line-based sources. */
117
- writeLine: (line: string): void => {
118
- Queue.offerUnsafe(queue, encoder.encode(`${stripVTControlCharacters(line)}\n`));
119
- },
120
- };
121
- });
122
- });
@@ -1,334 +0,0 @@
1
- /** @effect-diagnostics anyUnknownInErrorContext:off */
2
-
3
- /**
4
- * Test adapter for the `alchemy-test` runner (see `packages/alchemy-test`).
5
- *
6
- * Same shape as {@link "./Vitest.ts"} / {@link "./Bun.ts"}, but registers
7
- * tests as raw Effects with the alchemy-test harness so the single-process
8
- * runner can inject a buffering Logger/Console per test and manage
9
- * concurrency + timeouts itself.
10
- */
11
- import {
12
- currentFile,
13
- exclusiveOf,
14
- registerFileCleanup,
15
- registerHook,
16
- registerTest,
17
- retryOf,
18
- tagsOf,
19
- optInTagsOf,
20
- timeoutOf,
21
- type TestOptions,
22
- } from "alchemy-test";
23
- import * as Effect from "effect/Effect";
24
- import * as Exit from "effect/Exit";
25
- import * as Scope from "effect/Scope";
26
- import * as Semaphore from "effect/Semaphore";
27
- import type { AlchemyContext } from "../AlchemyContext.ts";
28
- import type { CompiledStack } from "../Stack.ts";
29
- import type { Stage } from "../Stage.ts";
30
- import * as Core from "./Core.ts";
31
-
32
- export {
33
- executeWhenReady,
34
- getWhenReady,
35
- guardContentType,
36
- guardedFetchLayer,
37
- rpcClientLayer,
38
- WorkerNotReady,
39
- type EdgeGuardOptions,
40
- type WhenReadyOptions,
41
- } from "./Http.ts";
42
-
43
- export type MakeOptions<ROut = any> = Core.MakeOptions<ROut>;
44
- export type ScratchStack = Core.ScratchStack;
45
- export type TestEffect<A, R = never> = Core.TestEffect<A, R>;
46
- export const ALCHEMY_TEST_DEV = Core.ALCHEMY_TEST_DEV;
47
- export const resolveDev = Core.resolveDev;
48
- export const defaultStage = Core.defaultStage;
49
- export const resolveStage = Core.resolveStage;
50
-
51
- interface TestFn {
52
- (name: string, eff: TestEffect<void>, options?: TestOptions): void;
53
- skip: (name: string, eff: TestEffect<void>, options?: TestOptions) => void;
54
- skipIf: (
55
- condition: boolean,
56
- ) => (name: string, eff: TestEffect<void>, options?: TestOptions) => void;
57
- only: (name: string, eff: TestEffect<void>, options?: TestOptions) => void;
58
- todo: (name: string, eff: TestEffect<void>, options?: TestOptions) => void;
59
- provider: ProviderFn;
60
- }
61
-
62
- interface ProviderFn {
63
- (
64
- name: string,
65
- fn: (stack: ScratchStack) => Effect.Effect<void, any, any>,
66
- options?: TestOptions,
67
- ): void;
68
- skip: (
69
- name: string,
70
- fn: (stack: ScratchStack) => Effect.Effect<void, any, any>,
71
- options?: TestOptions,
72
- ) => void;
73
- skipIf: (
74
- condition: boolean,
75
- ) => (
76
- name: string,
77
- fn: (stack: ScratchStack) => Effect.Effect<void, any, any>,
78
- options?: TestOptions,
79
- ) => void;
80
- todo: (
81
- name: string,
82
- fn: (stack: ScratchStack) => Effect.Effect<void, any, any>,
83
- options?: TestOptions,
84
- ) => void;
85
- }
86
-
87
- interface BeforeAllFn {
88
- <A>(eff: TestEffect<A>, options?: TestOptions): Effect.Effect<A>;
89
- }
90
-
91
- interface BeforeEachFn {
92
- (eff: TestEffect<void>, options?: TestOptions): void;
93
- }
94
-
95
- interface AfterAllFn {
96
- (eff: TestEffect<any>, options?: TestOptions): void;
97
- skipIf: (predicate: boolean) => (eff: TestEffect<any>, options?: TestOptions) => void;
98
- }
99
-
100
- interface AfterEachFn {
101
- (eff: TestEffect<void>, options?: TestOptions): void;
102
- }
103
-
104
- export interface TestApi {
105
- test: TestFn;
106
- beforeAll: BeforeAllFn;
107
- beforeEach: BeforeEachFn;
108
- afterAll: AfterAllFn;
109
- afterEach: AfterEachFn;
110
- deploy: Core.Deploy;
111
- destroy: (
112
- stack: TestEffect<CompiledStack, Stage | AlchemyContext>,
113
- options?: { stage?: string; include?: never; exclude?: never },
114
- ) => ReturnType<typeof Core.destroy>;
115
- }
116
-
117
- const DEFAULT_TIMEOUT = 120_000;
118
-
119
- /**
120
- * Build the per-file test API. Configure providers / state once at the top of
121
- * the test file:
122
- *
123
- * ```ts
124
- * import * as Test from "@/Test/Alchemy";
125
- * import * as Cloudflare from "@alchemy.run/cloudflare";
126
- *
127
- * const { test, deploy, destroy, beforeAll, afterAll } = Test.make({
128
- * providers: Cloudflare.providers(),
129
- * state: Cloudflare.state(),
130
- * });
131
- * ```
132
- */
133
- export const make = <ROut = any>(options: MakeOptions<ROut>): TestApi => {
134
- // Single scope shared across `beforeAll`, every `test`, and `afterAll`.
135
- // Scoped resources in dev mode (the Cloudflare dev proxy and its workerd
136
- // children) must outlive a single test boundary, otherwise the proxy is
137
- // killed the moment `beforeAll(deploy(Stack))` resolves and every later
138
- // `HttpClient.get(workerUrl)` hits a dead port. The scope is closed by
139
- // `destroy(...)` (or by file cleanup below).
140
- let sharedScope: Scope.Closeable | undefined = Scope.makeUnsafe("sequential");
141
- // Session ownership outlives a mid-file destroy, but not file cleanup.
142
- let sidecar = Core.makeSidecarHandle(options);
143
- const clearResults = new Set<() => void>();
144
- const wrap = <A>(eff: TestEffect<A>) =>
145
- sharedScope === undefined
146
- ? Effect.die("Test runtime is closed")
147
- : Core.toEffect(eff, options, sharedScope, sidecar);
148
-
149
- const addTest = (
150
- name: string,
151
- eff: TestEffect<void>,
152
- opts: TestOptions | undefined,
153
- mode: "run" | "skip" | "only" | "todo",
154
- ) =>
155
- registerTest({
156
- name,
157
- mode,
158
- exclusive: exclusiveOf(opts),
159
- retry: retryOf(opts),
160
- timeout: timeoutOf(opts),
161
- tags: tagsOf(opts),
162
- optInTags: optInTagsOf(opts),
163
- body: mode === "skip" || mode === "todo" ? undefined : () => wrap(eff),
164
- });
165
-
166
- const test = ((name, eff, opts) => {
167
- addTest(name, eff, opts, "run");
168
- }) as TestFn;
169
-
170
- test.skip = (name, eff, opts) => addTest(name, eff, opts, "skip");
171
- test.skipIf = (condition) => (name, eff, opts) =>
172
- addTest(name, eff, opts, condition ? "skip" : "run");
173
- test.only = (name, eff, opts) => addTest(name, eff, opts, "only");
174
- test.todo = (name, eff, opts) => addTest(name, eff, opts, "todo");
175
-
176
- // One lock per scratch stack. When an attempt times out, the runner fires
177
- // an interrupt and ABANDONS the attempt's fiber after a short grace — but
178
- // the fiber keeps running its teardown (`scratch.destroy()` below) in the
179
- // background, e.g. a CloudFront disable-wait. Without this lock the retry
180
- // starts concurrently on the SAME scratch state: the stale teardown then
181
- // deletes the state rows the retry just wrote for the same logical ids,
182
- // orphaning the retry's cloud resources (observed: two leaked CloudFront
183
- // distributions + buckets + OACs from one retried test). Holding the lock
184
- // across body + teardown makes a retry wait (on its own timeout clock)
185
- // until the previous attempt's teardown has fully settled.
186
- const scratchLocks = new Map<string, Semaphore.Semaphore>();
187
- const scratchLock = (name: string) => {
188
- let lock = scratchLocks.get(name);
189
- if (lock === undefined) {
190
- lock = Semaphore.makeUnsafe(1);
191
- scratchLocks.set(name, lock);
192
- }
193
- return lock;
194
- };
195
-
196
- const wrapProvider = (
197
- name: string,
198
- fn: (stack: ScratchStack) => Effect.Effect<void, any, any>,
199
- file: string | undefined,
200
- ) => {
201
- if (sharedScope === undefined) return Effect.die("Test runtime is closed");
202
- // Durable, file-namespaced scratch state (`.alchemy/state`). A run that
203
- // dies mid-delete — e.g. the runner abandons teardown 10s after a test
204
- // timeout while a CloudFront disable-wait is still in flight — leaves
205
- // its `deleting` rows on disk, so the NEXT run's leading
206
- // `stack.destroy()` (or the ensuring teardown below) resumes and drains
207
- // them instead of planning "no changes" and silently orphaning the
208
- // cloud resource.
209
- const scratch = Core.scratchStack(options, name, file);
210
- // Guarantee teardown. `test.provider` has no built-in cleanup, so a body
211
- // that fails (assertion, API error like a 409/Unauthorized) or is
212
- // interrupted (timeout) BEFORE its trailing `stack.destroy()` would
213
- // otherwise leak every cloud resource it deployed.
214
- // `scratch.destroy()` is idempotent — a no-op when the body already
215
- // destroyed, and it reclaims the orphans otherwise. `Effect.ensuring`
216
- // runs the finalizer on success, failure, AND interruption.
217
- const body = Core.withProviders(fn(scratch), options, scratch.name).pipe(
218
- Effect.ensuring(scratch.destroy().pipe(Effect.ignore)),
219
- scratchLock(scratch.name).withPermits(1),
220
- );
221
- return Core.toEffect(body, { ...options, state: scratch.state }, sharedScope, sidecar);
222
- };
223
-
224
- const addProvider = (
225
- name: string,
226
- fn: (stack: ScratchStack) => Effect.Effect<void, any, any>,
227
- opts: TestOptions | undefined,
228
- mode: "run" | "skip" | "todo",
229
- ) => {
230
- // Captured at registration (module evaluation during collection) — the
231
- // collection context is gone by the time the body runs.
232
- const file = currentFile();
233
- registerTest({
234
- name,
235
- mode,
236
- exclusive: exclusiveOf(opts),
237
- retry: retryOf(opts),
238
- timeout: timeoutOf(opts),
239
- tags: tagsOf(opts),
240
- optInTags: optInTagsOf(opts),
241
- body: mode === "run" ? () => wrapProvider(name, fn, file) : undefined,
242
- });
243
- };
244
-
245
- const provider = ((name, fn, opts) => {
246
- addProvider(name, fn, opts, "run");
247
- }) as ProviderFn;
248
- provider.skip = (name, fn, opts) => addProvider(name, fn, opts, "skip");
249
- provider.skipIf = (condition) => (name, fn, opts) =>
250
- addProvider(name, fn, opts, condition ? "skip" : "run");
251
- provider.todo = (name, fn, opts) => addProvider(name, fn, opts, "todo");
252
- test.provider = provider;
253
-
254
- const beforeAll: BeforeAllFn = <A>(eff: TestEffect<A>, hookOptions?: TestOptions) => {
255
- let result: A | undefined;
256
- clearResults.add(() => {
257
- result = undefined;
258
- });
259
- registerHook("beforeAll", {
260
- body: () =>
261
- wrap(eff).pipe(
262
- Effect.map((value) => {
263
- if (sharedScope !== undefined) result = value;
264
- }),
265
- ),
266
- timeout: timeoutOf(hookOptions) ?? DEFAULT_TIMEOUT,
267
- exclusive: exclusiveOf(hookOptions),
268
- });
269
- return Effect.sync(() => result as A);
270
- };
271
-
272
- const beforeEach: BeforeEachFn = (eff, hookOptions) => {
273
- registerHook("beforeEach", { body: () => wrap(eff), timeout: timeoutOf(hookOptions) });
274
- };
275
-
276
- const afterAll = ((eff, hookOptions) => {
277
- registerHook("afterAll", {
278
- body: () => wrap(eff),
279
- timeout: timeoutOf(hookOptions) ?? DEFAULT_TIMEOUT,
280
- exclusive: exclusiveOf(hookOptions),
281
- });
282
- }) as AfterAllFn;
283
- afterAll.skipIf = (predicate) => (eff, hookOptions) => {
284
- if (predicate) return;
285
- registerHook("afterAll", {
286
- body: () => wrap(eff),
287
- timeout: timeoutOf(hookOptions) ?? DEFAULT_TIMEOUT,
288
- exclusive: exclusiveOf(hookOptions),
289
- });
290
- };
291
-
292
- const afterEach: AfterEachFn = (eff, hookOptions) => {
293
- registerHook("afterEach", { body: () => wrap(eff), timeout: timeoutOf(hookOptions) });
294
- };
295
-
296
- // `destroy(Stack)` needs the dev sidecar alive so it can call `sidecar.stop`
297
- // for each worker. We close the shared scope only AFTER destroy completes.
298
- // `Scope.close` on an already-closed scope is a no-op, so it's safe for both
299
- // the destroy wrapper AND the fallback cleanup hook below to call it.
300
- const closeScope = Effect.suspend(() =>
301
- sharedScope === undefined ? Effect.void : Scope.close(sharedScope, Exit.void),
302
- ).pipe(Effect.ignore);
303
-
304
- // File cleanup runs after user afterAll, including skipped/failed imports.
305
- // Interactive retries retain the runtime until the runner releases the file.
306
- registerFileCleanup({
307
- body: () =>
308
- closeScope.pipe(
309
- Effect.ensuring(Effect.suspend(() => sidecar?.close ?? Effect.void)),
310
- Effect.ensuring(
311
- Effect.sync(() => {
312
- sharedScope = undefined;
313
- sidecar = undefined;
314
- for (const clear of clearResults) clear();
315
- clearResults.clear();
316
- }),
317
- ),
318
- ),
319
- timeout: DEFAULT_TIMEOUT,
320
- });
321
-
322
- return {
323
- test,
324
- beforeAll,
325
- beforeEach,
326
- afterAll,
327
- afterEach,
328
- deploy: Core.makeDeploy(options, sharedScope),
329
- destroy: (stack, callOpts) =>
330
- Core.destroy(options, stack, { ...callOpts, scope: sharedScope }).pipe(
331
- Effect.ensuring(closeScope),
332
- ),
333
- };
334
- };
package/src/Test/Bun.ts DELETED
@@ -1,230 +0,0 @@
1
- /** @effect-diagnostics anyUnknownInErrorContext:off */
2
-
3
- import bun from "bun:test";
4
- import type { HookOptions } from "node:test";
5
- import * as Effect from "effect/Effect";
6
- import * as Exit from "effect/Exit";
7
- import * as Scope from "effect/Scope";
8
- import type { AlchemyContext } from "../AlchemyContext.ts";
9
- import type { CompiledStack } from "../Stack.ts";
10
- import type { Stage } from "../Stage.ts";
11
- import * as Core from "./Core.ts";
12
-
13
- export {
14
- executeWhenReady,
15
- getWhenReady,
16
- guardContentType,
17
- guardedFetchLayer,
18
- rpcClientLayer,
19
- WorkerNotReady,
20
- type EdgeGuardOptions,
21
- type WhenReadyOptions,
22
- } from "./Http.ts";
23
-
24
- export type MakeOptions<ROut = any> = Core.MakeOptions<ROut>;
25
- export type ScratchStack = Core.ScratchStack;
26
- export type TestEffect<A, R = never> = Core.TestEffect<A, R>;
27
- export const defaultStage = Core.defaultStage;
28
- export const resolveStage = Core.resolveStage;
29
-
30
- export interface TestApi {
31
- test: TestFn;
32
- beforeAll: BeforeAllFn;
33
- beforeEach: BeforeEachFn;
34
- afterAll: AfterAllFn;
35
- afterEach: AfterEachFn;
36
- deploy: Core.Deploy;
37
- destroy: (
38
- stack: TestEffect<CompiledStack, Stage | AlchemyContext>,
39
- options?: { stage?: string; include?: never; exclude?: never },
40
- ) => ReturnType<typeof Core.destroy>;
41
- }
42
-
43
- interface TestFn {
44
- (name: string, eff: TestEffect<void>, options?: bun.TestOptions): void;
45
- skip: (name: string, eff: TestEffect<void>, options?: bun.TestOptions) => void;
46
- skipIf: (
47
- condition: boolean,
48
- ) => (name: string, eff: TestEffect<void>, options?: bun.TestOptions) => void;
49
- only: (name: string, eff: TestEffect<void>, options?: bun.TestOptions) => void;
50
- todo: (name: string, eff: TestEffect<void>, options?: bun.TestOptions) => void;
51
- provider: ProviderFn;
52
- }
53
-
54
- interface ProviderFn {
55
- (
56
- name: string,
57
- fn: (stack: ScratchStack) => Effect.Effect<void, any, any>,
58
- options?: bun.TestOptions,
59
- ): void;
60
- skip: (
61
- name: string,
62
- fn: (stack: ScratchStack) => Effect.Effect<void, any, any>,
63
- options?: bun.TestOptions,
64
- ) => void;
65
- skipIf: (
66
- condition: boolean,
67
- ) => (
68
- name: string,
69
- fn: (stack: ScratchStack) => Effect.Effect<void, any, any>,
70
- options?: bun.TestOptions,
71
- ) => void;
72
- }
73
-
74
- interface BeforeAllFn {
75
- <A>(eff: TestEffect<A>, options?: HookOptions): Effect.Effect<A>;
76
- }
77
-
78
- interface BeforeEachFn {
79
- (eff: TestEffect<void>, options?: HookOptions): void;
80
- }
81
-
82
- interface AfterAllFn {
83
- (eff: TestEffect<any>, options?: HookOptions): void;
84
- skipIf: (predicate: boolean) => (eff: TestEffect<any>, options?: HookOptions) => void;
85
- }
86
-
87
- interface AfterEachFn {
88
- (eff: TestEffect<void>, options?: HookOptions): void;
89
- }
90
-
91
- const DEFAULT_HOOK_TIMEOUT: HookOptions = { timeout: 120_000 };
92
-
93
- /**
94
- * Build the per-file test API. Configure providers / state once at the top of
95
- * the test file:
96
- *
97
- * ```ts
98
- * import * as Test from "alchemy/Test/Bun";
99
- * import * as Cloudflare from "@alchemy.run/cloudflare";
100
- *
101
- * const { test, deploy, destroy, beforeAll, afterAll } = Test.make({
102
- * providers: Cloudflare.providers(),
103
- * state: Cloudflare.state(),
104
- * });
105
- * ```
106
- */
107
- export const make = <ROut = any>(options: MakeOptions<ROut>): TestApi => {
108
- // Single scope shared across `beforeAll`, every `test`, and `afterAll`.
109
- // Scoped resources in dev mode (the Cloudflare sidecar process and its
110
- // workerd children) must outlive a single `Effect.runPromise` boundary,
111
- // otherwise the proxy is killed the moment `beforeAll(deploy(Stack))`
112
- // resolves and every later `HttpClient.get(workerUrl)` hits a dead port.
113
- // The scope is closed by `destroy(...)` (or never — the next test run
114
- // reclaims any leaked sidecar via the lock file).
115
- const sharedScope = Scope.makeUnsafe("sequential");
116
- // In dev mode, run local providers behind one file-scoped RPC sidecar
117
- // (the `alchemy dev` topology). Lives in its own scope — NOT sharedScope,
118
- // which `destroy(Stack)` closes mid-file in self-contained tests — and is
119
- // closed by the fallback afterAll below.
120
- const sidecar = Core.makeSidecarHandle(options);
121
- const runEff = <A>(eff: TestEffect<A>) => Core.run(eff, options, sharedScope, sidecar);
122
-
123
- const test = ((name, eff, opts) => {
124
- bun.test(name, () => runEff(eff), opts);
125
- }) as TestFn;
126
-
127
- test.skip = (name, eff, opts) => {
128
- bun.test.skip(name, () => runEff(eff), opts);
129
- };
130
- test.skipIf = (condition) => (name, eff, opts) => {
131
- bun.test.skipIf(condition)(name, () => runEff(eff), opts);
132
- };
133
- test.only = (name, eff, opts) => {
134
- bun.test.only(name, () => runEff(eff), opts);
135
- };
136
- test.todo = (name, eff, opts) => {
137
- bun.test.todo(name, () => runEff(eff), opts);
138
- };
139
-
140
- const runProvider = (
141
- name: string,
142
- fn: (stack: ScratchStack) => Effect.Effect<void, any, any>,
143
- ) => {
144
- const scratch = Core.scratchStack(options, name);
145
- return Core.run(
146
- Core.withProviders(fn(scratch), options, scratch.name),
147
- { ...options, state: scratch.state },
148
- sharedScope,
149
- sidecar,
150
- );
151
- };
152
-
153
- const provider = ((name, fn, opts) => {
154
- bun.test(name, () => runProvider(name, fn), opts);
155
- }) as ProviderFn;
156
- provider.skip = (name, fn, opts) => {
157
- bun.test.skip(name, () => runProvider(name, fn), opts);
158
- };
159
- provider.skipIf = (condition) => (name, fn, opts) => {
160
- bun.test.skipIf(condition)(name, () => runProvider(name, fn), opts);
161
- };
162
- test.provider = provider;
163
-
164
- const beforeAll: BeforeAllFn = <A>(eff: TestEffect<A>, hookOptions?: HookOptions) => {
165
- let result: A;
166
- bun.beforeAll(() => runEff(eff).then((v) => (result = v)), hookOptions ?? DEFAULT_HOOK_TIMEOUT);
167
- return Effect.sync(() => result);
168
- };
169
-
170
- const beforeEach: BeforeEachFn = (eff, hookOptions) => {
171
- bun.beforeEach(() => runEff(eff), hookOptions);
172
- };
173
-
174
- // bun:test stops running later `afterAll` hooks once one throws, which
175
- // would skip the fallback cleanup hook below — leaking the shared scope
176
- // and the sidecar for the rest of the process whenever a teardown
177
- // assertion fails. Guard every user teardown: on failure, run the
178
- // (idempotent) cleanup before rethrowing so the failure still fails the
179
- // suite. (`closeAll` is initialized below; hooks only run after `make`
180
- // returns.)
181
- const guardTeardown = (eff: TestEffect<any>) => () =>
182
- runEff(eff).catch(async (error) => {
183
- await Effect.runPromise(closeAll);
184
- throw error;
185
- });
186
-
187
- const afterAll = ((eff, hookOptions) => {
188
- bun.afterAll(guardTeardown(eff), hookOptions ?? DEFAULT_HOOK_TIMEOUT);
189
- }) as AfterAllFn;
190
- afterAll.skipIf = (predicate) => (eff, hookOptions) => {
191
- if (predicate) return;
192
- bun.afterAll(guardTeardown(eff), hookOptions ?? DEFAULT_HOOK_TIMEOUT);
193
- };
194
-
195
- const afterEach: AfterEachFn = (eff, hookOptions) => {
196
- bun.afterEach(() => runEff(eff), hookOptions);
197
- };
198
-
199
- // `destroy(Stack)` needs the dev sidecar alive so it can call `sidecar.stop`
200
- // for each worker. We close the shared scope only AFTER destroy completes.
201
- // `Scope.close` on an already-closed scope is a no-op, so it's safe for both
202
- // the destroy wrapper AND the fallback cleanup hook below to call it.
203
- const closeScope = Effect.suspend(() => Scope.close(sharedScope, Exit.void)).pipe(Effect.ignore);
204
-
205
- // Fallback cleanup: if the user never calls `destroy(Stack)` (e.g.
206
- // `NO_DESTROY=1`), nothing else closes the shared scope and the sidecar
207
- // child process leaks past the test process. Register an `afterAll` that
208
- // closes it (and the RPC sidecar, which lives in its own scope so that
209
- // mid-file `destroy(Stack)` calls can't kill it for later tests). We defer
210
- // registration to a microtask so it runs AFTER any user-registered
211
- // `afterAll` (including `destroy(Stack)`); bun runs afterAll hooks in
212
- // registration order.
213
- const closeAll = sidecar ? Effect.andThen(closeScope, sidecar.close) : closeScope;
214
- queueMicrotask(() => {
215
- bun.afterAll(() => Effect.runPromise(closeAll), DEFAULT_HOOK_TIMEOUT);
216
- });
217
-
218
- return {
219
- test,
220
- beforeAll,
221
- beforeEach,
222
- afterAll,
223
- afterEach,
224
- deploy: Core.makeDeploy(options, sharedScope),
225
- destroy: (stack, callOpts) =>
226
- Core.destroy(options, stack, { ...callOpts, scope: sharedScope }).pipe(
227
- Effect.ensuring(closeScope),
228
- ),
229
- };
230
- };