@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.

Files changed (151) hide show
  1. package/dist/chunk-BVYJZCqc.cjs +44 -0
  2. package/dist/chunk-OPjESj5l.mjs +9 -0
  3. package/dist/git-guard.cjs +62 -0
  4. package/dist/git-guard.cjs.map +1 -0
  5. package/dist/git-guard.d.cts +13 -0
  6. package/dist/git-guard.d.cts.map +1 -0
  7. package/dist/git-guard.d.mts +13 -0
  8. package/dist/git-guard.d.mts.map +1 -0
  9. package/dist/git-guard.mjs +56 -0
  10. package/dist/git-guard.mjs.map +1 -0
  11. package/dist/hash.cjs +40 -0
  12. package/dist/hash.cjs.map +1 -0
  13. package/dist/hash.d.cts +10 -0
  14. package/dist/hash.d.cts.map +1 -0
  15. package/dist/hash.d.mts +10 -0
  16. package/dist/hash.d.mts.map +1 -0
  17. package/dist/hash.mjs +36 -0
  18. package/dist/hash.mjs.map +1 -0
  19. package/dist/neon/branch.cjs +113 -0
  20. package/dist/neon/branch.cjs.map +1 -0
  21. package/dist/neon/branch.d.cts +40 -0
  22. package/dist/neon/branch.d.cts.map +1 -0
  23. package/dist/neon/branch.d.mts +40 -0
  24. package/dist/neon/branch.d.mts.map +1 -0
  25. package/dist/neon/branch.mjs +111 -0
  26. package/dist/neon/branch.mjs.map +1 -0
  27. package/dist/neon/client.cjs +85 -0
  28. package/dist/neon/client.cjs.map +1 -0
  29. package/dist/neon/client.d.cts +59 -0
  30. package/dist/neon/client.d.cts.map +1 -0
  31. package/dist/neon/client.d.mts +59 -0
  32. package/dist/neon/client.d.mts.map +1 -0
  33. package/dist/neon/client.mjs +84 -0
  34. package/dist/neon/client.mjs.map +1 -0
  35. package/dist/neon/database.cjs +117 -0
  36. package/dist/neon/database.cjs.map +1 -0
  37. package/dist/neon/database.d.cts +48 -0
  38. package/dist/neon/database.d.cts.map +1 -0
  39. package/dist/neon/database.d.mts +48 -0
  40. package/dist/neon/database.d.mts.map +1 -0
  41. package/dist/neon/database.mjs +115 -0
  42. package/dist/neon/database.mjs.map +1 -0
  43. package/dist/neon/endpoint.cjs +167 -0
  44. package/dist/neon/endpoint.cjs.map +1 -0
  45. package/dist/neon/endpoint.d.cts +57 -0
  46. package/dist/neon/endpoint.d.cts.map +1 -0
  47. package/dist/neon/endpoint.d.mts +57 -0
  48. package/dist/neon/endpoint.d.mts.map +1 -0
  49. package/dist/neon/endpoint.mjs +165 -0
  50. package/dist/neon/endpoint.mjs.map +1 -0
  51. package/dist/neon/index.cjs +14 -0
  52. package/dist/neon/index.d.cts +7 -0
  53. package/dist/neon/index.d.mts +7 -0
  54. package/dist/neon/index.mjs +8 -0
  55. package/dist/neon/project.cjs +120 -0
  56. package/dist/neon/project.cjs.map +1 -0
  57. package/dist/neon/project.d.cts +52 -0
  58. package/dist/neon/project.d.cts.map +1 -0
  59. package/dist/neon/project.d.mts +52 -0
  60. package/dist/neon/project.d.mts.map +1 -0
  61. package/dist/neon/project.mjs +118 -0
  62. package/dist/neon/project.mjs.map +1 -0
  63. package/dist/neon/role.cjs +135 -0
  64. package/dist/neon/role.cjs.map +1 -0
  65. package/dist/neon/role.d.cts +49 -0
  66. package/dist/neon/role.d.cts.map +1 -0
  67. package/dist/neon/role.d.mts +49 -0
  68. package/dist/neon/role.d.mts.map +1 -0
  69. package/dist/neon/role.mjs +133 -0
  70. package/dist/neon/role.mjs.map +1 -0
  71. package/dist/railway/client.cjs +59 -0
  72. package/dist/railway/client.cjs.map +1 -0
  73. package/dist/railway/client.d.cts +39 -0
  74. package/dist/railway/client.d.cts.map +1 -0
  75. package/dist/railway/client.d.mts +39 -0
  76. package/dist/railway/client.d.mts.map +1 -0
  77. package/dist/railway/client.mjs +58 -0
  78. package/dist/railway/client.mjs.map +1 -0
  79. package/dist/railway/deploy.cjs +40 -0
  80. package/dist/railway/deploy.cjs.map +1 -0
  81. package/dist/railway/deploy.d.cts +47 -0
  82. package/dist/railway/deploy.d.cts.map +1 -0
  83. package/dist/railway/deploy.d.mts +47 -0
  84. package/dist/railway/deploy.d.mts.map +1 -0
  85. package/dist/railway/deploy.mjs +37 -0
  86. package/dist/railway/deploy.mjs.map +1 -0
  87. package/dist/railway/domain.cjs +236 -0
  88. package/dist/railway/domain.cjs.map +1 -0
  89. package/dist/railway/domain.d.cts +52 -0
  90. package/dist/railway/domain.d.cts.map +1 -0
  91. package/dist/railway/domain.d.mts +52 -0
  92. package/dist/railway/domain.d.mts.map +1 -0
  93. package/dist/railway/domain.mjs +234 -0
  94. package/dist/railway/domain.mjs.map +1 -0
  95. package/dist/railway/index.cjs +16 -0
  96. package/dist/railway/index.d.cts +8 -0
  97. package/dist/railway/index.d.mts +8 -0
  98. package/dist/railway/index.mjs +9 -0
  99. package/dist/railway/project.cjs +231 -0
  100. package/dist/railway/project.cjs.map +1 -0
  101. package/dist/railway/project.d.cts +52 -0
  102. package/dist/railway/project.d.cts.map +1 -0
  103. package/dist/railway/project.d.mts +52 -0
  104. package/dist/railway/project.d.mts.map +1 -0
  105. package/dist/railway/project.mjs +229 -0
  106. package/dist/railway/project.mjs.map +1 -0
  107. package/dist/railway/service.cjs +268 -0
  108. package/dist/railway/service.cjs.map +1 -0
  109. package/dist/railway/service.d.cts +88 -0
  110. package/dist/railway/service.d.cts.map +1 -0
  111. package/dist/railway/service.d.mts +88 -0
  112. package/dist/railway/service.d.mts.map +1 -0
  113. package/dist/railway/service.mjs +266 -0
  114. package/dist/railway/service.mjs.map +1 -0
  115. package/dist/railway/variable.cjs +149 -0
  116. package/dist/railway/variable.cjs.map +1 -0
  117. package/dist/railway/variable.d.cts +52 -0
  118. package/dist/railway/variable.d.cts.map +1 -0
  119. package/dist/railway/variable.d.mts +52 -0
  120. package/dist/railway/variable.d.mts.map +1 -0
  121. package/dist/railway/variable.mjs +147 -0
  122. package/dist/railway/variable.mjs.map +1 -0
  123. package/dist/railway/volume.cjs +179 -0
  124. package/dist/railway/volume.cjs.map +1 -0
  125. package/dist/railway/volume.d.cts +52 -0
  126. package/dist/railway/volume.d.cts.map +1 -0
  127. package/dist/railway/volume.d.mts +52 -0
  128. package/dist/railway/volume.d.mts.map +1 -0
  129. package/dist/railway/volume.mjs +177 -0
  130. package/dist/railway/volume.mjs.map +1 -0
  131. package/dist/vercel/deploy.cjs +65 -0
  132. package/dist/vercel/deploy.cjs.map +1 -0
  133. package/dist/vercel/deploy.d.cts +54 -0
  134. package/dist/vercel/deploy.d.cts.map +1 -0
  135. package/dist/vercel/deploy.d.mts +54 -0
  136. package/dist/vercel/deploy.d.mts.map +1 -0
  137. package/dist/vercel/deploy.mjs +61 -0
  138. package/dist/vercel/deploy.mjs.map +1 -0
  139. package/dist/vercel/index.cjs +6 -0
  140. package/dist/vercel/index.d.cts +3 -0
  141. package/dist/vercel/index.d.mts +3 -0
  142. package/dist/vercel/index.mjs +4 -0
  143. package/dist/vercel/variable.cjs +280 -0
  144. package/dist/vercel/variable.cjs.map +1 -0
  145. package/dist/vercel/variable.d.cts +55 -0
  146. package/dist/vercel/variable.d.cts.map +1 -0
  147. package/dist/vercel/variable.d.mts +55 -0
  148. package/dist/vercel/variable.d.mts.map +1 -0
  149. package/dist/vercel/variable.mjs +278 -0
  150. package/dist/vercel/variable.mjs.map +1 -0
  151. 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"}