1import * as Cloudflare from "@/Cloudflare";
2import * as Alchemy from "@/index";
3import * as Output from "@/Output";
4import * as Config from "effect/Config";
5import * as Effect from "effect/Effect";
6import * as Redacted from "effect/Redacted";
7import * as path from "pathe";
8import EnvEffectWorker from "./effect.ts";
9
10export type AsyncWorkerEnv = Cloudflare.InferEnv<typeof AsyncWorker>;
11
12export const AsyncWorker = Cloudflare.Worker("EnvAsyncWorker", {
13 main: path.resolve(import.meta.dirname, "async.ts"),
14 workersDev: true,
15 env: {
16 STR: "hello",
17 NUM: 42,
18 BOOL: true,
19 NULL: null,
20 OBJ: { nested: { value: "ok" }, count: 7 },
21 ARR: [1, 2, 3],
22 OUTPUT_STR: Output.literal("output-str"),
23 RANDOM: Alchemy.makeRandom("WorkerEnvRandom"),
24 SECRET_STR: Redacted.make("shh"),
25 SECRET_JSON: Redacted.make({
26 token: "abc",
27 scopes: ["read", "write"],
28 }),
29 CONFIG_STR: Config.String("CONFIG_STR"),
30 CONFIG_NUM: Config.Number("CONFIG_NUM"),
31 CONFIG_REDACTED: Config.Redacted("CONFIG_REDACTED"),
32 CF_VERSION_METADATA: Cloudflare.Workers.VersionMetadata(),
33 },
34});
35
36export default Alchemy.Stack(
37 "WorkerEnvTestStack",
38 {
39 providers: Cloudflare.providers(),
40 state: Cloudflare.state(),
41 },
42 Effect.gen(function* () {
43 const asyncWorker = yield* AsyncWorker;
44 const effectWorker = yield* EnvEffectWorker;
45
46 return {
47 asyncUrl: asyncWorker.url.as<string>(),
48 asyncWorkerName: asyncWorker.workerName,
49 effectUrl: effectWorker.url.as<string>(),
50 };
51 }),
52);