@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,469 @@
1
+ /**
2
+ * Hetzner Cloud Firewalls API
3
+ * @see https://docs.hetzner.cloud/reference/cloud#firewalls
4
+ */
5
+
6
+ import type { HCloudClient } from "../../client/index";
7
+ import type {
8
+ ListFirewallsParams,
9
+ ListFirewallsResponse,
10
+ CreateFirewallParams,
11
+ CreateFirewallResponse,
12
+ GetFirewallResponse,
13
+ UpdateFirewallParams,
14
+ UpdateFirewallResponse,
15
+ DeleteFirewallResponse,
16
+ ListFirewallActionsParams,
17
+ ListFirewallActionsResponse,
18
+ GetFirewallActionResponse,
19
+ ApplyFirewallToResourcesParams,
20
+ ApplyFirewallToResourcesResponse,
21
+ RemoveFirewallFromResourcesParams,
22
+ RemoveFirewallFromResourcesResponse,
23
+ SetFirewallRulesParams,
24
+ SetFirewallRulesResponse,
25
+ } from "../../apis/firewalls/types";
26
+ import { validate } from "../../validation/index";
27
+ import {
28
+ listFirewallsResponseSchema,
29
+ createFirewallRequestSchema,
30
+ createFirewallResponseSchema,
31
+ getFirewallResponseSchema,
32
+ updateFirewallRequestSchema,
33
+ updateFirewallResponseSchema,
34
+ deleteFirewallResponseSchema,
35
+ listFirewallActionsResponseSchema,
36
+ getFirewallActionResponseSchema,
37
+ applyFirewallToResourcesRequestSchema,
38
+ applyFirewallToResourcesResponseSchema,
39
+ removeFirewallFromResourcesRequestSchema,
40
+ removeFirewallFromResourcesResponseSchema,
41
+ setFirewallRulesRequestSchema,
42
+ setFirewallRulesResponseSchema,
43
+ } from "../../apis/firewalls/schemas";
44
+
45
+ /**
46
+ * Firewalls API client
47
+ */
48
+ export class FirewallsClient {
49
+ constructor(private readonly client: HCloudClient) {}
50
+
51
+ /**
52
+ * Returns all Firewall objects.
53
+ *
54
+ * @param params - Query parameters for filtering and pagination
55
+ * @returns Promise resolving to list of firewalls with pagination metadata
56
+ * @see https://docs.hetzner.cloud/reference/cloud#firewalls-list-firewalls
57
+ *
58
+ * @example
59
+ * ```typescript
60
+ * const client = new HCloudClient({ token: 'your-token' });
61
+ *
62
+ * // List all firewalls
63
+ * const result = await client.firewalls.list();
64
+ *
65
+ * // List firewalls with filters
66
+ * const firewalls = await client.firewalls.list({
67
+ * name: 'my-firewall',
68
+ * label_selector: 'environment=production',
69
+ * sort: ['name:asc'],
70
+ * page: 1,
71
+ * per_page: 50
72
+ * });
73
+ * ```
74
+ */
75
+ async list(params?: ListFirewallsParams): Promise<ListFirewallsResponse> {
76
+ const queryParams: Record<string, string | number | string[] | undefined> = {};
77
+
78
+ if (params?.name) {
79
+ queryParams.name = params.name;
80
+ }
81
+
82
+ if (params?.label_selector) {
83
+ queryParams.label_selector = params.label_selector;
84
+ }
85
+
86
+ if (params?.sort) {
87
+ queryParams.sort = Array.isArray(params.sort) ? params.sort : [params.sort];
88
+ }
89
+
90
+ if (params?.page !== undefined) {
91
+ queryParams.page = params.page;
92
+ }
93
+
94
+ if (params?.per_page !== undefined) {
95
+ queryParams.per_page = params.per_page;
96
+ }
97
+
98
+ const response = await this.client.get<unknown>("/firewalls", queryParams);
99
+
100
+ return validate(listFirewallsResponseSchema, response, {
101
+ context: "List firewalls response",
102
+ detailed: true,
103
+ });
104
+ }
105
+
106
+ /**
107
+ * Creates a new Firewall.
108
+ *
109
+ * @param params - Parameters for creating the firewall
110
+ * @returns Promise resolving to the created firewall and action
111
+ * @see https://docs.hetzner.cloud/reference/cloud#firewalls-create-a-firewall
112
+ *
113
+ * @example
114
+ * ```typescript
115
+ * const client = new HCloudClient({ token: 'your-token' });
116
+ *
117
+ * // Create a firewall with rules
118
+ * const firewall = await client.firewalls.create({
119
+ * name: 'my-firewall',
120
+ * rules: {
121
+ * inbound: [
122
+ * {
123
+ * direction: 'in',
124
+ * protocol: 'tcp',
125
+ * port: '80',
126
+ * source_ips: ['0.0.0.0/0']
127
+ * }
128
+ * ]
129
+ * },
130
+ * apply_to: [
131
+ * {
132
+ * type: 'server',
133
+ * server: { id: 12345 }
134
+ * }
135
+ * ]
136
+ * });
137
+ * ```
138
+ */
139
+ async create(params: CreateFirewallParams): Promise<CreateFirewallResponse> {
140
+ const validatedParams = validate(createFirewallRequestSchema, params, {
141
+ context: "Create firewall request",
142
+ detailed: true,
143
+ });
144
+
145
+ const response = await this.client.post<unknown>("/firewalls", validatedParams);
146
+
147
+ return validate(createFirewallResponseSchema, response, {
148
+ context: "Create firewall response",
149
+ detailed: true,
150
+ });
151
+ }
152
+
153
+ /**
154
+ * Returns a specific Firewall object.
155
+ *
156
+ * @param id - ID of the Firewall
157
+ * @returns Promise resolving to the firewall
158
+ * @see https://docs.hetzner.cloud/reference/cloud#firewalls-get-a-firewall
159
+ *
160
+ * @example
161
+ * ```typescript
162
+ * const client = new HCloudClient({ token: 'your-token' });
163
+ *
164
+ * // Get a firewall by ID
165
+ * const firewall = await client.firewalls.get(12345);
166
+ * console.log(firewall.firewall.name);
167
+ * ```
168
+ */
169
+ async get(id: number): Promise<GetFirewallResponse> {
170
+ const response = await this.client.get<unknown>(`/firewalls/${id}`);
171
+
172
+ return validate(getFirewallResponseSchema, response, {
173
+ context: "Get firewall response",
174
+ detailed: true,
175
+ });
176
+ }
177
+
178
+ /**
179
+ * Updates the Firewall.
180
+ *
181
+ * You can update a Firewall's name and labels.
182
+ *
183
+ * @param id - ID of the Firewall
184
+ * @param params - Parameters to update (name and/or labels)
185
+ * @returns Promise resolving to the updated firewall
186
+ * @see https://docs.hetzner.cloud/reference/cloud#firewalls-update-a-firewall
187
+ *
188
+ * @example
189
+ * ```typescript
190
+ * const client = new HCloudClient({ token: 'your-token' });
191
+ *
192
+ * // Update firewall name
193
+ * const updated = await client.firewalls.update(12345, {
194
+ * name: 'new-firewall-name'
195
+ * });
196
+ *
197
+ * // Update labels
198
+ * const updated = await client.firewalls.update(12345, {
199
+ * labels: { environment: 'production', team: 'backend' }
200
+ * });
201
+ * ```
202
+ */
203
+ async update(id: number, params: UpdateFirewallParams): Promise<UpdateFirewallResponse> {
204
+ const validatedParams = validate(updateFirewallRequestSchema, params, {
205
+ context: "Update firewall request",
206
+ detailed: true,
207
+ });
208
+
209
+ const response = await this.client.put<unknown>(`/firewalls/${id}`, validatedParams);
210
+
211
+ return validate(updateFirewallResponseSchema, response, {
212
+ context: "Update firewall response",
213
+ detailed: true,
214
+ });
215
+ }
216
+
217
+ /**
218
+ * Deletes a Firewall.
219
+ *
220
+ * @param id - ID of the Firewall
221
+ * @returns Promise resolving to the delete action
222
+ * @see https://docs.hetzner.cloud/reference/cloud#firewalls-delete-a-firewall
223
+ *
224
+ * @example
225
+ * ```typescript
226
+ * const client = new HCloudClient({ token: 'your-token' });
227
+ *
228
+ * // Delete a firewall
229
+ * const result = await client.firewalls.delete(12345);
230
+ * if (result.action) {
231
+ * console.log(`Delete action ID: ${result.action.id}`);
232
+ * }
233
+ * ```
234
+ */
235
+ async delete(id: number): Promise<DeleteFirewallResponse> {
236
+ const response = await this.client.delete<unknown>(`/firewalls/${id}`);
237
+
238
+ return validate(deleteFirewallResponseSchema, response, {
239
+ context: "Delete firewall response",
240
+ detailed: true,
241
+ });
242
+ }
243
+
244
+ /**
245
+ * Returns all Action objects for a Firewall.
246
+ *
247
+ * @param id - ID of the Firewall
248
+ * @param params - Query parameters for filtering and pagination
249
+ * @returns Promise resolving to list of actions with pagination metadata
250
+ * @see https://docs.hetzner.cloud/reference/cloud#firewalls-list-actions-for-a-firewall
251
+ *
252
+ * @example
253
+ * ```typescript
254
+ * const client = new HCloudClient({ token: 'your-token' });
255
+ *
256
+ * // List all actions for a firewall
257
+ * const actions = await client.firewalls.listActions(12345);
258
+ *
259
+ * // List actions with filters
260
+ * const runningActions = await client.firewalls.listActions(12345, {
261
+ * status: ['running'],
262
+ * sort: ['started:desc']
263
+ * });
264
+ * ```
265
+ */
266
+ async listActions(
267
+ id: number,
268
+ params?: ListFirewallActionsParams,
269
+ ): Promise<ListFirewallActionsResponse> {
270
+ const queryParams: Record<string, string | number | string[] | undefined> = {};
271
+
272
+ if (params?.sort) {
273
+ queryParams.sort = Array.isArray(params.sort) ? params.sort : [params.sort];
274
+ }
275
+
276
+ if (params?.status) {
277
+ queryParams.status = Array.isArray(params.status) ? params.status : [params.status];
278
+ }
279
+
280
+ if (params?.page !== undefined) {
281
+ queryParams.page = params.page;
282
+ }
283
+
284
+ if (params?.per_page !== undefined) {
285
+ queryParams.per_page = params.per_page;
286
+ }
287
+
288
+ const response = await this.client.get<unknown>(`/firewalls/${id}/actions`, queryParams);
289
+
290
+ return validate(listFirewallActionsResponseSchema, response, {
291
+ context: "List firewall actions response",
292
+ detailed: true,
293
+ });
294
+ }
295
+
296
+ /**
297
+ * Returns a specific Action object for a Firewall.
298
+ *
299
+ * @param id - ID of the Firewall
300
+ * @param actionId - ID of the Action
301
+ * @returns Promise resolving to the action
302
+ * @see https://docs.hetzner.cloud/reference/cloud#firewalls-get-an-action-for-a-firewall
303
+ *
304
+ * @example
305
+ * ```typescript
306
+ * const client = new HCloudClient({ token: 'your-token' });
307
+ *
308
+ * // Get an action by ID
309
+ * const action = await client.firewalls.getAction(12345, 67890);
310
+ * console.log(action.action.command);
311
+ * ```
312
+ */
313
+ async getAction(id: number, actionId: number): Promise<GetFirewallActionResponse> {
314
+ const response = await this.client.get<unknown>(`/firewalls/${id}/actions/${actionId}`);
315
+
316
+ return validate(getFirewallActionResponseSchema, response, {
317
+ context: "Get firewall action response",
318
+ detailed: true,
319
+ });
320
+ }
321
+
322
+ /**
323
+ * Applies one Firewall to multiple resources.
324
+ *
325
+ * @param id - ID of the Firewall
326
+ * @param params - Resources to apply the firewall to
327
+ * @returns Promise resolving to list of actions
328
+ * @see https://docs.hetzner.cloud/reference/cloud#firewalls-apply-to-resources
329
+ *
330
+ * @example
331
+ * ```typescript
332
+ * const client = new HCloudClient({ token: 'your-token' });
333
+ *
334
+ * // Apply firewall to a server
335
+ * const result = await client.firewalls.applyToResources(12345, {
336
+ * apply_to: [
337
+ * {
338
+ * type: 'server',
339
+ * server: { id: 67890 }
340
+ * }
341
+ * ]
342
+ * });
343
+ *
344
+ * // Apply firewall using label selector
345
+ * const result = await client.firewalls.applyToResources(12345, {
346
+ * apply_to: [
347
+ * {
348
+ * type: 'label_selector',
349
+ * label_selector: { selector: 'environment=production' }
350
+ * }
351
+ * ]
352
+ * });
353
+ * ```
354
+ */
355
+ async applyToResources(
356
+ id: number,
357
+ params: ApplyFirewallToResourcesParams,
358
+ ): Promise<ApplyFirewallToResourcesResponse> {
359
+ const validatedParams = validate(applyFirewallToResourcesRequestSchema, params, {
360
+ context: "Apply firewall to resources request",
361
+ detailed: true,
362
+ });
363
+
364
+ const response = await this.client.post<unknown>(
365
+ `/firewalls/${id}/actions/apply_to_resources`,
366
+ validatedParams,
367
+ );
368
+
369
+ return validate(applyFirewallToResourcesResponseSchema, response, {
370
+ context: "Apply firewall to resources response",
371
+ detailed: true,
372
+ });
373
+ }
374
+
375
+ /**
376
+ * Removes one Firewall from multiple resources.
377
+ *
378
+ * @param id - ID of the Firewall
379
+ * @param params - Resources to remove the firewall from
380
+ * @returns Promise resolving to list of actions
381
+ * @see https://docs.hetzner.cloud/reference/cloud#firewalls-remove-from-resources
382
+ *
383
+ * @example
384
+ * ```typescript
385
+ * const client = new HCloudClient({ token: 'your-token' });
386
+ *
387
+ * // Remove firewall from a server
388
+ * const result = await client.firewalls.removeFromResources(12345, {
389
+ * remove_from: [
390
+ * {
391
+ * type: 'server',
392
+ * server: { id: 67890 }
393
+ * }
394
+ * ]
395
+ * });
396
+ * ```
397
+ */
398
+ async removeFromResources(
399
+ id: number,
400
+ params: RemoveFirewallFromResourcesParams,
401
+ ): Promise<RemoveFirewallFromResourcesResponse> {
402
+ const validatedParams = validate(removeFirewallFromResourcesRequestSchema, params, {
403
+ context: "Remove firewall from resources request",
404
+ detailed: true,
405
+ });
406
+
407
+ const response = await this.client.post<unknown>(
408
+ `/firewalls/${id}/actions/remove_from_resources`,
409
+ validatedParams,
410
+ );
411
+
412
+ return validate(removeFirewallFromResourcesResponseSchema, response, {
413
+ context: "Remove firewall from resources response",
414
+ detailed: true,
415
+ });
416
+ }
417
+
418
+ /**
419
+ * Sets the rules of a Firewall.
420
+ *
421
+ * @param id - ID of the Firewall
422
+ * @param params - Firewall rules to set
423
+ * @returns Promise resolving to list of actions
424
+ * @see https://docs.hetzner.cloud/reference/cloud#firewalls-set-rules
425
+ *
426
+ * @example
427
+ * ```typescript
428
+ * const client = new HCloudClient({ token: 'your-token' });
429
+ *
430
+ * // Set firewall rules
431
+ * const result = await client.firewalls.setRules(12345, {
432
+ * rules: {
433
+ * inbound: [
434
+ * {
435
+ * direction: 'in',
436
+ * protocol: 'tcp',
437
+ * port: '443',
438
+ * source_ips: ['0.0.0.0/0']
439
+ * }
440
+ * ],
441
+ * outbound: [
442
+ * {
443
+ * direction: 'out',
444
+ * protocol: 'tcp',
445
+ * port: '80',
446
+ * destination_ips: ['0.0.0.0/0']
447
+ * }
448
+ * ]
449
+ * }
450
+ * });
451
+ * ```
452
+ */
453
+ async setRules(id: number, params: SetFirewallRulesParams): Promise<SetFirewallRulesResponse> {
454
+ const validatedParams = validate(setFirewallRulesRequestSchema, params, {
455
+ context: "Set firewall rules request",
456
+ detailed: true,
457
+ });
458
+
459
+ const response = await this.client.post<unknown>(
460
+ `/firewalls/${id}/actions/set_rules`,
461
+ validatedParams,
462
+ );
463
+
464
+ return validate(setFirewallRulesResponseSchema, response, {
465
+ context: "Set firewall rules response",
466
+ detailed: true,
467
+ });
468
+ }
469
+ }