Skip to content

Commit 77d69be

Browse files
committed
fix: properly type the Resource Provider Layers and use Layer.merge
1 parent 877ba8f commit 77d69be

File tree

3 files changed

+17
-9
lines changed

3 files changed

+17
-9
lines changed

alchemy-effect/src/resource.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,14 @@ export const Resource = <Ctor extends (id: string, props: any) => Resource>(
3737
type: ReturnType<Ctor>["type"],
3838
) => {
3939
const Tag = Context.Tag(type)();
40-
const provider = {
41-
tag: Tag,
40+
const provider: ResourceTags<ReturnType<Ctor>> = {
41+
tag: Tag as any,
4242
effect: <Err, Req>(
4343
eff: Effect<ProviderService<ReturnType<Ctor>>, Err, Req>,
4444
) => Layer.effect(Tag, eff),
4545
succeed: (service: ProviderService<ReturnType<Ctor>>) =>
4646
Layer.succeed(Tag, service),
47+
of: (service) => service,
4748
};
4849
return Object.assign(
4950
function (id: string, props: any) {

example/alchemy.run.ts

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { FetchHttpClient } from "@effect/platform";
22
import { NodeContext } from "@effect/platform-node";
33
import * as Alchemy from "alchemy-effect";
44
import * as AWS from "alchemy-effect/aws";
5+
import { Layer } from "effect";
56
import * as Effect from "effect/Effect";
67
import { Api } from "./src/index.ts";
78

@@ -10,16 +11,22 @@ const plan = Alchemy.plan({
1011
services: [Api],
1112
});
1213

14+
const app = Alchemy.app({ name: "my-app", stage: "dev" });
15+
16+
const providers = Layer.provideMerge(
17+
Layer.mergeAll(AWS.live, Alchemy.State.localFs, Alchemy.CLI.layer),
18+
Layer.mergeAll(app, Alchemy.dotAlchemy),
19+
);
20+
21+
const layers = Layer.provideMerge(
22+
providers,
23+
Layer.mergeAll(NodeContext.layer, FetchHttpClient.layer),
24+
);
25+
1326
const stack = await plan.pipe(
1427
// Effect.tap((plan) => Console.log(plan)),
1528
Alchemy.apply,
16-
Effect.provide(Alchemy.CLI.layer),
17-
Effect.provide(AWS.live),
18-
Effect.provide(Alchemy.State.localFs),
19-
Effect.provide(Alchemy.dotAlchemy),
20-
Effect.provide(Alchemy.app({ name: "my-app", stage: "dev" })),
21-
Effect.provide(NodeContext.layer),
22-
Effect.provide(FetchHttpClient.layer),
29+
Effect.provide(layers),
2330
Effect.tap((stack) => Effect.log(stack?.Api.functionUrl)),
2431
Effect.runPromise,
2532
);

images/alchemy-effect-layers.png

-9.98 KB
Loading

0 commit comments

Comments
 (0)