alchemy 0.85.1 → 0.86.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 (40) hide show
  1. package/bin/alchemy.js +1 -1
  2. package/lib/cloudflare/index.d.ts +1 -0
  3. package/lib/cloudflare/index.d.ts.map +1 -1
  4. package/lib/cloudflare/index.js +1 -0
  5. package/lib/cloudflare/index.js.map +1 -1
  6. package/lib/cloudflare/sveltekit/plugin.d.ts.map +1 -1
  7. package/lib/cloudflare/sveltekit/plugin.js +11 -5
  8. package/lib/cloudflare/sveltekit/plugin.js.map +1 -1
  9. package/lib/cloudflare/vite/vite.d.ts.map +1 -1
  10. package/lib/cloudflare/vite/vite.js +2 -1
  11. package/lib/cloudflare/vite/vite.js.map +1 -1
  12. package/lib/cloudflare/vpc-service-ref.d.ts +38 -0
  13. package/lib/cloudflare/vpc-service-ref.d.ts.map +1 -0
  14. package/lib/cloudflare/vpc-service-ref.js +33 -0
  15. package/lib/cloudflare/vpc-service-ref.js.map +1 -0
  16. package/lib/cloudflare/vpc-service.d.ts +4 -4
  17. package/lib/cloudflare/vpc-service.d.ts.map +1 -1
  18. package/lib/cloudflare/vpc-service.js +44 -38
  19. package/lib/cloudflare/vpc-service.js.map +1 -1
  20. package/lib/docker/api.d.ts +33 -2
  21. package/lib/docker/api.d.ts.map +1 -1
  22. package/lib/docker/api.js +8 -4
  23. package/lib/docker/api.js.map +1 -1
  24. package/lib/docker/container.d.ts +1 -1
  25. package/lib/docker/container.d.ts.map +1 -1
  26. package/lib/docker/container.js +244 -15
  27. package/lib/docker/container.js.map +1 -1
  28. package/lib/test/bun.js +1 -1
  29. package/lib/test/vitest.js +1 -1
  30. package/package.json +1 -1
  31. package/src/cloudflare/index.ts +1 -0
  32. package/src/cloudflare/sveltekit/plugin.ts +17 -8
  33. package/src/cloudflare/vite/vite.ts +4 -2
  34. package/src/cloudflare/vpc-service-ref.ts +60 -0
  35. package/src/cloudflare/vpc-service.ts +53 -46
  36. package/src/docker/api.ts +47 -4
  37. package/src/docker/container.ts +318 -18
  38. package/src/test/bun.ts +1 -1
  39. package/src/test/vitest.ts +1 -1
  40. package/workers/tunnel-proxy.js +1 -1
@@ -1,5 +1,5 @@
1
1
  import { Resource } from "../resource.js";
2
- import { DockerApi } from "./api.js";
2
+ import { DockerApi, normalizeDuration } from "./api.js";
3
3
  /**
4
4
  * Create and manage a Docker Container
5
5
  *
@@ -66,7 +66,7 @@ import { DockerApi } from "./api.js";
66
66
  * start: true
67
67
  * });
68
68
  */
69
- export const Container = Resource("docker::Container", async function (id, props) {
69
+ export const Container = Resource("docker::Container", { alwaysUpdate: true }, async function (id, props) {
70
70
  // Initialize Docker API client
71
71
  const api = new DockerApi();
72
72
  // Get image reference
@@ -91,29 +91,47 @@ export const Container = Resource("docker::Container", async function (id, props
91
91
  // Check if container already exists
92
92
  const containerExists = await api.containerExists(containerName);
93
93
  if (containerExists) {
94
- if (this.phase === "update") {
95
- // Remove existing container for update
96
- await api.removeContainer(containerName, true);
94
+ // Create phase - check for adoption
95
+ if (this.phase === "create" && !props.adopt) {
96
+ throw new Error(`Container "${containerName}" already exists. Use adopt: true to adopt it.`);
97
+ }
98
+ const [containerInfo] = await api.inspectContainer(containerName);
99
+ // Compute what changes are needed
100
+ if (shouldReplace(imageRef, props, containerInfo)) {
101
+ // Need to recreate - remove existing container
102
+ if (this.phase === "update") {
103
+ // In update phase, we can replace the resource
104
+ // Force because we need to delete the old one first if the name is the same
105
+ return this.replace(true);
106
+ }
107
+ else {
108
+ // In create phase, we cannot replace the resource, so manually delete instead
109
+ await api.removeContainer(containerName, true);
110
+ }
97
111
  }
98
112
  else {
99
- // Create phase - check for adoption
100
- if (!props.adopt) {
101
- throw new Error(`Container "${containerName}" already exists. Use adopt: true to adopt it.`);
113
+ // Apply incremental changes without recreating the container
114
+ const { toConnect, toDisconnect } = getNetworkChanges(props, containerInfo);
115
+ // Apply network disconnections
116
+ for (const network of toDisconnect) {
117
+ await api.disconnectNetwork(containerInfo.Id, network);
118
+ }
119
+ // Apply network connections
120
+ for (const network of toConnect) {
121
+ await api.connectNetwork(containerInfo.Id, network.name, {
122
+ aliases: network.aliases,
123
+ });
102
124
  }
103
- // Adopt existing container
104
- const containerInfos = await api.inspectContainer(containerName);
105
- const containerInfo = containerInfos[0];
106
- let adoptedState = containerInfo.State.Status;
107
125
  // Optionally start the container if requested
108
126
  if (props.start && containerInfo.State.Status !== "running") {
109
- await api.startContainer(containerName);
110
- adoptedState = "running";
127
+ await api.startContainer(containerInfo.Id);
128
+ containerState = "running";
111
129
  }
112
130
  return {
113
131
  ...props,
114
132
  id: containerInfo.Id,
115
133
  name: containerName,
116
- state: adoptedState,
134
+ state: containerState,
117
135
  createdAt: new Date(containerInfo.Created).getTime(),
118
136
  };
119
137
  }
@@ -165,4 +183,215 @@ export const Container = Resource("docker::Container", async function (id, props
165
183
  createdAt: Date.now(),
166
184
  };
167
185
  });
186
+ function getNetworkChanges(props, containerInfo) {
187
+ const currentNetworks = new Set(Object.keys(containerInfo.NetworkSettings.Networks || {}));
188
+ const desiredNetworks = new Map((props.networks || []).map((n) => [n.name, n]));
189
+ const toConnect = [];
190
+ const toDisconnect = [];
191
+ for (const network of currentNetworks) {
192
+ if (!desiredNetworks.has(network) && network !== "bridge") {
193
+ toDisconnect.push(network);
194
+ }
195
+ }
196
+ for (const [name, config] of desiredNetworks) {
197
+ if (!currentNetworks.has(name)) {
198
+ toConnect.push(config);
199
+ }
200
+ }
201
+ return { toConnect, toDisconnect };
202
+ }
203
+ function shouldReplace(imageRef, props, containerInfo) {
204
+ // Check immutable properties that require recreation
205
+ // Image change - compare the image ID/digest if available
206
+ // The container stores the resolved image ID, so we compare against imageRef
207
+ if (containerInfo.Config.Image !== imageRef) {
208
+ return true;
209
+ }
210
+ // Command change
211
+ const containerCmd = containerInfo.Config.Cmd || [];
212
+ if (props.command && // only compare if command is set; otherwise we'd be comparing against the image's default command
213
+ (props.command.length !== containerCmd.length ||
214
+ !props.command.every((c, i) => c === containerCmd[i]))) {
215
+ return true;
216
+ }
217
+ // Environment variables
218
+ if (!compareEnv(props.environment, containerInfo.Config.Env)) {
219
+ return true;
220
+ }
221
+ // Port bindings
222
+ if (!comparePorts(props.ports, containerInfo.HostConfig.PortBindings)) {
223
+ return true;
224
+ }
225
+ // Volume bindings
226
+ if (!compareVolumes(props.volumes, containerInfo.HostConfig.Binds)) {
227
+ return true;
228
+ }
229
+ // Healthcheck
230
+ if (!compareHealthcheck(props.healthcheck, containerInfo.Config.Healthcheck)) {
231
+ return true;
232
+ }
233
+ // Restart policy
234
+ if (!compareRestartPolicy(props.restart, containerInfo.HostConfig.RestartPolicy)) {
235
+ return true;
236
+ }
237
+ // AutoRemove (removeOnExit)
238
+ if ((props.removeOnExit || false) !== containerInfo.HostConfig.AutoRemove) {
239
+ return true;
240
+ }
241
+ return false;
242
+ }
243
+ /**
244
+ * Normalize port mappings to a comparable format
245
+ * @internal
246
+ */
247
+ function normalizePortMappings(ports) {
248
+ const map = new Map();
249
+ if (!ports)
250
+ return map;
251
+ for (const port of ports) {
252
+ const protocol = port.protocol || "tcp";
253
+ map.set(`${port.external}`, `${port.internal}/${protocol}`);
254
+ }
255
+ return map;
256
+ }
257
+ /**
258
+ * Normalize volume mappings to a comparable format
259
+ * @internal
260
+ */
261
+ function normalizeVolumeMappings(volumes) {
262
+ const set = new Set();
263
+ if (!volumes)
264
+ return set;
265
+ for (const volume of volumes) {
266
+ const readOnlyFlag = volume.readOnly ? ":ro" : "";
267
+ set.add(`${volume.hostPath}:${volume.containerPath}${readOnlyFlag}`);
268
+ }
269
+ return set;
270
+ }
271
+ /**
272
+ * Compare environment variables
273
+ * @internal
274
+ */
275
+ function compareEnv(propsEnv, containerEnv) {
276
+ const propsEntries = Object.entries(propsEnv || {}).sort(([a], [b]) => a.localeCompare(b));
277
+ const containerEntries = (containerEnv || [])
278
+ .map((e) => {
279
+ const idx = e.indexOf("=");
280
+ return idx >= 0 ? [e.slice(0, idx), e.slice(idx + 1)] : null;
281
+ })
282
+ .filter((e) => e !== null)
283
+ // Filter out PATH and other system env vars that Docker adds
284
+ .filter(([key]) => propsEnv && key in propsEnv)
285
+ .sort(([a], [b]) => a.localeCompare(b));
286
+ if (propsEntries.length !== containerEntries.length)
287
+ return false;
288
+ for (let i = 0; i < propsEntries.length; i++) {
289
+ if (propsEntries[i][0] !== containerEntries[i][0] ||
290
+ propsEntries[i][1] !== containerEntries[i][1]) {
291
+ return false;
292
+ }
293
+ }
294
+ return true;
295
+ }
296
+ /**
297
+ * Compare port bindings
298
+ * @internal
299
+ */
300
+ function comparePorts(propsPorts, containerPorts) {
301
+ const propsMap = normalizePortMappings(propsPorts);
302
+ // Extract container port mappings
303
+ const containerMap = new Map();
304
+ if (containerPorts) {
305
+ for (const [containerPort, bindings] of Object.entries(containerPorts)) {
306
+ if (bindings && bindings.length > 0) {
307
+ containerMap.set(bindings[0].HostPort, containerPort);
308
+ }
309
+ }
310
+ }
311
+ if (propsMap.size !== containerMap.size)
312
+ return false;
313
+ for (const [hostPort, containerPort] of propsMap) {
314
+ if (containerMap.get(hostPort) !== containerPort)
315
+ return false;
316
+ }
317
+ return true;
318
+ }
319
+ /**
320
+ * Compare volume bindings
321
+ * @internal
322
+ */
323
+ function compareVolumes(propsVolumes, containerBinds) {
324
+ const propsSet = normalizeVolumeMappings(propsVolumes);
325
+ const containerSet = new Set(containerBinds || []);
326
+ if (propsSet.size !== containerSet.size)
327
+ return false;
328
+ for (const bind of propsSet) {
329
+ if (!containerSet.has(bind))
330
+ return false;
331
+ }
332
+ return true;
333
+ }
334
+ /**
335
+ * Compare healthcheck configuration
336
+ * @internal
337
+ */
338
+ function compareHealthcheck(propsHc, containerHc) {
339
+ // Both undefined/null
340
+ if (!propsHc && !containerHc)
341
+ return true;
342
+ // One defined, one not
343
+ if (!propsHc || !containerHc)
344
+ return false;
345
+ // Compare command
346
+ const propsCmd = Array.isArray(propsHc.cmd)
347
+ ? propsHc.cmd.join(" ")
348
+ : propsHc.cmd;
349
+ const containerCmd = containerHc.Test
350
+ ? containerHc.Test.slice(1).join(" ")
351
+ : "";
352
+ if (propsCmd !== containerCmd)
353
+ return false;
354
+ // Helper to convert Duration to nanoseconds for comparison
355
+ const toNanos = (d) => {
356
+ if (d === undefined)
357
+ return 0;
358
+ const str = normalizeDuration(d);
359
+ const match = str.match(/^(\d+(?:\.\d+)?)(ms|s|m|h)$/);
360
+ if (!match)
361
+ return 0;
362
+ const value = parseFloat(match[1]);
363
+ const unit = match[2];
364
+ switch (unit) {
365
+ case "ms":
366
+ return value * 1_000_000;
367
+ case "s":
368
+ return value * 1_000_000_000;
369
+ case "m":
370
+ return value * 60 * 1_000_000_000;
371
+ case "h":
372
+ return value * 3600 * 1_000_000_000;
373
+ default:
374
+ return 0;
375
+ }
376
+ };
377
+ if (toNanos(propsHc.interval) !== (containerHc.Interval || 0))
378
+ return false;
379
+ if (toNanos(propsHc.timeout) !== (containerHc.Timeout || 0))
380
+ return false;
381
+ if ((propsHc.retries || 0) !== (containerHc.Retries || 0))
382
+ return false;
383
+ if (toNanos(propsHc.startPeriod) !== (containerHc.StartPeriod || 0))
384
+ return false;
385
+ if (toNanos(propsHc.startInterval) !== (containerHc.StartInterval || 0))
386
+ return false;
387
+ return true;
388
+ }
389
+ /**
390
+ * Compare restart policy
391
+ * @internal
392
+ */
393
+ function compareRestartPolicy(propsRestart, containerRestart) {
394
+ const propsPolicy = propsRestart || "no";
395
+ return propsPolicy === containerRestart.Name;
396
+ }
168
397
  //# sourceMappingURL=container.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"container.js","sourceRoot":"","sources":["../../src/docker/container.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"container.js","sourceRoot":"","sources":["../../src/docker/container.ts"],"names":[],"mappings":"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"}
package/lib/test/bun.js CHANGED
@@ -61,7 +61,7 @@ export function test(meta, defaultOptions) {
61
61
  const _options = typeof args[1] === "object" ? args[1] : undefined;
62
62
  const timeout = typeof args[args.length - 1] === "number"
63
63
  ? args[args.length - 1]
64
- : 120000;
64
+ : 150000;
65
65
  const spread = (obj) => obj && typeof obj === "object"
66
66
  ? Object.fromEntries(Object.entries(obj).flatMap(([k, v]) => v !== undefined ? [[k, v]] : []))
67
67
  : {};
@@ -84,7 +84,7 @@ export function test(meta, defaultOptions = {
84
84
  const _options = typeof args[1] === "object" ? args[1] : undefined;
85
85
  const timeout = typeof args[args.length - 1] === "number"
86
86
  ? args[args.length - 1]
87
- : 120000;
87
+ : 150000;
88
88
  const spread = (obj) => obj && typeof obj === "object"
89
89
  ? Object.fromEntries(Object.entries(obj).flatMap(([k, v]) => v !== undefined ? [[k, v]] : []))
90
90
  : {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "alchemy",
3
- "version": "0.85.1",
3
+ "version": "0.86.0",
4
4
  "license": "Apache-2.0",
5
5
  "author": "Sam Goodwin <sam@alchemy.run>",
6
6
  "homepage": "https://alchemy.run",
@@ -73,6 +73,7 @@ export * from "./vectorize-index.ts";
73
73
  export * from "./vectorize-metadata-index.ts";
74
74
  export * from "./version-metadata.ts";
75
75
  export * from "./vite/vite.ts";
76
+ export * from "./vpc-service-ref.ts";
76
77
  export * from "./vpc-service.ts";
77
78
  export * from "./warp-default-profile.ts";
78
79
  export * from "./warp-device-profile.ts";
@@ -2,17 +2,11 @@ import adapter, { type AdapterOptions } from "@sveltejs/adapter-cloudflare";
2
2
  import type { Adapter } from "@sveltejs/kit";
3
3
  import { getPlatformProxyOptions } from "../cloudflare-env-proxy.ts";
4
4
 
5
- const isSvelteLanguageServer = !!process.argv.find((arg) =>
6
- arg.includes("svelte-language-server"),
7
- );
8
-
9
5
  export default (options?: AdapterOptions): Adapter => {
10
- if (isSvelteLanguageServer) {
11
- // the svelte language server runs from the root and therefore may be running in a different cwd than the `Website.cwd`
12
- // for now, we work around this by returning a noop adapter to avoid breaking svelte intellisense
6
+ if (shouldDisable()) {
13
7
  return {
14
- adapt() {},
15
8
  name: "alchemy-noop",
9
+ adapt() {},
16
10
  };
17
11
  }
18
12
  const { platformProxy: proxyOptions, ...config } = options ?? {};
@@ -23,3 +17,18 @@ export default (options?: AdapterOptions): Adapter => {
23
17
  ...config,
24
18
  });
25
19
  };
20
+
21
+ /**
22
+ * Return true for `svelte-language-server`, `svelte-check`, and `svelte-kit sync`. This is because:
23
+ * - The svelte language server runs from the root and therefore may be running in a different cwd than the `Website.cwd`, so disable to avoid breaking intellisense
24
+ * - The `svelte-check` and `svelte-kit sync` commands do not require Cloudflare-specific configuration, so disable to avoid breaking the commands
25
+ */
26
+ function shouldDisable(argv = process.argv): boolean {
27
+ return (
28
+ argv.some(
29
+ (arg) =>
30
+ arg.includes("svelte-check") || arg.includes("svelte-language-server"),
31
+ ) ||
32
+ (argv.some((arg) => arg.includes("svelte-kit")) && argv.includes("sync"))
33
+ );
34
+ }
@@ -2,6 +2,7 @@ import path from "pathe";
2
2
  import { getPackageManagerRunner } from "../../util/detect-package-manager.ts";
3
3
  import type { Assets } from "../assets.ts";
4
4
  import type { Bindings } from "../bindings.ts";
5
+ import { withSkipPathValidation } from "../miniflare/paths.ts";
5
6
  import {
6
7
  spreadBuildProps,
7
8
  spreadDevProps,
@@ -34,8 +35,9 @@ export async function Vite<B extends Bindings>(
34
35
  port = args[index + 1];
35
36
  } else {
36
37
  try {
37
- const config = await import(
38
- path.resolve(props.cwd ?? process.cwd(), "vite.config.ts")
38
+ const config = await withSkipPathValidation(
39
+ () =>
40
+ import(path.resolve(props.cwd ?? process.cwd(), "vite.config.ts")),
39
41
  );
40
42
  port = config.default?.server?.port ?? 5173;
41
43
  } catch {}
@@ -0,0 +1,60 @@
1
+ import { createCloudflareApi, type CloudflareApiOptions } from "./api.ts";
2
+ import {
3
+ findVpcServiceByName,
4
+ getService,
5
+ type VpcService,
6
+ } from "./vpc-service.ts";
7
+
8
+ export type VpcServiceRefProps = CloudflareApiOptions &
9
+ (
10
+ | {
11
+ /**
12
+ * The Cloudflare-assigned ID for the VPC service.
13
+ */
14
+ serviceId: string;
15
+ }
16
+ | {
17
+ /**
18
+ * The name of the VPC service.
19
+ */
20
+ name: string;
21
+ }
22
+ );
23
+
24
+ /**
25
+ * A reference to a VPC service.
26
+ */
27
+ export type VpcServiceRef = VpcService;
28
+
29
+ /**
30
+ * Reference an existing [VPC Service](https://developers.cloudflare.com/workers-vpc/configuration/vpc-services/) without managing its lifecycle.
31
+ *
32
+ * @example
33
+ * ```ts
34
+ * // Reference by ID
35
+ * const vpcService = await VpcServiceRef({
36
+ * serviceId: "123e4567-e89b-12d3-a456-426614174000",
37
+ * });
38
+ * ```
39
+ *
40
+ * @example
41
+ * ```ts
42
+ * // Reference by name
43
+ * const vpcService = await VpcServiceRef({
44
+ * name: "my-vpc-service",
45
+ * });
46
+ * ```
47
+ */
48
+ export async function VpcServiceRef(
49
+ props: VpcServiceRefProps,
50
+ ): Promise<VpcServiceRef> {
51
+ const api = await createCloudflareApi(props);
52
+ if ("name" in props) {
53
+ const service = await findVpcServiceByName(api, props.name);
54
+ if (!service) {
55
+ throw new Error(`VPC service "${props.name}" not found`);
56
+ }
57
+ return service;
58
+ }
59
+ return await getService(api, props.serviceId);
60
+ }
@@ -258,21 +258,18 @@ export const VpcService = Resource(
258
258
  switch (this.phase) {
259
259
  case "create": {
260
260
  const adopt = props.adopt ?? this.scope.adopt;
261
- const service = await createService(api, input).catch(async (err) => {
261
+ return await createService(api, input).catch(async (err) => {
262
262
  if (isCloudflareApiError(err, { code: 5101 }) && adopt) {
263
- const services = await listServices(api);
264
- const service = services.find((s) => s.name === input.name);
263
+ const service = await findVpcServiceByName(api, input.name);
265
264
  if (service) {
266
- return await updateService(api, service.service_id, input);
265
+ return await updateService(api, service.serviceId, input);
267
266
  }
268
267
  }
269
268
  throw err;
270
269
  });
271
- return formatOutput(service);
272
270
  }
273
271
  case "update": {
274
- const service = await updateService(api, this.output.serviceId, input);
275
- return formatOutput(service);
272
+ return await updateService(api, this.output.serviceId, input);
276
273
  }
277
274
  }
278
275
 
@@ -299,34 +296,6 @@ export const VpcService = Resource(
299
296
  const { tunnel, ...rest } = network;
300
297
  return { tunnel_id: tunnel.tunnelId, ...rest };
301
298
  }
302
-
303
- function formatOutput(service: ConnectivityService): VpcService {
304
- return {
305
- name: service.name,
306
- serviceId: service.service_id,
307
- serviceType: service.type,
308
- tcpPort: service.tcp_port,
309
- appProtocol: service.app_protocol,
310
- httpPort: service.http_port,
311
- httpsPort: service.https_port,
312
- host:
313
- "hostname" in service.host
314
- ? {
315
- hostname: service.host.hostname,
316
- resolverNetwork: {
317
- tunnelId: service.host.resolver_network.tunnel_id,
318
- resolverIps: service.host.resolver_network.resolver_ips,
319
- },
320
- }
321
- : {
322
- ...service.host,
323
- network: { tunnelId: service.host.network.tunnel_id },
324
- },
325
- createdAt: new Date(service.created_at).getTime(),
326
- updatedAt: new Date(service.updated_at).getTime(),
327
- type: "vpc_service",
328
- };
329
- }
330
299
  },
331
300
  );
332
301
 
@@ -337,14 +306,15 @@ export const VpcService = Resource(
337
306
  export async function createService(
338
307
  api: CloudflareApi,
339
308
  body: ConnectivityService.Input,
340
- ): Promise<ConnectivityService> {
341
- return await extractCloudflareResult<ConnectivityService>(
342
- `create connectivity service`,
309
+ ): Promise<VpcService> {
310
+ const service = await extractCloudflareResult<ConnectivityService>(
311
+ "create connectivity service",
343
312
  api.post(
344
313
  `/accounts/${api.accountId}/connectivity/directory/services`,
345
314
  body,
346
315
  ),
347
316
  );
317
+ return formatVpcService(service);
348
318
  }
349
319
 
350
320
  /**
@@ -374,28 +344,32 @@ export async function deleteService(
374
344
  export async function getService(
375
345
  api: CloudflareApi,
376
346
  serviceId: string,
377
- ): Promise<ConnectivityService> {
378
- return await extractCloudflareResult<ConnectivityService>(
347
+ ): Promise<VpcService> {
348
+ const service = await extractCloudflareResult<ConnectivityService>(
379
349
  `get connectivity service "${serviceId}"`,
380
350
  api.get(
381
351
  `/accounts/${api.accountId}/connectivity/directory/services/${serviceId}`,
382
352
  ),
383
353
  );
354
+ return formatVpcService(service);
384
355
  }
385
356
 
386
357
  /**
387
358
  * List connectivity (VPC) services for the account.
388
359
  * @internal
389
360
  */
390
- export async function listServices(
361
+ export async function findVpcServiceByName(
391
362
  api: CloudflareApi,
392
- ): Promise<ConnectivityService[]> {
393
- return await extractCloudflareResult<ConnectivityService[]>(
394
- `list connectivity services`,
363
+ name: string,
364
+ ): Promise<VpcService | undefined> {
365
+ const services = await extractCloudflareResult<ConnectivityService[]>(
366
+ "list connectivity services",
395
367
  api.get(
396
368
  `/accounts/${api.accountId}/connectivity/directory/services?per_page=1000`,
397
369
  ),
398
370
  );
371
+ const service = services.find((s) => s.name === name);
372
+ return service ? formatVpcService(service) : undefined;
399
373
  }
400
374
 
401
375
  /**
@@ -406,14 +380,47 @@ export async function updateService(
406
380
  api: CloudflareApi,
407
381
  serviceId: string,
408
382
  body: ConnectivityService.Input,
409
- ): Promise<ConnectivityService> {
410
- return await extractCloudflareResult<ConnectivityService>(
383
+ ): Promise<VpcService> {
384
+ const service = await extractCloudflareResult<ConnectivityService>(
411
385
  `update connectivity service "${serviceId}"`,
412
386
  api.put(
413
387
  `/accounts/${api.accountId}/connectivity/directory/services/${serviceId}`,
414
388
  body,
415
389
  ),
416
390
  );
391
+ return formatVpcService(service);
392
+ }
393
+
394
+ /**
395
+ * Format an API response into a VpcService resource.
396
+ * @internal
397
+ */
398
+ function formatVpcService(service: ConnectivityService): VpcService {
399
+ return {
400
+ name: service.name,
401
+ serviceId: service.service_id,
402
+ serviceType: service.type,
403
+ tcpPort: service.tcp_port,
404
+ appProtocol: service.app_protocol,
405
+ httpPort: service.http_port,
406
+ httpsPort: service.https_port,
407
+ host:
408
+ "hostname" in service.host
409
+ ? {
410
+ hostname: service.host.hostname,
411
+ resolverNetwork: {
412
+ tunnelId: service.host.resolver_network.tunnel_id,
413
+ resolverIps: service.host.resolver_network.resolver_ips,
414
+ },
415
+ }
416
+ : {
417
+ ...service.host,
418
+ network: { tunnelId: service.host.network.tunnel_id },
419
+ },
420
+ createdAt: new Date(service.created_at).getTime(),
421
+ updatedAt: new Date(service.updated_at).getTime(),
422
+ type: "vpc_service",
423
+ };
417
424
  }
418
425
 
419
426
  interface ConnectivityService extends ConnectivityService.Input {