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.
- package/lib/AWS/EC2/InternetGateway.d.ts.map +1 -1
- package/lib/AWS/EC2/InternetGateway.js +8 -3
- package/lib/AWS/EC2/InternetGateway.js.map +1 -1
- package/lib/AWS/EC2/LingeringEnis.d.ts +26 -0
- package/lib/AWS/EC2/LingeringEnis.d.ts.map +1 -0
- package/lib/AWS/EC2/LingeringEnis.js +128 -0
- package/lib/AWS/EC2/LingeringEnis.js.map +1 -0
- package/lib/AWS/EC2/SecurityGroup.d.ts.map +1 -1
- package/lib/AWS/EC2/SecurityGroup.js +14 -14
- package/lib/AWS/EC2/SecurityGroup.js.map +1 -1
- package/lib/AWS/EC2/Subnet.d.ts.map +1 -1
- package/lib/AWS/EC2/Subnet.js +13 -21
- package/lib/AWS/EC2/Subnet.js.map +1 -1
- package/lib/AWS/ECR/Image.d.ts +1 -0
- package/lib/AWS/ECR/Image.d.ts.map +1 -1
- package/lib/AWS/EKS/Addon.d.ts.map +1 -1
- package/lib/AWS/EKS/Addon.js +15 -3
- package/lib/AWS/EKS/Addon.js.map +1 -1
- package/lib/AWS/EKS/Deployment.d.ts +10 -1
- package/lib/AWS/EKS/Deployment.d.ts.map +1 -1
- package/lib/AWS/EKS/Deployment.js +10 -4
- package/lib/AWS/EKS/Deployment.js.map +1 -1
- package/lib/AWS/EKS/HyperPod.d.ts +57 -0
- package/lib/AWS/EKS/HyperPod.d.ts.map +1 -0
- package/lib/AWS/EKS/HyperPod.js +46 -0
- package/lib/AWS/EKS/HyperPod.js.map +1 -0
- package/lib/AWS/EKS/Job.d.ts +10 -1
- package/lib/AWS/EKS/Job.d.ts.map +1 -1
- package/lib/AWS/EKS/Job.js +16 -6
- package/lib/AWS/EKS/Job.js.map +1 -1
- package/lib/AWS/EKS/internal/client.d.ts +4 -3
- package/lib/AWS/EKS/internal/client.d.ts.map +1 -1
- package/lib/AWS/EKS/internal/client.js +33 -2
- package/lib/AWS/EKS/internal/client.js.map +1 -1
- package/lib/AWS/Lambda/Function.d.ts.map +1 -1
- package/lib/AWS/Lambda/Function.js +1 -1
- package/lib/AWS/Lambda/Function.js.map +1 -1
- package/lib/AWS/Providers.d.ts.map +1 -1
- package/lib/AWS/Providers.js +4 -1
- package/lib/AWS/Providers.js.map +1 -1
- package/lib/AWS/SageMaker/Cluster.d.ts +327 -0
- package/lib/AWS/SageMaker/Cluster.d.ts.map +1 -0
- package/lib/AWS/SageMaker/Cluster.js +469 -0
- package/lib/AWS/SageMaker/Cluster.js.map +1 -0
- package/lib/AWS/SageMaker/ClusterSchedulerConfig.d.ts +96 -0
- package/lib/AWS/SageMaker/ClusterSchedulerConfig.d.ts.map +1 -0
- package/lib/AWS/SageMaker/ClusterSchedulerConfig.js +270 -0
- package/lib/AWS/SageMaker/ClusterSchedulerConfig.js.map +1 -0
- package/lib/AWS/SageMaker/ComputeQuota.d.ts +106 -0
- package/lib/AWS/SageMaker/ComputeQuota.d.ts.map +1 -0
- package/lib/AWS/SageMaker/ComputeQuota.js +268 -0
- package/lib/AWS/SageMaker/ComputeQuota.js.map +1 -0
- package/lib/AWS/SageMaker/index.d.ts +3 -0
- package/lib/AWS/SageMaker/index.d.ts.map +1 -1
- package/lib/AWS/SageMaker/index.js +3 -0
- package/lib/AWS/SageMaker/index.js.map +1 -1
- package/lib/Bundle/PurePlugin.d.ts +29 -7
- package/lib/Bundle/PurePlugin.d.ts.map +1 -1
- package/lib/Bundle/PurePlugin.js +56 -33
- package/lib/Bundle/PurePlugin.js.map +1 -1
- package/lib/Cli/commands/nuke.d.ts.map +1 -1
- package/lib/Cli/commands/nuke.js +231 -37
- package/lib/Cli/commands/nuke.js.map +1 -1
- package/lib/Cloudflare/StateStore/Api.d.ts +1 -1
- package/lib/Cloudflare/Workers/Assets.d.ts +26 -8
- package/lib/Cloudflare/Workers/Assets.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/Assets.js +46 -1
- package/lib/Cloudflare/Workers/Assets.js.map +1 -1
- package/lib/Cloudflare/Workers/LocalWorkerProvider.d.ts +2 -2
- package/lib/Cloudflare/Workers/LocalWorkerProvider.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/LocalWorkerProvider.js +39 -6
- package/lib/Cloudflare/Workers/LocalWorkerProvider.js.map +1 -1
- package/lib/Cloudflare/Workers/Worker.d.ts +7 -5
- package/lib/Cloudflare/Workers/Worker.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/Worker.js +0 -1
- package/lib/Cloudflare/Workers/Worker.js.map +1 -1
- package/lib/Cloudflare/Workers/WorkerBinding.d.ts +2 -2
- package/lib/Cloudflare/Workers/WorkerBundle.d.ts +20 -1
- package/lib/Cloudflare/Workers/WorkerBundle.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/WorkerBundle.js +11 -0
- package/lib/Cloudflare/Workers/WorkerBundle.js.map +1 -1
- package/lib/Cloudflare/Workers/WorkerProvider.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/WorkerProvider.js +10 -4
- package/lib/Cloudflare/Workers/WorkerProvider.js.map +1 -1
- package/lib/Cloudflare/Workflows/WorkflowBridge.d.ts +2 -1
- package/lib/Cloudflare/Workflows/WorkflowBridge.d.ts.map +1 -1
- package/lib/Cloudflare/Workflows/WorkflowBridge.js +5 -5
- package/lib/Cloudflare/Workflows/WorkflowBridge.js.map +1 -1
- package/lib/Cloudflare/Workflows/index.d.ts +1 -1
- package/lib/Cloudflare/Workflows/index.d.ts.map +1 -1
- package/lib/Cloudflare/Workflows/index.js +1 -1
- package/lib/Cloudflare/Workflows/index.js.map +1 -1
- package/lib/Docker/Container.d.ts +26 -0
- package/lib/Docker/Container.d.ts.map +1 -1
- package/lib/Docker/Container.js +20 -1
- package/lib/Docker/Container.js.map +1 -1
- package/lib/Docker/Docker.d.ts +2 -0
- package/lib/Docker/Docker.d.ts.map +1 -1
- package/lib/Docker/Docker.js.map +1 -1
- package/lib/Output.d.ts +4 -1
- package/lib/Output.d.ts.map +1 -1
- package/lib/Output.js.map +1 -1
- package/lib/Provider.d.ts +20 -0
- package/lib/Provider.d.ts.map +1 -1
- package/lib/Provider.js.map +1 -1
- package/lib/Random.d.ts +1 -1
- package/lib/Random.d.ts.map +1 -1
- package/lib/Resource.d.ts +14 -1
- package/lib/Resource.d.ts.map +1 -1
- package/lib/Resource.js.map +1 -1
- package/lib/SQL/D1.d.ts +1 -1
- package/lib/SQL/D1.js +1 -1
- package/lib/SQL/Postgres.d.ts +1 -1
- package/lib/SQL/Postgres.js +1 -1
- package/lib/State/HttpStateApi.d.ts +11 -11
- package/lib/Test/Alchemy.d.ts +1 -1
- package/lib/Test/Alchemy.js +1 -1
- package/lib/Test/Vitest.d.ts +58 -0
- package/lib/Test/Vitest.d.ts.map +1 -0
- package/lib/Test/Vitest.js +114 -0
- package/lib/Test/Vitest.js.map +1 -0
- package/lib/Util/proxy-chain.d.ts +5 -0
- package/lib/Util/proxy-chain.d.ts.map +1 -1
- package/lib/Util/proxy-chain.js +52 -4
- package/lib/Util/proxy-chain.js.map +1 -1
- package/package.json +23 -15
- package/src/AWS/EC2/InternetGateway.ts +8 -3
- package/src/AWS/EC2/LingeringEnis.ts +169 -0
- package/src/AWS/EC2/SecurityGroup.ts +24 -28
- package/src/AWS/EC2/Subnet.ts +23 -34
- package/src/AWS/EKS/Addon.ts +17 -4
- package/src/AWS/EKS/Deployment.ts +26 -5
- package/src/AWS/EKS/HyperPod.ts +97 -0
- package/src/AWS/EKS/Job.ts +32 -7
- package/src/AWS/EKS/internal/client.ts +40 -3
- package/src/AWS/Lambda/Function.ts +5 -3
- package/src/AWS/Providers.ts +6 -0
- package/src/AWS/SageMaker/Cluster.ts +775 -0
- package/src/AWS/SageMaker/ClusterSchedulerConfig.ts +430 -0
- package/src/AWS/SageMaker/ComputeQuota.ts +426 -0
- package/src/AWS/SageMaker/index.ts +3 -0
- package/src/Bundle/PurePlugin.ts +92 -39
- package/src/Cli/commands/nuke.ts +295 -56
- package/src/Cloudflare/Workers/Assets.ts +53 -1
- package/src/Cloudflare/Workers/LocalWorkerProvider.ts +46 -7
- package/src/Cloudflare/Workers/Worker.ts +7 -5
- package/src/Cloudflare/Workers/WorkerBundle.ts +31 -1
- package/src/Cloudflare/Workers/WorkerProvider.ts +18 -4
- package/src/Cloudflare/Workflows/WorkflowBridge.ts +5 -5
- package/src/Cloudflare/Workflows/index.ts +1 -1
- package/src/Docker/Container.ts +30 -1
- package/src/Docker/Docker.ts +2 -0
- package/src/Output.ts +19 -11
- package/src/Provider.ts +20 -0
- package/src/Resource.ts +18 -1
- package/src/SQL/D1.ts +1 -1
- package/src/SQL/Postgres.ts +1 -1
- package/src/Test/Alchemy.ts +1 -1
- package/src/Test/Vitest.ts +244 -0
- package/src/Util/proxy-chain.ts +73 -4
- package/lib/SQL/index.d.ts +0 -4
- package/lib/SQL/index.d.ts.map +0 -1
- package/lib/SQL/index.js +0 -4
- package/lib/SQL/index.js.map +0 -1
- 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<"
|
|
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<"
|
|
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
|
-
|
|
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<"
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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;
|
package/lib/Test/Alchemy.d.ts
CHANGED
|
@@ -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.
|
package/lib/Test/Alchemy.js
CHANGED
|
@@ -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":"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"}
|
|
@@ -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;
|
|
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"}
|
package/lib/Util/proxy-chain.js
CHANGED
|
@@ -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
|
-
|
|
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;
|
|
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.
|
|
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
|
|
234
|
-
"bun": "./src/SQL
|
|
235
|
-
"worker": "./src/SQL
|
|
236
|
-
"import": "./lib/SQL
|
|
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.
|
|
316
|
-
"@distilled.cloud/axiom": "0.30.
|
|
317
|
-
"@distilled.cloud/cloudflare": "0.30.
|
|
318
|
-
"@distilled.cloud/cloudflare-rolldown-plugin": "0.13.
|
|
319
|
-
"@distilled.cloud/cloudflare-runtime": "0.13.
|
|
320
|
-
"@distilled.cloud/cloudflare-vite-plugin": "0.13.
|
|
321
|
-
"@distilled.cloud/core": "0.30.
|
|
322
|
-
"@distilled.cloud/neon": "0.30.
|
|
323
|
-
"@distilled.cloud/planetscale": "0.30.
|
|
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(
|
|
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(
|
|
443
|
+
Schedule.recurs(60),
|
|
439
444
|
]).pipe(
|
|
440
445
|
Schedule.tap(({ attempt }) =>
|
|
441
446
|
session.note(
|