@nilovonjs/hcloud-js 1.0.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 (62) hide show
  1. package/README.md +90 -0
  2. package/package.json +70 -0
  3. package/src/apis/actions/index.ts +113 -0
  4. package/src/apis/actions/schemas.ts +59 -0
  5. package/src/apis/actions/types.ts +77 -0
  6. package/src/apis/certificates/index.ts +326 -0
  7. package/src/apis/certificates/schemas.ts +140 -0
  8. package/src/apis/certificates/types.ts +176 -0
  9. package/src/apis/common/schemas.ts +19 -0
  10. package/src/apis/dns/index.ts +961 -0
  11. package/src/apis/dns/schemas.ts +437 -0
  12. package/src/apis/dns/types.ts +397 -0
  13. package/src/apis/firewalls/index.ts +469 -0
  14. package/src/apis/firewalls/schemas.ts +274 -0
  15. package/src/apis/firewalls/types.ts +205 -0
  16. package/src/apis/floating-ips/index.ts +466 -0
  17. package/src/apis/floating-ips/schemas.ts +203 -0
  18. package/src/apis/floating-ips/types.ts +207 -0
  19. package/src/apis/images/index.ts +195 -0
  20. package/src/apis/images/schemas.ts +113 -0
  21. package/src/apis/images/types.ts +124 -0
  22. package/src/apis/isos/index.ts +91 -0
  23. package/src/apis/isos/schemas.ts +43 -0
  24. package/src/apis/isos/types.ts +60 -0
  25. package/src/apis/load-balancers/index.ts +892 -0
  26. package/src/apis/load-balancers/schemas.ts +561 -0
  27. package/src/apis/load-balancers/types.ts +361 -0
  28. package/src/apis/locations/index.ts +176 -0
  29. package/src/apis/locations/schemas.ts +83 -0
  30. package/src/apis/locations/types.ts +113 -0
  31. package/src/apis/networks/index.ts +544 -0
  32. package/src/apis/networks/schemas.ts +279 -0
  33. package/src/apis/networks/types.ts +243 -0
  34. package/src/apis/placement-groups/index.ts +212 -0
  35. package/src/apis/placement-groups/schemas.ts +90 -0
  36. package/src/apis/placement-groups/types.ts +99 -0
  37. package/src/apis/pricing/index.ts +42 -0
  38. package/src/apis/pricing/schemas.ts +93 -0
  39. package/src/apis/pricing/types.ts +71 -0
  40. package/src/apis/primary-ips/index.ts +467 -0
  41. package/src/apis/primary-ips/schemas.ts +221 -0
  42. package/src/apis/primary-ips/types.ts +221 -0
  43. package/src/apis/server-types/index.ts +93 -0
  44. package/src/apis/server-types/schemas.ts +29 -0
  45. package/src/apis/server-types/types.ts +43 -0
  46. package/src/apis/servers/index.ts +378 -0
  47. package/src/apis/servers/schemas.ts +771 -0
  48. package/src/apis/servers/types.ts +538 -0
  49. package/src/apis/ssh-keys/index.ts +204 -0
  50. package/src/apis/ssh-keys/schemas.ts +84 -0
  51. package/src/apis/ssh-keys/types.ts +106 -0
  52. package/src/apis/volumes/index.ts +452 -0
  53. package/src/apis/volumes/schemas.ts +195 -0
  54. package/src/apis/volumes/types.ts +197 -0
  55. package/src/auth/index.ts +26 -0
  56. package/src/base/index.ts +10 -0
  57. package/src/client/index.ts +388 -0
  58. package/src/config/index.ts +34 -0
  59. package/src/errors/index.ts +38 -0
  60. package/src/index.ts +799 -0
  61. package/src/types/index.ts +37 -0
  62. package/src/validation/index.ts +109 -0
@@ -0,0 +1,378 @@
1
+ /**
2
+ * Hetzner Cloud Servers API
3
+ * @see https://docs.hetzner.cloud/reference/cloud#servers
4
+ */
5
+
6
+ import type { HCloudClient } from "../../client/index";
7
+ import type {
8
+ ListServersParams,
9
+ ListServersResponse,
10
+ CreateServerParams,
11
+ CreateServerResponse,
12
+ GetServerResponse,
13
+ UpdateServerParams,
14
+ UpdateServerResponse,
15
+ DeleteServerResponse,
16
+ GetServerMetricsParams,
17
+ GetServerMetricsResponse,
18
+ ListServerActionsParams,
19
+ ListServerActionsResponse,
20
+ GetServerActionResponse,
21
+ PowerOnServerResponse,
22
+ PowerOffServerResponse,
23
+ RebootServerResponse,
24
+ ResetServerResponse,
25
+ ShutdownServerResponse,
26
+ AttachISOToServerParams,
27
+ AttachISOToServerResponse,
28
+ DetachISOFromServerResponse,
29
+ EnableRescueModeParams,
30
+ EnableRescueModeResponse,
31
+ DisableRescueModeResponse,
32
+ CreateImageFromServerParams,
33
+ CreateImageFromServerResponse,
34
+ RebuildServerFromImageParams,
35
+ RebuildServerFromImageResponse,
36
+ ChangeServerProtectionParams,
37
+ ChangeServerProtectionResponse,
38
+ ChangeServerTypeParams,
39
+ ChangeServerTypeResponse,
40
+ EnableBackupsParams,
41
+ EnableBackupsResponse,
42
+ DisableBackupsResponse,
43
+ AttachServerToNetworkParams,
44
+ AttachServerToNetworkResponse,
45
+ DetachServerFromNetworkParams,
46
+ DetachServerFromNetworkResponse,
47
+ ChangeAliasIPsOfNetworkParams,
48
+ ChangeAliasIPsOfNetworkResponse,
49
+ ChangeServerReverseDNSParams,
50
+ ChangeServerReverseDNSResponse,
51
+ RequestConsoleForServerParams,
52
+ RequestConsoleForServerResponse,
53
+ ResetRootPasswordResponse,
54
+ AddServerToPlacementGroupParams,
55
+ AddServerToPlacementGroupResponse,
56
+ RemoveServerFromPlacementGroupResponse,
57
+ } from "../../apis/servers/types";
58
+ import { validate } from "../../validation/index";
59
+ import {
60
+ listServersResponseSchema,
61
+ createServerRequestSchema,
62
+ createServerResponseSchema,
63
+ getServerResponseSchema,
64
+ updateServerRequestSchema,
65
+ updateServerResponseSchema,
66
+ deleteServerResponseSchema,
67
+ getServerMetricsResponseSchema,
68
+ listServerActionsResponseSchema,
69
+ getServerActionResponseSchema,
70
+ powerOnServerResponseSchema,
71
+ powerOffServerResponseSchema,
72
+ rebootServerResponseSchema,
73
+ resetServerResponseSchema,
74
+ shutdownServerResponseSchema,
75
+ attachISOToServerRequestSchema,
76
+ attachISOToServerResponseSchema,
77
+ detachISOFromServerResponseSchema,
78
+ enableRescueModeRequestSchema,
79
+ enableRescueModeResponseSchema,
80
+ disableRescueModeResponseSchema,
81
+ createImageFromServerRequestSchema,
82
+ createImageFromServerResponseSchema,
83
+ rebuildServerFromImageRequestSchema,
84
+ rebuildServerFromImageResponseSchema,
85
+ changeServerProtectionRequestSchema,
86
+ changeServerProtectionResponseSchema,
87
+ changeServerTypeRequestSchema,
88
+ changeServerTypeResponseSchema,
89
+ enableBackupsRequestSchema,
90
+ enableBackupsResponseSchema,
91
+ disableBackupsResponseSchema,
92
+ attachServerToNetworkRequestSchema,
93
+ attachServerToNetworkResponseSchema,
94
+ detachServerFromNetworkRequestSchema,
95
+ detachServerFromNetworkResponseSchema,
96
+ changeAliasIPsOfNetworkRequestSchema,
97
+ changeAliasIPsOfNetworkResponseSchema,
98
+ changeServerReverseDNSRequestSchema,
99
+ changeServerReverseDNSResponseSchema,
100
+ requestConsoleForServerRequestSchema,
101
+ requestConsoleForServerResponseSchema,
102
+ resetRootPasswordResponseSchema,
103
+ addServerToPlacementGroupRequestSchema,
104
+ addServerToPlacementGroupResponseSchema,
105
+ removeServerFromPlacementGroupRequestSchema,
106
+ removeServerFromPlacementGroupResponseSchema,
107
+ } from "../../apis/servers/schemas";
108
+
109
+ /**
110
+ * Servers API client
111
+ */
112
+ export class ServersClient {
113
+ constructor(private readonly client: HCloudClient) {}
114
+
115
+ /**
116
+ * Returns all Server objects.
117
+ *
118
+ * You can select specific Server types only and sort the results by using URI parameters.
119
+ *
120
+ * @param params - Query parameters for filtering and pagination
121
+ * @returns Promise resolving to list of servers with pagination metadata
122
+ * @see https://docs.hetzner.cloud/reference/cloud#servers-list-servers
123
+ *
124
+ * @example
125
+ * ```typescript
126
+ * const client = new HCloudClient({ token: 'your-token' });
127
+ *
128
+ * // List all servers
129
+ * const result = await client.servers.list();
130
+ *
131
+ * // List servers with filters
132
+ * const runningServers = await client.servers.list({
133
+ * status: ['running'],
134
+ * label_selector: 'environment=production',
135
+ * sort: ['name:asc'],
136
+ * page: 1,
137
+ * per_page: 50
138
+ * });
139
+ * ```
140
+ */
141
+ async list(params?: ListServersParams): Promise<ListServersResponse> {
142
+ // Build query parameters
143
+ // Note: For array parameters (sort, status), we need to pass them as arrays
144
+ // to the client, which will handle them correctly using URLSearchParams.append()
145
+ const queryParams: Record<string, string | number | boolean | string[] | undefined> = {};
146
+
147
+ if (params?.name) {
148
+ queryParams.name = params.name;
149
+ }
150
+
151
+ if (params?.label_selector) {
152
+ queryParams.label_selector = params.label_selector;
153
+ }
154
+
155
+ if (params?.sort) {
156
+ // Convert single string to array for consistent handling
157
+ queryParams.sort = Array.isArray(params.sort) ? params.sort : [params.sort];
158
+ }
159
+
160
+ if (params?.status) {
161
+ // Convert single status to array for consistent handling
162
+ queryParams.status = Array.isArray(params.status) ? params.status : [params.status];
163
+ }
164
+
165
+ if (params?.page !== undefined) {
166
+ queryParams.page = params.page;
167
+ }
168
+
169
+ if (params?.per_page !== undefined) {
170
+ queryParams.per_page = params.per_page;
171
+ }
172
+
173
+ const response = await this.client.get<unknown>("/servers", queryParams);
174
+
175
+ // Validate response with Zod
176
+ return validate(listServersResponseSchema, response, {
177
+ context: "List servers response",
178
+ detailed: true,
179
+ });
180
+ }
181
+
182
+ /**
183
+ * Creates a new Server.
184
+ *
185
+ * Returns the initial Action object for the server creation progress.
186
+ *
187
+ * @param params - Parameters for creating the server
188
+ * @returns Promise resolving to the created server with action and root password
189
+ * @see https://docs.hetzner.cloud/reference/cloud#servers-create-a-server
190
+ *
191
+ * @example
192
+ * ```typescript
193
+ * const client = new HCloudClient({ token: 'your-token' });
194
+ *
195
+ * // Create a server with required fields
196
+ * const result = await client.servers.create({
197
+ * name: 'my-server',
198
+ * server_type: 'cpx11',
199
+ * image: 'ubuntu-22.04'
200
+ * });
201
+ *
202
+ * // Create a server with optional fields
203
+ * const result = await client.servers.create({
204
+ * name: 'my-server',
205
+ * server_type: 'cpx11',
206
+ * image: 'ubuntu-22.04',
207
+ * location: 'nbg1',
208
+ * ssh_keys: ['my-ssh-key-id'],
209
+ * user_data: '#cloud-config\n...',
210
+ * labels: { project: 'production' }
211
+ * });
212
+ * ```
213
+ */
214
+ async create(params: CreateServerParams): Promise<CreateServerResponse> {
215
+ // Validate request parameters
216
+ const validatedParams = validate(createServerRequestSchema, params, {
217
+ context: "Create server request",
218
+ detailed: true,
219
+ });
220
+
221
+ // Make API request
222
+ const response = await this.client.post<unknown>("/servers", validatedParams);
223
+
224
+ // Validate response with Zod
225
+ return validate(createServerResponseSchema, response, {
226
+ context: "Create server response",
227
+ detailed: true,
228
+ });
229
+ }
230
+
231
+ /**
232
+ * Returns a specific Server object.
233
+ *
234
+ * @param id - ID of the Server
235
+ * @returns Promise resolving to the server
236
+ * @see https://docs.hetzner.cloud/reference/cloud#servers-get-a-server
237
+ *
238
+ * @example
239
+ * ```typescript
240
+ * const client = new HCloudClient({ token: 'your-token' });
241
+ *
242
+ * // Get a server by ID
243
+ * const server = await client.servers.get(12345);
244
+ * console.log(server.server.name);
245
+ * ```
246
+ */
247
+ async get(id: number): Promise<GetServerResponse> {
248
+ const response = await this.client.get<unknown>(`/servers/${id}`);
249
+
250
+ // Validate response with Zod
251
+ return validate(getServerResponseSchema, response, {
252
+ context: "Get server response",
253
+ detailed: true,
254
+ });
255
+ }
256
+
257
+ /**
258
+ * Updates a Server.
259
+ *
260
+ * You can update a Server's name and a Server's labels.
261
+ *
262
+ * @param id - ID of the Server
263
+ * @param params - Parameters to update (name and/or labels)
264
+ * @returns Promise resolving to the updated server
265
+ * @see https://docs.hetzner.cloud/reference/cloud#servers-update-a-server
266
+ *
267
+ * @example
268
+ * ```typescript
269
+ * const client = new HCloudClient({ token: 'your-token' });
270
+ *
271
+ * // Update server name
272
+ * const updated = await client.servers.update(12345, {
273
+ * name: 'new-server-name'
274
+ * });
275
+ *
276
+ * // Update labels
277
+ * const updated = await client.servers.update(12345, {
278
+ * labels: { environment: 'production', team: 'backend' }
279
+ * });
280
+ * ```
281
+ */
282
+ async update(id: number, params: UpdateServerParams): Promise<UpdateServerResponse> {
283
+ // Validate request parameters
284
+ const validatedParams = validate(updateServerRequestSchema, params, {
285
+ context: "Update server request",
286
+ detailed: true,
287
+ });
288
+
289
+ // Make API request
290
+ const response = await this.client.put<unknown>(`/servers/${id}`, validatedParams);
291
+
292
+ // Validate response with Zod
293
+ return validate(updateServerResponseSchema, response, {
294
+ context: "Update server response",
295
+ detailed: true,
296
+ });
297
+ }
298
+
299
+ /**
300
+ * Deletes a Server.
301
+ *
302
+ * This immediately removes the Server from your account, and it is no longer accessible.
303
+ *
304
+ * @param id - ID of the Server
305
+ * @returns Promise resolving to the delete action
306
+ * @see https://docs.hetzner.cloud/reference/cloud#servers-delete-a-server
307
+ *
308
+ * @example
309
+ * ```typescript
310
+ * const client = new HCloudClient({ token: 'your-token' });
311
+ *
312
+ * // Delete a server
313
+ * const result = await client.servers.delete(12345);
314
+ * console.log(`Delete action ID: ${result.action.id}`);
315
+ * ```
316
+ */
317
+ async delete(id: number): Promise<DeleteServerResponse> {
318
+ const response = await this.client.delete<unknown>(`/servers/${id}`);
319
+
320
+ // Validate response with Zod
321
+ return validate(deleteServerResponseSchema, response, {
322
+ context: "Delete server response",
323
+ detailed: true,
324
+ });
325
+ }
326
+
327
+ /**
328
+ * Get Metrics for a Server.
329
+ *
330
+ * Returns Metrics for a Server. The Server must have a public network interface attached.
331
+ *
332
+ * @param id - ID of the Server
333
+ * @param params - Query parameters for metrics (type, start, end, step)
334
+ * @returns Promise resolving to server metrics
335
+ * @see https://docs.hetzner.cloud/reference/cloud#servers-get-metrics-for-a-server
336
+ *
337
+ * @example
338
+ * ```typescript
339
+ * const client = new HCloudClient({ token: 'your-token' });
340
+ *
341
+ * const now = new Date();
342
+ * const oneHourAgo = new Date(now.getTime() - 60 * 60 * 1000);
343
+ *
344
+ * // Get CPU and network metrics
345
+ * const metrics = await client.servers.getMetrics(12345, {
346
+ * type: ['cpu', 'network'],
347
+ * start: oneHourAgo.toISOString(),
348
+ * end: now.toISOString(),
349
+ * step: 60 // optional, resolution in seconds
350
+ * });
351
+ *
352
+ * console.log(metrics.metrics.time_series);
353
+ * ```
354
+ */
355
+ async getMetrics(id: number, params: GetServerMetricsParams): Promise<GetServerMetricsResponse> {
356
+ // Build query parameters
357
+ const queryParams: Record<string, string | number | undefined> = {};
358
+
359
+ // Handle type parameter - can be single string or array
360
+ const types = Array.isArray(params.type) ? params.type : [params.type];
361
+ queryParams.type = types.join(",");
362
+
363
+ queryParams.start = params.start;
364
+ queryParams.end = params.end;
365
+
366
+ if (params.step !== undefined) {
367
+ queryParams.step = params.step;
368
+ }
369
+
370
+ const response = await this.client.get<unknown>(`/servers/${id}/metrics`, queryParams);
371
+
372
+ // Validate response with Zod
373
+ return validate(getServerMetricsResponseSchema, response, {
374
+ context: "Get server metrics response",
375
+ detailed: true,
376
+ });
377
+ }
378
+ }