@infracraft/pulumi 0.1.0
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.
Potentially problematic release.
This version of @infracraft/pulumi might be problematic. Click here for more details.
- package/dist/chunk-BVYJZCqc.cjs +44 -0
- package/dist/chunk-OPjESj5l.mjs +9 -0
- package/dist/git-guard.cjs +62 -0
- package/dist/git-guard.cjs.map +1 -0
- package/dist/git-guard.d.cts +13 -0
- package/dist/git-guard.d.cts.map +1 -0
- package/dist/git-guard.d.mts +13 -0
- package/dist/git-guard.d.mts.map +1 -0
- package/dist/git-guard.mjs +56 -0
- package/dist/git-guard.mjs.map +1 -0
- package/dist/hash.cjs +40 -0
- package/dist/hash.cjs.map +1 -0
- package/dist/hash.d.cts +10 -0
- package/dist/hash.d.cts.map +1 -0
- package/dist/hash.d.mts +10 -0
- package/dist/hash.d.mts.map +1 -0
- package/dist/hash.mjs +36 -0
- package/dist/hash.mjs.map +1 -0
- package/dist/neon/branch.cjs +113 -0
- package/dist/neon/branch.cjs.map +1 -0
- package/dist/neon/branch.d.cts +40 -0
- package/dist/neon/branch.d.cts.map +1 -0
- package/dist/neon/branch.d.mts +40 -0
- package/dist/neon/branch.d.mts.map +1 -0
- package/dist/neon/branch.mjs +111 -0
- package/dist/neon/branch.mjs.map +1 -0
- package/dist/neon/client.cjs +85 -0
- package/dist/neon/client.cjs.map +1 -0
- package/dist/neon/client.d.cts +59 -0
- package/dist/neon/client.d.cts.map +1 -0
- package/dist/neon/client.d.mts +59 -0
- package/dist/neon/client.d.mts.map +1 -0
- package/dist/neon/client.mjs +84 -0
- package/dist/neon/client.mjs.map +1 -0
- package/dist/neon/database.cjs +117 -0
- package/dist/neon/database.cjs.map +1 -0
- package/dist/neon/database.d.cts +48 -0
- package/dist/neon/database.d.cts.map +1 -0
- package/dist/neon/database.d.mts +48 -0
- package/dist/neon/database.d.mts.map +1 -0
- package/dist/neon/database.mjs +115 -0
- package/dist/neon/database.mjs.map +1 -0
- package/dist/neon/endpoint.cjs +167 -0
- package/dist/neon/endpoint.cjs.map +1 -0
- package/dist/neon/endpoint.d.cts +57 -0
- package/dist/neon/endpoint.d.cts.map +1 -0
- package/dist/neon/endpoint.d.mts +57 -0
- package/dist/neon/endpoint.d.mts.map +1 -0
- package/dist/neon/endpoint.mjs +165 -0
- package/dist/neon/endpoint.mjs.map +1 -0
- package/dist/neon/index.cjs +14 -0
- package/dist/neon/index.d.cts +7 -0
- package/dist/neon/index.d.mts +7 -0
- package/dist/neon/index.mjs +8 -0
- package/dist/neon/project.cjs +120 -0
- package/dist/neon/project.cjs.map +1 -0
- package/dist/neon/project.d.cts +52 -0
- package/dist/neon/project.d.cts.map +1 -0
- package/dist/neon/project.d.mts +52 -0
- package/dist/neon/project.d.mts.map +1 -0
- package/dist/neon/project.mjs +118 -0
- package/dist/neon/project.mjs.map +1 -0
- package/dist/neon/role.cjs +135 -0
- package/dist/neon/role.cjs.map +1 -0
- package/dist/neon/role.d.cts +49 -0
- package/dist/neon/role.d.cts.map +1 -0
- package/dist/neon/role.d.mts +49 -0
- package/dist/neon/role.d.mts.map +1 -0
- package/dist/neon/role.mjs +133 -0
- package/dist/neon/role.mjs.map +1 -0
- package/dist/railway/client.cjs +59 -0
- package/dist/railway/client.cjs.map +1 -0
- package/dist/railway/client.d.cts +39 -0
- package/dist/railway/client.d.cts.map +1 -0
- package/dist/railway/client.d.mts +39 -0
- package/dist/railway/client.d.mts.map +1 -0
- package/dist/railway/client.mjs +58 -0
- package/dist/railway/client.mjs.map +1 -0
- package/dist/railway/deploy.cjs +40 -0
- package/dist/railway/deploy.cjs.map +1 -0
- package/dist/railway/deploy.d.cts +47 -0
- package/dist/railway/deploy.d.cts.map +1 -0
- package/dist/railway/deploy.d.mts +47 -0
- package/dist/railway/deploy.d.mts.map +1 -0
- package/dist/railway/deploy.mjs +37 -0
- package/dist/railway/deploy.mjs.map +1 -0
- package/dist/railway/domain.cjs +236 -0
- package/dist/railway/domain.cjs.map +1 -0
- package/dist/railway/domain.d.cts +52 -0
- package/dist/railway/domain.d.cts.map +1 -0
- package/dist/railway/domain.d.mts +52 -0
- package/dist/railway/domain.d.mts.map +1 -0
- package/dist/railway/domain.mjs +234 -0
- package/dist/railway/domain.mjs.map +1 -0
- package/dist/railway/index.cjs +16 -0
- package/dist/railway/index.d.cts +8 -0
- package/dist/railway/index.d.mts +8 -0
- package/dist/railway/index.mjs +9 -0
- package/dist/railway/project.cjs +231 -0
- package/dist/railway/project.cjs.map +1 -0
- package/dist/railway/project.d.cts +52 -0
- package/dist/railway/project.d.cts.map +1 -0
- package/dist/railway/project.d.mts +52 -0
- package/dist/railway/project.d.mts.map +1 -0
- package/dist/railway/project.mjs +229 -0
- package/dist/railway/project.mjs.map +1 -0
- package/dist/railway/service.cjs +268 -0
- package/dist/railway/service.cjs.map +1 -0
- package/dist/railway/service.d.cts +88 -0
- package/dist/railway/service.d.cts.map +1 -0
- package/dist/railway/service.d.mts +88 -0
- package/dist/railway/service.d.mts.map +1 -0
- package/dist/railway/service.mjs +266 -0
- package/dist/railway/service.mjs.map +1 -0
- package/dist/railway/variable.cjs +149 -0
- package/dist/railway/variable.cjs.map +1 -0
- package/dist/railway/variable.d.cts +52 -0
- package/dist/railway/variable.d.cts.map +1 -0
- package/dist/railway/variable.d.mts +52 -0
- package/dist/railway/variable.d.mts.map +1 -0
- package/dist/railway/variable.mjs +147 -0
- package/dist/railway/variable.mjs.map +1 -0
- package/dist/railway/volume.cjs +179 -0
- package/dist/railway/volume.cjs.map +1 -0
- package/dist/railway/volume.d.cts +52 -0
- package/dist/railway/volume.d.cts.map +1 -0
- package/dist/railway/volume.d.mts +52 -0
- package/dist/railway/volume.d.mts.map +1 -0
- package/dist/railway/volume.mjs +177 -0
- package/dist/railway/volume.mjs.map +1 -0
- package/dist/vercel/deploy.cjs +65 -0
- package/dist/vercel/deploy.cjs.map +1 -0
- package/dist/vercel/deploy.d.cts +54 -0
- package/dist/vercel/deploy.d.cts.map +1 -0
- package/dist/vercel/deploy.d.mts +54 -0
- package/dist/vercel/deploy.d.mts.map +1 -0
- package/dist/vercel/deploy.mjs +61 -0
- package/dist/vercel/deploy.mjs.map +1 -0
- package/dist/vercel/index.cjs +6 -0
- package/dist/vercel/index.d.cts +3 -0
- package/dist/vercel/index.d.mts +3 -0
- package/dist/vercel/index.mjs +4 -0
- package/dist/vercel/variable.cjs +280 -0
- package/dist/vercel/variable.cjs.map +1 -0
- package/dist/vercel/variable.d.cts +55 -0
- package/dist/vercel/variable.d.cts.map +1 -0
- package/dist/vercel/variable.d.mts +55 -0
- package/dist/vercel/variable.d.mts.map +1 -0
- package/dist/vercel/variable.mjs +278 -0
- package/dist/vercel/variable.mjs.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
const require_chunk = require('../chunk-BVYJZCqc.cjs');
|
|
3
|
+
const require_railway_client = require('./client.cjs');
|
|
4
|
+
let _pulumi_pulumi = require("@pulumi/pulumi");
|
|
5
|
+
_pulumi_pulumi = require_chunk.__toESM(_pulumi_pulumi, 1);
|
|
6
|
+
|
|
7
|
+
//#region src/railway/service.ts
|
|
8
|
+
const SERVICES_QUERY = `
|
|
9
|
+
query($projectId: String!) {
|
|
10
|
+
project(id: $projectId) {
|
|
11
|
+
services {
|
|
12
|
+
edges {
|
|
13
|
+
node {
|
|
14
|
+
id
|
|
15
|
+
name
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
`;
|
|
22
|
+
const SERVICE_QUERY = `
|
|
23
|
+
query($serviceId: String!) {
|
|
24
|
+
service(id: $serviceId) {
|
|
25
|
+
id
|
|
26
|
+
name
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
`;
|
|
30
|
+
const SERVICE_CREATE = `
|
|
31
|
+
mutation($input: ServiceCreateInput!) {
|
|
32
|
+
serviceCreate(input: $input) {
|
|
33
|
+
id
|
|
34
|
+
name
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
`;
|
|
38
|
+
const SERVICE_UPDATE = `
|
|
39
|
+
mutation($id: String!, $input: ServiceUpdateInput!) {
|
|
40
|
+
serviceUpdate(id: $id, input: $input) {
|
|
41
|
+
id
|
|
42
|
+
name
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
`;
|
|
46
|
+
const SERVICE_INSTANCE_UPDATE = `
|
|
47
|
+
mutation(
|
|
48
|
+
$serviceId: String!
|
|
49
|
+
$environmentId: String!
|
|
50
|
+
$input: ServiceInstanceUpdateInput!
|
|
51
|
+
) {
|
|
52
|
+
serviceInstanceUpdate(
|
|
53
|
+
serviceId: $serviceId
|
|
54
|
+
environmentId: $environmentId
|
|
55
|
+
input: $input
|
|
56
|
+
)
|
|
57
|
+
}
|
|
58
|
+
`;
|
|
59
|
+
const SERVICE_CONNECT = `
|
|
60
|
+
mutation($id: String!, $input: ServiceConnectInput!) {
|
|
61
|
+
serviceConnect(id: $id, input: $input) {
|
|
62
|
+
id
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
`;
|
|
66
|
+
const SERVICE_DELETE = `
|
|
67
|
+
mutation($id: String!) { serviceDelete(id: $id) }
|
|
68
|
+
`;
|
|
69
|
+
/**
|
|
70
|
+
* Applies service instance configuration (builder, commands, healthcheck).
|
|
71
|
+
* Retries without healthcheck fields if the first call fails.
|
|
72
|
+
*/
|
|
73
|
+
async function applyInstanceConfig(client, serviceId, environmentId, inputs) {
|
|
74
|
+
const instanceInput = {};
|
|
75
|
+
if (inputs.builder) instanceInput.builder = inputs.builder;
|
|
76
|
+
if (inputs.buildCommand) instanceInput.buildCommand = inputs.buildCommand;
|
|
77
|
+
if (inputs.startCommand) instanceInput.startCommand = inputs.startCommand;
|
|
78
|
+
if (inputs.restartPolicyType) instanceInput.restartPolicyType = inputs.restartPolicyType;
|
|
79
|
+
if (inputs.healthcheckPath) instanceInput.healthcheckPath = inputs.healthcheckPath;
|
|
80
|
+
if (inputs.healthcheckTimeout) instanceInput.healthcheckTimeout = inputs.healthcheckTimeout;
|
|
81
|
+
if (inputs.preDeployCommand) instanceInput.preDeployCommand = inputs.preDeployCommand;
|
|
82
|
+
if (Object.keys(instanceInput).length === 0) return;
|
|
83
|
+
try {
|
|
84
|
+
await client.query(SERVICE_INSTANCE_UPDATE, {
|
|
85
|
+
serviceId,
|
|
86
|
+
environmentId,
|
|
87
|
+
input: instanceInput
|
|
88
|
+
});
|
|
89
|
+
} catch (error) {
|
|
90
|
+
_pulumi_pulumi.log.warn(`serviceInstanceUpdate failed, retrying without healthcheck fields: ${error}`);
|
|
91
|
+
delete instanceInput.healthcheckPath;
|
|
92
|
+
delete instanceInput.healthcheckTimeout;
|
|
93
|
+
if (Object.keys(instanceInput).length > 0) await client.query(SERVICE_INSTANCE_UPDATE, {
|
|
94
|
+
serviceId,
|
|
95
|
+
environmentId,
|
|
96
|
+
input: instanceInput
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Dynamic provider implementing CRUD for Railway services.
|
|
102
|
+
*
|
|
103
|
+
* Uses adopt-or-create on `create()`: queries services by project ID and name
|
|
104
|
+
* before creating a new one. Service instance configuration (builder, commands,
|
|
105
|
+
* healthcheck) is applied via `serviceInstanceUpdate` after create or update.
|
|
106
|
+
*/
|
|
107
|
+
var RailwayServiceProvider = class {
|
|
108
|
+
/**
|
|
109
|
+
* Creates or adopts a Railway service by name, then applies instance config.
|
|
110
|
+
*
|
|
111
|
+
* @param inputs Resolved service configuration
|
|
112
|
+
* @returns The Railway service UUID as the resource ID
|
|
113
|
+
*/
|
|
114
|
+
async create(inputs) {
|
|
115
|
+
const client = new require_railway_client.RailwayClient(inputs.token);
|
|
116
|
+
let serviceId = (await client.query(SERVICES_QUERY, { projectId: inputs.projectId })).project.services.edges.find((edge) => edge.node.name === inputs.name)?.node.id;
|
|
117
|
+
if (serviceId) _pulumi_pulumi.log.info(`Adopted existing Railway service "${inputs.name}" (${serviceId})`);
|
|
118
|
+
else {
|
|
119
|
+
const createInput = {
|
|
120
|
+
projectId: inputs.projectId,
|
|
121
|
+
name: inputs.name
|
|
122
|
+
};
|
|
123
|
+
if (inputs.source) createInput.source = { image: inputs.source.image };
|
|
124
|
+
serviceId = (await client.query(SERVICE_CREATE, { input: createInput })).serviceCreate.id;
|
|
125
|
+
_pulumi_pulumi.log.info(`Created Railway service "${inputs.name}" (${serviceId})`);
|
|
126
|
+
if (inputs.source) await client.query(SERVICE_CONNECT, {
|
|
127
|
+
id: serviceId,
|
|
128
|
+
input: { image: inputs.source.image }
|
|
129
|
+
});
|
|
130
|
+
if (inputs.icon) await client.query(SERVICE_UPDATE, {
|
|
131
|
+
id: serviceId,
|
|
132
|
+
input: { icon: inputs.icon }
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
await applyInstanceConfig(client, serviceId, inputs.environmentId, inputs);
|
|
136
|
+
const outs = {
|
|
137
|
+
...inputs,
|
|
138
|
+
serviceId
|
|
139
|
+
};
|
|
140
|
+
return {
|
|
141
|
+
id: serviceId,
|
|
142
|
+
outs
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Updates service name/icon and re-applies instance configuration.
|
|
147
|
+
*
|
|
148
|
+
* @param id Railway service UUID
|
|
149
|
+
* @param _olds Previous persisted state
|
|
150
|
+
* @param news New desired configuration
|
|
151
|
+
*/
|
|
152
|
+
async update(id, _olds, news) {
|
|
153
|
+
const client = new require_railway_client.RailwayClient(news.token);
|
|
154
|
+
if (news.icon) await client.query(SERVICE_UPDATE, {
|
|
155
|
+
id,
|
|
156
|
+
input: { icon: news.icon }
|
|
157
|
+
});
|
|
158
|
+
await applyInstanceConfig(client, id, news.environmentId, news);
|
|
159
|
+
return { outs: {
|
|
160
|
+
...news,
|
|
161
|
+
serviceId: id
|
|
162
|
+
} };
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Reads current state for `pulumi refresh` by querying the service by ID.
|
|
166
|
+
*
|
|
167
|
+
* @param id Railway service UUID
|
|
168
|
+
* @param props Last known persisted state
|
|
169
|
+
*/
|
|
170
|
+
async read(id, props) {
|
|
171
|
+
const client = new require_railway_client.RailwayClient(props.token);
|
|
172
|
+
try {
|
|
173
|
+
await client.query(SERVICE_QUERY, { serviceId: id });
|
|
174
|
+
} catch {
|
|
175
|
+
throw new Error(`Railway service "${props.name}" (${id}) not found`);
|
|
176
|
+
}
|
|
177
|
+
return {
|
|
178
|
+
id,
|
|
179
|
+
props: {
|
|
180
|
+
...props,
|
|
181
|
+
serviceId: id
|
|
182
|
+
}
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Deletes the Railway service. Silently succeeds if already deleted.
|
|
187
|
+
*
|
|
188
|
+
* @param id Railway service UUID to delete
|
|
189
|
+
* @param props Last known persisted state (used for token and logging)
|
|
190
|
+
*/
|
|
191
|
+
async delete(id, props) {
|
|
192
|
+
const client = new require_railway_client.RailwayClient(props.token);
|
|
193
|
+
try {
|
|
194
|
+
await client.query(SERVICE_DELETE, { id });
|
|
195
|
+
_pulumi_pulumi.log.info(`Deleted Railway service "${props.name}" (${id})`);
|
|
196
|
+
} catch {
|
|
197
|
+
_pulumi_pulumi.log.warn(`Failed to delete Railway service "${props.name}" (${id}) — may already be deleted`);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Compares old and new inputs to determine what changed.
|
|
202
|
+
*
|
|
203
|
+
* Name, projectId, and environmentId changes trigger replacement.
|
|
204
|
+
* Builder, commands, and healthcheck changes trigger in-place update.
|
|
205
|
+
*
|
|
206
|
+
* @param _id Current resource ID (unused)
|
|
207
|
+
* @param olds Previous persisted state
|
|
208
|
+
* @param news New desired configuration
|
|
209
|
+
*/
|
|
210
|
+
async diff(_id, olds, news) {
|
|
211
|
+
const replaces = [];
|
|
212
|
+
const changes = [];
|
|
213
|
+
if (olds.name !== news.name) replaces.push("name");
|
|
214
|
+
if (olds.projectId !== news.projectId) replaces.push("projectId");
|
|
215
|
+
if (olds.environmentId !== news.environmentId) replaces.push("environmentId");
|
|
216
|
+
if (olds.builder !== news.builder) changes.push("builder");
|
|
217
|
+
if (olds.buildCommand !== news.buildCommand) changes.push("buildCommand");
|
|
218
|
+
if (olds.startCommand !== news.startCommand) changes.push("startCommand");
|
|
219
|
+
if (olds.restartPolicyType !== news.restartPolicyType) changes.push("restartPolicyType");
|
|
220
|
+
if (olds.healthcheckPath !== news.healthcheckPath) changes.push("healthcheckPath");
|
|
221
|
+
if (olds.healthcheckTimeout !== news.healthcheckTimeout) changes.push("healthcheckTimeout");
|
|
222
|
+
if (olds.preDeployCommand !== news.preDeployCommand) changes.push("preDeployCommand");
|
|
223
|
+
if (olds.icon !== news.icon) changes.push("icon");
|
|
224
|
+
return {
|
|
225
|
+
changes: replaces.length > 0 || changes.length > 0,
|
|
226
|
+
replaces,
|
|
227
|
+
deleteBeforeReplace: true
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
};
|
|
231
|
+
/**
|
|
232
|
+
* Manages a Railway service with adopt-or-create semantics.
|
|
233
|
+
*
|
|
234
|
+
* Queries existing services by project ID and name before creating new ones.
|
|
235
|
+
* Service instance configuration (builder, start command, healthcheck) is
|
|
236
|
+
* applied after creation via `serviceInstanceUpdate`.
|
|
237
|
+
*
|
|
238
|
+
* @example
|
|
239
|
+
* ```typescript
|
|
240
|
+
* const service = new RailwayService("railway-service-api", {
|
|
241
|
+
* token: project.projectToken,
|
|
242
|
+
* projectId: project.projectId,
|
|
243
|
+
* environmentId: project.productionEnvironmentId,
|
|
244
|
+
* name: "@my-app/api",
|
|
245
|
+
* builder: "RAILPACK",
|
|
246
|
+
* startCommand: "node dist/index.js",
|
|
247
|
+
* healthcheckPath: "/health",
|
|
248
|
+
* });
|
|
249
|
+
*
|
|
250
|
+
* // Use serviceId downstream
|
|
251
|
+
* new RailwayVariable("railway-variable-api", {
|
|
252
|
+
* serviceId: service.serviceId,
|
|
253
|
+
* ...
|
|
254
|
+
* });
|
|
255
|
+
* ```
|
|
256
|
+
*/
|
|
257
|
+
var RailwayService = class extends _pulumi_pulumi.dynamic.Resource {
|
|
258
|
+
constructor(name, args, opts) {
|
|
259
|
+
super(new RailwayServiceProvider(), name, {
|
|
260
|
+
...args,
|
|
261
|
+
serviceId: void 0
|
|
262
|
+
}, opts);
|
|
263
|
+
}
|
|
264
|
+
};
|
|
265
|
+
|
|
266
|
+
//#endregion
|
|
267
|
+
exports.RailwayService = RailwayService;
|
|
268
|
+
//# sourceMappingURL=service.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.cjs","names":["RailwayClient","pulumi"],"sources":["../../src/railway/service.ts"],"sourcesContent":["import * as pulumi from \"@pulumi/pulumi\";\nimport { RailwayClient } from \"./client.js\";\n\n/** Docker image source for a Railway service (e.g. `redis:8-alpine`). */\ninterface RailwayServiceSource {\n\t/** Full Docker image reference including tag. */\n\timage: string;\n}\n\n/** Resolved inputs for the Railway service dynamic provider. */\nexport interface RailwayServiceInputs {\n\t/** Railway API bearer token. */\n\ttoken: string;\n\n\t/** Railway project UUID. */\n\tprojectId: string;\n\n\t/** Railway environment UUID (e.g. production). */\n\tenvironmentId: string;\n\n\t/** Human-readable service name used for adopt-or-create matching. */\n\tname: string;\n\n\t/** SVG icon URL displayed in the Railway dashboard. */\n\ticon?: string;\n\n\t/** Docker image source for image-based services. */\n\tsource?: RailwayServiceSource;\n\n\t/** Build system: `\"RAILPACK\"`, `\"NIXPACKS\"`, or `\"DOCKERFILE\"`. */\n\tbuilder?: string;\n\n\t/** Shell command executed during the build phase. */\n\tbuildCommand?: string;\n\n\t/** Shell command executed to start the service at runtime. */\n\tstartCommand?: string;\n\n\t/** Restart behavior: `\"ON_FAILURE\"`, `\"ALWAYS\"`, or `\"NEVER\"`. */\n\trestartPolicyType?: string;\n\n\t/** HTTP path polled for health checks (e.g. `\"/health-check\"`). */\n\thealthcheckPath?: string;\n\n\t/** Seconds to wait for a healthy response before marking unhealthy. */\n\thealthcheckTimeout?: number;\n\n\t/** Shell command executed before the main deploy (e.g. migrations). */\n\tpreDeployCommand?: string;\n}\n\n/** Persisted state for the Railway service, extending inputs with the Railway-assigned ID. */\ninterface RailwayServiceOutputs extends RailwayServiceInputs {\n\t/** Railway-assigned service UUID. */\n\tserviceId: string;\n}\n\nconst SERVICES_QUERY = `\n query($projectId: String!) {\n project(id: $projectId) {\n services {\n edges {\n node {\n id\n name\n }\n }\n }\n }\n }\n`;\n\nconst SERVICE_QUERY = `\n query($serviceId: String!) {\n service(id: $serviceId) {\n id\n name\n }\n }\n`;\n\nconst SERVICE_CREATE = `\n mutation($input: ServiceCreateInput!) {\n serviceCreate(input: $input) {\n id\n name\n }\n }\n`;\n\nconst SERVICE_UPDATE = `\n mutation($id: String!, $input: ServiceUpdateInput!) {\n serviceUpdate(id: $id, input: $input) {\n id\n name\n }\n }\n`;\n\nconst SERVICE_INSTANCE_UPDATE = `\n mutation(\n $serviceId: String!\n $environmentId: String!\n $input: ServiceInstanceUpdateInput!\n ) {\n serviceInstanceUpdate(\n serviceId: $serviceId\n environmentId: $environmentId\n input: $input\n )\n }\n`;\n\nconst SERVICE_CONNECT = `\n mutation($id: String!, $input: ServiceConnectInput!) {\n serviceConnect(id: $id, input: $input) {\n id\n }\n }\n`;\n\nconst SERVICE_DELETE = `\n mutation($id: String!) { serviceDelete(id: $id) }\n`;\n\n/**\n * Applies service instance configuration (builder, commands, healthcheck).\n * Retries without healthcheck fields if the first call fails.\n */\nasync function applyInstanceConfig(\n\tclient: RailwayClient,\n\tserviceId: string,\n\tenvironmentId: string,\n\tinputs: RailwayServiceInputs,\n): Promise<void> {\n\tconst instanceInput: Record<string, unknown> = {};\n\n\tif (inputs.builder) {\n\t\tinstanceInput.builder = inputs.builder;\n\t}\n\n\tif (inputs.buildCommand) {\n\t\tinstanceInput.buildCommand = inputs.buildCommand;\n\t}\n\n\tif (inputs.startCommand) {\n\t\tinstanceInput.startCommand = inputs.startCommand;\n\t}\n\n\tif (inputs.restartPolicyType) {\n\t\tinstanceInput.restartPolicyType = inputs.restartPolicyType;\n\t}\n\n\tif (inputs.healthcheckPath) {\n\t\tinstanceInput.healthcheckPath = inputs.healthcheckPath;\n\t}\n\n\tif (inputs.healthcheckTimeout) {\n\t\tinstanceInput.healthcheckTimeout = inputs.healthcheckTimeout;\n\t}\n\n\tif (inputs.preDeployCommand) {\n\t\tinstanceInput.preDeployCommand = inputs.preDeployCommand;\n\t}\n\n\tif (Object.keys(instanceInput).length === 0) {\n\t\treturn;\n\t}\n\n\ttry {\n\t\tawait client.query(SERVICE_INSTANCE_UPDATE, {\n\t\t\tserviceId,\n\t\t\tenvironmentId,\n\t\t\tinput: instanceInput,\n\t\t});\n\t} catch (error) {\n\t\tpulumi.log.warn(\n\t\t\t`serviceInstanceUpdate failed, retrying without healthcheck fields: ${error}`,\n\t\t);\n\n\t\tdelete instanceInput.healthcheckPath;\n\t\tdelete instanceInput.healthcheckTimeout;\n\n\t\tif (Object.keys(instanceInput).length > 0) {\n\t\t\tawait client.query(SERVICE_INSTANCE_UPDATE, {\n\t\t\t\tserviceId,\n\t\t\t\tenvironmentId,\n\t\t\t\tinput: instanceInput,\n\t\t\t});\n\t\t}\n\t}\n}\n\n/**\n * Dynamic provider implementing CRUD for Railway services.\n *\n * Uses adopt-or-create on `create()`: queries services by project ID and name\n * before creating a new one. Service instance configuration (builder, commands,\n * healthcheck) is applied via `serviceInstanceUpdate` after create or update.\n */\nclass RailwayServiceProvider implements pulumi.dynamic.ResourceProvider {\n\t/**\n\t * Creates or adopts a Railway service by name, then applies instance config.\n\t *\n\t * @param inputs Resolved service configuration\n\t * @returns The Railway service UUID as the resource ID\n\t */\n\tasync create(\n\t\tinputs: RailwayServiceInputs,\n\t): Promise<pulumi.dynamic.CreateResult> {\n\t\tconst client = new RailwayClient(inputs.token);\n\n\t\tconst result = await client.query<{\n\t\t\tproject: {\n\t\t\t\tservices: { edges: Array<{ node: { id: string; name: string } }> };\n\t\t\t};\n\t\t}>(SERVICES_QUERY, { projectId: inputs.projectId });\n\n\t\tlet serviceId = result.project.services.edges.find(\n\t\t\t(edge) => edge.node.name === inputs.name,\n\t\t)?.node.id;\n\n\t\tif (serviceId) {\n\t\t\tpulumi.log.info(\n\t\t\t\t`Adopted existing Railway service \"${inputs.name}\" (${serviceId})`,\n\t\t\t);\n\t\t} else {\n\t\t\tconst createInput: Record<string, unknown> = {\n\t\t\t\tprojectId: inputs.projectId,\n\t\t\t\tname: inputs.name,\n\t\t\t};\n\n\t\t\tif (inputs.source) {\n\t\t\t\tcreateInput.source = { image: inputs.source.image };\n\t\t\t}\n\n\t\t\tconst created = await client.query<{\n\t\t\t\tserviceCreate: { id: string; name: string };\n\t\t\t}>(SERVICE_CREATE, { input: createInput });\n\n\t\t\tserviceId = created.serviceCreate.id;\n\n\t\t\tpulumi.log.info(\n\t\t\t\t`Created Railway service \"${inputs.name}\" (${serviceId})`,\n\t\t\t);\n\n\t\t\tif (inputs.source) {\n\t\t\t\tawait client.query(SERVICE_CONNECT, {\n\t\t\t\t\tid: serviceId,\n\t\t\t\t\tinput: { image: inputs.source.image },\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (inputs.icon) {\n\t\t\t\tawait client.query(SERVICE_UPDATE, {\n\t\t\t\t\tid: serviceId,\n\t\t\t\t\tinput: { icon: inputs.icon },\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tawait applyInstanceConfig(client, serviceId, inputs.environmentId, inputs);\n\n\t\tconst outs: RailwayServiceOutputs = { ...inputs, serviceId };\n\n\t\treturn { id: serviceId, outs };\n\t}\n\n\t/**\n\t * Updates service name/icon and re-applies instance configuration.\n\t *\n\t * @param id Railway service UUID\n\t * @param _olds Previous persisted state\n\t * @param news New desired configuration\n\t */\n\tasync update(\n\t\tid: string,\n\t\t_olds: RailwayServiceOutputs,\n\t\tnews: RailwayServiceInputs,\n\t): Promise<pulumi.dynamic.UpdateResult> {\n\t\tconst client = new RailwayClient(news.token);\n\n\t\tif (news.icon) {\n\t\t\tawait client.query(SERVICE_UPDATE, {\n\t\t\t\tid,\n\t\t\t\tinput: { icon: news.icon },\n\t\t\t});\n\t\t}\n\n\t\tawait applyInstanceConfig(client, id, news.environmentId, news);\n\n\t\tconst outs: RailwayServiceOutputs = { ...news, serviceId: id };\n\n\t\treturn { outs };\n\t}\n\n\t/**\n\t * Reads current state for `pulumi refresh` by querying the service by ID.\n\t *\n\t * @param id Railway service UUID\n\t * @param props Last known persisted state\n\t */\n\tasync read(\n\t\tid: string,\n\t\tprops: RailwayServiceOutputs,\n\t): Promise<pulumi.dynamic.ReadResult> {\n\t\tconst client = new RailwayClient(props.token);\n\n\t\ttry {\n\t\t\tawait client.query<{ service: { id: string; name: string } }>(\n\t\t\t\tSERVICE_QUERY,\n\t\t\t\t{ serviceId: id },\n\t\t\t);\n\t\t} catch {\n\t\t\tthrow new Error(`Railway service \"${props.name}\" (${id}) not found`);\n\t\t}\n\n\t\treturn { id, props: { ...props, serviceId: id } };\n\t}\n\n\t/**\n\t * Deletes the Railway service. Silently succeeds if already deleted.\n\t *\n\t * @param id Railway service UUID to delete\n\t * @param props Last known persisted state (used for token and logging)\n\t */\n\tasync delete(id: string, props: RailwayServiceOutputs): Promise<void> {\n\t\tconst client = new RailwayClient(props.token);\n\n\t\ttry {\n\t\t\tawait client.query(SERVICE_DELETE, { id });\n\n\t\t\tpulumi.log.info(`Deleted Railway service \"${props.name}\" (${id})`);\n\t\t} catch {\n\t\t\tpulumi.log.warn(\n\t\t\t\t`Failed to delete Railway service \"${props.name}\" (${id}) — may already be deleted`,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Compares old and new inputs to determine what changed.\n\t *\n\t * Name, projectId, and environmentId changes trigger replacement.\n\t * Builder, commands, and healthcheck changes trigger in-place update.\n\t *\n\t * @param _id Current resource ID (unused)\n\t * @param olds Previous persisted state\n\t * @param news New desired configuration\n\t */\n\tasync diff(\n\t\t_id: string,\n\t\tolds: RailwayServiceOutputs,\n\t\tnews: RailwayServiceInputs,\n\t): Promise<pulumi.dynamic.DiffResult> {\n\t\tconst replaces: string[] = [];\n\t\tconst changes: string[] = [];\n\n\t\tif (olds.name !== news.name) {\n\t\t\treplaces.push(\"name\");\n\t\t}\n\n\t\tif (olds.projectId !== news.projectId) {\n\t\t\treplaces.push(\"projectId\");\n\t\t}\n\n\t\tif (olds.environmentId !== news.environmentId) {\n\t\t\treplaces.push(\"environmentId\");\n\t\t}\n\n\t\tif (olds.builder !== news.builder) {\n\t\t\tchanges.push(\"builder\");\n\t\t}\n\n\t\tif (olds.buildCommand !== news.buildCommand) {\n\t\t\tchanges.push(\"buildCommand\");\n\t\t}\n\n\t\tif (olds.startCommand !== news.startCommand) {\n\t\t\tchanges.push(\"startCommand\");\n\t\t}\n\n\t\tif (olds.restartPolicyType !== news.restartPolicyType) {\n\t\t\tchanges.push(\"restartPolicyType\");\n\t\t}\n\n\t\tif (olds.healthcheckPath !== news.healthcheckPath) {\n\t\t\tchanges.push(\"healthcheckPath\");\n\t\t}\n\n\t\tif (olds.healthcheckTimeout !== news.healthcheckTimeout) {\n\t\t\tchanges.push(\"healthcheckTimeout\");\n\t\t}\n\n\t\tif (olds.preDeployCommand !== news.preDeployCommand) {\n\t\t\tchanges.push(\"preDeployCommand\");\n\t\t}\n\n\t\tif (olds.icon !== news.icon) {\n\t\t\tchanges.push(\"icon\");\n\t\t}\n\n\t\treturn {\n\t\t\tchanges: replaces.length > 0 || changes.length > 0,\n\t\t\treplaces,\n\t\t\tdeleteBeforeReplace: true,\n\t\t};\n\t}\n}\n\n/**\n * Manages a Railway service with adopt-or-create semantics.\n *\n * Queries existing services by project ID and name before creating new ones.\n * Service instance configuration (builder, start command, healthcheck) is\n * applied after creation via `serviceInstanceUpdate`.\n *\n * @example\n * ```typescript\n * const service = new RailwayService(\"railway-service-api\", {\n * token: project.projectToken,\n * projectId: project.projectId,\n * environmentId: project.productionEnvironmentId,\n * name: \"@my-app/api\",\n * builder: \"RAILPACK\",\n * startCommand: \"node dist/index.js\",\n * healthcheckPath: \"/health\",\n * });\n *\n * // Use serviceId downstream\n * new RailwayVariable(\"railway-variable-api\", {\n * serviceId: service.serviceId,\n * ...\n * });\n * ```\n */\nexport class RailwayService extends pulumi.dynamic.Resource {\n\t/** Railway service UUID. */\n\tpublic declare readonly serviceId: pulumi.Output<string>;\n\n\tconstructor(\n\t\tname: string,\n\t\targs: {\n\t\t\t/** Railway API bearer token. */\n\t\t\ttoken: pulumi.Input<string>;\n\n\t\t\t/** Railway project UUID. */\n\t\t\tprojectId: pulumi.Input<string>;\n\n\t\t\t/** Railway environment UUID (e.g. production). */\n\t\t\tenvironmentId: pulumi.Input<string>;\n\n\t\t\t/** Human-readable service name used for adopt-or-create matching. */\n\t\t\tname: pulumi.Input<string>;\n\n\t\t\t/** SVG icon URL displayed in the Railway dashboard. */\n\t\t\ticon?: pulumi.Input<string>;\n\n\t\t\t/** Docker image source for image-based services. */\n\t\t\tsource?: pulumi.Input<{ image: pulumi.Input<string> }>;\n\n\t\t\t/** Build system: `\"RAILPACK\"`, `\"NIXPACKS\"`, or `\"DOCKERFILE\"`. */\n\t\t\tbuilder?: pulumi.Input<string>;\n\n\t\t\t/** Shell command executed during the build phase. */\n\t\t\tbuildCommand?: pulumi.Input<string>;\n\n\t\t\t/** Shell command executed to start the service at runtime. */\n\t\t\tstartCommand?: pulumi.Input<string>;\n\n\t\t\t/** Restart behavior: `\"ON_FAILURE\"`, `\"ALWAYS\"`, or `\"NEVER\"`. */\n\t\t\trestartPolicyType?: pulumi.Input<string>;\n\n\t\t\t/** HTTP path polled for health checks (e.g. `\"/health-check\"`). */\n\t\t\thealthcheckPath?: pulumi.Input<string>;\n\n\t\t\t/** Seconds to wait for a healthy response before marking unhealthy. */\n\t\t\thealthcheckTimeout?: pulumi.Input<number>;\n\n\t\t\t/** Shell command executed before the main deploy (e.g. migrations). */\n\t\t\tpreDeployCommand?: pulumi.Input<string>;\n\t\t},\n\t\topts?: pulumi.CustomResourceOptions,\n\t) {\n\t\tsuper(\n\t\t\tnew RailwayServiceProvider(),\n\t\t\tname,\n\t\t\t{ ...args, serviceId: undefined },\n\t\t\topts,\n\t\t);\n\t}\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { t as __name } from "../chunk-OPjESj5l.cjs";
|
|
2
|
+
import * as pulumi from "@pulumi/pulumi";
|
|
3
|
+
|
|
4
|
+
//#region src/railway/service.d.ts
|
|
5
|
+
/** Docker image source for a Railway service (e.g. `redis:8-alpine`). */
|
|
6
|
+
interface RailwayServiceSource {
|
|
7
|
+
/** Full Docker image reference including tag. */
|
|
8
|
+
image: string;
|
|
9
|
+
}
|
|
10
|
+
/** Resolved inputs for the Railway service dynamic provider. */
|
|
11
|
+
interface RailwayServiceInputs {
|
|
12
|
+
/** Railway API bearer token. */
|
|
13
|
+
token: string;
|
|
14
|
+
/** Railway project UUID. */
|
|
15
|
+
projectId: string;
|
|
16
|
+
/** Railway environment UUID (e.g. production). */
|
|
17
|
+
environmentId: string;
|
|
18
|
+
/** Human-readable service name used for adopt-or-create matching. */
|
|
19
|
+
name: string;
|
|
20
|
+
/** SVG icon URL displayed in the Railway dashboard. */
|
|
21
|
+
icon?: string;
|
|
22
|
+
/** Docker image source for image-based services. */
|
|
23
|
+
source?: RailwayServiceSource;
|
|
24
|
+
/** Build system: `"RAILPACK"`, `"NIXPACKS"`, or `"DOCKERFILE"`. */
|
|
25
|
+
builder?: string;
|
|
26
|
+
/** Shell command executed during the build phase. */
|
|
27
|
+
buildCommand?: string;
|
|
28
|
+
/** Shell command executed to start the service at runtime. */
|
|
29
|
+
startCommand?: string;
|
|
30
|
+
/** Restart behavior: `"ON_FAILURE"`, `"ALWAYS"`, or `"NEVER"`. */
|
|
31
|
+
restartPolicyType?: string;
|
|
32
|
+
/** HTTP path polled for health checks (e.g. `"/health-check"`). */
|
|
33
|
+
healthcheckPath?: string;
|
|
34
|
+
/** Seconds to wait for a healthy response before marking unhealthy. */
|
|
35
|
+
healthcheckTimeout?: number;
|
|
36
|
+
/** Shell command executed before the main deploy (e.g. migrations). */
|
|
37
|
+
preDeployCommand?: string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Manages a Railway service with adopt-or-create semantics.
|
|
41
|
+
*
|
|
42
|
+
* Queries existing services by project ID and name before creating new ones.
|
|
43
|
+
* Service instance configuration (builder, start command, healthcheck) is
|
|
44
|
+
* applied after creation via `serviceInstanceUpdate`.
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* ```typescript
|
|
48
|
+
* const service = new RailwayService("railway-service-api", {
|
|
49
|
+
* token: project.projectToken,
|
|
50
|
+
* projectId: project.projectId,
|
|
51
|
+
* environmentId: project.productionEnvironmentId,
|
|
52
|
+
* name: "@my-app/api",
|
|
53
|
+
* builder: "RAILPACK",
|
|
54
|
+
* startCommand: "node dist/index.js",
|
|
55
|
+
* healthcheckPath: "/health",
|
|
56
|
+
* });
|
|
57
|
+
*
|
|
58
|
+
* // Use serviceId downstream
|
|
59
|
+
* new RailwayVariable("railway-variable-api", {
|
|
60
|
+
* serviceId: service.serviceId,
|
|
61
|
+
* ...
|
|
62
|
+
* });
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
declare class RailwayService extends pulumi.dynamic.Resource {
|
|
66
|
+
/** Railway service UUID. */
|
|
67
|
+
readonly serviceId: pulumi.Output<string>;
|
|
68
|
+
constructor(name: string, args: {
|
|
69
|
+
/** Railway API bearer token. */token: pulumi.Input<string>; /** Railway project UUID. */
|
|
70
|
+
projectId: pulumi.Input<string>; /** Railway environment UUID (e.g. production). */
|
|
71
|
+
environmentId: pulumi.Input<string>; /** Human-readable service name used for adopt-or-create matching. */
|
|
72
|
+
name: pulumi.Input<string>; /** SVG icon URL displayed in the Railway dashboard. */
|
|
73
|
+
icon?: pulumi.Input<string>; /** Docker image source for image-based services. */
|
|
74
|
+
source?: pulumi.Input<{
|
|
75
|
+
image: pulumi.Input<string>;
|
|
76
|
+
}>; /** Build system: `"RAILPACK"`, `"NIXPACKS"`, or `"DOCKERFILE"`. */
|
|
77
|
+
builder?: pulumi.Input<string>; /** Shell command executed during the build phase. */
|
|
78
|
+
buildCommand?: pulumi.Input<string>; /** Shell command executed to start the service at runtime. */
|
|
79
|
+
startCommand?: pulumi.Input<string>; /** Restart behavior: `"ON_FAILURE"`, `"ALWAYS"`, or `"NEVER"`. */
|
|
80
|
+
restartPolicyType?: pulumi.Input<string>; /** HTTP path polled for health checks (e.g. `"/health-check"`). */
|
|
81
|
+
healthcheckPath?: pulumi.Input<string>; /** Seconds to wait for a healthy response before marking unhealthy. */
|
|
82
|
+
healthcheckTimeout?: pulumi.Input<number>; /** Shell command executed before the main deploy (e.g. migrations). */
|
|
83
|
+
preDeployCommand?: pulumi.Input<string>;
|
|
84
|
+
}, opts?: pulumi.CustomResourceOptions);
|
|
85
|
+
}
|
|
86
|
+
//#endregion
|
|
87
|
+
export { RailwayService, RailwayServiceInputs };
|
|
88
|
+
//# sourceMappingURL=service.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.cts","names":[],"sources":["../../src/railway/service.ts"],"mappings":";;;;;UAIU,oBAAA;;EAET,KAAK;AAAA;;UAIW,oBAAA;EAJX;EAML,KAAA;EAFoC;EAKpC,SAAA;EAY6B;EAT7B,aAAA;EAHA;EAMA,IAAA;EAAA;EAGA,IAAA;EAGA;EAAA,MAAA,GAAS,oBAAoB;EAG7B;EAAA,OAAA;EAMA;EAHA,YAAA;EASA;EANA,YAAA;EAYA;EATA,iBAAA;EASgB;EANhB,eAAA;EA0Y2B;EAvY3B,kBAAA;EAyYmC;EAtYnC,gBAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;cAoYY,cAAA,SAAuB,MAAA,CAAO,OAAA,CAAQ,QAAA;EAWhD;EAAA,SATsB,SAAA,EAAW,MAAA,CAAO,MAAA;cAGzC,IAAA,UACA,IAAA;IAQC,gCANA,KAAA,EAAO,MAAA,CAAO,KAAA,UAMQ;IAHtB,SAAA,EAAW,MAAA,CAAO,KAAA,UAMZ;IAHN,aAAA,EAAe,MAAA,CAAO,KAAA,UAMtB;IAHA,IAAA,EAAM,MAAA,CAAO,KAAA,UAGC;IAAd,IAAA,GAAO,MAAA,CAAO,KAAA,UAGL;IAAT,MAAA,GAAS,MAAA,CAAO,KAAA;MAAQ,KAAA,EAAO,MAAA,CAAO,KAAA;IAAA,IAAA;IAGtC,OAAA,GAAU,MAAA,CAAO,KAAA,UAAP;IAGV,YAAA,GAAe,MAAA,CAAO,KAAA,UAAtB;IAGA,YAAA,GAAe,MAAA,CAAO,KAAA,UAHA;IAMtB,iBAAA,GAAoB,MAAA,CAAO,KAAA,UAHZ;IAMf,eAAA,GAAkB,MAAA,CAAO,KAAA,UAHzB;IAMA,kBAAA,GAAqB,MAAA,CAAO,KAAA,UAND;IAS3B,gBAAA,GAAmB,MAAA,CAAO,KAAA;EAAA,GAE3B,IAAA,GAAO,MAAA,CAAO,qBAAA;AAAA"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { t as __name } from "../chunk-OPjESj5l.mjs";
|
|
2
|
+
import * as pulumi from "@pulumi/pulumi";
|
|
3
|
+
|
|
4
|
+
//#region src/railway/service.d.ts
|
|
5
|
+
/** Docker image source for a Railway service (e.g. `redis:8-alpine`). */
|
|
6
|
+
interface RailwayServiceSource {
|
|
7
|
+
/** Full Docker image reference including tag. */
|
|
8
|
+
image: string;
|
|
9
|
+
}
|
|
10
|
+
/** Resolved inputs for the Railway service dynamic provider. */
|
|
11
|
+
interface RailwayServiceInputs {
|
|
12
|
+
/** Railway API bearer token. */
|
|
13
|
+
token: string;
|
|
14
|
+
/** Railway project UUID. */
|
|
15
|
+
projectId: string;
|
|
16
|
+
/** Railway environment UUID (e.g. production). */
|
|
17
|
+
environmentId: string;
|
|
18
|
+
/** Human-readable service name used for adopt-or-create matching. */
|
|
19
|
+
name: string;
|
|
20
|
+
/** SVG icon URL displayed in the Railway dashboard. */
|
|
21
|
+
icon?: string;
|
|
22
|
+
/** Docker image source for image-based services. */
|
|
23
|
+
source?: RailwayServiceSource;
|
|
24
|
+
/** Build system: `"RAILPACK"`, `"NIXPACKS"`, or `"DOCKERFILE"`. */
|
|
25
|
+
builder?: string;
|
|
26
|
+
/** Shell command executed during the build phase. */
|
|
27
|
+
buildCommand?: string;
|
|
28
|
+
/** Shell command executed to start the service at runtime. */
|
|
29
|
+
startCommand?: string;
|
|
30
|
+
/** Restart behavior: `"ON_FAILURE"`, `"ALWAYS"`, or `"NEVER"`. */
|
|
31
|
+
restartPolicyType?: string;
|
|
32
|
+
/** HTTP path polled for health checks (e.g. `"/health-check"`). */
|
|
33
|
+
healthcheckPath?: string;
|
|
34
|
+
/** Seconds to wait for a healthy response before marking unhealthy. */
|
|
35
|
+
healthcheckTimeout?: number;
|
|
36
|
+
/** Shell command executed before the main deploy (e.g. migrations). */
|
|
37
|
+
preDeployCommand?: string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Manages a Railway service with adopt-or-create semantics.
|
|
41
|
+
*
|
|
42
|
+
* Queries existing services by project ID and name before creating new ones.
|
|
43
|
+
* Service instance configuration (builder, start command, healthcheck) is
|
|
44
|
+
* applied after creation via `serviceInstanceUpdate`.
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* ```typescript
|
|
48
|
+
* const service = new RailwayService("railway-service-api", {
|
|
49
|
+
* token: project.projectToken,
|
|
50
|
+
* projectId: project.projectId,
|
|
51
|
+
* environmentId: project.productionEnvironmentId,
|
|
52
|
+
* name: "@my-app/api",
|
|
53
|
+
* builder: "RAILPACK",
|
|
54
|
+
* startCommand: "node dist/index.js",
|
|
55
|
+
* healthcheckPath: "/health",
|
|
56
|
+
* });
|
|
57
|
+
*
|
|
58
|
+
* // Use serviceId downstream
|
|
59
|
+
* new RailwayVariable("railway-variable-api", {
|
|
60
|
+
* serviceId: service.serviceId,
|
|
61
|
+
* ...
|
|
62
|
+
* });
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
declare class RailwayService extends pulumi.dynamic.Resource {
|
|
66
|
+
/** Railway service UUID. */
|
|
67
|
+
readonly serviceId: pulumi.Output<string>;
|
|
68
|
+
constructor(name: string, args: {
|
|
69
|
+
/** Railway API bearer token. */token: pulumi.Input<string>; /** Railway project UUID. */
|
|
70
|
+
projectId: pulumi.Input<string>; /** Railway environment UUID (e.g. production). */
|
|
71
|
+
environmentId: pulumi.Input<string>; /** Human-readable service name used for adopt-or-create matching. */
|
|
72
|
+
name: pulumi.Input<string>; /** SVG icon URL displayed in the Railway dashboard. */
|
|
73
|
+
icon?: pulumi.Input<string>; /** Docker image source for image-based services. */
|
|
74
|
+
source?: pulumi.Input<{
|
|
75
|
+
image: pulumi.Input<string>;
|
|
76
|
+
}>; /** Build system: `"RAILPACK"`, `"NIXPACKS"`, or `"DOCKERFILE"`. */
|
|
77
|
+
builder?: pulumi.Input<string>; /** Shell command executed during the build phase. */
|
|
78
|
+
buildCommand?: pulumi.Input<string>; /** Shell command executed to start the service at runtime. */
|
|
79
|
+
startCommand?: pulumi.Input<string>; /** Restart behavior: `"ON_FAILURE"`, `"ALWAYS"`, or `"NEVER"`. */
|
|
80
|
+
restartPolicyType?: pulumi.Input<string>; /** HTTP path polled for health checks (e.g. `"/health-check"`). */
|
|
81
|
+
healthcheckPath?: pulumi.Input<string>; /** Seconds to wait for a healthy response before marking unhealthy. */
|
|
82
|
+
healthcheckTimeout?: pulumi.Input<number>; /** Shell command executed before the main deploy (e.g. migrations). */
|
|
83
|
+
preDeployCommand?: pulumi.Input<string>;
|
|
84
|
+
}, opts?: pulumi.CustomResourceOptions);
|
|
85
|
+
}
|
|
86
|
+
//#endregion
|
|
87
|
+
export { RailwayService, RailwayServiceInputs };
|
|
88
|
+
//# sourceMappingURL=service.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.mts","names":[],"sources":["../../src/railway/service.ts"],"mappings":";;;;;UAIU,oBAAA;;EAET,KAAK;AAAA;;UAIW,oBAAA;EAJX;EAML,KAAA;EAFoC;EAKpC,SAAA;EAY6B;EAT7B,aAAA;EAHA;EAMA,IAAA;EAAA;EAGA,IAAA;EAGA;EAAA,MAAA,GAAS,oBAAoB;EAG7B;EAAA,OAAA;EAMA;EAHA,YAAA;EASA;EANA,YAAA;EAYA;EATA,iBAAA;EASgB;EANhB,eAAA;EA0Y2B;EAvY3B,kBAAA;EAyYmC;EAtYnC,gBAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;cAoYY,cAAA,SAAuB,MAAA,CAAO,OAAA,CAAQ,QAAA;EAWhD;EAAA,SATsB,SAAA,EAAW,MAAA,CAAO,MAAA;cAGzC,IAAA,UACA,IAAA;IAQC,gCANA,KAAA,EAAO,MAAA,CAAO,KAAA,UAMQ;IAHtB,SAAA,EAAW,MAAA,CAAO,KAAA,UAMZ;IAHN,aAAA,EAAe,MAAA,CAAO,KAAA,UAMtB;IAHA,IAAA,EAAM,MAAA,CAAO,KAAA,UAGC;IAAd,IAAA,GAAO,MAAA,CAAO,KAAA,UAGL;IAAT,MAAA,GAAS,MAAA,CAAO,KAAA;MAAQ,KAAA,EAAO,MAAA,CAAO,KAAA;IAAA,IAAA;IAGtC,OAAA,GAAU,MAAA,CAAO,KAAA,UAAP;IAGV,YAAA,GAAe,MAAA,CAAO,KAAA,UAAtB;IAGA,YAAA,GAAe,MAAA,CAAO,KAAA,UAHA;IAMtB,iBAAA,GAAoB,MAAA,CAAO,KAAA,UAHZ;IAMf,eAAA,GAAkB,MAAA,CAAO,KAAA,UAHzB;IAMA,kBAAA,GAAqB,MAAA,CAAO,KAAA,UAND;IAS3B,gBAAA,GAAmB,MAAA,CAAO,KAAA;EAAA,GAE3B,IAAA,GAAO,MAAA,CAAO,qBAAA;AAAA"}
|