alchemy 2.0.0-beta.64 → 2.0.0-beta.65

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 (165) hide show
  1. package/lib/AWS/EC2/InternetGateway.d.ts.map +1 -1
  2. package/lib/AWS/EC2/InternetGateway.js +8 -3
  3. package/lib/AWS/EC2/InternetGateway.js.map +1 -1
  4. package/lib/AWS/EC2/LingeringEnis.d.ts +26 -0
  5. package/lib/AWS/EC2/LingeringEnis.d.ts.map +1 -0
  6. package/lib/AWS/EC2/LingeringEnis.js +128 -0
  7. package/lib/AWS/EC2/LingeringEnis.js.map +1 -0
  8. package/lib/AWS/EC2/SecurityGroup.d.ts.map +1 -1
  9. package/lib/AWS/EC2/SecurityGroup.js +14 -14
  10. package/lib/AWS/EC2/SecurityGroup.js.map +1 -1
  11. package/lib/AWS/EC2/Subnet.d.ts.map +1 -1
  12. package/lib/AWS/EC2/Subnet.js +13 -21
  13. package/lib/AWS/EC2/Subnet.js.map +1 -1
  14. package/lib/AWS/ECR/Image.d.ts +1 -0
  15. package/lib/AWS/ECR/Image.d.ts.map +1 -1
  16. package/lib/AWS/EKS/Addon.d.ts.map +1 -1
  17. package/lib/AWS/EKS/Addon.js +15 -3
  18. package/lib/AWS/EKS/Addon.js.map +1 -1
  19. package/lib/AWS/EKS/Deployment.d.ts +10 -1
  20. package/lib/AWS/EKS/Deployment.d.ts.map +1 -1
  21. package/lib/AWS/EKS/Deployment.js +10 -4
  22. package/lib/AWS/EKS/Deployment.js.map +1 -1
  23. package/lib/AWS/EKS/HyperPod.d.ts +57 -0
  24. package/lib/AWS/EKS/HyperPod.d.ts.map +1 -0
  25. package/lib/AWS/EKS/HyperPod.js +46 -0
  26. package/lib/AWS/EKS/HyperPod.js.map +1 -0
  27. package/lib/AWS/EKS/Job.d.ts +10 -1
  28. package/lib/AWS/EKS/Job.d.ts.map +1 -1
  29. package/lib/AWS/EKS/Job.js +16 -6
  30. package/lib/AWS/EKS/Job.js.map +1 -1
  31. package/lib/AWS/EKS/internal/client.d.ts +4 -3
  32. package/lib/AWS/EKS/internal/client.d.ts.map +1 -1
  33. package/lib/AWS/EKS/internal/client.js +33 -2
  34. package/lib/AWS/EKS/internal/client.js.map +1 -1
  35. package/lib/AWS/Lambda/Function.d.ts.map +1 -1
  36. package/lib/AWS/Lambda/Function.js +1 -1
  37. package/lib/AWS/Lambda/Function.js.map +1 -1
  38. package/lib/AWS/Providers.d.ts.map +1 -1
  39. package/lib/AWS/Providers.js +4 -1
  40. package/lib/AWS/Providers.js.map +1 -1
  41. package/lib/AWS/SageMaker/Cluster.d.ts +327 -0
  42. package/lib/AWS/SageMaker/Cluster.d.ts.map +1 -0
  43. package/lib/AWS/SageMaker/Cluster.js +469 -0
  44. package/lib/AWS/SageMaker/Cluster.js.map +1 -0
  45. package/lib/AWS/SageMaker/ClusterSchedulerConfig.d.ts +96 -0
  46. package/lib/AWS/SageMaker/ClusterSchedulerConfig.d.ts.map +1 -0
  47. package/lib/AWS/SageMaker/ClusterSchedulerConfig.js +270 -0
  48. package/lib/AWS/SageMaker/ClusterSchedulerConfig.js.map +1 -0
  49. package/lib/AWS/SageMaker/ComputeQuota.d.ts +106 -0
  50. package/lib/AWS/SageMaker/ComputeQuota.d.ts.map +1 -0
  51. package/lib/AWS/SageMaker/ComputeQuota.js +268 -0
  52. package/lib/AWS/SageMaker/ComputeQuota.js.map +1 -0
  53. package/lib/AWS/SageMaker/index.d.ts +3 -0
  54. package/lib/AWS/SageMaker/index.d.ts.map +1 -1
  55. package/lib/AWS/SageMaker/index.js +3 -0
  56. package/lib/AWS/SageMaker/index.js.map +1 -1
  57. package/lib/Bundle/PurePlugin.d.ts +29 -7
  58. package/lib/Bundle/PurePlugin.d.ts.map +1 -1
  59. package/lib/Bundle/PurePlugin.js +56 -33
  60. package/lib/Bundle/PurePlugin.js.map +1 -1
  61. package/lib/Cli/commands/nuke.d.ts.map +1 -1
  62. package/lib/Cli/commands/nuke.js +231 -37
  63. package/lib/Cli/commands/nuke.js.map +1 -1
  64. package/lib/Cloudflare/StateStore/Api.d.ts +1 -1
  65. package/lib/Cloudflare/Workers/Assets.d.ts +26 -8
  66. package/lib/Cloudflare/Workers/Assets.d.ts.map +1 -1
  67. package/lib/Cloudflare/Workers/Assets.js +46 -1
  68. package/lib/Cloudflare/Workers/Assets.js.map +1 -1
  69. package/lib/Cloudflare/Workers/LocalWorkerProvider.d.ts +2 -2
  70. package/lib/Cloudflare/Workers/LocalWorkerProvider.d.ts.map +1 -1
  71. package/lib/Cloudflare/Workers/LocalWorkerProvider.js +39 -6
  72. package/lib/Cloudflare/Workers/LocalWorkerProvider.js.map +1 -1
  73. package/lib/Cloudflare/Workers/Worker.d.ts +7 -5
  74. package/lib/Cloudflare/Workers/Worker.d.ts.map +1 -1
  75. package/lib/Cloudflare/Workers/Worker.js +0 -1
  76. package/lib/Cloudflare/Workers/Worker.js.map +1 -1
  77. package/lib/Cloudflare/Workers/WorkerBinding.d.ts +2 -2
  78. package/lib/Cloudflare/Workers/WorkerBundle.d.ts +20 -1
  79. package/lib/Cloudflare/Workers/WorkerBundle.d.ts.map +1 -1
  80. package/lib/Cloudflare/Workers/WorkerBundle.js +11 -0
  81. package/lib/Cloudflare/Workers/WorkerBundle.js.map +1 -1
  82. package/lib/Cloudflare/Workers/WorkerProvider.d.ts.map +1 -1
  83. package/lib/Cloudflare/Workers/WorkerProvider.js +10 -4
  84. package/lib/Cloudflare/Workers/WorkerProvider.js.map +1 -1
  85. package/lib/Cloudflare/Workflows/WorkflowBridge.d.ts +2 -1
  86. package/lib/Cloudflare/Workflows/WorkflowBridge.d.ts.map +1 -1
  87. package/lib/Cloudflare/Workflows/WorkflowBridge.js +5 -5
  88. package/lib/Cloudflare/Workflows/WorkflowBridge.js.map +1 -1
  89. package/lib/Cloudflare/Workflows/index.d.ts +1 -1
  90. package/lib/Cloudflare/Workflows/index.d.ts.map +1 -1
  91. package/lib/Cloudflare/Workflows/index.js +1 -1
  92. package/lib/Cloudflare/Workflows/index.js.map +1 -1
  93. package/lib/Docker/Container.d.ts +26 -0
  94. package/lib/Docker/Container.d.ts.map +1 -1
  95. package/lib/Docker/Container.js +20 -1
  96. package/lib/Docker/Container.js.map +1 -1
  97. package/lib/Docker/Docker.d.ts +2 -0
  98. package/lib/Docker/Docker.d.ts.map +1 -1
  99. package/lib/Docker/Docker.js.map +1 -1
  100. package/lib/Output.d.ts +4 -1
  101. package/lib/Output.d.ts.map +1 -1
  102. package/lib/Output.js.map +1 -1
  103. package/lib/Provider.d.ts +20 -0
  104. package/lib/Provider.d.ts.map +1 -1
  105. package/lib/Provider.js.map +1 -1
  106. package/lib/Random.d.ts +1 -1
  107. package/lib/Random.d.ts.map +1 -1
  108. package/lib/Resource.d.ts +14 -1
  109. package/lib/Resource.d.ts.map +1 -1
  110. package/lib/Resource.js.map +1 -1
  111. package/lib/SQL/D1.d.ts +1 -1
  112. package/lib/SQL/D1.js +1 -1
  113. package/lib/SQL/Postgres.d.ts +1 -1
  114. package/lib/SQL/Postgres.js +1 -1
  115. package/lib/State/HttpStateApi.d.ts +11 -11
  116. package/lib/Test/Alchemy.d.ts +1 -1
  117. package/lib/Test/Alchemy.js +1 -1
  118. package/lib/Test/Vitest.d.ts +58 -0
  119. package/lib/Test/Vitest.d.ts.map +1 -0
  120. package/lib/Test/Vitest.js +114 -0
  121. package/lib/Test/Vitest.js.map +1 -0
  122. package/lib/Util/proxy-chain.d.ts +5 -0
  123. package/lib/Util/proxy-chain.d.ts.map +1 -1
  124. package/lib/Util/proxy-chain.js +52 -4
  125. package/lib/Util/proxy-chain.js.map +1 -1
  126. package/package.json +23 -15
  127. package/src/AWS/EC2/InternetGateway.ts +8 -3
  128. package/src/AWS/EC2/LingeringEnis.ts +169 -0
  129. package/src/AWS/EC2/SecurityGroup.ts +24 -28
  130. package/src/AWS/EC2/Subnet.ts +23 -34
  131. package/src/AWS/EKS/Addon.ts +17 -4
  132. package/src/AWS/EKS/Deployment.ts +26 -5
  133. package/src/AWS/EKS/HyperPod.ts +97 -0
  134. package/src/AWS/EKS/Job.ts +32 -7
  135. package/src/AWS/EKS/internal/client.ts +40 -3
  136. package/src/AWS/Lambda/Function.ts +5 -3
  137. package/src/AWS/Providers.ts +6 -0
  138. package/src/AWS/SageMaker/Cluster.ts +775 -0
  139. package/src/AWS/SageMaker/ClusterSchedulerConfig.ts +430 -0
  140. package/src/AWS/SageMaker/ComputeQuota.ts +426 -0
  141. package/src/AWS/SageMaker/index.ts +3 -0
  142. package/src/Bundle/PurePlugin.ts +92 -39
  143. package/src/Cli/commands/nuke.ts +295 -56
  144. package/src/Cloudflare/Workers/Assets.ts +53 -1
  145. package/src/Cloudflare/Workers/LocalWorkerProvider.ts +46 -7
  146. package/src/Cloudflare/Workers/Worker.ts +7 -5
  147. package/src/Cloudflare/Workers/WorkerBundle.ts +31 -1
  148. package/src/Cloudflare/Workers/WorkerProvider.ts +18 -4
  149. package/src/Cloudflare/Workflows/WorkflowBridge.ts +5 -5
  150. package/src/Cloudflare/Workflows/index.ts +1 -1
  151. package/src/Docker/Container.ts +30 -1
  152. package/src/Docker/Docker.ts +2 -0
  153. package/src/Output.ts +19 -11
  154. package/src/Provider.ts +20 -0
  155. package/src/Resource.ts +18 -1
  156. package/src/SQL/D1.ts +1 -1
  157. package/src/SQL/Postgres.ts +1 -1
  158. package/src/Test/Alchemy.ts +1 -1
  159. package/src/Test/Vitest.ts +244 -0
  160. package/src/Util/proxy-chain.ts +73 -4
  161. package/lib/SQL/index.d.ts +0 -4
  162. package/lib/SQL/index.d.ts.map +0 -1
  163. package/lib/SQL/index.js +0 -4
  164. package/lib/SQL/index.js.map +0 -1
  165. package/src/SQL/index.ts +0 -3
@@ -107,33 +107,33 @@ export declare const VersionResponse: Schema.Struct<{
107
107
  export declare const GetVersion: HttpApiEndpoint.HttpApiEndpoint<"getVersion", "GET", "/version", never, never, never, never, Schema.toCodecJson<Schema.Struct<{
108
108
  readonly version: Schema.Number;
109
109
  }>>, never, never, never>;
110
- declare const StateGroup_base: HttpApiGroup.HttpApiGroup<"state", HttpApiEndpoint.HttpApiEndpoint<"listStacks", "GET", "/state/stacks", never, never, never, never, Schema.toCodecJson<Schema.$Array<Schema.String>>, never, StateAuth, BearerTokenValidator> | HttpApiEndpoint.HttpApiEndpoint<"deleteStack", "DELETE", "/state/stacks/:stack", Schema.toCodecStringTree<Schema.Struct<{
110
+ declare const StateGroup_base: HttpApiGroup.HttpApiGroup<"state", HttpApiEndpoint.HttpApiEndpoint<"deleteStack", "DELETE", "/state/stacks/:stack", Schema.toCodecStringTree<Schema.Struct<{
111
111
  readonly stack: Schema.String;
112
112
  }>>, Schema.toCodecStringTree<Schema.Struct<{
113
113
  readonly stage: Schema.optional<Schema.String>;
114
- }>>, never, never, Schema.toCodecJson<HttpApiSchema.NoContent>, never, StateAuth, BearerTokenValidator> | HttpApiEndpoint.HttpApiEndpoint<"listStages", "GET", "/state/stacks/:stack/stages", Schema.toCodecStringTree<Schema.Struct<{
114
+ }>>, never, never, Schema.toCodecJson<HttpApiSchema.NoContent>, never, StateAuth, BearerTokenValidator> | HttpApiEndpoint.HttpApiEndpoint<"deleteState", "DELETE", "/state/stacks/:stack/stages/:stage/resources/:fqn", Schema.toCodecStringTree<Schema.Struct<{
115
115
  readonly stack: Schema.String;
116
- }>>, never, never, never, Schema.toCodecJson<Schema.$Array<Schema.String>>, never, StateAuth, BearerTokenValidator> | HttpApiEndpoint.HttpApiEndpoint<"getReplacedResources", "GET", "/state/stacks/:stack/stages/:stage/replaced-resources", Schema.toCodecStringTree<Schema.Struct<{
116
+ readonly stage: Schema.String;
117
+ readonly fqn: Schema.String;
118
+ }>>, never, never, never, Schema.toCodecJson<HttpApiSchema.NoContent>, never, StateAuth, BearerTokenValidator> | HttpApiEndpoint.HttpApiEndpoint<"getReplacedResources", "GET", "/state/stacks/:stack/stages/:stage/replaced-resources", Schema.toCodecStringTree<Schema.Struct<{
117
119
  readonly stack: Schema.String;
118
120
  readonly stage: Schema.String;
119
121
  }>>, never, never, never, Schema.toCodecJson<Schema.$Array<Schema.Any>>, never, StateAuth, BearerTokenValidator> | HttpApiEndpoint.HttpApiEndpoint<"getStackOutput", "GET", "/state/stacks/:stack/stages/:stage/output", Schema.toCodecStringTree<Schema.Struct<{
120
122
  readonly stack: Schema.String;
121
123
  readonly stage: Schema.String;
122
- }>>, never, never, never, Schema.toCodecJson<Schema.UndefinedOr<Schema.Any>>, never, StateAuth, BearerTokenValidator> | HttpApiEndpoint.HttpApiEndpoint<"listResources", "GET", "/state/stacks/:stack/stages/:stage/resources", Schema.toCodecStringTree<Schema.Struct<{
124
+ }>>, never, never, never, Schema.toCodecJson<Schema.UndefinedOr<Schema.Any>>, never, StateAuth, BearerTokenValidator> | HttpApiEndpoint.HttpApiEndpoint<"getState", "GET", "/state/stacks/:stack/stages/:stage/resources/:fqn", Schema.toCodecStringTree<Schema.Struct<{
123
125
  readonly stack: Schema.String;
124
126
  readonly stage: Schema.String;
125
- }>>, never, never, never, Schema.toCodecJson<Schema.$Array<Schema.String>>, never, StateAuth, BearerTokenValidator> | HttpApiEndpoint.HttpApiEndpoint<"setStackOutput", "PUT", "/state/stacks/:stack/stages/:stage/output", Schema.toCodecStringTree<Schema.Struct<{
127
+ readonly fqn: Schema.String;
128
+ }>>, never, never, never, Schema.toCodecJson<Schema.UndefinedOr<Schema.Any>>, never, StateAuth, BearerTokenValidator> | HttpApiEndpoint.HttpApiEndpoint<"listResources", "GET", "/state/stacks/:stack/stages/:stage/resources", Schema.toCodecStringTree<Schema.Struct<{
126
129
  readonly stack: Schema.String;
127
130
  readonly stage: Schema.String;
128
- }>>, never, Schema.toCodecJson<Schema.Any>, never, Schema.toCodecJson<Schema.Any>, never, StateAuth, BearerTokenValidator> | HttpApiEndpoint.HttpApiEndpoint<"deleteState", "DELETE", "/state/stacks/:stack/stages/:stage/resources/:fqn", Schema.toCodecStringTree<Schema.Struct<{
131
+ }>>, never, never, never, Schema.toCodecJson<Schema.$Array<Schema.String>>, never, StateAuth, BearerTokenValidator> | HttpApiEndpoint.HttpApiEndpoint<"listStacks", "GET", "/state/stacks", never, never, never, never, Schema.toCodecJson<Schema.$Array<Schema.String>>, never, StateAuth, BearerTokenValidator> | HttpApiEndpoint.HttpApiEndpoint<"listStages", "GET", "/state/stacks/:stack/stages", Schema.toCodecStringTree<Schema.Struct<{
129
132
  readonly stack: Schema.String;
130
- readonly stage: Schema.String;
131
- readonly fqn: Schema.String;
132
- }>>, never, never, never, Schema.toCodecJson<HttpApiSchema.NoContent>, never, StateAuth, BearerTokenValidator> | HttpApiEndpoint.HttpApiEndpoint<"getState", "GET", "/state/stacks/:stack/stages/:stage/resources/:fqn", Schema.toCodecStringTree<Schema.Struct<{
133
+ }>>, never, never, never, Schema.toCodecJson<Schema.$Array<Schema.String>>, never, StateAuth, BearerTokenValidator> | HttpApiEndpoint.HttpApiEndpoint<"setStackOutput", "PUT", "/state/stacks/:stack/stages/:stage/output", Schema.toCodecStringTree<Schema.Struct<{
133
134
  readonly stack: Schema.String;
134
135
  readonly stage: Schema.String;
135
- readonly fqn: Schema.String;
136
- }>>, never, never, never, Schema.toCodecJson<Schema.UndefinedOr<Schema.Any>>, never, StateAuth, BearerTokenValidator> | HttpApiEndpoint.HttpApiEndpoint<"setState", "PUT", "/state/stacks/:stack/stages/:stage/resources/:fqn", Schema.toCodecStringTree<Schema.Struct<{
136
+ }>>, never, Schema.toCodecJson<Schema.Any>, never, Schema.toCodecJson<Schema.Any>, never, StateAuth, BearerTokenValidator> | HttpApiEndpoint.HttpApiEndpoint<"setState", "PUT", "/state/stacks/:stack/stages/:stage/resources/:fqn", Schema.toCodecStringTree<Schema.Struct<{
137
137
  readonly stack: Schema.String;
138
138
  readonly stage: Schema.String;
139
139
  readonly fqn: Schema.String;
@@ -2,7 +2,7 @@
2
2
  /**
3
3
  * Test adapter for the `alchemy-test` runner (see `packages/alchemy-test`).
4
4
  *
5
- * Same shape as {@link "./Bun.ts"}, but registers
5
+ * Same shape as {@link "./Vitest.ts"} / {@link "./Bun.ts"}, but registers
6
6
  * tests as raw Effects with the alchemy-test harness so the single-process
7
7
  * runner can inject a buffering Logger/Console per test and manage
8
8
  * concurrency + timeouts itself.
@@ -2,7 +2,7 @@
2
2
  /**
3
3
  * Test adapter for the `alchemy-test` runner (see `packages/alchemy-test`).
4
4
  *
5
- * Same shape as {@link "./Bun.ts"}, but registers
5
+ * Same shape as {@link "./Vitest.ts"} / {@link "./Bun.ts"}, but registers
6
6
  * tests as raw Effects with the alchemy-test harness so the single-process
7
7
  * runner can inject a buffering Logger/Console per test and manage
8
8
  * concurrency + timeouts itself.
@@ -0,0 +1,58 @@
1
+ import * as Effect from "effect/Effect";
2
+ import type { AlchemyContext } from "../AlchemyContext.ts";
3
+ import type { CompiledStack } from "../Stack.ts";
4
+ import type { Stage } from "../Stage.ts";
5
+ import * as Core from "./Core.ts";
6
+ export { executeWhenReady, getWhenReady, guardContentType, guardedFetchLayer, rpcClientLayer, WorkerNotReady, type EdgeGuardOptions, type WhenReadyOptions, } from "./Http.ts";
7
+ export type MakeOptions<ROut = any> = Core.MakeOptions<ROut>;
8
+ export type ScratchStack = Core.ScratchStack;
9
+ export type TestEffect<A, R = never> = Core.TestEffect<A, R>;
10
+ type TestOptions = number | {
11
+ timeout?: number;
12
+ };
13
+ interface TestFn {
14
+ (name: string, eff: TestEffect<void>, options?: TestOptions): void;
15
+ skip: (name: string, eff: TestEffect<void>, options?: TestOptions) => void;
16
+ skipIf: (condition: boolean) => (name: string, eff: TestEffect<void>, options?: TestOptions) => void;
17
+ only: (name: string, eff: TestEffect<void>, options?: TestOptions) => void;
18
+ todo: (name: string, eff: TestEffect<void>, options?: TestOptions) => void;
19
+ provider: ProviderFn;
20
+ }
21
+ interface ProviderFn {
22
+ (name: string, fn: (stack: ScratchStack) => Effect.Effect<void, any, any>, options?: TestOptions): void;
23
+ skip: (name: string, fn: (stack: ScratchStack) => Effect.Effect<void, any, any>, options?: TestOptions) => void;
24
+ skipIf: (condition: boolean) => (name: string, fn: (stack: ScratchStack) => Effect.Effect<void, any, any>, options?: TestOptions) => void;
25
+ }
26
+ interface BeforeAllFn {
27
+ <A>(eff: TestEffect<A>, options?: TestOptions): Effect.Effect<A>;
28
+ }
29
+ interface BeforeEachFn {
30
+ (eff: TestEffect<void>, options?: TestOptions): void;
31
+ }
32
+ interface AfterAllFn {
33
+ (eff: TestEffect<any>, options?: TestOptions): void;
34
+ skipIf: (predicate: boolean) => (eff: TestEffect<any>, options?: TestOptions) => void;
35
+ }
36
+ interface AfterEachFn {
37
+ (eff: TestEffect<void>, options?: TestOptions): void;
38
+ }
39
+ export interface TestApi {
40
+ test: TestFn;
41
+ beforeAll: BeforeAllFn;
42
+ beforeEach: BeforeEachFn;
43
+ afterAll: AfterAllFn;
44
+ afterEach: AfterEachFn;
45
+ deploy: <A>(stack: TestEffect<CompiledStack<A>, Stage | AlchemyContext>, options?: {
46
+ stage?: string;
47
+ }) => ReturnType<typeof Core.deploy<A>>;
48
+ destroy: (stack: TestEffect<CompiledStack, Stage | AlchemyContext>, options?: {
49
+ stage?: string;
50
+ }) => ReturnType<typeof Core.destroy>;
51
+ }
52
+ /**
53
+ * Build the per-file test API. See {@link "./Bun.ts"} for the same shape
54
+ * over `bun:test`. Vitest variant uses `@effect/vitest`'s `it.live` so
55
+ * Effect-aware tests stay first-class.
56
+ */
57
+ export declare const make: <ROut = any>(options: MakeOptions<ROut>) => TestApi;
58
+ //# sourceMappingURL=Vitest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Vitest.d.ts","sourceRoot":"","sources":["../../src/Test/Vitest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,114 @@
1
+ /** @effect-diagnostics anyUnknownInErrorContext:off */
2
+ import { it } from "@effect/vitest";
3
+ import * as Effect from "effect/Effect";
4
+ import * as Exit from "effect/Exit";
5
+ import * as Scope from "effect/Scope";
6
+ import { afterAll as vitestAfterAll, afterEach as vitestAfterEach, beforeAll as vitestBeforeAll, beforeEach as vitestBeforeEach, } from "vitest";
7
+ import * as Core from "./Core.js";
8
+ export { executeWhenReady, getWhenReady, guardContentType, guardedFetchLayer, rpcClientLayer, WorkerNotReady, } from "./Http.js";
9
+ const timeoutOf = (opts) => typeof opts === "number" ? opts : opts?.timeout;
10
+ const DEFAULT_TIMEOUT = 120_000;
11
+ /**
12
+ * Build the per-file test API. See {@link "./Bun.ts"} for the same shape
13
+ * over `bun:test`. Vitest variant uses `@effect/vitest`'s `it.live` so
14
+ * Effect-aware tests stay first-class.
15
+ */
16
+ export const make = (options) => {
17
+ // See `Test/Bun.ts` for the rationale: the dev sidecar must outlive a
18
+ // single `runPromise` boundary, so all hooks share one scope that's only
19
+ // closed after `destroy(...)` runs.
20
+ const sharedScope = Scope.makeUnsafe("sequential");
21
+ const wrap = (eff) => Core.toEffect(eff, options, sharedScope);
22
+ const runEff = (eff) => Core.run(eff, options, sharedScope);
23
+ const test = ((name, eff, opts) => {
24
+ it.live(name, () => wrap(eff), timeoutOf(opts));
25
+ });
26
+ test.skip = (name, _eff, opts) => {
27
+ it.skip(name, () => { }, timeoutOf(opts));
28
+ };
29
+ test.skipIf = (condition) => (name, eff, opts) => {
30
+ if (condition) {
31
+ it.skip(name, () => { }, timeoutOf(opts));
32
+ }
33
+ else {
34
+ it.live(name, () => wrap(eff), timeoutOf(opts));
35
+ }
36
+ };
37
+ test.only = (name, eff, opts) => {
38
+ it.only(name, () => wrap(eff), timeoutOf(opts));
39
+ };
40
+ test.todo = (name, _eff, _opts) => {
41
+ it.todo(name);
42
+ };
43
+ const wrapProvider = (name, fn) => {
44
+ const scratch = Core.scratchStack(options, name);
45
+ // Guarantee teardown. `test.provider` has no built-in cleanup, so a body
46
+ // that fails (assertion, API error like a 409/Unauthorized) or is
47
+ // interrupted (vitest timeout) BEFORE its trailing `stack.destroy()` would
48
+ // otherwise leak every cloud resource it deployed: the scratch's in-memory
49
+ // state is discarded with the process, so no later run can reclaim the
50
+ // orphan (only an account-wide `nuke` can). `scratch.destroy()` is
51
+ // idempotent (empty-plan apply against the shared scratch state) — a no-op
52
+ // when the body already destroyed, and it reclaims the orphans otherwise.
53
+ // `Effect.ensuring` runs the finalizer on success, failure, AND interruption.
54
+ const body = Core.withProviders(fn(scratch), options, scratch.name).pipe(Effect.ensuring(scratch.destroy().pipe(Effect.ignore)));
55
+ return Core.toEffect(body, { ...options, state: scratch.state }, sharedScope);
56
+ };
57
+ const provider = ((name, fn, opts) => {
58
+ it.live(name, () => wrapProvider(name, fn), timeoutOf(opts));
59
+ });
60
+ provider.skip = (name, _fn, opts) => {
61
+ it.skip(name, () => { }, timeoutOf(opts));
62
+ };
63
+ provider.skipIf = (condition) => (name, fn, opts) => {
64
+ if (condition) {
65
+ it.skip(name, () => { }, timeoutOf(opts));
66
+ }
67
+ else {
68
+ it.live(name, () => wrapProvider(name, fn), timeoutOf(opts));
69
+ }
70
+ };
71
+ test.provider = provider;
72
+ const beforeAll = (eff, hookOptions) => {
73
+ let result;
74
+ vitestBeforeAll(() => runEff(eff).then((v) => (result = v)), timeoutOf(hookOptions) ?? DEFAULT_TIMEOUT);
75
+ return Effect.sync(() => result);
76
+ };
77
+ const beforeEach = (eff, hookOptions) => {
78
+ vitestBeforeEach(() => runEff(eff), timeoutOf(hookOptions));
79
+ };
80
+ const afterAll = ((eff, hookOptions) => {
81
+ vitestAfterAll(() => runEff(eff), timeoutOf(hookOptions) ?? DEFAULT_TIMEOUT);
82
+ });
83
+ afterAll.skipIf = (predicate) => (eff, hookOptions) => {
84
+ if (predicate)
85
+ return;
86
+ vitestAfterAll(() => runEff(eff), timeoutOf(hookOptions) ?? DEFAULT_TIMEOUT);
87
+ };
88
+ const afterEach = (eff, hookOptions) => {
89
+ vitestAfterEach(() => runEff(eff), timeoutOf(hookOptions));
90
+ };
91
+ // `destroy(Stack)` needs the dev sidecar alive so it can call `sidecar.stop`.
92
+ // `Scope.close` on an already-closed scope is a no-op, so the destroy
93
+ // wrapper AND the fallback cleanup hook below can both call it safely.
94
+ const closeScope = Effect.suspend(() => Scope.close(sharedScope, Exit.void)).pipe(Effect.ignore);
95
+ // Fallback cleanup: if the user never calls `destroy(Stack)` (e.g.
96
+ // `NO_DESTROY=1`), nothing else closes the shared scope and the sidecar
97
+ // child process leaks past the test process. Register an `afterAll` that
98
+ // closes it. We defer registration to a microtask so it runs AFTER any
99
+ // user-registered `afterAll` (including `destroy(Stack)`); vitest runs
100
+ // afterAll hooks in registration order.
101
+ queueMicrotask(() => {
102
+ vitestAfterAll(() => Effect.runPromise(closeScope), DEFAULT_TIMEOUT);
103
+ });
104
+ return {
105
+ test,
106
+ beforeAll,
107
+ beforeEach,
108
+ afterAll,
109
+ afterEach,
110
+ deploy: (stack, callOpts) => Core.deploy(options, stack, { ...callOpts, scope: sharedScope }),
111
+ destroy: (stack, callOpts) => Core.destroy(options, stack, { ...callOpts, scope: sharedScope }).pipe(Effect.ensuring(closeScope)),
112
+ };
113
+ };
114
+ //# sourceMappingURL=Vitest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Vitest.js","sourceRoot":"","sources":["../../src/Test/Vitest.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AACpC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,IAAI,MAAM,aAAa,CAAC;AACpC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,EACL,QAAQ,IAAI,cAAc,EAC1B,SAAS,IAAI,eAAe,EAC5B,SAAS,IAAI,eAAe,EAC5B,UAAU,IAAI,gBAAgB,GAC/B,MAAM,QAAQ,CAAC;AAKhB,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,cAAc,GAGf,MAAM,WAAW,CAAC;AAQnB,MAAM,SAAS,GAAG,CAAC,IAA6B,EAAsB,EAAE,CACtE,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC;AAoElD,MAAM,eAAe,GAAG,OAAO,CAAC;AAEhC;;;;GAIG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,CAAa,OAA0B,EAAW,EAAE;IACtE,sEAAsE;IACtE,yEAAyE;IACzE,oCAAoC;IACpC,MAAM,WAAW,GAAG,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,CAAI,GAAkB,EAAE,EAAE,CACrC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,CAAI,GAAkB,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;IAE9E,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAChC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IAClD,CAAC,CAAW,CAAC;IAEb,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QAC/B,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3C,CAAC,CAAC;IACF,IAAI,CAAC,MAAM,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC/C,IAAI,SAAS,EAAE,CAAC;YACd,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3C,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QAClD,CAAC;IACH,CAAC,CAAC;IACF,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC9B,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAuB,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IACxE,CAAC,CAAC;IACF,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;QAChC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,CACnB,IAAY,EACZ,EAA0D,EAC1D,EAAE;QACF,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACjD,yEAAyE;QACzE,kEAAkE;QAClE,2EAA2E;QAC3E,2EAA2E;QAC3E,uEAAuE;QACvE,mEAAmE;QACnE,2EAA2E;QAC3E,0EAA0E;QAC1E,8EAA8E;QAC9E,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CACtE,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CACvD,CAAC;QACF,OAAO,IAAI,CAAC,QAAQ,CAClB,IAAI,EACJ,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,EACpC,WAAW,CACZ,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE;QACnC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/D,CAAC,CAAe,CAAC;IACjB,QAAQ,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAClC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3C,CAAC,CAAC;IACF,QAAQ,CAAC,MAAM,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE;QAClD,IAAI,SAAS,EAAE,CAAC;YACd,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3C,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC,CAAC;IACF,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAEzB,MAAM,SAAS,GAAgB,CAC7B,GAAkB,EAClB,WAAyB,EACzB,EAAE;QACF,IAAI,MAAS,CAAC;QACd,eAAe,CACb,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAC3C,SAAS,CAAC,WAAW,CAAC,IAAI,eAAe,CAC1C,CAAC;QACF,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC,CAAC;IAEF,MAAM,UAAU,GAAiB,CAAC,GAAG,EAAE,WAAW,EAAE,EAAE;QACpD,gBAAgB,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,CAAC,CAAC,GAAG,EAAE,WAAW,EAAE,EAAE;QACrC,cAAc,CACZ,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,EACjB,SAAS,CAAC,WAAW,CAAC,IAAI,eAAe,CAC1C,CAAC;IACJ,CAAC,CAAe,CAAC;IACjB,QAAQ,CAAC,MAAM,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,WAAW,EAAE,EAAE;QACpD,IAAI,SAAS;YAAE,OAAO;QACtB,cAAc,CACZ,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,EACjB,SAAS,CAAC,WAAW,CAAC,IAAI,eAAe,CAC1C,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,SAAS,GAAgB,CAAC,GAAG,EAAE,WAAW,EAAE,EAAE;QAClD,eAAe,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC;IAEF,8EAA8E;IAC9E,sEAAsE;IACtE,uEAAuE;IACvE,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CACrC,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CACpC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAEtB,mEAAmE;IACnE,wEAAwE;IACxE,yEAAyE;IACzE,uEAAuE;IACvE,uEAAuE;IACvE,wCAAwC;IACxC,cAAc,CAAC,GAAG,EAAE;QAClB,cAAc,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,eAAe,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,IAAI;QACJ,SAAS;QACT,UAAU;QACV,QAAQ;QACR,SAAS;QACT,MAAM,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,CAC1B,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,GAAG,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;QAClE,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,CAC3B,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,GAAG,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,IAAI,CACpE,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAC5B;KACJ,CAAC;AACJ,CAAC,CAAC"}
@@ -26,6 +26,11 @@ import * as Effect from "effect/Effect";
26
26
  * The chain ends when the proxy is yielded as an Effect — the resolved
27
27
  * value at that point must be a `Yieldable` (an Effect, drizzle query
28
28
  * builder, etc). Anything before that is recorded as ops.
29
+ *
30
+ * A chain passed as an *argument* to another chain over the same effect —
31
+ * e.g. `` sql`INSERT INTO users ${sql.insert(row)}` ``, where `sql.insert(row)`
32
+ * is itself a deferred proxy — is replayed against the same resolved root
33
+ * before the outer call runs, so synchronous fragment helpers compose.
29
34
  */
30
35
  export declare const proxyChain: <T>(cached: Effect.Effect<T, any, any>) => T;
31
36
  //# sourceMappingURL=proxy-chain.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"proxy-chain.d.ts","sourceRoot":"","sources":["../../src/Util/proxy-chain.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AA2BxC;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,eAAO,MAAM,UAAU,GAAI,CAAC,UAAU,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,KAAG,CAC/C,CAAC"}
1
+ {"version":3,"file":"proxy-chain.d.ts","sourceRoot":"","sources":["../../src/Util/proxy-chain.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAwFxC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,eAAO,MAAM,UAAU,GAAI,CAAC,UAAU,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,KAAG,CAC/C,CAAC"}
@@ -1,12 +1,20 @@
1
1
  /** @effect-diagnostics anyUnknownInErrorContext:off */
2
2
  import * as Effect from "effect/Effect";
3
+ /**
4
+ * Every proxy produced by {@link chain} is registered here so that a chain
5
+ * passed as an *argument* to another chain over the same `cached` effect
6
+ * (e.g. `` sql`... ${sql.insert(row)}` `` — the nested `sql.insert(row)` is
7
+ * itself a proxy) can be recognized and replayed against the same resolved
8
+ * root instead of being handed to the real client as an opaque proxy.
9
+ */
10
+ const chainStates = new WeakMap();
3
11
  /**
4
12
  * Replay an op chain against a real value. `get` reads a property,
5
13
  * `call` invokes — bound to the previous receiver so `this` resolves
6
14
  * to the object the method was read from (drizzle's `select()` etc.
7
15
  * read `this._.session`, so dropping `this` would throw).
8
16
  */
9
- const replay = (root, ops) => {
17
+ const replay = (root, ops, cached) => {
10
18
  let cur = root;
11
19
  let receiver = root;
12
20
  for (const op of ops) {
@@ -15,12 +23,45 @@ const replay = (root, ops) => {
15
23
  cur = cur[op.prop];
16
24
  }
17
25
  else {
18
- cur = cur.apply(receiver, op.args);
26
+ cur = cur.apply(receiver, replayArgs(root, op.args, cached));
19
27
  receiver = cur;
20
28
  }
21
29
  }
22
30
  return cur;
23
31
  };
32
+ /**
33
+ * Resolve nested chain proxies inside a call's arguments. Only proxies over
34
+ * the *same* `cached` effect can be replayed synchronously (the root is
35
+ * already resolved); proxies over a different effect pass through untouched.
36
+ * Returns the original array when nothing needed resolving, so identity-
37
+ * sensitive values (e.g. a `TemplateStringsArray` with its `raw` property)
38
+ * are preserved.
39
+ */
40
+ const replayArgs = (root, args, cached) => {
41
+ let out;
42
+ for (let i = 0; i < args.length; i++) {
43
+ const resolved = replayArg(root, args[i], cached);
44
+ if (resolved !== args[i]) {
45
+ out ??= [...args];
46
+ out[i] = resolved;
47
+ }
48
+ }
49
+ return out ?? args;
50
+ };
51
+ const replayArg = (root, arg, cached) => {
52
+ if (arg === null || (typeof arg !== "object" && typeof arg !== "function")) {
53
+ return arg;
54
+ }
55
+ const state = chainStates.get(arg);
56
+ if (state?.cached === cached) {
57
+ return replay(root, state.ops, cached);
58
+ }
59
+ // Fragments may arrive wrapped in arrays (e.g. `sql.and([a, b])`).
60
+ if (Array.isArray(arg)) {
61
+ return replayArgs(root, arg, cached);
62
+ }
63
+ return arg;
64
+ };
24
65
  /**
25
66
  * Wrap a cached `Effect<T>` in a chainable Proxy so callers can use the
26
67
  * returned value as if it were `T` itself — every property read and call
@@ -47,11 +88,16 @@ const replay = (root, ops) => {
47
88
  * The chain ends when the proxy is yielded as an Effect — the resolved
48
89
  * value at that point must be a `Yieldable` (an Effect, drizzle query
49
90
  * builder, etc). Anything before that is recorded as ops.
91
+ *
92
+ * A chain passed as an *argument* to another chain over the same effect —
93
+ * e.g. `` sql`INSERT INTO users ${sql.insert(row)}` ``, where `sql.insert(row)`
94
+ * is itself a deferred proxy — is replayed against the same resolved root
95
+ * before the outer call runs, so synchronous fragment helpers compose.
50
96
  */
51
97
  export const proxyChain = (cached) => chain(cached);
52
98
  const chain = (cached, ops = []) => {
53
- const effect = Effect.flatMap(cached, (root) => replay(root, ops));
54
- return new Proxy(function () { }, {
99
+ const effect = Effect.flatMap(cached, (root) => replay(root, ops, cached));
100
+ const proxy = new Proxy(function () { }, {
55
101
  get(_, prop) {
56
102
  if (Reflect.has(effect, prop)) {
57
103
  return Reflect.get(effect, prop);
@@ -65,5 +111,7 @@ const chain = (cached, ops = []) => {
65
111
  return chain(cached, [...ops, { kind: "call", args }]);
66
112
  },
67
113
  });
114
+ chainStates.set(proxy, { cached, ops });
115
+ return proxy;
68
116
  };
69
117
  //# sourceMappingURL=proxy-chain.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"proxy-chain.js","sourceRoot":"","sources":["../../src/Util/proxy-chain.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAMxC;;;;;GAKG;AACH,MAAM,MAAM,GAAG,CAAC,IAAa,EAAE,GAAsB,EAAW,EAAE;IAChE,IAAI,GAAG,GAAQ,IAAI,CAAC;IACpB,IAAI,QAAQ,GAAQ,IAAI,CAAC;IACzB,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACrB,IAAI,EAAE,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YACtB,QAAQ,GAAG,GAAG,CAAC;YACf,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;YACnC,QAAQ,GAAG,GAAG,CAAC;QACjB,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAI,MAAkC,EAAK,EAAE,CACrE,KAAK,CAAC,MAAM,CAAM,CAAC;AAErB,MAAM,KAAK,GAAG,CACZ,MAAwC,EACxC,GAAG,GAAsB,EAAE,EAClB,EAAE;IACX,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAC3B,MAAM,EACN,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAA6C,CACxE,CAAC;IACF,OAAO,IAAI,KAAK,CAAC,cAAa,CAAC,EAAE;QAC/B,GAAG,CAAC,CAAC,EAAE,IAAI;YACT,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC;gBAC9B,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YACnC,CAAC;YACD,OAAO,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACxD,CAAC;QACD,GAAG,CAAC,MAAM,EAAE,IAAI;YACd,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAChE,CAAC;QACD,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI;YACf,OAAO,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACzD,CAAC;KACF,CAAC,CAAC;AACL,CAAC,CAAC"}
1
+ {"version":3,"file":"proxy-chain.js","sourceRoot":"","sources":["../../src/Util/proxy-chain.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "alchemy",
3
- "version": "2.0.0-beta.64",
3
+ "version": "2.0.0-beta.65",
4
4
  "homepage": "https://alchemy.run",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Sam Goodwin <sam@alchemy.run>",
@@ -229,11 +229,11 @@
229
229
  "worker": "./src/Process/index.ts",
230
230
  "import": "./lib/Process/index.js"
231
231
  },
232
- "./SQL": {
233
- "types": "./lib/SQL/index.d.ts",
234
- "bun": "./src/SQL/index.ts",
235
- "worker": "./src/SQL/index.ts",
236
- "import": "./lib/SQL/index.js"
232
+ "./SQL/*": {
233
+ "types": "./lib/SQL/*.d.ts",
234
+ "bun": "./src/SQL/*.ts",
235
+ "worker": "./src/SQL/*.ts",
236
+ "import": "./lib/SQL/*.js"
237
237
  },
238
238
  "./SQLite": {
239
239
  "types": "./lib/SQLite/index.d.ts",
@@ -283,6 +283,12 @@
283
283
  "worker": "./src/Test/Http.ts",
284
284
  "import": "./lib/Test/Http.js"
285
285
  },
286
+ "./Test/Vitest": {
287
+ "types": "./lib/Test/Vitest.d.ts",
288
+ "bun": "./src/Test/Vitest.ts",
289
+ "worker": "./src/Test/Vitest.ts",
290
+ "import": "./lib/Test/Vitest.js"
291
+ },
286
292
  "./Util": {
287
293
  "types": "./lib/Util/index.d.ts",
288
294
  "bun": "./src/Util/index.ts",
@@ -312,16 +318,17 @@
312
318
  "@alchemy.run/node-utils": "0.0.5",
313
319
  "@aws-sdk/credential-providers": "^3.0.0",
314
320
  "@clack/prompts": "^0.11.0",
315
- "@distilled.cloud/aws": "0.30.1",
316
- "@distilled.cloud/axiom": "0.30.1",
317
- "@distilled.cloud/cloudflare": "0.30.1",
318
- "@distilled.cloud/cloudflare-rolldown-plugin": "0.13.8",
319
- "@distilled.cloud/cloudflare-runtime": "0.13.8",
320
- "@distilled.cloud/cloudflare-vite-plugin": "0.13.8",
321
- "@distilled.cloud/core": "0.30.1",
322
- "@distilled.cloud/neon": "0.30.1",
323
- "@distilled.cloud/planetscale": "0.30.1",
321
+ "@distilled.cloud/aws": "0.30.2",
322
+ "@distilled.cloud/axiom": "0.30.2",
323
+ "@distilled.cloud/cloudflare": "0.30.2",
324
+ "@distilled.cloud/cloudflare-rolldown-plugin": "0.13.10",
325
+ "@distilled.cloud/cloudflare-runtime": "0.13.10",
326
+ "@distilled.cloud/cloudflare-vite-plugin": "0.13.10",
327
+ "@distilled.cloud/core": "0.30.2",
328
+ "@distilled.cloud/neon": "0.30.2",
329
+ "@distilled.cloud/planetscale": "0.30.2",
324
330
  "@effect/sql-d1": ">=4.0.0-beta.100 || >=4.0.0",
331
+ "@effect/vitest": ">=4.0.0-beta.100 || >=4.0.0",
325
332
  "@libsql/client": "^0.17.0",
326
333
  "@octokit/rest": "^22.0.1",
327
334
  "@octokit/webhooks": "^14.2.0",
@@ -381,6 +388,7 @@
381
388
  "tsx": "^4.20.6",
382
389
  "typescript": "^7.0.2",
383
390
  "uuid": "^14.0.0",
391
+ "vitest": "^4.1.8",
384
392
  "wrangler": "^4.103.0",
385
393
  "ws": "^8.20.0"
386
394
  },
@@ -396,9 +396,12 @@ export const InternetGatewayProvider = () =>
396
396
  while: (e) => {
397
397
  return e._tag === "DependencyViolation";
398
398
  },
399
+ // Public addresses on a draining EKS/HyperPod control
400
+ // plane's ENIs can take several minutes to release —
401
+ // 5s x 60 = ~5 min.
399
402
  schedule: Schedule.max([
400
403
  Schedule.fixed(5000),
401
- Schedule.recurs(10),
404
+ Schedule.recurs(60),
402
405
  ]).pipe(
403
406
  Schedule.tap(({ attempt }) =>
404
407
  session.note(
@@ -424,7 +427,9 @@ export const InternetGatewayProvider = () =>
424
427
  "InvalidInternetGatewayID.NotFound",
425
428
  () => Effect.void,
426
429
  ),
427
- // Retry on dependency violations
430
+ // Retry on dependency violations. Public addresses on a
431
+ // draining EKS/HyperPod control plane's ENIs can take
432
+ // several minutes to release — 5s x 60 = ~5 min.
428
433
  Effect.retry({
429
434
  while: (e) => {
430
435
  return (
@@ -435,7 +440,7 @@ export const InternetGatewayProvider = () =>
435
440
  },
436
441
  schedule: Schedule.max([
437
442
  Schedule.fixed(5000),
438
- Schedule.recurs(10),
443
+ Schedule.recurs(60),
439
444
  ]).pipe(
440
445
  Schedule.tap(({ attempt }) =>
441
446
  session.note(