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.
- package/THIRD_PARTY_LICENSES.md +2 -2
- package/bin/cli.js +14 -6
- package/bin/register-oxc.js +16 -12
- package/lib/AdoptPolicy.d.ts +73 -0
- package/lib/AdoptPolicy.d.ts.map +1 -1
- package/lib/AdoptPolicy.js +54 -0
- package/lib/AdoptPolicy.js.map +1 -1
- package/lib/Alchemist/AuthRegistry.d.ts +31 -0
- package/lib/Alchemist/AuthRegistry.d.ts.map +1 -0
- package/lib/Alchemist/AuthRegistry.js +95 -0
- package/lib/Alchemist/AuthRegistry.js.map +1 -0
- package/lib/Alchemist/Drift.d.ts +70 -0
- package/lib/Alchemist/Drift.d.ts.map +1 -0
- package/lib/Alchemist/Drift.js +54 -0
- package/lib/Alchemist/Drift.js.map +1 -0
- package/lib/Alchemist/Entrypoint.d.ts +27 -3
- package/lib/Alchemist/Entrypoint.d.ts.map +1 -1
- package/lib/Alchemist/Entrypoint.js +34 -3
- package/lib/Alchemist/Entrypoint.js.map +1 -1
- package/lib/Alchemist/Errors.d.ts +1 -1
- package/lib/Alchemist/Errors.d.ts.map +1 -1
- package/lib/Alchemist/Errors.js +1 -1
- package/lib/Alchemist/Errors.js.map +1 -1
- package/lib/Alchemist/Logs.d.ts +46 -0
- package/lib/Alchemist/Logs.d.ts.map +1 -0
- package/lib/Alchemist/{routes/logs.js → Logs.js} +21 -26
- package/lib/Alchemist/Logs.js.map +1 -0
- package/lib/Alchemist/Nuke.d.ts +69 -0
- package/lib/Alchemist/Nuke.d.ts.map +1 -0
- package/lib/Alchemist/Nuke.js +35 -0
- package/lib/Alchemist/Nuke.js.map +1 -0
- package/lib/Alchemist/Operations.d.ts +168 -0
- package/lib/Alchemist/Operations.d.ts.map +1 -0
- package/lib/Alchemist/Operations.js +165 -0
- package/lib/Alchemist/Operations.js.map +1 -0
- package/lib/Alchemist/Profile.d.ts +132 -0
- package/lib/Alchemist/Profile.d.ts.map +1 -0
- package/lib/Alchemist/{routes/profile.js → Profile.js} +20 -21
- package/lib/Alchemist/Profile.js.map +1 -0
- package/lib/Alchemist/{routes/provider.d.ts → Provider.d.ts} +4 -4
- package/lib/Alchemist/Provider.d.ts.map +1 -0
- package/lib/Alchemist/{routes/provider.js → Provider.js} +7 -6
- package/lib/Alchemist/Provider.js.map +1 -0
- package/lib/Alchemist/Runtime.d.ts +10 -6
- package/lib/Alchemist/Runtime.d.ts.map +1 -1
- package/lib/Alchemist/Runtime.js +38 -2
- package/lib/Alchemist/Runtime.js.map +1 -1
- package/lib/Alchemist/{routes/state.d.ts → State.d.ts} +36 -16
- package/lib/Alchemist/State.d.ts.map +1 -0
- package/lib/Alchemist/{routes/state.js → State.js} +50 -15
- package/lib/Alchemist/State.js.map +1 -0
- package/lib/Alchemist/index.d.ts +11 -10
- package/lib/Alchemist/index.d.ts.map +1 -1
- package/lib/Alchemist/index.js +10 -9
- package/lib/Alchemist/index.js.map +1 -1
- package/lib/Apply.d.ts +2 -8
- package/lib/Apply.d.ts.map +1 -1
- package/lib/Apply.js +364 -184
- package/lib/Apply.js.map +1 -1
- package/lib/Auth/AuthProvider.d.ts +24 -11
- package/lib/Auth/AuthProvider.d.ts.map +1 -1
- package/lib/Auth/AuthProvider.js +28 -12
- package/lib/Auth/AuthProvider.js.map +1 -1
- package/lib/Auth/BrowserOAuth.d.ts +6 -8
- package/lib/Auth/BrowserOAuth.d.ts.map +1 -1
- package/lib/Auth/BrowserOAuth.js +25 -41
- package/lib/Auth/BrowserOAuth.js.map +1 -1
- package/lib/Auth/Credentials.d.ts.map +1 -1
- package/lib/Auth/Credentials.js +2 -2
- package/lib/Auth/Credentials.js.map +1 -1
- package/lib/Auth/Demand.d.ts +4 -4
- package/lib/Auth/Demand.d.ts.map +1 -1
- package/lib/Auth/Demand.js +16 -10
- package/lib/Auth/Demand.js.map +1 -1
- package/lib/Auth/Env.d.ts +2 -1
- package/lib/Auth/Env.d.ts.map +1 -1
- package/lib/Auth/Env.js +4 -2
- package/lib/Auth/Env.js.map +1 -1
- package/lib/Auth/Inspect.d.ts +2 -2
- package/lib/Auth/Inspect.d.ts.map +1 -1
- package/lib/Auth/Inspect.js +3 -1
- package/lib/Auth/Inspect.js.map +1 -1
- package/lib/Auth/Lock.d.ts.map +1 -1
- package/lib/Auth/Lock.js +4 -8
- package/lib/Auth/Lock.js.map +1 -1
- package/lib/Auth/OAuthFlow.d.ts +3 -12
- package/lib/Auth/OAuthFlow.d.ts.map +1 -1
- package/lib/Auth/OAuthFlow.js +7 -17
- package/lib/Auth/OAuthFlow.js.map +1 -1
- package/lib/Auth/Paths.d.ts +2 -1
- package/lib/Auth/Paths.d.ts.map +1 -1
- package/lib/Auth/Paths.js +3 -2
- package/lib/Auth/Paths.js.map +1 -1
- package/lib/Auth/Profile.d.ts +10 -0
- package/lib/Auth/Profile.d.ts.map +1 -1
- package/lib/Auth/Profile.js +19 -2
- package/lib/Auth/Profile.js.map +1 -1
- package/lib/Auth/Registry.d.ts +20 -0
- package/lib/Auth/Registry.d.ts.map +1 -0
- package/lib/Auth/Registry.js +17 -0
- package/lib/Auth/Registry.js.map +1 -0
- package/lib/Auth/Resolve.d.ts +34 -2
- package/lib/Auth/Resolve.d.ts.map +1 -1
- package/lib/Auth/Resolve.js +51 -3
- package/lib/Auth/Resolve.js.map +1 -1
- package/lib/Auth/StoredAuthProvider.d.ts +1 -1
- package/lib/Auth/StoredAuthProvider.d.ts.map +1 -1
- package/lib/Auth/StoredAuthProvider.js +1 -2
- package/lib/Auth/StoredAuthProvider.js.map +1 -1
- package/lib/Binding.d.ts.map +1 -1
- package/lib/Binding.js +3 -1
- package/lib/Binding.js.map +1 -1
- package/lib/Bundle/Bundle.d.ts +5 -0
- package/lib/Bundle/Bundle.d.ts.map +1 -1
- package/lib/Bundle/Bundle.js +36 -6
- package/lib/Bundle/Bundle.js.map +1 -1
- package/lib/Bundle/NamespaceImportPlugin.d.ts +55 -0
- package/lib/Bundle/NamespaceImportPlugin.d.ts.map +1 -0
- package/lib/Bundle/NamespaceImportPlugin.js +226 -0
- package/lib/Bundle/NamespaceImportPlugin.js.map +1 -0
- package/lib/Bundle/index.d.ts +1 -0
- package/lib/Bundle/index.d.ts.map +1 -1
- package/lib/Bundle/index.js +1 -0
- package/lib/Bundle/index.js.map +1 -1
- package/lib/Cli/Format.d.ts.map +1 -1
- package/lib/Cli/Format.js +2 -1
- package/lib/Cli/Format.js.map +1 -1
- package/lib/Cli/GlobalLog.d.ts +72 -26
- package/lib/Cli/GlobalLog.d.ts.map +1 -1
- package/lib/Cli/GlobalLog.js +151 -59
- package/lib/Cli/GlobalLog.js.map +1 -1
- package/lib/Cli/LoggingCli.d.ts.map +1 -1
- package/lib/Cli/LoggingCli.js +24 -18
- package/lib/Cli/LoggingCli.js.map +1 -1
- package/lib/Cli/PlainCliFormatter.d.ts.map +1 -1
- package/lib/Cli/PlainCliFormatter.js +4 -1
- package/lib/Cli/PlainCliFormatter.js.map +1 -1
- package/lib/Cli/Present.d.ts +14 -0
- package/lib/Cli/Present.d.ts.map +1 -0
- package/lib/Cli/Present.js +22 -0
- package/lib/Cli/Present.js.map +1 -0
- package/lib/Cli/SigilRenderer.d.ts +58 -0
- package/lib/Cli/SigilRenderer.d.ts.map +1 -0
- package/lib/Cli/SigilRenderer.js +39 -0
- package/lib/Cli/SigilRenderer.js.map +1 -0
- package/lib/Cli/checkVersion.d.ts +11 -14
- package/lib/Cli/checkVersion.d.ts.map +1 -1
- package/lib/Cli/checkVersion.js +19 -77
- package/lib/Cli/checkVersion.js.map +1 -1
- package/lib/Cli/commands/confirm.d.ts +2 -2
- package/lib/Cli/commands/confirm.d.ts.map +1 -1
- package/lib/Cli/commands/confirm.js +3 -3
- package/lib/Cli/commands/confirm.js.map +1 -1
- package/lib/Cli/commands/deploy.d.ts +4 -4
- package/lib/Cli/commands/deploy.d.ts.map +1 -1
- package/lib/Cli/commands/deploy.js +40 -39
- package/lib/Cli/commands/deploy.js.map +1 -1
- package/lib/Cli/commands/dev.d.ts.map +1 -1
- package/lib/Cli/commands/dev.js +41 -3
- package/lib/Cli/commands/dev.js.map +1 -1
- package/lib/Cli/commands/drift.d.ts +2 -2
- package/lib/Cli/commands/drift.d.ts.map +1 -1
- package/lib/Cli/commands/drift.js +14 -13
- package/lib/Cli/commands/drift.js.map +1 -1
- package/lib/Cli/commands/errors.d.ts.map +1 -1
- package/lib/Cli/commands/errors.js +2 -1
- package/lib/Cli/commands/errors.js.map +1 -1
- package/lib/Cli/commands/instrument.d.ts +15 -5
- package/lib/Cli/commands/instrument.d.ts.map +1 -1
- package/lib/Cli/commands/instrument.js +33 -8
- package/lib/Cli/commands/instrument.js.map +1 -1
- package/lib/Cli/commands/logs.d.ts +1 -1
- package/lib/Cli/commands/logs.d.ts.map +1 -1
- package/lib/Cli/commands/logs.js +22 -22
- package/lib/Cli/commands/logs.js.map +1 -1
- package/lib/Cli/commands/nuke.d.ts +3 -2
- package/lib/Cli/commands/nuke.d.ts.map +1 -1
- package/lib/Cli/commands/nuke.js +19 -17
- package/lib/Cli/commands/nuke.js.map +1 -1
- package/lib/Cli/commands/profile/commands.d.ts +3 -2
- package/lib/Cli/commands/profile/commands.d.ts.map +1 -1
- package/lib/Cli/commands/profile/commands.js +26 -27
- package/lib/Cli/commands/profile/commands.js.map +1 -1
- package/lib/Cli/commands/profile/flows.d.ts +6 -5
- package/lib/Cli/commands/profile/flows.d.ts.map +1 -1
- package/lib/Cli/commands/profile/flows.js +19 -17
- package/lib/Cli/commands/profile/flows.js.map +1 -1
- package/lib/Cli/commands/profile/hub.d.ts +1 -2
- package/lib/Cli/commands/profile/hub.d.ts.map +1 -1
- package/lib/Cli/commands/profile/hub.js +15 -17
- package/lib/Cli/commands/profile/hub.js.map +1 -1
- package/lib/Cli/commands/provider.d.ts +3 -1
- package/lib/Cli/commands/provider.d.ts.map +1 -1
- package/lib/Cli/commands/provider.js +4 -4
- package/lib/Cli/commands/provider.js.map +1 -1
- package/lib/Cli/commands/render.d.ts +2 -4
- package/lib/Cli/commands/render.d.ts.map +1 -1
- package/lib/Cli/commands/render.js +33 -56
- package/lib/Cli/commands/render.js.map +1 -1
- package/lib/Cli/commands/state.d.ts +1 -2
- package/lib/Cli/commands/state.d.ts.map +1 -1
- package/lib/Cli/commands/state.js +74 -27
- package/lib/Cli/commands/state.js.map +1 -1
- package/lib/Cli/components/capabilities.d.ts +4 -0
- package/lib/Cli/components/capabilities.d.ts.map +1 -0
- package/lib/Cli/components/capabilities.js +18 -0
- package/lib/Cli/components/capabilities.js.map +1 -0
- package/lib/Cli/components/types.d.ts +2 -81
- package/lib/Cli/components/types.d.ts.map +1 -1
- package/lib/Cli/components/types.js +1 -3
- package/lib/Cli/components/types.js.map +1 -1
- package/lib/Cli/components/ui/Environment.d.ts +3 -3
- package/lib/Cli/components/ui/Environment.d.ts.map +1 -1
- package/lib/Cli/components/ui/Environment.js.map +1 -1
- package/lib/Cli/components/ui/Interactive.d.ts +17 -4
- package/lib/Cli/components/ui/Interactive.d.ts.map +1 -1
- package/lib/Cli/components/ui/Interactive.js +7 -11
- package/lib/Cli/components/ui/Interactive.js.map +1 -1
- package/lib/Cli/components/ui/Layout.d.ts +1 -1
- package/lib/Cli/components/ui/Layout.d.ts.map +1 -1
- package/lib/Cli/components/ui/Layout.js +1 -1
- package/lib/Cli/components/ui/Layout.js.map +1 -1
- package/lib/Cli/components/ui/Typography.d.ts +1 -1
- package/lib/Cli/components/ui/Typography.d.ts.map +1 -1
- package/lib/Cli/components/ui/Typography.js +1 -1
- package/lib/Cli/components/ui/Typography.js.map +1 -1
- package/lib/Cli/components/ui/index.d.ts +2 -2
- package/lib/Cli/components/ui/index.js +2 -2
- package/lib/Cli/components/view/ApprovePlan.d.ts +1 -1
- package/lib/Cli/components/view/ApprovePlan.d.ts.map +1 -1
- package/lib/Cli/components/view/ApprovePlan.js +2 -1
- package/lib/Cli/components/view/ApprovePlan.js.map +1 -1
- package/lib/Cli/components/view/Format.d.ts +5 -0
- package/lib/Cli/components/view/Format.d.ts.map +1 -0
- package/lib/Cli/components/view/Format.js +39 -0
- package/lib/Cli/components/view/Format.js.map +1 -0
- package/lib/Cli/components/view/Help.d.ts +2 -2
- package/lib/Cli/components/view/Help.d.ts.map +1 -1
- package/lib/Cli/components/view/Help.js +7 -5
- package/lib/Cli/components/view/Help.js.map +1 -1
- package/lib/Cli/components/view/Logo.js +1 -1
- package/lib/Cli/components/view/Logo.js.map +1 -1
- package/lib/Cli/components/view/Nuke.d.ts +8 -9
- package/lib/Cli/components/view/Nuke.d.ts.map +1 -1
- package/lib/Cli/components/view/Nuke.js +49 -52
- package/lib/Cli/components/view/Nuke.js.map +1 -1
- package/lib/Cli/components/view/PlanDecision.d.ts +1 -1
- package/lib/Cli/components/view/PlanDecision.d.ts.map +1 -1
- package/lib/Cli/components/view/PlanDecision.js +1 -1
- package/lib/Cli/components/view/PlanDecision.js.map +1 -1
- package/lib/Cli/components/view/PlanRow.js +1 -1
- package/lib/Cli/components/view/PlanRow.js.map +1 -1
- package/lib/Cli/components/view/PlanTree.d.ts +1 -1
- package/lib/Cli/components/view/PlanTree.d.ts.map +1 -1
- package/lib/Cli/components/view/PlanTree.js +1 -1
- package/lib/Cli/components/view/PlanView.js +1 -1
- package/lib/Cli/components/view/PlanView.js.map +1 -1
- package/lib/Cli/components/view/Profile.d.ts +1 -1
- package/lib/Cli/components/view/Profile.js +2 -2
- package/lib/Cli/components/view/Profile.js.map +1 -1
- package/lib/Cli/components/view/ProfileDashboard.d.ts +4 -4
- package/lib/Cli/components/view/ProfileDashboard.d.ts.map +1 -1
- package/lib/Cli/components/view/ProfileDashboard.js +9 -8
- package/lib/Cli/components/view/ProfileDashboard.js.map +1 -1
- package/lib/Cli/components/view/Prompts.d.ts +3 -3
- package/lib/Cli/components/view/Prompts.d.ts.map +1 -1
- package/lib/Cli/components/view/Prompts.js +11 -18
- package/lib/Cli/components/view/Prompts.js.map +1 -1
- package/lib/Cli/components/view/Runtime.d.ts +5 -5
- package/lib/Cli/components/view/Runtime.d.ts.map +1 -1
- package/lib/Cli/components/view/Runtime.js +136 -219
- package/lib/Cli/components/view/Runtime.js.map +1 -1
- package/lib/Cli/components/view/SigilCli.d.ts +2 -2
- package/lib/Cli/components/view/SigilCli.d.ts.map +1 -1
- package/lib/Cli/components/view/SigilCli.js +7 -7
- package/lib/Cli/components/view/SigilCli.js.map +1 -1
- package/lib/Cli/components/view/StateExplorer.d.ts +1 -1
- package/lib/Cli/components/view/StateExplorer.d.ts.map +1 -1
- package/lib/Cli/components/view/StateExplorer.js +2 -1
- package/lib/Cli/components/view/StateExplorer.js.map +1 -1
- package/lib/Cli/components/view/statusStyle.d.ts +2 -2
- package/lib/Cli/components/view/statusStyle.d.ts.map +1 -1
- package/lib/Cli/components/view/statusStyle.js +1 -1
- package/lib/Cli/components/view/statusStyle.js.map +1 -1
- package/lib/Cli/exec.d.ts +6 -1
- package/lib/Cli/exec.d.ts.map +1 -1
- package/lib/Cli/exec.js +29 -34
- package/lib/Cli/exec.js.map +1 -1
- package/lib/Cli/main.d.ts.map +1 -1
- package/lib/Cli/main.js +35 -26
- package/lib/Cli/main.js.map +1 -1
- package/lib/Cli/selectCli.d.ts +2 -2
- package/lib/Cli/selectCli.d.ts.map +1 -1
- package/lib/Cli/selectCli.js +2 -2
- package/lib/Cli/selectCli.js.map +1 -1
- package/lib/Command/Command.js +1 -1
- package/lib/Command/Command.js.map +1 -1
- package/lib/Command/Dev.d.ts +58 -4
- package/lib/Command/Dev.d.ts.map +1 -1
- package/lib/Command/Dev.js +87 -30
- package/lib/Command/Dev.js.map +1 -1
- package/lib/Command/Local.d.ts +1 -1
- package/lib/Command/Memo.js +1 -1
- package/lib/Command/Memo.js.map +1 -1
- package/lib/Command/Providers.d.ts +1 -1
- package/lib/Command/Providers.d.ts.map +1 -1
- package/lib/Contributions.d.ts +2 -3
- package/lib/Contributions.d.ts.map +1 -1
- package/lib/Contributions.js +38 -6
- package/lib/Contributions.js.map +1 -1
- package/lib/DNS/Adapter.d.ts +204 -0
- package/lib/DNS/Adapter.d.ts.map +1 -0
- package/lib/DNS/Adapter.js +112 -0
- package/lib/DNS/Adapter.js.map +1 -0
- package/lib/DNS/index.d.ts +2 -0
- package/lib/DNS/index.d.ts.map +1 -0
- package/lib/DNS/index.js +2 -0
- package/lib/DNS/index.js.map +1 -0
- package/lib/Deploy.d.ts +7 -2
- package/lib/Deploy.d.ts.map +1 -1
- package/lib/Deploy.js +8 -3
- package/lib/Deploy.js.map +1 -1
- package/lib/Destroy.d.ts +5 -8
- package/lib/Destroy.d.ts.map +1 -1
- package/lib/Destroy.js +10 -7
- package/lib/Destroy.js.map +1 -1
- package/lib/Diff.d.ts.map +1 -1
- package/lib/Diff.js +14 -4
- package/lib/Diff.js.map +1 -1
- package/lib/Drift.d.ts +7 -7
- package/lib/Drift.d.ts.map +1 -1
- package/lib/Drift.js +184 -101
- package/lib/Drift.js.map +1 -1
- package/lib/EvalStack.d.ts +23 -0
- package/lib/EvalStack.d.ts.map +1 -0
- package/lib/EvalStack.js +47 -0
- package/lib/EvalStack.js.map +1 -0
- package/lib/Events.d.ts +210 -0
- package/lib/Events.d.ts.map +1 -0
- package/lib/Events.js +244 -0
- package/lib/Events.js.map +1 -0
- package/lib/Interaction.d.ts +159 -48
- package/lib/Interaction.d.ts.map +1 -1
- package/lib/Interaction.js +139 -58
- package/lib/Interaction.js.map +1 -1
- package/lib/Local/LocalProvider.d.ts.map +1 -1
- package/lib/Local/LocalProvider.js +31 -9
- package/lib/Local/LocalProvider.js.map +1 -1
- package/lib/Local/RpcProvider.d.ts.map +1 -1
- package/lib/Local/RpcProvider.js +10 -1
- package/lib/Local/RpcProvider.js.map +1 -1
- package/lib/Local/RpcProviderProxy.d.ts +16 -0
- package/lib/Local/RpcProviderProxy.d.ts.map +1 -1
- package/lib/Local/RpcProviderProxy.js +19 -10
- package/lib/Local/RpcProviderProxy.js.map +1 -1
- package/lib/Local/RpcSerialization.d.ts +3 -2
- package/lib/Local/RpcSerialization.d.ts.map +1 -1
- package/lib/Local/RpcSerialization.js +13 -10
- package/lib/Local/RpcSerialization.js.map +1 -1
- package/lib/Local/RpcServer.d.ts +2 -1
- package/lib/Local/RpcServer.d.ts.map +1 -1
- package/lib/Local/RpcServer.js +19 -14
- package/lib/Local/RpcServer.js.map +1 -1
- package/lib/Local/RpcServerBun.d.ts.map +1 -1
- package/lib/Local/RpcServerBun.js +8 -4
- package/lib/Local/RpcServerBun.js.map +1 -1
- package/lib/Local/RpcServerEnvironment.d.ts +2 -3
- package/lib/Local/RpcServerEnvironment.d.ts.map +1 -1
- package/lib/Local/RpcServerEnvironment.js +2 -2
- package/lib/Local/RpcServerEnvironment.js.map +1 -1
- package/lib/Local/RpcServerNode.d.ts.map +1 -1
- package/lib/Local/RpcServerNode.js +5 -1
- package/lib/Local/RpcServerNode.js.map +1 -1
- package/lib/Local/RpcServerSession.d.ts +1 -1
- package/lib/Local/RpcServerSession.d.ts.map +1 -1
- package/lib/Local/RpcServerSession.js.map +1 -1
- package/lib/Local/RpcSpawner.d.ts +6 -8
- package/lib/Local/RpcSpawner.d.ts.map +1 -1
- package/lib/Local/RpcSpawner.js +45 -36
- package/lib/Local/RpcSpawner.js.map +1 -1
- package/lib/Local/Sidecar.d.ts +23 -0
- package/lib/Local/Sidecar.d.ts.map +1 -1
- package/lib/Local/Sidecar.js +14 -9
- package/lib/Local/Sidecar.js.map +1 -1
- package/lib/Nuke.d.ts +5 -23
- package/lib/Nuke.d.ts.map +1 -1
- package/lib/Nuke.js +48 -13
- package/lib/Nuke.js.map +1 -1
- package/lib/Output.d.ts +19 -1
- package/lib/Output.d.ts.map +1 -1
- package/lib/Output.js +96 -3
- package/lib/Output.js.map +1 -1
- package/lib/Plan.d.ts +5 -1
- package/lib/Plan.d.ts.map +1 -1
- package/lib/Plan.js +111 -33
- package/lib/Plan.js.map +1 -1
- package/lib/Platform.d.ts.map +1 -1
- package/lib/Platform.js +31 -7
- package/lib/Platform.js.map +1 -1
- package/lib/Provider.d.ts +45 -0
- package/lib/Provider.d.ts.map +1 -1
- package/lib/Provider.js +2 -2
- package/lib/Provider.js.map +1 -1
- package/lib/Report.d.ts +17 -195
- package/lib/Report.d.ts.map +1 -1
- package/lib/Report.js +39 -12
- package/lib/Report.js.map +1 -1
- package/lib/Runtime/ManagedHttpShutdown.d.ts +17 -0
- package/lib/Runtime/ManagedHttpShutdown.d.ts.map +1 -1
- package/lib/Runtime/ManagedHttpShutdown.js +11 -2
- package/lib/Runtime/ManagedHttpShutdown.js.map +1 -1
- package/lib/RuntimeContext.js +1 -1
- package/lib/RuntimeContext.js.map +1 -1
- package/lib/Stack.d.ts +49 -29
- package/lib/Stack.d.ts.map +1 -1
- package/lib/Stack.js +25 -31
- package/lib/Stack.js.map +1 -1
- package/lib/State/BucketState.d.ts.map +1 -1
- package/lib/State/BucketState.js +43 -14
- package/lib/State/BucketState.js.map +1 -1
- package/lib/State/LocalState.d.ts.map +1 -1
- package/lib/State/LocalState.js +3 -3
- package/lib/State/LocalState.js.map +1 -1
- package/lib/State/Provisioning.d.ts +5 -0
- package/lib/State/Provisioning.d.ts.map +1 -1
- package/lib/State/Provisioning.js +3 -1
- package/lib/State/Provisioning.js.map +1 -1
- package/lib/State/ResourceState.d.ts +2 -0
- package/lib/State/ResourceState.d.ts.map +1 -1
- package/lib/State/State.d.ts +26 -0
- package/lib/State/State.d.ts.map +1 -1
- package/lib/State/StateEncoding.d.ts +7 -0
- package/lib/State/StateEncoding.d.ts.map +1 -1
- package/lib/State/StateEncoding.js +19 -0
- package/lib/State/StateEncoding.js.map +1 -1
- package/lib/State/index.js +2 -2
- package/lib/State/index.js.map +1 -1
- package/lib/Telemetry/Layer.d.ts +2 -5
- package/lib/Telemetry/Layer.d.ts.map +1 -1
- package/lib/Telemetry/Layer.js +3 -23
- package/lib/Telemetry/Layer.js.map +1 -1
- package/lib/Telemetry/Metrics.d.ts +1 -1
- package/lib/Telemetry/Metrics.d.ts.map +1 -1
- package/lib/TelemetryRelay.js +1 -1
- package/lib/TelemetryRelay.js.map +1 -1
- package/lib/TelemetryRuntime.d.ts +1 -1
- package/lib/TelemetryRuntime.d.ts.map +1 -1
- package/lib/TelemetryRuntime.js +4 -3
- package/lib/TelemetryRuntime.js.map +1 -1
- package/lib/Util/ConsoleSink.d.ts +23 -2
- package/lib/Util/ConsoleSink.d.ts.map +1 -1
- package/lib/Util/ConsoleSink.js +54 -14
- package/lib/Util/ConsoleSink.js.map +1 -1
- package/lib/Util/LogAnnotation.d.ts +19 -0
- package/lib/Util/LogAnnotation.d.ts.map +1 -0
- package/lib/Util/LogAnnotation.js +19 -0
- package/lib/Util/LogAnnotation.js.map +1 -0
- package/lib/Util/LogRecord.d.ts +281 -0
- package/lib/Util/LogRecord.d.ts.map +1 -0
- package/lib/Util/LogRecord.js +267 -0
- package/lib/Util/LogRecord.js.map +1 -0
- package/lib/Util/Node.d.ts +9 -0
- package/lib/Util/Node.d.ts.map +1 -1
- package/lib/Util/Node.js +10 -6
- package/lib/Util/Node.js.map +1 -1
- package/lib/Util/PlatformServices.d.ts +3 -2
- package/lib/Util/PlatformServices.d.ts.map +1 -1
- package/lib/Util/PlatformServices.js +6 -2
- package/lib/Util/PlatformServices.js.map +1 -1
- package/lib/Util/ResourceOutput.d.ts +18 -10
- package/lib/Util/ResourceOutput.d.ts.map +1 -1
- package/lib/Util/ResourceOutput.js +22 -23
- package/lib/Util/ResourceOutput.js.map +1 -1
- package/lib/Util/Shutdown.d.ts +10 -0
- package/lib/Util/Shutdown.d.ts.map +1 -0
- package/lib/Util/Shutdown.js +32 -0
- package/lib/Util/Shutdown.js.map +1 -0
- package/lib/Util/Terminal.d.ts +2 -4
- package/lib/Util/Terminal.d.ts.map +1 -1
- package/lib/Util/Terminal.js +3 -11
- package/lib/Util/Terminal.js.map +1 -1
- package/lib/Util/TraceParent.d.ts +32 -0
- package/lib/Util/TraceParent.d.ts.map +1 -0
- package/lib/Util/TraceParent.js +42 -0
- package/lib/Util/TraceParent.js.map +1 -0
- package/lib/Util/base64.d.ts +7 -0
- package/lib/Util/base64.d.ts.map +1 -0
- package/lib/Util/base64.js +24 -0
- package/lib/Util/base64.js.map +1 -0
- package/lib/Util/cached-function.d.ts +5 -0
- package/lib/Util/cached-function.d.ts.map +1 -1
- package/lib/Util/cached-function.js +13 -8
- package/lib/Util/cached-function.js.map +1 -1
- package/lib/Util/data.d.ts +1 -1
- package/lib/Util/data.d.ts.map +1 -1
- package/lib/Util/data.js +1 -1
- package/lib/Util/data.js.map +1 -1
- package/lib/Util/equal.d.ts.map +1 -1
- package/lib/Util/equal.js +3 -2
- package/lib/Util/equal.js.map +1 -1
- package/lib/Util/extraFiles.d.ts.map +1 -1
- package/lib/Util/extraFiles.js +5 -5
- package/lib/Util/extraFiles.js.map +1 -1
- package/lib/Util/interactive.js +1 -1
- package/lib/Website/AstroOutput.d.ts +42 -0
- package/lib/Website/AstroOutput.d.ts.map +1 -0
- package/lib/Website/AstroOutput.js +34 -0
- package/lib/Website/AstroOutput.js.map +1 -0
- package/lib/Website/FrontendCore.d.ts +1 -1
- package/lib/Workflows.d.ts +9 -0
- package/lib/Workflows.d.ts.map +1 -1
- package/lib/Workflows.js +8 -0
- package/lib/Workflows.js.map +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- package/package.json +21 -28
- package/src/AdoptPolicy.ts +76 -0
- package/src/Alchemist/AuthRegistry.ts +164 -0
- package/src/Alchemist/Drift.ts +103 -0
- package/src/Alchemist/Entrypoint.ts +51 -3
- package/src/Alchemist/Errors.ts +1 -1
- package/src/Alchemist/{routes/logs.ts → Logs.ts} +28 -30
- package/src/Alchemist/Nuke.ts +90 -0
- package/src/Alchemist/Operations.ts +309 -0
- package/src/Alchemist/{routes/profile.ts → Profile.ts} +22 -22
- package/src/Alchemist/{routes/provider.ts → Provider.ts} +7 -6
- package/src/Alchemist/Runtime.ts +46 -12
- package/src/Alchemist/{routes/state.ts → State.ts} +78 -21
- package/src/Alchemist/index.ts +32 -15
- package/src/Apply.ts +513 -274
- package/src/Auth/AuthProvider.ts +76 -23
- package/src/Auth/BrowserOAuth.ts +37 -60
- package/src/Auth/Credentials.ts +2 -4
- package/src/Auth/Demand.ts +27 -18
- package/src/Auth/Env.ts +13 -8
- package/src/Auth/Inspect.ts +5 -2
- package/src/Auth/Lock.ts +4 -8
- package/src/Auth/OAuthFlow.ts +12 -26
- package/src/Auth/Paths.ts +3 -2
- package/src/Auth/Profile.ts +30 -2
- package/src/Auth/Registry.ts +27 -0
- package/src/Auth/Resolve.ts +75 -3
- package/src/Auth/StoredAuthProvider.ts +1 -2
- package/src/Binding.ts +3 -4
- package/src/Bundle/Bundle.ts +58 -7
- package/src/Bundle/NamespaceImportPlugin.ts +259 -0
- package/src/Bundle/index.ts +1 -0
- package/src/Cli/Format.ts +2 -1
- package/src/Cli/GlobalLog.ts +206 -68
- package/src/Cli/LoggingCli.ts +33 -20
- package/src/Cli/PlainCliFormatter.ts +4 -1
- package/src/Cli/Present.ts +34 -0
- package/src/Cli/SigilRenderer.ts +75 -0
- package/src/Cli/checkVersion.ts +25 -78
- package/src/Cli/commands/confirm.ts +3 -3
- package/src/Cli/commands/deploy.ts +53 -44
- package/src/Cli/commands/dev.ts +65 -7
- package/src/Cli/commands/drift.ts +20 -16
- package/src/Cli/commands/errors.ts +2 -3
- package/src/Cli/commands/instrument.ts +39 -8
- package/src/Cli/commands/logs.ts +22 -30
- package/src/Cli/commands/nuke.ts +25 -26
- package/src/Cli/commands/profile/commands.ts +34 -34
- package/src/Cli/commands/profile/flows.ts +26 -20
- package/src/Cli/commands/profile/hub.ts +16 -18
- package/src/Cli/commands/provider.ts +4 -4
- package/src/Cli/commands/render.ts +43 -71
- package/src/Cli/commands/state.ts +113 -33
- package/src/Cli/components/capabilities.ts +20 -0
- package/src/Cli/components/types.ts +13 -99
- package/src/Cli/components/ui/Environment.tsx +5 -5
- package/src/Cli/components/ui/Interactive.tsx +24 -15
- package/src/Cli/components/ui/Layout.tsx +1 -1
- package/src/Cli/components/ui/Typography.tsx +1 -1
- package/src/Cli/components/ui/index.ts +2 -2
- package/src/Cli/components/view/ApprovePlan.tsx +2 -1
- package/src/Cli/components/view/Format.tsx +58 -0
- package/src/Cli/components/view/Help.tsx +14 -17
- package/src/Cli/components/view/Logo.tsx +1 -1
- package/src/Cli/components/view/Nuke.tsx +74 -49
- package/src/Cli/components/view/PlanDecision.tsx +1 -1
- package/src/Cli/components/view/PlanRow.tsx +1 -1
- package/src/Cli/components/view/PlanTree.ts +2 -2
- package/src/Cli/components/view/PlanView.tsx +2 -2
- package/src/Cli/components/view/Profile.tsx +2 -2
- package/src/Cli/components/view/ProfileDashboard.tsx +12 -11
- package/src/Cli/components/view/Prompts.tsx +37 -75
- package/src/Cli/components/view/Runtime.tsx +132 -238
- package/src/Cli/components/view/SigilCli.tsx +12 -12
- package/src/Cli/components/view/StateExplorer.tsx +2 -1
- package/src/Cli/components/view/statusStyle.ts +2 -2
- package/src/Cli/exec.ts +48 -41
- package/src/Cli/main.ts +52 -33
- package/src/Cli/selectCli.ts +3 -3
- package/src/Command/Command.ts +1 -1
- package/src/Command/Dev.ts +129 -36
- package/src/Command/Memo.ts +1 -1
- package/src/Contributions.ts +42 -8
- package/src/DNS/Adapter.ts +289 -0
- package/src/DNS/index.ts +1 -0
- package/src/Deploy.ts +11 -3
- package/src/Destroy.ts +19 -13
- package/src/Diff.ts +17 -4
- package/src/Drift.ts +256 -127
- package/src/EvalStack.ts +97 -0
- package/src/Events.ts +296 -0
- package/src/Interaction.ts +332 -97
- package/src/Local/LocalProvider.ts +40 -9
- package/src/Local/RpcProvider.ts +11 -1
- package/src/Local/RpcProviderProxy.ts +29 -21
- package/src/Local/RpcSerialization.ts +32 -17
- package/src/Local/RpcServer.ts +25 -17
- package/src/Local/RpcServerBun.ts +10 -6
- package/src/Local/RpcServerEnvironment.ts +2 -2
- package/src/Local/RpcServerNode.ts +8 -1
- package/src/Local/RpcServerSession.ts +2 -2
- package/src/Local/RpcSpawner.ts +61 -37
- package/src/Local/Sidecar.ts +10 -1
- package/src/Nuke.ts +66 -43
- package/src/Output.ts +120 -7
- package/src/Plan.ts +140 -52
- package/src/Platform.ts +47 -18
- package/src/Provider.ts +48 -3
- package/src/Report.ts +77 -275
- package/src/Runtime/ManagedHttpShutdown.ts +21 -4
- package/src/RuntimeContext.ts +1 -1
- package/src/Stack.ts +113 -135
- package/src/State/BucketState.ts +53 -21
- package/src/State/LocalState.ts +7 -9
- package/src/State/Provisioning.ts +8 -1
- package/src/State/ResourceState.ts +2 -0
- package/src/State/State.ts +30 -0
- package/src/State/StateEncoding.ts +22 -0
- package/src/State/index.ts +2 -2
- package/src/Telemetry/Layer.ts +3 -24
- package/src/Telemetry/Metrics.ts +1 -1
- package/src/TelemetryRelay.ts +1 -1
- package/src/TelemetryRuntime.ts +8 -8
- package/src/Util/ConsoleSink.ts +76 -13
- package/src/Util/LogAnnotation.ts +18 -0
- package/src/Util/LogRecord.ts +386 -0
- package/src/Util/Node.ts +20 -6
- package/src/Util/PlatformServices.ts +17 -4
- package/src/Util/ResourceOutput.ts +26 -25
- package/src/Util/Shutdown.ts +52 -0
- package/src/Util/Terminal.ts +3 -20
- package/src/Util/TraceParent.ts +70 -0
- package/src/Util/base64.ts +22 -0
- package/src/Util/cached-function.ts +30 -19
- package/src/Util/data.ts +2 -2
- package/src/Util/equal.ts +3 -2
- package/src/Util/extraFiles.ts +9 -8
- package/src/Util/interactive.ts +1 -1
- package/src/Website/AstroOutput.ts +83 -0
- package/src/Workflows.ts +11 -0
- package/src/index.ts +1 -0
- package/lib/Alchemist/Progress.d.ts +0 -16
- package/lib/Alchemist/Progress.d.ts.map +0 -1
- package/lib/Alchemist/Progress.js +0 -123
- package/lib/Alchemist/Progress.js.map +0 -1
- package/lib/Alchemist/Session.d.ts +0 -116
- package/lib/Alchemist/Session.d.ts.map +0 -1
- package/lib/Alchemist/Session.js +0 -212
- package/lib/Alchemist/Session.js.map +0 -1
- package/lib/Alchemist/routes/drift.d.ts +0 -55
- package/lib/Alchemist/routes/drift.d.ts.map +0 -1
- package/lib/Alchemist/routes/drift.js +0 -52
- package/lib/Alchemist/routes/drift.js.map +0 -1
- package/lib/Alchemist/routes/logs.d.ts +0 -41
- package/lib/Alchemist/routes/logs.d.ts.map +0 -1
- package/lib/Alchemist/routes/logs.js.map +0 -1
- package/lib/Alchemist/routes/nuke.d.ts +0 -46
- package/lib/Alchemist/routes/nuke.d.ts.map +0 -1
- package/lib/Alchemist/routes/nuke.js +0 -80
- package/lib/Alchemist/routes/nuke.js.map +0 -1
- package/lib/Alchemist/routes/profile.d.ts +0 -133
- package/lib/Alchemist/routes/profile.d.ts.map +0 -1
- package/lib/Alchemist/routes/profile.js.map +0 -1
- package/lib/Alchemist/routes/provider.d.ts.map +0 -1
- package/lib/Alchemist/routes/provider.js.map +0 -1
- package/lib/Alchemist/routes/stack.d.ts +0 -95
- package/lib/Alchemist/routes/stack.d.ts.map +0 -1
- package/lib/Alchemist/routes/stack.js +0 -73
- package/lib/Alchemist/routes/stack.js.map +0 -1
- package/lib/Alchemist/routes/state.d.ts.map +0 -1
- package/lib/Alchemist/routes/state.js.map +0 -1
- package/lib/Cli/CliKit/CliKit.d.ts +0 -92
- package/lib/Cli/CliKit/CliKit.d.ts.map +0 -1
- package/lib/Cli/CliKit/CliKit.js +0 -27
- package/lib/Cli/CliKit/CliKit.js.map +0 -1
- package/lib/Cli/CliKit/index.d.ts +0 -9
- package/lib/Cli/CliKit/index.d.ts.map +0 -1
- package/lib/Cli/CliKit/index.js +0 -9
- package/lib/Cli/CliKit/index.js.map +0 -1
- package/lib/Cli/CliKit/interaction.d.ts +0 -13
- package/lib/Cli/CliKit/interaction.d.ts.map +0 -1
- package/lib/Cli/CliKit/interaction.js +0 -17
- package/lib/Cli/CliKit/interaction.js.map +0 -1
- package/lib/Cli/CliKit/layer.d.ts +0 -7
- package/lib/Cli/CliKit/layer.d.ts.map +0 -1
- package/lib/Cli/CliKit/layer.js +0 -33
- package/lib/Cli/CliKit/layer.js.map +0 -1
- package/lib/Local/DevLog.d.ts +0 -32
- package/lib/Local/DevLog.d.ts.map +0 -1
- package/lib/Local/DevLog.js +0 -112
- package/lib/Local/DevLog.js.map +0 -1
- package/lib/Test/Alchemy.d.ts +0 -79
- package/lib/Test/Alchemy.d.ts.map +0 -1
- package/lib/Test/Alchemy.js +0 -193
- package/lib/Test/Alchemy.js.map +0 -1
- package/lib/Test/Bun.d.ts +0 -69
- package/lib/Test/Bun.d.ts.map +0 -1
- package/lib/Test/Bun.js +0 -126
- package/lib/Test/Bun.js.map +0 -1
- package/lib/Test/Core.d.ts +0 -277
- package/lib/Test/Core.d.ts.map +0 -1
- package/lib/Test/Core.js +0 -362
- package/lib/Test/Core.js.map +0 -1
- package/lib/Test/Http.d.ts +0 -109
- package/lib/Test/Http.d.ts.map +0 -1
- package/lib/Test/Http.js +0 -123
- package/lib/Test/Http.js.map +0 -1
- package/lib/Test/TestState.d.ts +0 -12
- package/lib/Test/TestState.d.ts.map +0 -1
- package/lib/Test/TestState.js +0 -15
- package/lib/Test/TestState.js.map +0 -1
- package/lib/Test/Vitest.d.ts +0 -60
- package/lib/Test/Vitest.d.ts.map +0 -1
- package/lib/Test/Vitest.js +0 -132
- package/lib/Test/Vitest.js.map +0 -1
- package/lib/Test/index.d.ts +0 -3
- package/lib/Test/index.d.ts.map +0 -1
- package/lib/Test/index.js +0 -3
- package/lib/Test/index.js.map +0 -1
- package/lib/Util/FileLogger.d.ts +0 -7
- package/lib/Util/FileLogger.d.ts.map +0 -1
- package/lib/Util/FileLogger.js +0 -16
- package/lib/Util/FileLogger.js.map +0 -1
- package/src/Alchemist/Progress.ts +0 -167
- package/src/Alchemist/Session.ts +0 -415
- package/src/Alchemist/routes/drift.ts +0 -87
- package/src/Alchemist/routes/nuke.ts +0 -131
- package/src/Alchemist/routes/stack.ts +0 -173
- package/src/Cli/CliKit/CliKit.ts +0 -159
- package/src/Cli/CliKit/index.ts +0 -41
- package/src/Cli/CliKit/interaction.ts +0 -19
- package/src/Cli/CliKit/layer.ts +0 -44
- package/src/Local/DevLog.ts +0 -122
- package/src/Test/Alchemy.ts +0 -334
- package/src/Test/Bun.ts +0 -230
- package/src/Test/Core.ts +0 -785
- package/src/Test/Http.ts +0 -201
- package/src/Test/TestState.ts +0 -35
- package/src/Test/Vitest.ts +0 -239
- package/src/Test/index.ts +0 -2
- package/src/Util/FileLogger.ts +0 -20
package/src/Local/DevLog.ts
DELETED
|
@@ -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
|
-
});
|
package/src/Test/Alchemy.ts
DELETED
|
@@ -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
|
-
};
|