1import * as Effect from "effect/Effect";
2import * as Layer from "effect/Layer";
3
4// Intentionally duplicated from alchemy's Util/PlatformServices.ts: this
5// package must not depend on "alchemy", and the message names this package.
6const importPlatformPeer = <A>(
7 peerDependency: "@effect/platform-bun" | "@effect/platform-node",
8 load: () => Promise<A>,
9): Promise<A> =>
10 load().catch(() => {
11 console.error(
12 [
13 `"@alchemy.run/cloudflare-frameworks" could not load its peer dependency "${peerDependency}".`,
14 `Install a compatible version of "${peerDependency}" alongside "@alchemy.run/cloudflare-frameworks".`,
15 ].join("\n"),
16 );
17 process.exit(1);
18 });
19
20const BunServices = {
21 layer: Layer.unwrap(
22 Effect.promise(() =>
23 importPlatformPeer(
24 "@effect/platform-bun",
25 () => import("@effect/platform-bun/BunServices"),
26 ).then((module) => module.layer),
27 ),
28 ),
29};
30
31const NodeServices = {
32 layer: Layer.unwrap(
33 Effect.promise(() =>
34 importPlatformPeer(
35 "@effect/platform-node",
36 () => import("@effect/platform-node/NodeServices"),
37 ).then((module) => module.layer),
38 ),
39 ),
40};
41
42export const PlatformServices =
43 typeof Bun === "undefined" ? NodeServices.layer : BunServices.layer;