@prisma/compute-sdk 0.28.0 → 0.30.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.
Files changed (106) hide show
  1. package/dist/api-client.d.ts +38 -38
  2. package/dist/api-client.d.ts.map +1 -1
  3. package/dist/api-client.js +44 -43
  4. package/dist/api-client.js.map +1 -1
  5. package/dist/astro-build.d.ts +2 -0
  6. package/dist/astro-build.d.ts.map +1 -1
  7. package/dist/astro-build.js +31 -39
  8. package/dist/astro-build.js.map +1 -1
  9. package/dist/build-settings.d.ts +3 -0
  10. package/dist/build-settings.d.ts.map +1 -1
  11. package/dist/build-settings.js +13 -0
  12. package/dist/build-settings.js.map +1 -1
  13. package/dist/build-strategy.d.ts +20 -0
  14. package/dist/build-strategy.d.ts.map +1 -1
  15. package/dist/build-strategy.js +33 -1
  16. package/dist/build-strategy.js.map +1 -1
  17. package/dist/build.d.ts +2 -1
  18. package/dist/build.d.ts.map +1 -1
  19. package/dist/build.js +16 -4
  20. package/dist/build.js.map +1 -1
  21. package/dist/bun-build.d.ts +1 -1
  22. package/dist/bun-build.d.ts.map +1 -1
  23. package/dist/bun-build.js +25 -9
  24. package/dist/bun-build.js.map +1 -1
  25. package/dist/callbacks.d.ts +33 -33
  26. package/dist/callbacks.d.ts.map +1 -1
  27. package/dist/compute-client.d.ts +66 -66
  28. package/dist/compute-client.d.ts.map +1 -1
  29. package/dist/compute-client.js +274 -272
  30. package/dist/compute-client.js.map +1 -1
  31. package/dist/config/frameworks.d.ts +4 -8
  32. package/dist/config/frameworks.d.ts.map +1 -1
  33. package/dist/config/frameworks.js +17 -5
  34. package/dist/config/frameworks.js.map +1 -1
  35. package/dist/config/normalize.d.ts +6 -0
  36. package/dist/config/normalize.d.ts.map +1 -1
  37. package/dist/config/normalize.js +53 -12
  38. package/dist/config/normalize.js.map +1 -1
  39. package/dist/config/types.d.ts +3 -1
  40. package/dist/config/types.d.ts.map +1 -1
  41. package/dist/config/types.js +1 -0
  42. package/dist/config/types.js.map +1 -1
  43. package/dist/configured-artifact.d.ts +20 -0
  44. package/dist/configured-artifact.d.ts.map +1 -0
  45. package/dist/configured-artifact.js +104 -0
  46. package/dist/configured-artifact.js.map +1 -0
  47. package/dist/custom-build.d.ts +20 -0
  48. package/dist/custom-build.d.ts.map +1 -0
  49. package/dist/custom-build.js +53 -0
  50. package/dist/custom-build.js.map +1 -0
  51. package/dist/errors.d.ts +28 -28
  52. package/dist/errors.d.ts.map +1 -1
  53. package/dist/errors.js +12 -12
  54. package/dist/errors.js.map +1 -1
  55. package/dist/index.d.ts +6 -5
  56. package/dist/index.d.ts.map +1 -1
  57. package/dist/index.js +2 -1
  58. package/dist/index.js.map +1 -1
  59. package/dist/log-stream.d.ts +1 -1
  60. package/dist/log-stream.d.ts.map +1 -1
  61. package/dist/log-stream.js +1 -1
  62. package/dist/log-stream.js.map +1 -1
  63. package/dist/nestjs-build.d.ts.map +1 -1
  64. package/dist/nestjs-build.js +28 -29
  65. package/dist/nestjs-build.js.map +1 -1
  66. package/dist/nextjs-build.d.ts +1 -1
  67. package/dist/nextjs-build.d.ts.map +1 -1
  68. package/dist/nextjs-build.js +25 -14
  69. package/dist/nextjs-build.js.map +1 -1
  70. package/dist/nuxt-build.d.ts +2 -0
  71. package/dist/nuxt-build.d.ts.map +1 -1
  72. package/dist/nuxt-build.js +31 -39
  73. package/dist/nuxt-build.js.map +1 -1
  74. package/dist/polling.d.ts +4 -4
  75. package/dist/polling.d.ts.map +1 -1
  76. package/dist/polling.js +15 -15
  77. package/dist/polling.js.map +1 -1
  78. package/dist/tanstack-start-build.d.ts +1 -1
  79. package/dist/tanstack-start-build.d.ts.map +1 -1
  80. package/dist/tanstack-start-build.js +26 -47
  81. package/dist/tanstack-start-build.js.map +1 -1
  82. package/dist/types.d.ts +8 -8
  83. package/dist/types.d.ts.map +1 -1
  84. package/package.json +2 -2
  85. package/src/api-client.ts +57 -63
  86. package/src/astro-build.ts +39 -46
  87. package/src/build-settings.ts +16 -0
  88. package/src/build-strategy.ts +56 -1
  89. package/src/build.ts +16 -4
  90. package/src/bun-build.ts +39 -10
  91. package/src/callbacks.ts +34 -34
  92. package/src/compute-client.ts +433 -413
  93. package/src/config/frameworks.ts +18 -5
  94. package/src/config/normalize.ts +74 -13
  95. package/src/config/types.ts +3 -0
  96. package/src/configured-artifact.ts +169 -0
  97. package/src/custom-build.ts +73 -0
  98. package/src/errors.ts +42 -38
  99. package/src/index.ts +27 -26
  100. package/src/log-stream.ts +2 -2
  101. package/src/nestjs-build.ts +36 -33
  102. package/src/nextjs-build.ts +31 -14
  103. package/src/nuxt-build.ts +39 -46
  104. package/src/polling.ts +19 -18
  105. package/src/tanstack-start-build.ts +31 -53
  106. package/src/types.ts +8 -8
@@ -2,8 +2,8 @@ import { Result } from "better-result";
2
2
  import invariant from "tiny-invariant";
3
3
  import { InternalApiClient, readUploadUrl, toDeploymentUrl, } from "./api-client.js";
4
4
  import { createArchive } from "./archive.js";
5
- import { ApiError, ArtifactError, BuildError, CancelledError, DestroyAggregateError, InvalidOptionsError, MissingArgumentError, NoExistingVersionError, NoVersionsFoundError, } from "./errors.js";
6
- import { pollVersionStatus } from "./polling.js";
5
+ import { ApiError, ArtifactError, BuildError, CancelledError, DestroyAggregateError, InvalidOptionsError, MissingArgumentError, NoDeploymentsFoundError, NoExistingDeploymentError, } from "./errors.js";
6
+ import { pollDeploymentStatus } from "./polling.js";
7
7
  import { REGIONS } from "./types.js";
8
8
  import { uploadArtifact } from "./upload-artifact.js";
9
9
  const DEFAULT_TIMEOUT_SECONDS = 120;
@@ -14,9 +14,9 @@ export class ComputeClient {
14
14
  this.#api = new InternalApiClient(managementApiClient);
15
15
  }
16
16
  async deploy(options) {
17
- if (options.skipPromote && options.destroyOldVersion) {
17
+ if (options.skipPromote && options.destroyOldDeployment) {
18
18
  return Result.err(new InvalidOptionsError({
19
- message: "destroyOldVersion cannot be combined with skipPromote — the old version stays active when promotion is skipped",
19
+ message: "destroyOldDeployment cannot be combined with skipPromote — the old deployment stays active when promotion is skipped",
20
20
  }));
21
21
  }
22
22
  const self = this;
@@ -46,16 +46,16 @@ export class ComputeClient {
46
46
  options.progress?.onArchiveReady?.(archiveBytes.byteLength);
47
47
  yield* self.#checkAborted(options.signal);
48
48
  const portMapping = options.portMapping ??
49
- (target.isNewService && artifact.defaultPortMapping
49
+ (target.isNewApp && artifact.defaultPortMapping
50
50
  ? artifact.defaultPortMapping
51
51
  : undefined);
52
52
  yield* Result.await(self.#applyEnvVars(target.projectId, target.branchId, options.envVars, options.signal));
53
- const createResponse = yield* Result.await(self.#api.createServiceVersion(target.serviceId, portMapping ? { portMapping } : {}, options.signal));
54
- options.progress?.onVersionCreated?.(createResponse.id);
53
+ const createResponse = yield* Result.await(self.#api.createAppDeployment(target.appId, portMapping ? { portMapping } : {}, options.signal));
54
+ options.progress?.onDeploymentCreated?.(createResponse.id);
55
55
  const uploadUrl = readUploadUrl(createResponse);
56
56
  if (!uploadUrl) {
57
57
  return Result.err(new ArtifactError({
58
- message: "Version creation did not return an upload URL",
58
+ message: "Deployment creation did not return an upload URL",
59
59
  }));
60
60
  }
61
61
  yield* self.#checkAborted(options.signal);
@@ -63,55 +63,55 @@ export class ComputeClient {
63
63
  yield* Result.await(self.#uploadArtifactResult(uploadUrl, archiveBytes, options.signal));
64
64
  options.progress?.onUploadComplete?.();
65
65
  yield* self.#checkAborted(options.signal);
66
- const service = yield* Result.await(self.#api.getService(target.serviceId, options.signal));
67
- const previousVersionId = service.latestVersionId ?? null;
66
+ const app = yield* Result.await(self.#api.getApp(target.appId, options.signal));
67
+ const previousDeploymentId = app.latestDeploymentId ?? null;
68
68
  options.progress?.onStartRequested?.();
69
- yield* Result.await(self.#api.startVersion(createResponse.id, options.signal));
70
- const pollResult = yield* Result.await(pollVersionStatus(self.#api, createResponse.id, {
69
+ yield* Result.await(self.#api.startDeployment(createResponse.id, options.signal));
70
+ const pollResult = yield* Result.await(pollDeploymentStatus(self.#api, createResponse.id, {
71
71
  targetStatus: "running",
72
72
  timeoutSeconds: options.timeoutSeconds ?? DEFAULT_TIMEOUT_SECONDS,
73
73
  pollIntervalMs: options.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS,
74
74
  signal: options.signal,
75
75
  onStatusChange: options.progress?.onStatusChange,
76
76
  }));
77
- const versionEndpointDomain = toDeploymentUrl(pollResult.previewDomain);
78
- options.progress?.onRunning?.(versionEndpointDomain);
77
+ const deploymentEndpointDomain = toDeploymentUrl(pollResult.previewDomain);
78
+ options.progress?.onRunning?.(deploymentEndpointDomain);
79
79
  const resolvedConfig = {
80
80
  projectId: target.projectId,
81
- serviceId: target.serviceId,
82
- serviceName: target.serviceName,
81
+ appId: target.appId,
82
+ appName: target.appName,
83
83
  region: target.region,
84
- portMapping: options.portMapping,
84
+ portMapping,
85
85
  };
86
86
  if (options.skipPromote) {
87
87
  return Result.ok({
88
88
  projectId: target.projectId,
89
- serviceId: target.serviceId,
90
- serviceName: target.serviceName,
89
+ appId: target.appId,
90
+ appName: target.appName,
91
91
  region: target.region,
92
- versionId: createResponse.id,
93
- versionEndpointDomain,
94
- serviceEndpointDomain: null,
92
+ deploymentId: createResponse.id,
93
+ deploymentEndpointDomain,
94
+ appEndpointDomain: null,
95
95
  promoted: false,
96
- previousVersionId,
97
- previousVersionAction: previousVersionId
96
+ previousDeploymentId,
97
+ previousDeploymentAction: previousDeploymentId
98
98
  ? "still-active"
99
99
  : null,
100
100
  resolvedConfig,
101
101
  });
102
102
  }
103
- const switchoverResult = yield* Result.await(self.#promoteAndSwitchover(target.serviceId, createResponse.id, previousVersionId, options.destroyOldVersion ?? false, options.signal, options.progress));
103
+ const switchoverResult = yield* Result.await(self.#promoteAndSwitchover(target.appId, createResponse.id, previousDeploymentId, options.destroyOldDeployment ?? false, options.signal, options.progress));
104
104
  return Result.ok({
105
105
  projectId: target.projectId,
106
- serviceId: target.serviceId,
107
- serviceName: target.serviceName,
106
+ appId: target.appId,
107
+ appName: target.appName,
108
108
  region: target.region,
109
- versionId: createResponse.id,
110
- versionEndpointDomain,
111
- serviceEndpointDomain: switchoverResult.serviceEndpointDomain,
109
+ deploymentId: createResponse.id,
110
+ deploymentEndpointDomain,
111
+ appEndpointDomain: switchoverResult.appEndpointDomain,
112
112
  promoted: true,
113
- previousVersionId: switchoverResult.previousVersionId,
114
- previousVersionAction: switchoverResult.previousVersionAction,
113
+ previousDeploymentId: switchoverResult.previousDeploymentId,
114
+ previousDeploymentAction: switchoverResult.previousDeploymentAction,
115
115
  resolvedConfig,
116
116
  });
117
117
  }
@@ -125,24 +125,24 @@ export class ComputeClient {
125
125
  return Result.gen(async function* () {
126
126
  yield* self.#checkAborted(options.signal);
127
127
  const target = yield* Result.await(self.#resolveDeployTarget(options));
128
- const versions = yield* Result.await(self.#api.listServiceVersions(target.serviceId, options.signal));
129
- if (versions.length === 0) {
130
- return Result.err(new NoExistingVersionError({ serviceId: target.serviceId }));
128
+ const deployments = yield* Result.await(self.#api.listAppDeployments(target.appId, options.signal));
129
+ if (deployments.length === 0) {
130
+ return Result.err(new NoExistingDeploymentError({ appId: target.appId }));
131
131
  }
132
132
  yield* self.#checkAborted(options.signal);
133
133
  yield* Result.await(self.#applyEnvVars(target.projectId, target.branchId, options.envVars, options.signal));
134
134
  yield* self.#checkAborted(options.signal);
135
- const createResponse = yield* Result.await(self.#api.createServiceVersion(target.serviceId, {
135
+ const createResponse = yield* Result.await(self.#api.createAppDeployment(target.appId, {
136
136
  ...(options.portMapping !== undefined
137
137
  ? { portMapping: options.portMapping }
138
138
  : {}),
139
139
  skipCodeUpload: true,
140
140
  }, options.signal));
141
- options.progress?.onVersionCreated?.(createResponse.id);
141
+ options.progress?.onDeploymentCreated?.(createResponse.id);
142
142
  yield* self.#checkAborted(options.signal);
143
143
  options.progress?.onStartRequested?.();
144
- yield* Result.await(self.#api.startVersion(createResponse.id, options.signal));
145
- const pollResult = yield* Result.await(pollVersionStatus(self.#api, createResponse.id, {
144
+ yield* Result.await(self.#api.startDeployment(createResponse.id, options.signal));
145
+ const pollResult = yield* Result.await(pollDeploymentStatus(self.#api, createResponse.id, {
146
146
  targetStatus: "running",
147
147
  timeoutSeconds: options.timeoutSeconds ?? DEFAULT_TIMEOUT_SECONDS,
148
148
  pollIntervalMs: options.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS,
@@ -153,119 +153,120 @@ export class ComputeClient {
153
153
  options.progress?.onRunning?.(deploymentUrl);
154
154
  return Result.ok({
155
155
  projectId: target.projectId,
156
- serviceId: target.serviceId,
157
- versionId: createResponse.id,
156
+ appId: target.appId,
157
+ deploymentId: createResponse.id,
158
158
  deploymentUrl,
159
159
  resolvedConfig: {
160
160
  projectId: target.projectId,
161
- serviceId: target.serviceId,
162
- serviceName: target.serviceName,
161
+ appId: target.appId,
162
+ appName: target.appName,
163
163
  region: target.region,
164
164
  portMapping: options.portMapping,
165
165
  },
166
166
  });
167
167
  });
168
168
  }
169
- async destroyVersion(options) {
169
+ async destroyDeployment(options) {
170
170
  const self = this;
171
171
  return Result.gen(async function* () {
172
172
  yield* self.#checkAborted(options.signal);
173
- let versionId = options.versionId;
174
- let versionDetailsCache;
175
- if (!versionId) {
176
- const serviceId = options.serviceId;
177
- if (!serviceId) {
178
- return Result.err(new MissingArgumentError({ field: "versionId" }));
173
+ let deploymentId = options.deploymentId;
174
+ let deploymentDetailsCache;
175
+ if (!deploymentId) {
176
+ const appId = options.appId;
177
+ if (!appId) {
178
+ return Result.err(new MissingArgumentError({ field: "deploymentId" }));
179
179
  }
180
- const versions = yield* Result.await(self.#api.listServiceVersions(serviceId, options.signal));
181
- const versionDetailResults = await Promise.all(versions.map((v) => self.#api.getVersion(v.id, options.signal)));
180
+ const deployments = yield* Result.await(self.#api.listAppDeployments(appId, options.signal));
181
+ const deploymentDetailResults = await Promise.all(deployments.map((d) => self.#api.getDeployment(d.id, options.signal)));
182
182
  const details = [];
183
- for (const result of versionDetailResults) {
183
+ for (const result of deploymentDetailResults) {
184
184
  if (result.isErr())
185
185
  return result;
186
186
  details.push(result.value);
187
187
  }
188
- versionDetailsCache = new Map(details.map((v) => [v.id, v]));
189
- const versionInfos = details
190
- .map((v) => ({
191
- id: v.id,
192
- status: v.status,
193
- createdAt: v.createdAt,
194
- previewDomain: v.previewDomain,
188
+ deploymentDetailsCache = new Map(details.map((d) => [d.id, d]));
189
+ const deploymentInfos = details
190
+ .map((d) => ({
191
+ id: d.id,
192
+ status: d.status,
193
+ createdAt: d.createdAt,
194
+ previewDomain: d.previewDomain,
195
195
  }))
196
- .sort(versionSortComparator);
197
- if (versionInfos.length === 0) {
198
- return Result.err(new NoVersionsFoundError({ serviceId }));
196
+ .sort(deploymentSortComparator);
197
+ if (deploymentInfos.length === 0) {
198
+ return Result.err(new NoDeploymentsFoundError({ appId }));
199
199
  }
200
- if (!options.interaction?.selectVersion) {
201
- return Result.err(new MissingArgumentError({ field: "versionId" }));
200
+ if (!options.interaction?.selectDeployment) {
201
+ return Result.err(new MissingArgumentError({ field: "deploymentId" }));
202
202
  }
203
- versionId = await options.interaction.selectVersion(versionInfos);
203
+ deploymentId =
204
+ await options.interaction.selectDeployment(deploymentInfos);
204
205
  }
205
- const version = versionDetailsCache?.get(versionId) ??
206
- (yield* Result.await(self.#api.getVersion(versionId, options.signal)));
207
- const previousStatus = version.status ?? "unknown";
208
- const shouldStop = version.status === "running" || version.status === "provisioning";
206
+ const deployment = deploymentDetailsCache?.get(deploymentId) ??
207
+ (yield* Result.await(self.#api.getDeployment(deploymentId, options.signal)));
208
+ const previousStatus = deployment.status ?? "unknown";
209
+ const shouldStop = deployment.status === "running" || deployment.status === "provisioning";
209
210
  let stopped = false;
210
211
  if (shouldStop) {
211
- options.progress?.onStopRequested?.(versionId);
212
- yield* Result.await(self.#api.stopVersion(versionId, options.signal));
213
- yield* Result.await(pollVersionStatus(self.#api, versionId, {
212
+ options.progress?.onStopRequested?.(deploymentId);
213
+ yield* Result.await(self.#api.stopDeployment(deploymentId, options.signal));
214
+ yield* Result.await(pollDeploymentStatus(self.#api, deploymentId, {
214
215
  targetStatus: "stopped",
215
216
  timeoutSeconds: options.timeoutSeconds ?? DEFAULT_TIMEOUT_SECONDS,
216
217
  pollIntervalMs: options.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS,
217
218
  signal: options.signal,
218
219
  }));
219
220
  stopped = true;
220
- options.progress?.onStopped?.(versionId);
221
+ options.progress?.onStopped?.(deploymentId);
221
222
  }
222
- yield* Result.await(self.#api.deleteVersion(versionId, options.signal));
223
- options.progress?.onDeleted?.(versionId);
223
+ yield* Result.await(self.#api.deleteDeployment(deploymentId, options.signal));
224
+ options.progress?.onDeleted?.(deploymentId);
224
225
  return Result.ok({
225
- versionId,
226
+ deploymentId,
226
227
  previousStatus,
227
228
  stopped,
228
229
  deleted: true,
229
230
  });
230
231
  });
231
232
  }
232
- async destroyService(options) {
233
+ async destroyApp(options) {
233
234
  const self = this;
234
235
  return Result.gen(async function* () {
235
236
  yield* self.#checkAborted(options.signal);
236
237
  const timeoutSeconds = options.timeoutSeconds ?? DEFAULT_TIMEOUT_SECONDS;
237
238
  const pollIntervalMs = options.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;
238
- const versions = yield* Result.await(self.#api.listServiceVersions(options.serviceId, options.signal));
239
- const versionDetailResults = await Promise.all(versions.map((v) => self.#api.getVersion(v.id, options.signal)));
240
- const versionDetails = [];
241
- for (const result of versionDetailResults) {
239
+ const deployments = yield* Result.await(self.#api.listAppDeployments(options.appId, options.signal));
240
+ const deploymentDetailResults = await Promise.all(deployments.map((d) => self.#api.getDeployment(d.id, options.signal)));
241
+ const deploymentDetails = [];
242
+ for (const result of deploymentDetailResults) {
242
243
  if (result.isErr())
243
244
  return result;
244
- versionDetails.push(result.value);
245
+ deploymentDetails.push(result.value);
245
246
  }
246
- const activeVersions = versionDetails.filter((v) => v.status === "running" || v.status === "provisioning");
247
+ const activeDeployments = deploymentDetails.filter((d) => d.status === "running" || d.status === "provisioning");
247
248
  const succeededIds = [];
248
249
  const failures = [];
249
- if (activeVersions.length > 0) {
250
- const activeIds = activeVersions.map((v) => v.id);
251
- options.progress?.onStoppingVersions?.(activeIds);
252
- const stopResults = await Promise.all(activeVersions.map((v) => self.#api.stopVersion(v.id, options.signal)));
250
+ if (activeDeployments.length > 0) {
251
+ const activeIds = activeDeployments.map((d) => d.id);
252
+ options.progress?.onStoppingDeployments?.(activeIds);
253
+ const stopResults = await Promise.all(activeDeployments.map((d) => self.#api.stopDeployment(d.id, options.signal)));
253
254
  const stoppedCandidates = [];
254
255
  for (const [i, result] of stopResults.entries()) {
255
256
  // biome-ignore lint/style/noNonNullAssertion: both lists have the same length
256
- const activeVersion = activeVersions[i];
257
+ const activeDeployment = activeDeployments[i];
257
258
  if (result.isErr()) {
258
259
  failures.push({
259
- versionId: activeVersion.id,
260
+ deploymentId: activeDeployment.id,
260
261
  error: result.error,
261
262
  });
262
263
  }
263
264
  else {
264
- stoppedCandidates.push(activeVersion);
265
+ stoppedCandidates.push(activeDeployment);
265
266
  }
266
267
  }
267
268
  if (stoppedCandidates.length > 0) {
268
- const pollResults = await Promise.all(stoppedCandidates.map((v) => pollVersionStatus(self.#api, v.id, {
269
+ const pollResults = await Promise.all(stoppedCandidates.map((d) => pollDeploymentStatus(self.#api, d.id, {
269
270
  targetStatus: "stopped",
270
271
  timeoutSeconds,
271
272
  pollIntervalMs,
@@ -273,64 +274,64 @@ export class ComputeClient {
273
274
  })));
274
275
  for (const [i, result] of pollResults.entries()) {
275
276
  // biome-ignore lint/style/noNonNullAssertion: both lists have the same length
276
- const stoppedVersion = stoppedCandidates[i];
277
+ const stoppedDeployment = stoppedCandidates[i];
277
278
  if (result.isErr()) {
278
279
  failures.push({
279
- versionId: stoppedVersion.id,
280
+ deploymentId: stoppedDeployment.id,
280
281
  error: result.error,
281
282
  });
282
283
  }
283
284
  else {
284
- options.progress?.onVersionStopped?.(stoppedVersion.id);
285
+ options.progress?.onDeploymentStopped?.(stoppedDeployment.id);
285
286
  }
286
287
  }
287
288
  }
288
289
  if (failures.length > 0) {
289
290
  return Result.err(new DestroyAggregateError({
290
- succeededVersionIds: succeededIds,
291
+ succeededDeploymentIds: succeededIds,
291
292
  failures,
292
- serviceDeleted: false,
293
+ appDeleted: false,
293
294
  }));
294
295
  }
295
- options.progress?.onAllVersionsStopped?.();
296
+ options.progress?.onAllDeploymentsStopped?.();
296
297
  }
297
- if (versions.length > 0) {
298
- const versionIds = versions.map((v) => v.id);
299
- options.progress?.onDeletingVersions?.(versionIds);
300
- const deleteResults = await Promise.all(versions.map((v) => self.#api.deleteVersion(v.id, options.signal)));
298
+ if (deployments.length > 0) {
299
+ const deploymentIds = deployments.map((d) => d.id);
300
+ options.progress?.onDeletingDeployments?.(deploymentIds);
301
+ const deleteResults = await Promise.all(deployments.map((d) => self.#api.deleteDeployment(d.id, options.signal)));
301
302
  for (const [i, result] of deleteResults.entries()) {
302
303
  // biome-ignore lint/style/noNonNullAssertion: both lists have the same length
303
- const version = versions[i];
304
+ const deployment = deployments[i];
304
305
  if (result.isErr()) {
305
306
  failures.push({
306
- versionId: version.id,
307
+ deploymentId: deployment.id,
307
308
  error: result.error,
308
309
  });
309
310
  }
310
311
  else {
311
- succeededIds.push(version.id);
312
- options.progress?.onVersionDeleted?.(version.id);
312
+ succeededIds.push(deployment.id);
313
+ options.progress?.onDeploymentDeleted?.(deployment.id);
313
314
  }
314
315
  }
315
316
  if (failures.length > 0) {
316
317
  return Result.err(new DestroyAggregateError({
317
- succeededVersionIds: succeededIds,
318
+ succeededDeploymentIds: succeededIds,
318
319
  failures,
319
- serviceDeleted: false,
320
+ appDeleted: false,
320
321
  }));
321
322
  }
322
- options.progress?.onAllVersionsDeleted?.();
323
+ options.progress?.onAllDeploymentsDeleted?.();
323
324
  }
324
- let serviceDeleted = false;
325
- if (!options.keepService) {
326
- yield* Result.await(self.#api.deleteService(options.serviceId, options.signal));
327
- serviceDeleted = true;
328
- options.progress?.onServiceDeleted?.(options.serviceId);
325
+ let appDeleted = false;
326
+ if (!options.keepApp) {
327
+ yield* Result.await(self.#api.deleteApp(options.appId, options.signal));
328
+ appDeleted = true;
329
+ options.progress?.onAppDeleted?.(options.appId);
329
330
  }
330
331
  return Result.ok({
331
- serviceId: options.serviceId,
332
- deletedVersionIds: succeededIds,
333
- serviceDeleted,
332
+ appId: options.appId,
333
+ deletedDeploymentIds: succeededIds,
334
+ appDeleted,
334
335
  });
335
336
  });
336
337
  }
@@ -373,25 +374,25 @@ export class ComputeClient {
373
374
  })));
374
375
  });
375
376
  }
376
- async listServices(options) {
377
+ async listApps(options) {
377
378
  const self = this;
378
379
  return Result.gen(async function* () {
379
380
  yield* self.#checkAborted(options.signal);
380
- const services = yield* Result.await(self.#api.listProjectServices(options.projectId, options.signal));
381
- return Result.ok(services.map((s) => ({
382
- id: s.id,
383
- name: s.name,
384
- region: s.region.id,
385
- projectId: s.projectId,
381
+ const apps = yield* Result.await(self.#api.listProjectApps(options.projectId, options.signal));
382
+ return Result.ok(apps.map((a) => ({
383
+ id: a.id,
384
+ name: a.name,
385
+ region: a.region.id,
386
+ projectId: a.projectId,
386
387
  })));
387
388
  });
388
389
  }
389
- async createService(options) {
390
+ async createApp(options) {
390
391
  const self = this;
391
392
  return Result.gen(async function* () {
392
393
  yield* self.#checkAborted(options.signal);
393
- const response = yield* Result.await(self.#api.createProjectService(options.projectId, {
394
- displayName: options.serviceName,
394
+ const response = yield* Result.await(self.#api.createProjectApp(options.projectId, {
395
+ displayName: options.appName,
395
396
  regionId: options.region,
396
397
  }, options.signal));
397
398
  return Result.ok({
@@ -402,89 +403,89 @@ export class ComputeClient {
402
403
  });
403
404
  });
404
405
  }
405
- async showService(options) {
406
+ async showApp(options) {
406
407
  const self = this;
407
408
  return Result.gen(async function* () {
408
409
  yield* self.#checkAborted(options.signal);
409
- const s = yield* Result.await(self.#api.getService(options.serviceId, options.signal));
410
+ const a = yield* Result.await(self.#api.getApp(options.appId, options.signal));
410
411
  return Result.ok({
411
- id: s.id,
412
- name: s.name,
413
- region: s.region.id,
414
- projectId: s.projectId,
415
- latestVersionId: s.latestVersionId,
416
- serviceEndpointDomain: s.serviceEndpointDomain,
412
+ id: a.id,
413
+ name: a.name,
414
+ region: a.region.id,
415
+ projectId: a.projectId,
416
+ latestDeploymentId: a.latestDeploymentId,
417
+ appEndpointDomain: a.appEndpointDomain,
417
418
  });
418
419
  });
419
420
  }
420
- async deleteService(options) {
421
+ async deleteApp(options) {
421
422
  const self = this;
422
423
  return Result.gen(async function* () {
423
424
  yield* self.#checkAborted(options.signal);
424
- yield* Result.await(self.#api.deleteService(options.serviceId, options.signal));
425
+ yield* Result.await(self.#api.deleteApp(options.appId, options.signal));
425
426
  return Result.ok();
426
427
  });
427
428
  }
428
- async listVersions(options) {
429
+ async listDeployments(options) {
429
430
  const self = this;
430
431
  return Result.gen(async function* () {
431
432
  yield* self.#checkAborted(options.signal);
432
- const versions = yield* Result.await(self.#api.listServiceVersions(options.serviceId, options.signal));
433
- const detailResults = await Promise.all(versions.map((v) => self.#api.getVersion(v.id, options.signal)));
433
+ const deployments = yield* Result.await(self.#api.listAppDeployments(options.appId, options.signal));
434
+ const detailResults = await Promise.all(deployments.map((d) => self.#api.getDeployment(d.id, options.signal)));
434
435
  const details = [];
435
436
  for (const result of detailResults) {
436
437
  if (result.isErr()) {
437
- // listServiceVersions returns versions that have previously been deleted
438
- // and can't be fetched using getVersion so we need to filter those out.
438
+ // listAppDeployments returns deployments that have previously been deleted
439
+ // and can't be fetched using getDeployment so we need to filter those out.
439
440
  if (ApiError.is(result.error) && result.error.statusCode === 404)
440
441
  continue;
441
442
  return result;
442
443
  }
443
444
  details.push(result.value);
444
445
  }
445
- return Result.ok(details.map((v) => ({
446
- id: v.id,
447
- status: v.status,
448
- createdAt: v.createdAt,
449
- previewDomain: v.previewDomain,
446
+ return Result.ok(details.map((d) => ({
447
+ id: d.id,
448
+ status: d.status,
449
+ createdAt: d.createdAt,
450
+ previewDomain: d.previewDomain,
450
451
  })));
451
452
  });
452
453
  }
453
- async showVersion(options) {
454
+ async showDeployment(options) {
454
455
  const self = this;
455
456
  return Result.gen(async function* () {
456
457
  yield* self.#checkAborted(options.signal);
457
- const v = yield* Result.await(self.#api.getVersion(options.versionId, options.signal));
458
+ const d = yield* Result.await(self.#api.getDeployment(options.deploymentId, options.signal));
458
459
  return Result.ok({
459
- id: v.id,
460
- status: v.status,
461
- createdAt: v.createdAt,
462
- previewDomain: v.previewDomain,
463
- envVars: v.envVars ?? undefined,
460
+ id: d.id,
461
+ status: d.status,
462
+ createdAt: d.createdAt,
463
+ previewDomain: d.previewDomain,
464
+ envVars: d.envVars ?? undefined,
464
465
  });
465
466
  });
466
467
  }
467
- async startVersion(options) {
468
+ async startDeployment(options) {
468
469
  const self = this;
469
470
  return Result.gen(async function* () {
470
471
  yield* self.#checkAborted(options.signal);
471
- yield* Result.await(self.#api.startVersion(options.versionId, options.signal));
472
+ yield* Result.await(self.#api.startDeployment(options.deploymentId, options.signal));
472
473
  return Result.ok();
473
474
  });
474
475
  }
475
- async stopVersion(options) {
476
+ async stopDeployment(options) {
476
477
  const self = this;
477
478
  return Result.gen(async function* () {
478
479
  yield* self.#checkAborted(options.signal);
479
- yield* Result.await(self.#api.stopVersion(options.versionId, options.signal));
480
+ yield* Result.await(self.#api.stopDeployment(options.deploymentId, options.signal));
480
481
  return Result.ok();
481
482
  });
482
483
  }
483
- async deleteVersion(options) {
484
+ async deleteDeployment(options) {
484
485
  const self = this;
485
486
  return Result.gen(async function* () {
486
487
  yield* self.#checkAborted(options.signal);
487
- yield* Result.await(self.#api.deleteVersion(options.versionId, options.signal));
488
+ yield* Result.await(self.#api.deleteDeployment(options.deploymentId, options.signal));
488
489
  return Result.ok();
489
490
  });
490
491
  }
@@ -492,10 +493,10 @@ export class ComputeClient {
492
493
  const self = this;
493
494
  return Result.gen(async function* () {
494
495
  yield* self.#checkAborted(options.signal);
495
- let versionId = options.versionId;
496
- if (!versionId) {
497
- const versions = yield* Result.await(self.#api.listServiceVersions(options.serviceId, options.signal));
498
- const detailResults = await Promise.all(versions.map((v) => self.#api.getVersion(v.id, options.signal)));
496
+ let deploymentId = options.deploymentId;
497
+ if (!deploymentId) {
498
+ const deployments = yield* Result.await(self.#api.listAppDeployments(options.appId, options.signal));
499
+ const detailResults = await Promise.all(deployments.map((d) => self.#api.getDeployment(d.id, options.signal)));
499
500
  const details = [];
500
501
  for (const result of detailResults) {
501
502
  if (result.isErr()) {
@@ -505,35 +506,36 @@ export class ComputeClient {
505
506
  }
506
507
  details.push(result.value);
507
508
  }
508
- const versionInfos = details
509
- .map((v) => ({
510
- id: v.id,
511
- status: v.status,
512
- createdAt: v.createdAt,
513
- previewDomain: v.previewDomain,
509
+ const deploymentInfos = details
510
+ .map((d) => ({
511
+ id: d.id,
512
+ status: d.status,
513
+ createdAt: d.createdAt,
514
+ previewDomain: d.previewDomain,
514
515
  }))
515
- .sort(versionSortComparator);
516
- if (versionInfos.length === 0) {
517
- return Result.err(new NoVersionsFoundError({ serviceId: options.serviceId }));
516
+ .sort(deploymentSortComparator);
517
+ if (deploymentInfos.length === 0) {
518
+ return Result.err(new NoDeploymentsFoundError({ appId: options.appId }));
518
519
  }
519
- if (!options.interaction?.selectVersion) {
520
- return Result.err(new MissingArgumentError({ field: "versionId" }));
520
+ if (!options.interaction?.selectDeployment) {
521
+ return Result.err(new MissingArgumentError({ field: "deploymentId" }));
521
522
  }
522
- versionId = await options.interaction.selectVersion(versionInfos);
523
+ deploymentId =
524
+ await options.interaction.selectDeployment(deploymentInfos);
523
525
  }
524
- const version = yield* Result.await(self.#api.getVersion(versionId, options.signal));
525
- let versionStarted = false;
526
- if (version.status !== "running") {
527
- options.progress?.onVersionStarting?.(versionId);
528
- if (version.status !== "provisioning") {
529
- options.progress?.onVersionStartRequested?.();
530
- const startResult = await self.#api.startVersion(versionId, options.signal);
526
+ const deployment = yield* Result.await(self.#api.getDeployment(deploymentId, options.signal));
527
+ let deploymentStarted = false;
528
+ if (deployment.status !== "running") {
529
+ options.progress?.onDeploymentStarting?.(deploymentId);
530
+ if (deployment.status !== "provisioning") {
531
+ options.progress?.onDeploymentStartRequested?.();
532
+ const startResult = await self.#api.startDeployment(deploymentId, options.signal);
531
533
  if (startResult.isErr()) {
532
534
  options.progress?.onPromoteFailed?.(startResult.error);
533
535
  return startResult;
534
536
  }
535
537
  }
536
- const pollResult = await pollVersionStatus(self.#api, versionId, {
538
+ const pollResult = await pollDeploymentStatus(self.#api, deploymentId, {
537
539
  targetStatus: "running",
538
540
  timeoutSeconds: options.timeoutSeconds ?? DEFAULT_TIMEOUT_SECONDS,
539
541
  pollIntervalMs: options.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS,
@@ -544,97 +546,97 @@ export class ComputeClient {
544
546
  options.progress?.onPromoteFailed?.(pollResult.error);
545
547
  return pollResult;
546
548
  }
547
- versionStarted = true;
548
- options.progress?.onVersionRunning?.();
549
+ deploymentStarted = true;
550
+ options.progress?.onDeploymentRunning?.();
549
551
  }
550
552
  options.progress?.onPromoteStart?.();
551
- const promoteResult = await self.#api.promoteService(options.serviceId, { versionId }, options.signal);
553
+ const promoteResult = await self.#api.promoteApp(options.appId, { deploymentId }, options.signal);
552
554
  if (promoteResult.isErr()) {
553
555
  options.progress?.onPromoteFailed?.(promoteResult.error);
554
556
  return promoteResult;
555
557
  }
556
- options.progress?.onPromoted?.(promoteResult.value.serviceEndpointDomain);
558
+ options.progress?.onPromoted?.(promoteResult.value.appEndpointDomain);
557
559
  return Result.ok({
558
- serviceId: options.serviceId,
559
- versionId,
560
- serviceEndpointDomain: promoteResult.value.serviceEndpointDomain,
561
- versionStarted,
560
+ appId: options.appId,
561
+ deploymentId,
562
+ appEndpointDomain: promoteResult.value.appEndpointDomain,
563
+ deploymentStarted,
562
564
  });
563
565
  });
564
566
  }
565
- async #promoteAndSwitchover(serviceId, newVersionId, previousVersionId, destroyOldVersion, signal, progress) {
567
+ async #promoteAndSwitchover(appId, newDeploymentId, previousDeploymentId, destroyOldDeployment, signal, progress) {
566
568
  progress?.onPromoteStart?.();
567
- const promoteResult = await this.#api.promoteService(serviceId, { versionId: newVersionId }, signal);
569
+ const promoteResult = await this.#api.promoteApp(appId, { deploymentId: newDeploymentId }, signal);
568
570
  if (promoteResult.isErr()) {
569
571
  progress?.onPromoteFailed?.(promoteResult.error);
570
- progress?.onCleanupDanglingVersion?.(newVersionId);
571
- await this.#cleanupDanglingVersion(newVersionId, undefined, progress);
572
+ progress?.onCleanupDanglingDeployment?.(newDeploymentId);
573
+ await this.#cleanupDanglingDeployment(newDeploymentId, undefined, progress);
572
574
  return promoteResult;
573
575
  }
574
- const serviceEndpointDomain = promoteResult.value.serviceEndpointDomain;
575
- progress?.onPromoted?.(serviceEndpointDomain);
576
- let previousVersionAction = null;
577
- if (previousVersionId && previousVersionId !== newVersionId) {
578
- progress?.onOldVersionStopping?.(previousVersionId);
579
- const stopResult = await this.#api.stopVersion(previousVersionId, signal);
576
+ const appEndpointDomain = promoteResult.value.appEndpointDomain;
577
+ progress?.onPromoted?.(appEndpointDomain);
578
+ let previousDeploymentAction = null;
579
+ if (previousDeploymentId && previousDeploymentId !== newDeploymentId) {
580
+ progress?.onOldDeploymentStopping?.(previousDeploymentId);
581
+ const stopResult = await this.#api.stopDeployment(previousDeploymentId, signal);
580
582
  if (stopResult.isOk()) {
581
- const pollResult = await pollVersionStatus(this.#api, previousVersionId, {
583
+ const pollResult = await pollDeploymentStatus(this.#api, previousDeploymentId, {
582
584
  targetStatus: "stopped",
583
585
  timeoutSeconds: 30,
584
586
  pollIntervalMs: 1000,
585
587
  signal,
586
588
  });
587
589
  if (pollResult.isOk()) {
588
- previousVersionAction = "stopped";
589
- progress?.onOldVersionStopped?.(previousVersionId);
590
- if (destroyOldVersion) {
591
- progress?.onOldVersionDeleting?.(previousVersionId);
592
- const deleteResult = await this.#api.deleteVersion(previousVersionId, signal);
590
+ previousDeploymentAction = "stopped";
591
+ progress?.onOldDeploymentStopped?.(previousDeploymentId);
592
+ if (destroyOldDeployment) {
593
+ progress?.onOldDeploymentDeleting?.(previousDeploymentId);
594
+ const deleteResult = await this.#api.deleteDeployment(previousDeploymentId, signal);
593
595
  if (deleteResult.isOk()) {
594
- previousVersionAction = "destroyed";
595
- progress?.onOldVersionDeleted?.(previousVersionId);
596
+ previousDeploymentAction = "destroyed";
597
+ progress?.onOldDeploymentDeleted?.(previousDeploymentId);
596
598
  }
597
599
  else {
598
- progress?.onOldVersionDeleteFailed?.(previousVersionId);
600
+ progress?.onOldDeploymentDeleteFailed?.(previousDeploymentId);
599
601
  }
600
602
  }
601
603
  }
602
604
  else {
603
- progress?.onOldVersionStopFailed?.(previousVersionId);
605
+ progress?.onOldDeploymentStopFailed?.(previousDeploymentId);
604
606
  }
605
607
  }
606
608
  else {
607
- progress?.onOldVersionStopFailed?.(previousVersionId);
609
+ progress?.onOldDeploymentStopFailed?.(previousDeploymentId);
608
610
  }
609
611
  }
610
612
  return Result.ok({
611
- serviceEndpointDomain,
612
- previousVersionId,
613
- previousVersionAction,
613
+ appEndpointDomain,
614
+ previousDeploymentId,
615
+ previousDeploymentAction,
614
616
  });
615
617
  }
616
- async #cleanupDanglingVersion(versionId, signal, progress) {
617
- const stopResult = await this.#api.stopVersion(versionId, signal);
618
+ async #cleanupDanglingDeployment(deploymentId, signal, progress) {
619
+ const stopResult = await this.#api.stopDeployment(deploymentId, signal);
618
620
  if (stopResult.isErr()) {
619
- progress?.onCleanupDanglingVersionFailed?.(versionId);
621
+ progress?.onCleanupDanglingDeploymentFailed?.(deploymentId);
620
622
  return;
621
623
  }
622
- const pollResult = await pollVersionStatus(this.#api, versionId, {
624
+ const pollResult = await pollDeploymentStatus(this.#api, deploymentId, {
623
625
  targetStatus: "stopped",
624
626
  timeoutSeconds: 30,
625
627
  pollIntervalMs: 1000,
626
628
  signal,
627
629
  });
628
630
  if (pollResult.isErr()) {
629
- progress?.onCleanupDanglingVersionFailed?.(versionId);
631
+ progress?.onCleanupDanglingDeploymentFailed?.(deploymentId);
630
632
  return;
631
633
  }
632
- const deleteResult = await this.#api.deleteVersion(versionId, signal);
634
+ const deleteResult = await this.#api.deleteDeployment(deploymentId, signal);
633
635
  if (deleteResult.isErr()) {
634
- progress?.onCleanupDanglingVersionFailed?.(versionId);
636
+ progress?.onCleanupDanglingDeploymentFailed?.(deploymentId);
635
637
  return;
636
638
  }
637
- progress?.onCleanupDanglingVersionComplete?.(versionId);
639
+ progress?.onCleanupDanglingDeploymentComplete?.(deploymentId);
638
640
  }
639
641
  #checkAborted(signal) {
640
642
  try {
@@ -648,26 +650,26 @@ export class ComputeClient {
648
650
  async #resolveDeployTarget(options) {
649
651
  const self = this;
650
652
  return Result.gen(async function* () {
651
- if (options.serviceId) {
652
- const service = yield* Result.await(self.#api.getService(options.serviceId, options.signal));
653
- if (!service.projectId) {
653
+ if (options.appId) {
654
+ const app = yield* Result.await(self.#api.getApp(options.appId, options.signal));
655
+ if (!app.projectId) {
654
656
  return Result.err(new MissingArgumentError({ field: "projectId" }));
655
657
  }
656
658
  const requestedProjectId = options.projectId?.replace(/^proj_/, "");
657
- const serviceProjectId = service.projectId.replace(/^proj_/, "");
659
+ const appProjectId = app.projectId.replace(/^proj_/, "");
658
660
  if (requestedProjectId !== undefined &&
659
- requestedProjectId !== serviceProjectId) {
661
+ requestedProjectId !== appProjectId) {
660
662
  return Result.err(new InvalidOptionsError({
661
- message: `Service ${service.id} belongs to project ${service.projectId}, but project ${options.projectId} was provided`,
663
+ message: `App ${app.id} belongs to project ${app.projectId}, but project ${options.projectId} was provided`,
662
664
  }));
663
665
  }
664
666
  return Result.ok({
665
- projectId: service.projectId,
666
- serviceId: service.id,
667
- serviceName: service.name ?? service.id,
668
- region: service.region.id,
669
- branchId: service.branchId ?? null,
670
- isNewService: false,
667
+ projectId: app.projectId,
668
+ appId: app.id,
669
+ appName: app.name ?? app.id,
670
+ region: app.region.id,
671
+ branchId: app.branchId ?? null,
672
+ isNewApp: false,
671
673
  });
672
674
  }
673
675
  let projectId = options.projectId;
@@ -683,50 +685,50 @@ export class ComputeClient {
683
685
  }
684
686
  projectId = await options.interaction.selectProject(projectInfos);
685
687
  }
686
- if (options.serviceName && options.region) {
687
- const response = yield* Result.await(self.#api.createProjectService(projectId, {
688
- displayName: options.serviceName,
688
+ if (options.appName && options.region) {
689
+ const response = yield* Result.await(self.#api.createProjectApp(projectId, {
690
+ displayName: options.appName,
689
691
  regionId: options.region,
690
692
  }, options.signal));
691
693
  return Result.ok({
692
694
  projectId,
693
- serviceId: response.id,
694
- serviceName: response.name,
695
+ appId: response.id,
696
+ appName: response.name,
695
697
  region: response.region.id,
696
698
  branchId: response.branchId ?? null,
697
- isNewService: true,
699
+ isNewApp: true,
698
700
  });
699
701
  }
700
- const services = yield* Result.await(self.#api.listProjectServices(projectId, options.signal));
701
- const serviceInfos = services.map((s) => ({
702
- id: s.id,
703
- name: s.name,
704
- region: s.region.id,
705
- projectId: s.projectId,
702
+ const apps = yield* Result.await(self.#api.listProjectApps(projectId, options.signal));
703
+ const appInfos = apps.map((a) => ({
704
+ id: a.id,
705
+ name: a.name,
706
+ region: a.region.id,
707
+ projectId: a.projectId,
706
708
  }));
707
- if (!options.interaction?.selectService) {
708
- return Result.err(new MissingArgumentError({ field: "serviceId" }));
709
+ if (!options.interaction?.selectApp) {
710
+ return Result.err(new MissingArgumentError({ field: "appId" }));
709
711
  }
710
- const selectedServiceId = await options.interaction.selectService(serviceInfos);
711
- if (selectedServiceId !== null) {
712
- const selected = services.find((s) => s.id === selectedServiceId);
713
- invariant(selected, "selectService returned service ID not in the list");
714
- const service = yield* Result.await(self.#api.getService(selectedServiceId, options.signal));
712
+ const selectedAppId = await options.interaction.selectApp(appInfos);
713
+ if (selectedAppId !== null) {
714
+ const selected = apps.find((a) => a.id === selectedAppId);
715
+ invariant(selected, "selectApp returned app ID not in the list");
716
+ const app = yield* Result.await(self.#api.getApp(selectedAppId, options.signal));
715
717
  return Result.ok({
716
718
  projectId,
717
- serviceId: selectedServiceId,
718
- serviceName: service.name ?? selected.name,
719
- region: service.region.id,
720
- branchId: service.branchId ?? null,
721
- isNewService: false,
719
+ appId: selectedAppId,
720
+ appName: app.name ?? selected.name,
721
+ region: app.region.id,
722
+ branchId: app.branchId ?? null,
723
+ isNewApp: false,
722
724
  });
723
725
  }
724
- let serviceName = options.serviceName;
725
- if (!serviceName) {
726
- if (!options.interaction?.provideServiceName) {
727
- return Result.err(new MissingArgumentError({ field: "serviceName" }));
726
+ let appName = options.appName;
727
+ if (!appName) {
728
+ if (!options.interaction?.provideAppName) {
729
+ return Result.err(new MissingArgumentError({ field: "appName" }));
728
730
  }
729
- serviceName = await options.interaction.provideServiceName();
731
+ appName = await options.interaction.provideAppName();
730
732
  }
731
733
  let region = options.region;
732
734
  if (!region) {
@@ -735,17 +737,17 @@ export class ComputeClient {
735
737
  }
736
738
  region = await options.interaction.selectRegion(REGIONS);
737
739
  }
738
- const response = yield* Result.await(self.#api.createProjectService(projectId, {
739
- displayName: serviceName,
740
+ const response = yield* Result.await(self.#api.createProjectApp(projectId, {
741
+ displayName: appName,
740
742
  regionId: region,
741
743
  }, options.signal));
742
744
  return Result.ok({
743
745
  projectId,
744
- serviceId: response.id,
745
- serviceName: response.name,
746
+ appId: response.id,
747
+ appName: response.name,
746
748
  region: response.region.id,
747
749
  branchId: response.branchId ?? null,
748
- isNewService: true,
750
+ isNewApp: true,
749
751
  });
750
752
  });
751
753
  }
@@ -810,9 +812,9 @@ export class ComputeClient {
810
812
  }
811
813
  }
812
814
  /**
813
- * Sort versions: running/provisioning first, then by createdAt descending.
815
+ * Sort deployments: running/provisioning first, then by createdAt descending.
814
816
  */
815
- function versionSortComparator(a, b) {
817
+ function deploymentSortComparator(a, b) {
816
818
  const statusPriority = (s) => s === "running" ? 0 : s === "provisioning" ? 1 : 2;
817
819
  const aPriority = statusPriority(a.status);
818
820
  const bPriority = statusPriority(b.status);