1import { GraphQLLive } from "@distilled.cloud/railway";
2import * as Layer from "effect/Layer";
3import * as FetchHttpClient from "effect/http/FetchHttpClient";
4import { CredentialsStoreLive } from "../Auth/Credentials.ts";
5import { ProfileStoreLive } from "../Auth/Profile.ts";
6import * as Command from "../Command/index.ts";
7import * as Provider from "../Provider.ts";
8import { Random, RandomProvider } from "../Random.ts";
9import { RailwayAuth } from "./AuthProvider.ts";
10import { Bucket, BucketProvider } from "./Bucket.ts";
11import { CloudAgent, CloudAgentProvider } from "./CloudAgent.ts";
12import * as Credentials from "./Credentials.ts";
13import { DeleteObjectHttp } from "./DeleteObjectHttp.ts";
14import { GetObjectHttp } from "./GetObjectHttp.ts";
15import { HeadObjectHttp } from "./HeadObjectHttp.ts";
16import { ListObjectsV2Http } from "./ListObjectsV2Http.ts";
17import { PutObjectHttp } from "./PutObjectHttp.ts";
18import { CustomDomain, CustomDomainProvider } from "./CustomDomain.ts";
19import { fromCredentials } from "./Environment.ts";
20import { Function, FunctionProvider } from "./Function.ts";
21import { Group, GroupProvider } from "./Group.ts";
22import { Project, ProjectProvider } from "./Project.ts";
23import { Environment, EnvironmentProvider } from "./ProjectEnvironment.ts";
24import { TcpProxy, TcpProxyProvider } from "./TcpProxy.ts";
25import { Template, TemplateProvider } from "./Template.ts";
26import { UsageLimit, UsageLimitProvider } from "./Usage.ts";
27import { Variable, VariableProvider } from "./Variable.ts";
28import { MountVolumeLive } from "./MountVolume.ts";
29import { ConnectMongoHttp } from "./ConnectMongoHttp.ts";
30import { ConnectMySQLHttp } from "./ConnectMySQLHttp.ts";
31import { ConnectPostgresHttp } from "./ConnectPostgresHttp.ts";
32import { Mongo, MongoProvider } from "./Mongo.ts";
33import { MySQL, MySQLProvider } from "./MySQL.ts";
34import { Postgres, PostgresProvider } from "./Postgres.ts";
35import {
36 PrivateNetwork,
37 PrivateNetworkEndpoint,
38 PrivateNetworkEndpointProvider,
39 PrivateNetworkProvider,
40} from "./PrivateNetwork.ts";
41import { ReadRedisHttp } from "./ReadRedisHttp.ts";
42import { ReadWriteRedisHttp } from "./ReadWriteRedisHttp.ts";
43import { Redis, RedisProvider } from "./Redis.ts";
44import { Service } from "./Service.ts";
45import { ServiceProvider } from "./ServiceProvider.ts";
46import { Cdn, CdnProvider } from "./Website/Cdn.ts";
47import {
48 Server as WebsiteServer,
49 ServerProvider as WebsiteServerProvider,
50} from "../Website/Server.ts";
51import { ExecHttp, Sandbox, SandboxProvider } from "./Sandbox.ts";
52import {
53 SandboxCheckpoint,
54 SandboxCheckpointProvider,
55} from "./SandboxCheckpoint.ts";
56import { Volume, VolumeProvider } from "./Volume.ts";
57import { VolumeBackup, VolumeBackupProvider } from "./VolumeBackup.ts";
58import { WriteRedisHttp } from "./WriteRedisHttp.ts";
59
60export class Providers extends Provider.ProviderCollection<Providers>()(
61 "Railway",
62) {}
63
64export type ProviderRequirements = Layer.Services<ReturnType<typeof providers>>;
65
66/**
67 * Build a layer that registers Railway resource providers, the Railway
68 * `AuthProvider`, the resolved `Credentials`, and an `HttpClient`. Include
69 * this from your stack alongside other cloud `providers()` layers.
70 *
71 * Resource providers are inserted into {@link Provider.collection} as they
72 * land. The collection starts empty so Project / Service agents can make a
73 * single minimal insertion.
74 *
75 * @example
76 * ```typescript
77 * import * as Alchemy from "alchemy";
78 * import * as Railway from "alchemy/Railway";
79 * import * as Effect from "effect/Effect";
80 *
81 * export default Alchemy.Stack(
82 * "MyStack",
83 * {
84 * providers: Railway.providers(),
85 * state: Alchemy.localState(),
86 * },
87 * Effect.gen(function* () {
88 * return {};
89 * }),
90 * );
91 * ```
92 */
93export const providers = () =>
94 Layer.effect(
95 Providers,
96 Provider.collection([
97 Project,
98 Postgres,
99 PrivateNetwork,
100 PrivateNetworkEndpoint,
101 MySQL,
102 Mongo,
103 Cdn,
104 CustomDomain,
105 Environment,
106 Function,
107 Group,
108 Service,
109 TcpProxy,
110 Template,
111 UsageLimit,
112 Variable,
113 Volume,
114 VolumeBackup,
115 Redis,
116 Bucket,
117 CloudAgent,
118 Sandbox,
119 SandboxCheckpoint,
120 Random,
121 WebsiteServer,
122 ]),
123 ).pipe(
124 Layer.provide(
125 Layer.mergeAll(
126 ProjectProvider(),
127 PostgresProvider(),
128 PrivateNetworkProvider(),
129 PrivateNetworkEndpointProvider(),
130 MySQLProvider(),
131 MongoProvider(),
132 CdnProvider(),
133 CustomDomainProvider(),
134 EnvironmentProvider(),
135 FunctionProvider(),
136 GroupProvider(),
137 ServiceProvider(),
138 TcpProxyProvider(),
139 TemplateProvider(),
140 UsageLimitProvider(),
141 VariableProvider(),
142 VolumeProvider(),
143 VolumeBackupProvider(),
144 RedisProvider(),
145 BucketProvider(),
146 CloudAgentProvider(),
147 SandboxProvider(),
148 SandboxCheckpointProvider(),
149 RandomProvider(),
150 WebsiteServerProvider(),
151 ),
152 ),
153 Layer.provideMerge(
154 Layer.mergeAll(
155 MountVolumeLive,
156 ConnectPostgresHttp,
157 ConnectMySQLHttp,
158 ConnectMongoHttp,
159 PutObjectHttp,
160 GetObjectHttp,
161 DeleteObjectHttp,
162 HeadObjectHttp,
163 ListObjectsV2Http,
164 ReadRedisHttp,
165 WriteRedisHttp,
166 ReadWriteRedisHttp,
167 ExecHttp,
168 ),
169 ),
170 Layer.provideMerge(fromCredentials()),
171 Layer.provideMerge(GraphQLLive),
172 Layer.provideMerge(Credentials.fromAuthProvider()),
173 Layer.provideMerge(RailwayAuth),
174 Layer.provideMerge(ProfileStoreLive),
175 Layer.provideMerge(CredentialsStoreLive),
176 Layer.provideMerge(FetchHttpClient.layer),
177 Layer.provideMerge(Command.providers()),
178 Layer.orDie,
179 );