@studiometa/forge-sdk 0.0.1 → 0.2.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 (50) hide show
  1. package/README.md +178 -0
  2. package/dist/forge.d.ts +93 -0
  3. package/dist/forge.d.ts.map +1 -0
  4. package/dist/index.d.ts +40 -0
  5. package/dist/index.d.ts.map +1 -0
  6. package/dist/index.js +2049 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/pagination.d.ts +34 -0
  9. package/dist/pagination.d.ts.map +1 -0
  10. package/dist/resources/backups.d.ts +86 -0
  11. package/dist/resources/backups.d.ts.map +1 -0
  12. package/dist/resources/base.d.ts +10 -0
  13. package/dist/resources/base.d.ts.map +1 -0
  14. package/dist/resources/certificates.d.ts +102 -0
  15. package/dist/resources/certificates.d.ts.map +1 -0
  16. package/dist/resources/commands.d.ts +74 -0
  17. package/dist/resources/commands.d.ts.map +1 -0
  18. package/dist/resources/daemons.d.ts +92 -0
  19. package/dist/resources/daemons.d.ts.map +1 -0
  20. package/dist/resources/database-users.d.ts +84 -0
  21. package/dist/resources/database-users.d.ts.map +1 -0
  22. package/dist/resources/databases.d.ts +84 -0
  23. package/dist/resources/databases.d.ts.map +1 -0
  24. package/dist/resources/deployments.d.ts +90 -0
  25. package/dist/resources/deployments.d.ts.map +1 -0
  26. package/dist/resources/firewall-rules.d.ts +84 -0
  27. package/dist/resources/firewall-rules.d.ts.map +1 -0
  28. package/dist/resources/monitors.d.ts +85 -0
  29. package/dist/resources/monitors.d.ts.map +1 -0
  30. package/dist/resources/nginx-templates.d.ts +95 -0
  31. package/dist/resources/nginx-templates.d.ts.map +1 -0
  32. package/dist/resources/recipes.d.ts +99 -0
  33. package/dist/resources/recipes.d.ts.map +1 -0
  34. package/dist/resources/redirect-rules.d.ts +85 -0
  35. package/dist/resources/redirect-rules.d.ts.map +1 -0
  36. package/dist/resources/scheduled-jobs.d.ts +84 -0
  37. package/dist/resources/scheduled-jobs.d.ts.map +1 -0
  38. package/dist/resources/security-rules.d.ts +85 -0
  39. package/dist/resources/security-rules.d.ts.map +1 -0
  40. package/dist/resources/servers.d.ts +199 -0
  41. package/dist/resources/servers.d.ts.map +1 -0
  42. package/dist/resources/sites.d.ts +216 -0
  43. package/dist/resources/sites.d.ts.map +1 -0
  44. package/dist/resources/ssh-keys.d.ts +83 -0
  45. package/dist/resources/ssh-keys.d.ts.map +1 -0
  46. package/dist/test-utils.d.ts +27 -0
  47. package/dist/test-utils.d.ts.map +1 -0
  48. package/dist/test-utils.js +38 -0
  49. package/dist/test-utils.js.map +1 -0
  50. package/package.json +37 -1
package/dist/index.js ADDED
@@ -0,0 +1,2049 @@
1
+ import { HttpClient } from "@studiometa/forge-api";
2
+ /**
3
+ * Async paginated iterator that auto-fetches all pages.
4
+ *
5
+ * @example
6
+ * ```ts
7
+ * const iter = forge.server(123).site(456).deployments.all();
8
+ * for await (const deployment of iter) {
9
+ * console.log(deployment);
10
+ * }
11
+ *
12
+ * // Or collect all items at once:
13
+ * const deployments = await iter.toArray();
14
+ * ```
15
+ */
16
+ var AsyncPaginatedIterator = class {
17
+ fetchPage;
18
+ perPage;
19
+ constructor(fetchPage, perPage = 200) {
20
+ this.fetchPage = fetchPage;
21
+ this.perPage = perPage;
22
+ }
23
+ async *[Symbol.asyncIterator]() {
24
+ let page = 1;
25
+ let hasMore = true;
26
+ while (hasMore) {
27
+ const items = await this.fetchPage(page);
28
+ for (const item of items) yield item;
29
+ hasMore = items.length >= this.perPage;
30
+ page++;
31
+ }
32
+ }
33
+ /**
34
+ * Collect all items into an array.
35
+ *
36
+ * @example
37
+ * ```ts
38
+ * const deployments = await forge.server(123).site(456).deployments.all().toArray();
39
+ * ```
40
+ */
41
+ async toArray() {
42
+ const items = [];
43
+ for await (const item of this) items.push(item);
44
+ return items;
45
+ }
46
+ };
47
+ /**
48
+ * Abstract base class for resource collections.
49
+ * Provides a shared `client` property to avoid duplication across all collection classes.
50
+ */
51
+ var BaseCollection = class {
52
+ client;
53
+ constructor(client) {
54
+ this.client = client;
55
+ }
56
+ };
57
+ /**
58
+ * Collection of deployments for a site.
59
+ *
60
+ * Access via `forge.server(id).site(id).deployments`.
61
+ *
62
+ * @example
63
+ * ```ts
64
+ * const deployments = await forge.server(123).site(456).deployments.list();
65
+ * ```
66
+ */
67
+ var DeploymentsCollection = class extends BaseCollection {
68
+ /** @internal */
69
+ constructor(client, serverId, siteId) {
70
+ super(client);
71
+ this.serverId = serverId;
72
+ this.siteId = siteId;
73
+ }
74
+ get basePath() {
75
+ return `/servers/${this.serverId}/sites/${this.siteId}/deployments`;
76
+ }
77
+ /**
78
+ * List deployments for this site.
79
+ *
80
+ * @example
81
+ * ```ts
82
+ * const deployments = await forge.server(123).site(456).deployments.list();
83
+ *
84
+ * // Fetch a specific page:
85
+ * const page2 = await forge.server(123).site(456).deployments.list({ page: 2 });
86
+ * ```
87
+ */
88
+ async list(options = {}) {
89
+ const query = options.page !== void 0 ? `?page=${options.page}` : "";
90
+ return (await this.client.get(`${this.basePath}${query}`)).deployments;
91
+ }
92
+ /**
93
+ * Iterate over all deployments across all pages.
94
+ *
95
+ * @example
96
+ * ```ts
97
+ * for await (const deployment of forge.server(123).site(456).deployments.all()) {
98
+ * console.log(deployment);
99
+ * }
100
+ *
101
+ * // Or collect all at once:
102
+ * const deployments = await forge.server(123).site(456).deployments.all().toArray();
103
+ * ```
104
+ */
105
+ all(options = {}) {
106
+ return new AsyncPaginatedIterator((page) => this.list({
107
+ ...options,
108
+ page
109
+ }));
110
+ }
111
+ /**
112
+ * Get a specific deployment.
113
+ *
114
+ * @example
115
+ * ```ts
116
+ * const deployment = await forge.server(123).site(456).deployments.get(789);
117
+ * ```
118
+ */
119
+ async get(deploymentId) {
120
+ return (await this.client.get(`${this.basePath}/${deploymentId}`)).deployment;
121
+ }
122
+ /**
123
+ * Get the output of a deployment.
124
+ *
125
+ * @example
126
+ * ```ts
127
+ * const output = await forge.server(123).site(456).deployments.output(789);
128
+ * ```
129
+ */
130
+ async output(deploymentId) {
131
+ return this.client.get(`${this.basePath}/${deploymentId}/output`);
132
+ }
133
+ /**
134
+ * Get the deployment script.
135
+ *
136
+ * @example
137
+ * ```ts
138
+ * const script = await forge.server(123).site(456).deployments.script();
139
+ * ```
140
+ */
141
+ async script() {
142
+ return this.client.get(`/servers/${this.serverId}/sites/${this.siteId}/deployment/script`);
143
+ }
144
+ /**
145
+ * Update the deployment script.
146
+ *
147
+ * @example
148
+ * ```ts
149
+ * await forge.server(123).site(456).deployments.updateScript('npm run build && ...');
150
+ * ```
151
+ */
152
+ async updateScript(content) {
153
+ await this.client.put(`/servers/${this.serverId}/sites/${this.siteId}/deployment/script`, { content });
154
+ }
155
+ };
156
+ /**
157
+ * Collection of SSL certificates for a site.
158
+ *
159
+ * Access via `forge.server(id).site(id).certificates`.
160
+ *
161
+ * @example
162
+ * ```ts
163
+ * const certs = await forge.server(123).site(456).certificates.list();
164
+ * ```
165
+ */
166
+ var CertificatesCollection = class extends BaseCollection {
167
+ /** @internal */
168
+ constructor(client, serverId, siteId) {
169
+ super(client);
170
+ this.serverId = serverId;
171
+ this.siteId = siteId;
172
+ }
173
+ get basePath() {
174
+ return `/servers/${this.serverId}/sites/${this.siteId}/certificates`;
175
+ }
176
+ /**
177
+ * List certificates for this site.
178
+ *
179
+ * @example
180
+ * ```ts
181
+ * const certs = await forge.server(123).site(456).certificates.list();
182
+ *
183
+ * // Fetch a specific page:
184
+ * const page2 = await forge.server(123).site(456).certificates.list({ page: 2 });
185
+ * ```
186
+ */
187
+ async list(options = {}) {
188
+ const query = options.page !== void 0 ? `?page=${options.page}` : "";
189
+ return (await this.client.get(`${this.basePath}${query}`)).certificates;
190
+ }
191
+ /**
192
+ * Iterate over all certificates across all pages.
193
+ *
194
+ * @example
195
+ * ```ts
196
+ * for await (const cert of forge.server(123).site(456).certificates.all()) {
197
+ * console.log(cert);
198
+ * }
199
+ *
200
+ * // Or collect all at once:
201
+ * const certs = await forge.server(123).site(456).certificates.all().toArray();
202
+ * ```
203
+ */
204
+ all(options = {}) {
205
+ return new AsyncPaginatedIterator((page) => this.list({
206
+ ...options,
207
+ page
208
+ }));
209
+ }
210
+ /**
211
+ * Get a specific certificate.
212
+ *
213
+ * @example
214
+ * ```ts
215
+ * const cert = await forge.server(123).site(456).certificates.get(789);
216
+ * ```
217
+ */
218
+ async get(certificateId) {
219
+ return (await this.client.get(`${this.basePath}/${certificateId}`)).certificate;
220
+ }
221
+ /**
222
+ * Create a new SSL certificate.
223
+ *
224
+ * @example
225
+ * ```ts
226
+ * const cert = await forge.server(123).site(456).certificates.create({
227
+ * type: 'new',
228
+ * domain: 'example.com',
229
+ * });
230
+ * ```
231
+ */
232
+ async create(data) {
233
+ return (await this.client.post(this.basePath, data)).certificate;
234
+ }
235
+ /**
236
+ * Install a Let's Encrypt certificate.
237
+ *
238
+ * @example
239
+ * ```ts
240
+ * await forge.server(123).site(456).certificates.letsEncrypt(['example.com', 'www.example.com']);
241
+ * ```
242
+ */
243
+ async letsEncrypt(domains) {
244
+ return (await this.client.post(`${this.basePath}/letsencrypt`, { domains })).certificate;
245
+ }
246
+ /**
247
+ * Delete a certificate.
248
+ *
249
+ * @example
250
+ * ```ts
251
+ * await forge.server(123).site(456).certificates.delete(789);
252
+ * ```
253
+ */
254
+ async delete(certificateId) {
255
+ await this.client.delete(`${this.basePath}/${certificateId}`);
256
+ }
257
+ /**
258
+ * Activate a certificate.
259
+ *
260
+ * @example
261
+ * ```ts
262
+ * await forge.server(123).site(456).certificates.activate(789);
263
+ * ```
264
+ */
265
+ async activate(certificateId) {
266
+ await this.client.post(`${this.basePath}/${certificateId}/activate`);
267
+ }
268
+ };
269
+ /**
270
+ * Collection of commands run on a site.
271
+ *
272
+ * Access via `forge.server(id).site(id).commands`.
273
+ *
274
+ * @example
275
+ * ```ts
276
+ * const commands = await forge.server(123).site(456).commands.list();
277
+ * ```
278
+ */
279
+ var CommandsCollection = class extends BaseCollection {
280
+ /** @internal */
281
+ constructor(client, serverId, siteId) {
282
+ super(client);
283
+ this.serverId = serverId;
284
+ this.siteId = siteId;
285
+ }
286
+ get basePath() {
287
+ return `/servers/${this.serverId}/sites/${this.siteId}/commands`;
288
+ }
289
+ /**
290
+ * List commands run on this site.
291
+ *
292
+ * @example
293
+ * ```ts
294
+ * const commands = await forge.server(123).site(456).commands.list();
295
+ *
296
+ * // Fetch a specific page:
297
+ * const page2 = await forge.server(123).site(456).commands.list({ page: 2 });
298
+ * ```
299
+ */
300
+ async list(options = {}) {
301
+ const query = options.page !== void 0 ? `?page=${options.page}` : "";
302
+ return (await this.client.get(`${this.basePath}${query}`)).commands;
303
+ }
304
+ /**
305
+ * Iterate over all commands across all pages.
306
+ *
307
+ * @example
308
+ * ```ts
309
+ * for await (const command of forge.server(123).site(456).commands.all()) {
310
+ * console.log(command);
311
+ * }
312
+ *
313
+ * // Or collect all at once:
314
+ * const commands = await forge.server(123).site(456).commands.all().toArray();
315
+ * ```
316
+ */
317
+ all(options = {}) {
318
+ return new AsyncPaginatedIterator((page) => this.list({
319
+ ...options,
320
+ page
321
+ }));
322
+ }
323
+ /**
324
+ * Get a specific command.
325
+ *
326
+ * @example
327
+ * ```ts
328
+ * const command = await forge.server(123).site(456).commands.get(789);
329
+ * ```
330
+ */
331
+ async get(commandId) {
332
+ return (await this.client.get(`${this.basePath}/${commandId}`)).command;
333
+ }
334
+ /**
335
+ * Run a command on this site.
336
+ *
337
+ * @example
338
+ * ```ts
339
+ * const command = await forge.server(123).site(456).commands.create({
340
+ * command: 'php artisan migrate',
341
+ * });
342
+ * ```
343
+ */
344
+ async create(data) {
345
+ return (await this.client.post(this.basePath, data)).command;
346
+ }
347
+ };
348
+ /**
349
+ * Collection of security rules on a site.
350
+ *
351
+ * Access via `forge.server(id).site(id).securityRules`.
352
+ *
353
+ * @example
354
+ * ```ts
355
+ * const rules = await forge.server(123).site(456).securityRules.list();
356
+ * ```
357
+ */
358
+ var SecurityRulesCollection = class extends BaseCollection {
359
+ /** @internal */
360
+ constructor(client, serverId, siteId) {
361
+ super(client);
362
+ this.serverId = serverId;
363
+ this.siteId = siteId;
364
+ }
365
+ get basePath() {
366
+ return `/servers/${this.serverId}/sites/${this.siteId}/security-rules`;
367
+ }
368
+ /**
369
+ * List security rules on this site.
370
+ *
371
+ * @example
372
+ * ```ts
373
+ * const rules = await forge.server(123).site(456).securityRules.list();
374
+ *
375
+ * // Fetch a specific page:
376
+ * const page2 = await forge.server(123).site(456).securityRules.list({ page: 2 });
377
+ * ```
378
+ */
379
+ async list(options = {}) {
380
+ const query = options.page !== void 0 ? `?page=${options.page}` : "";
381
+ return (await this.client.get(`${this.basePath}${query}`)).security_rules;
382
+ }
383
+ /**
384
+ * Iterate over all security rules across all pages.
385
+ *
386
+ * @example
387
+ * ```ts
388
+ * for await (const rule of forge.server(123).site(456).securityRules.all()) {
389
+ * console.log(rule);
390
+ * }
391
+ *
392
+ * // Or collect all at once:
393
+ * const rules = await forge.server(123).site(456).securityRules.all().toArray();
394
+ * ```
395
+ */
396
+ all(options = {}) {
397
+ return new AsyncPaginatedIterator((page) => this.list({
398
+ ...options,
399
+ page
400
+ }));
401
+ }
402
+ /**
403
+ * Get a specific security rule.
404
+ *
405
+ * @example
406
+ * ```ts
407
+ * const rule = await forge.server(123).site(456).securityRules.get(789);
408
+ * ```
409
+ */
410
+ async get(ruleId) {
411
+ return (await this.client.get(`${this.basePath}/${ruleId}`)).security_rule;
412
+ }
413
+ /**
414
+ * Create a new security rule.
415
+ *
416
+ * @example
417
+ * ```ts
418
+ * const rule = await forge.server(123).site(456).securityRules.create({
419
+ * name: 'Admin Area',
420
+ * path: '/admin',
421
+ * credentials: [{ username: 'admin', password: 'secret' }],
422
+ * });
423
+ * ```
424
+ */
425
+ async create(data) {
426
+ return (await this.client.post(this.basePath, data)).security_rule;
427
+ }
428
+ /**
429
+ * Delete a security rule.
430
+ *
431
+ * @example
432
+ * ```ts
433
+ * await forge.server(123).site(456).securityRules.delete(789);
434
+ * ```
435
+ */
436
+ async delete(ruleId) {
437
+ await this.client.delete(`${this.basePath}/${ruleId}`);
438
+ }
439
+ };
440
+ /**
441
+ * Collection of redirect rules on a site.
442
+ *
443
+ * Access via `forge.server(id).site(id).redirectRules`.
444
+ *
445
+ * @example
446
+ * ```ts
447
+ * const rules = await forge.server(123).site(456).redirectRules.list();
448
+ * ```
449
+ */
450
+ var RedirectRulesCollection = class extends BaseCollection {
451
+ /** @internal */
452
+ constructor(client, serverId, siteId) {
453
+ super(client);
454
+ this.serverId = serverId;
455
+ this.siteId = siteId;
456
+ }
457
+ get basePath() {
458
+ return `/servers/${this.serverId}/sites/${this.siteId}/redirect-rules`;
459
+ }
460
+ /**
461
+ * List redirect rules on this site.
462
+ *
463
+ * @example
464
+ * ```ts
465
+ * const rules = await forge.server(123).site(456).redirectRules.list();
466
+ *
467
+ * // Fetch a specific page:
468
+ * const page2 = await forge.server(123).site(456).redirectRules.list({ page: 2 });
469
+ * ```
470
+ */
471
+ async list(options = {}) {
472
+ const query = options.page !== void 0 ? `?page=${options.page}` : "";
473
+ return (await this.client.get(`${this.basePath}${query}`)).redirect_rules;
474
+ }
475
+ /**
476
+ * Iterate over all redirect rules across all pages.
477
+ *
478
+ * @example
479
+ * ```ts
480
+ * for await (const rule of forge.server(123).site(456).redirectRules.all()) {
481
+ * console.log(rule);
482
+ * }
483
+ *
484
+ * // Or collect all at once:
485
+ * const rules = await forge.server(123).site(456).redirectRules.all().toArray();
486
+ * ```
487
+ */
488
+ all(options = {}) {
489
+ return new AsyncPaginatedIterator((page) => this.list({
490
+ ...options,
491
+ page
492
+ }));
493
+ }
494
+ /**
495
+ * Get a specific redirect rule.
496
+ *
497
+ * @example
498
+ * ```ts
499
+ * const rule = await forge.server(123).site(456).redirectRules.get(789);
500
+ * ```
501
+ */
502
+ async get(ruleId) {
503
+ return (await this.client.get(`${this.basePath}/${ruleId}`)).redirect_rule;
504
+ }
505
+ /**
506
+ * Create a new redirect rule.
507
+ *
508
+ * @example
509
+ * ```ts
510
+ * const rule = await forge.server(123).site(456).redirectRules.create({
511
+ * from: '/old-path',
512
+ * to: '/new-path',
513
+ * type: 'redirect',
514
+ * });
515
+ * ```
516
+ */
517
+ async create(data) {
518
+ return (await this.client.post(this.basePath, data)).redirect_rule;
519
+ }
520
+ /**
521
+ * Delete a redirect rule.
522
+ *
523
+ * @example
524
+ * ```ts
525
+ * await forge.server(123).site(456).redirectRules.delete(789);
526
+ * ```
527
+ */
528
+ async delete(ruleId) {
529
+ await this.client.delete(`${this.basePath}/${ruleId}`);
530
+ }
531
+ };
532
+ /**
533
+ * Collection of sites on a server.
534
+ *
535
+ * Access via `forge.server(id).sites`.
536
+ *
537
+ * @example
538
+ * ```ts
539
+ * const sites = await forge.server(123).sites.list();
540
+ * ```
541
+ */
542
+ var SitesCollection = class extends BaseCollection {
543
+ /** @internal */
544
+ constructor(client, serverId) {
545
+ super(client);
546
+ this.serverId = serverId;
547
+ }
548
+ get basePath() {
549
+ return `/servers/${this.serverId}/sites`;
550
+ }
551
+ /**
552
+ * List sites on this server.
553
+ *
554
+ * @example
555
+ * ```ts
556
+ * const sites = await forge.server(123).sites.list();
557
+ *
558
+ * // Fetch a specific page:
559
+ * const page2 = await forge.server(123).sites.list({ page: 2 });
560
+ * ```
561
+ */
562
+ async list(options = {}) {
563
+ const query = options.page !== void 0 ? `?page=${options.page}` : "";
564
+ return (await this.client.get(`${this.basePath}${query}`)).sites;
565
+ }
566
+ /**
567
+ * Iterate over all sites across all pages.
568
+ *
569
+ * @example
570
+ * ```ts
571
+ * for await (const site of forge.server(123).sites.all()) {
572
+ * console.log(site);
573
+ * }
574
+ *
575
+ * // Or collect all at once:
576
+ * const sites = await forge.server(123).sites.all().toArray();
577
+ * ```
578
+ */
579
+ all(options = {}) {
580
+ return new AsyncPaginatedIterator((page) => this.list({
581
+ ...options,
582
+ page
583
+ }));
584
+ }
585
+ /**
586
+ * Get a specific site by ID.
587
+ *
588
+ * @example
589
+ * ```ts
590
+ * const site = await forge.server(123).sites.get(456);
591
+ * ```
592
+ */
593
+ async get(siteId) {
594
+ return (await this.client.get(`${this.basePath}/${siteId}`)).site;
595
+ }
596
+ /**
597
+ * Create a new site on this server.
598
+ *
599
+ * @example
600
+ * ```ts
601
+ * const site = await forge.server(123).sites.create({
602
+ * domain: 'example.com',
603
+ * project_type: 'php',
604
+ * directory: '/public',
605
+ * });
606
+ * ```
607
+ */
608
+ async create(data) {
609
+ return (await this.client.post(this.basePath, data)).site;
610
+ }
611
+ /**
612
+ * Update a site.
613
+ *
614
+ * @example
615
+ * ```ts
616
+ * await forge.server(123).sites.update(456, { directory: '/public' });
617
+ * ```
618
+ */
619
+ async update(siteId, data) {
620
+ return (await this.client.put(`${this.basePath}/${siteId}`, data)).site;
621
+ }
622
+ /**
623
+ * Delete a site.
624
+ *
625
+ * @example
626
+ * ```ts
627
+ * await forge.server(123).sites.delete(456);
628
+ * ```
629
+ */
630
+ async delete(siteId) {
631
+ await this.client.delete(`${this.basePath}/${siteId}`);
632
+ }
633
+ };
634
+ /**
635
+ * A specific site with nested resources and actions.
636
+ *
637
+ * Access via `forge.server(id).site(id)`.
638
+ *
639
+ * @example
640
+ * ```ts
641
+ * // Deploy
642
+ * await forge.server(123).site(456).deploy();
643
+ *
644
+ * // Get environment
645
+ * const env = await forge.server(123).site(456).env.get();
646
+ * ```
647
+ */
648
+ var SiteResource = class extends BaseCollection {
649
+ /** Deployments for this site. */
650
+ deployments;
651
+ /** SSL certificates for this site. */
652
+ certificates;
653
+ /** Environment variables for this site. */
654
+ env;
655
+ /** Nginx configuration for this site. */
656
+ nginx;
657
+ /** Commands run on this site. */
658
+ commands;
659
+ /** Security rules for this site. */
660
+ securityRules;
661
+ /** Redirect rules for this site. */
662
+ redirectRules;
663
+ /** @internal */
664
+ constructor(client, serverId, siteId) {
665
+ super(client);
666
+ this.serverId = serverId;
667
+ this.siteId = siteId;
668
+ this.deployments = new DeploymentsCollection(client, serverId, siteId);
669
+ this.certificates = new CertificatesCollection(client, serverId, siteId);
670
+ this.env = new SiteEnvResource(client, serverId, siteId);
671
+ this.nginx = new SiteNginxResource(client, serverId, siteId);
672
+ this.commands = new CommandsCollection(client, serverId, siteId);
673
+ this.securityRules = new SecurityRulesCollection(client, serverId, siteId);
674
+ this.redirectRules = new RedirectRulesCollection(client, serverId, siteId);
675
+ }
676
+ get basePath() {
677
+ return `/servers/${this.serverId}/sites/${this.siteId}`;
678
+ }
679
+ /**
680
+ * Get this site's details.
681
+ *
682
+ * @example
683
+ * ```ts
684
+ * const site = await forge.server(123).site(456).get();
685
+ * ```
686
+ */
687
+ async get() {
688
+ return (await this.client.get(this.basePath)).site;
689
+ }
690
+ /**
691
+ * Deploy this site.
692
+ *
693
+ * @example
694
+ * ```ts
695
+ * await forge.server(123).site(456).deploy();
696
+ * ```
697
+ */
698
+ async deploy() {
699
+ await this.client.post(`${this.basePath}/deployment/deploy`);
700
+ }
701
+ /**
702
+ * Delete this site.
703
+ *
704
+ * @example
705
+ * ```ts
706
+ * await forge.server(123).site(456).delete();
707
+ * ```
708
+ */
709
+ async delete() {
710
+ await this.client.delete(this.basePath);
711
+ }
712
+ };
713
+ /**
714
+ * Environment variables for a site.
715
+ *
716
+ * @example
717
+ * ```ts
718
+ * const env = await forge.server(123).site(456).env.get();
719
+ * await forge.server(123).site(456).env.update('APP_ENV=production\n...');
720
+ * ```
721
+ */
722
+ var SiteEnvResource = class extends BaseCollection {
723
+ /** @internal */
724
+ constructor(client, serverId, siteId) {
725
+ super(client);
726
+ this.serverId = serverId;
727
+ this.siteId = siteId;
728
+ }
729
+ get basePath() {
730
+ return `/servers/${this.serverId}/sites/${this.siteId}/env`;
731
+ }
732
+ /**
733
+ * Get the environment file content.
734
+ *
735
+ * @returns The .env file content as a string.
736
+ */
737
+ async get() {
738
+ return this.client.get(this.basePath);
739
+ }
740
+ /**
741
+ * Update the environment file content.
742
+ *
743
+ * @param content The full .env file content.
744
+ */
745
+ async update(content) {
746
+ await this.client.put(this.basePath, { content });
747
+ }
748
+ };
749
+ /**
750
+ * Nginx configuration for a site.
751
+ *
752
+ * @example
753
+ * ```ts
754
+ * const config = await forge.server(123).site(456).nginx.get();
755
+ * await forge.server(123).site(456).nginx.update('server { ... }');
756
+ * ```
757
+ */
758
+ var SiteNginxResource = class extends BaseCollection {
759
+ /** @internal */
760
+ constructor(client, serverId, siteId) {
761
+ super(client);
762
+ this.serverId = serverId;
763
+ this.siteId = siteId;
764
+ }
765
+ get basePath() {
766
+ return `/servers/${this.serverId}/sites/${this.siteId}/nginx`;
767
+ }
768
+ /**
769
+ * Get the Nginx configuration.
770
+ *
771
+ * @returns The Nginx config content as a string.
772
+ */
773
+ async get() {
774
+ return this.client.get(this.basePath);
775
+ }
776
+ /**
777
+ * Update the Nginx configuration.
778
+ *
779
+ * @param content The full Nginx config content.
780
+ */
781
+ async update(content) {
782
+ await this.client.put(this.basePath, { content });
783
+ }
784
+ };
785
+ /**
786
+ * Collection of databases on a server.
787
+ *
788
+ * Access via `forge.server(id).databases`.
789
+ *
790
+ * @example
791
+ * ```ts
792
+ * const dbs = await forge.server(123).databases.list();
793
+ * ```
794
+ */
795
+ var DatabasesCollection = class extends BaseCollection {
796
+ /** @internal */
797
+ constructor(client, serverId) {
798
+ super(client);
799
+ this.serverId = serverId;
800
+ }
801
+ get basePath() {
802
+ return `/servers/${this.serverId}/databases`;
803
+ }
804
+ /**
805
+ * List databases on this server.
806
+ *
807
+ * @example
808
+ * ```ts
809
+ * const dbs = await forge.server(123).databases.list();
810
+ *
811
+ * // Fetch a specific page:
812
+ * const page2 = await forge.server(123).databases.list({ page: 2 });
813
+ * ```
814
+ */
815
+ async list(options = {}) {
816
+ const query = options.page !== void 0 ? `?page=${options.page}` : "";
817
+ return (await this.client.get(`${this.basePath}${query}`)).databases;
818
+ }
819
+ /**
820
+ * Iterate over all databases across all pages.
821
+ *
822
+ * @example
823
+ * ```ts
824
+ * for await (const db of forge.server(123).databases.all()) {
825
+ * console.log(db);
826
+ * }
827
+ *
828
+ * // Or collect all at once:
829
+ * const dbs = await forge.server(123).databases.all().toArray();
830
+ * ```
831
+ */
832
+ all(options = {}) {
833
+ return new AsyncPaginatedIterator((page) => this.list({
834
+ ...options,
835
+ page
836
+ }));
837
+ }
838
+ /**
839
+ * Get a specific database.
840
+ *
841
+ * @example
842
+ * ```ts
843
+ * const db = await forge.server(123).databases.get(789);
844
+ * ```
845
+ */
846
+ async get(databaseId) {
847
+ return (await this.client.get(`${this.basePath}/${databaseId}`)).database;
848
+ }
849
+ /**
850
+ * Create a new database.
851
+ *
852
+ * @example
853
+ * ```ts
854
+ * const db = await forge.server(123).databases.create({
855
+ * name: 'myapp',
856
+ * user: 'admin',
857
+ * password: 'secret',
858
+ * });
859
+ * ```
860
+ */
861
+ async create(data) {
862
+ return (await this.client.post(this.basePath, data)).database;
863
+ }
864
+ /**
865
+ * Delete a database.
866
+ *
867
+ * @example
868
+ * ```ts
869
+ * await forge.server(123).databases.delete(789);
870
+ * ```
871
+ */
872
+ async delete(databaseId) {
873
+ await this.client.delete(`${this.basePath}/${databaseId}`);
874
+ }
875
+ };
876
+ /**
877
+ * Collection of database users on a server.
878
+ *
879
+ * Access via `forge.server(id).databaseUsers`.
880
+ *
881
+ * @example
882
+ * ```ts
883
+ * const users = await forge.server(123).databaseUsers.list();
884
+ * ```
885
+ */
886
+ var DatabaseUsersCollection = class extends BaseCollection {
887
+ /** @internal */
888
+ constructor(client, serverId) {
889
+ super(client);
890
+ this.serverId = serverId;
891
+ }
892
+ get basePath() {
893
+ return `/servers/${this.serverId}/database-users`;
894
+ }
895
+ /**
896
+ * List database users on this server.
897
+ *
898
+ * @example
899
+ * ```ts
900
+ * const users = await forge.server(123).databaseUsers.list();
901
+ *
902
+ * // Fetch a specific page:
903
+ * const page2 = await forge.server(123).databaseUsers.list({ page: 2 });
904
+ * ```
905
+ */
906
+ async list(options = {}) {
907
+ const query = options.page !== void 0 ? `?page=${options.page}` : "";
908
+ return (await this.client.get(`${this.basePath}${query}`)).users;
909
+ }
910
+ /**
911
+ * Iterate over all database users across all pages.
912
+ *
913
+ * @example
914
+ * ```ts
915
+ * for await (const user of forge.server(123).databaseUsers.all()) {
916
+ * console.log(user);
917
+ * }
918
+ *
919
+ * // Or collect all at once:
920
+ * const users = await forge.server(123).databaseUsers.all().toArray();
921
+ * ```
922
+ */
923
+ all(options = {}) {
924
+ return new AsyncPaginatedIterator((page) => this.list({
925
+ ...options,
926
+ page
927
+ }));
928
+ }
929
+ /**
930
+ * Get a specific database user.
931
+ *
932
+ * @example
933
+ * ```ts
934
+ * const user = await forge.server(123).databaseUsers.get(789);
935
+ * ```
936
+ */
937
+ async get(userId) {
938
+ return (await this.client.get(`${this.basePath}/${userId}`)).user;
939
+ }
940
+ /**
941
+ * Create a new database user.
942
+ *
943
+ * @example
944
+ * ```ts
945
+ * const user = await forge.server(123).databaseUsers.create({
946
+ * name: 'forge',
947
+ * password: 'secret',
948
+ * databases: [1, 2],
949
+ * });
950
+ * ```
951
+ */
952
+ async create(data) {
953
+ return (await this.client.post(this.basePath, data)).user;
954
+ }
955
+ /**
956
+ * Delete a database user.
957
+ *
958
+ * @example
959
+ * ```ts
960
+ * await forge.server(123).databaseUsers.delete(789);
961
+ * ```
962
+ */
963
+ async delete(userId) {
964
+ await this.client.delete(`${this.basePath}/${userId}`);
965
+ }
966
+ };
967
+ /**
968
+ * Collection of daemons (background processes) on a server.
969
+ *
970
+ * Access via `forge.server(id).daemons`.
971
+ *
972
+ * @example
973
+ * ```ts
974
+ * const daemons = await forge.server(123).daemons.list();
975
+ * ```
976
+ */
977
+ var DaemonsCollection = class extends BaseCollection {
978
+ /** @internal */
979
+ constructor(client, serverId) {
980
+ super(client);
981
+ this.serverId = serverId;
982
+ }
983
+ get basePath() {
984
+ return `/servers/${this.serverId}/daemons`;
985
+ }
986
+ /**
987
+ * List daemons on this server.
988
+ *
989
+ * @example
990
+ * ```ts
991
+ * const daemons = await forge.server(123).daemons.list();
992
+ *
993
+ * // Fetch a specific page:
994
+ * const page2 = await forge.server(123).daemons.list({ page: 2 });
995
+ * ```
996
+ */
997
+ async list(options = {}) {
998
+ const query = options.page !== void 0 ? `?page=${options.page}` : "";
999
+ return (await this.client.get(`${this.basePath}${query}`)).daemons;
1000
+ }
1001
+ /**
1002
+ * Iterate over all daemons across all pages.
1003
+ *
1004
+ * @example
1005
+ * ```ts
1006
+ * for await (const daemon of forge.server(123).daemons.all()) {
1007
+ * console.log(daemon);
1008
+ * }
1009
+ *
1010
+ * // Or collect all at once:
1011
+ * const daemons = await forge.server(123).daemons.all().toArray();
1012
+ * ```
1013
+ */
1014
+ all(options = {}) {
1015
+ return new AsyncPaginatedIterator((page) => this.list({
1016
+ ...options,
1017
+ page
1018
+ }));
1019
+ }
1020
+ /**
1021
+ * Get a specific daemon.
1022
+ *
1023
+ * @example
1024
+ * ```ts
1025
+ * const daemon = await forge.server(123).daemons.get(789);
1026
+ * ```
1027
+ */
1028
+ async get(daemonId) {
1029
+ return (await this.client.get(`${this.basePath}/${daemonId}`)).daemon;
1030
+ }
1031
+ /**
1032
+ * Create a new daemon.
1033
+ *
1034
+ * @example
1035
+ * ```ts
1036
+ * const daemon = await forge.server(123).daemons.create({
1037
+ * command: 'php artisan queue:work',
1038
+ * user: 'forge',
1039
+ * });
1040
+ * ```
1041
+ */
1042
+ async create(data) {
1043
+ return (await this.client.post(this.basePath, data)).daemon;
1044
+ }
1045
+ /**
1046
+ * Delete a daemon.
1047
+ *
1048
+ * @example
1049
+ * ```ts
1050
+ * await forge.server(123).daemons.delete(789);
1051
+ * ```
1052
+ */
1053
+ async delete(daemonId) {
1054
+ await this.client.delete(`${this.basePath}/${daemonId}`);
1055
+ }
1056
+ /**
1057
+ * Restart a daemon.
1058
+ *
1059
+ * @example
1060
+ * ```ts
1061
+ * await forge.server(123).daemons.restart(789);
1062
+ * ```
1063
+ */
1064
+ async restart(daemonId) {
1065
+ await this.client.post(`${this.basePath}/${daemonId}/restart`);
1066
+ }
1067
+ };
1068
+ /**
1069
+ * Collection of backup configurations on a server.
1070
+ *
1071
+ * Access via `forge.server(id).backups`.
1072
+ *
1073
+ * @example
1074
+ * ```ts
1075
+ * const backups = await forge.server(123).backups.list();
1076
+ * ```
1077
+ */
1078
+ var BackupsCollection = class extends BaseCollection {
1079
+ /** @internal */
1080
+ constructor(client, serverId) {
1081
+ super(client);
1082
+ this.serverId = serverId;
1083
+ }
1084
+ get basePath() {
1085
+ return `/servers/${this.serverId}/backup-configs`;
1086
+ }
1087
+ /**
1088
+ * List backup configurations on this server.
1089
+ *
1090
+ * @example
1091
+ * ```ts
1092
+ * const backups = await forge.server(123).backups.list();
1093
+ *
1094
+ * // Fetch a specific page:
1095
+ * const page2 = await forge.server(123).backups.list({ page: 2 });
1096
+ * ```
1097
+ */
1098
+ async list(options = {}) {
1099
+ const query = options.page !== void 0 ? `?page=${options.page}` : "";
1100
+ return (await this.client.get(`${this.basePath}${query}`)).backups;
1101
+ }
1102
+ /**
1103
+ * Iterate over all backup configurations across all pages.
1104
+ *
1105
+ * @example
1106
+ * ```ts
1107
+ * for await (const backup of forge.server(123).backups.all()) {
1108
+ * console.log(backup);
1109
+ * }
1110
+ *
1111
+ * // Or collect all at once:
1112
+ * const backups = await forge.server(123).backups.all().toArray();
1113
+ * ```
1114
+ */
1115
+ all(options = {}) {
1116
+ return new AsyncPaginatedIterator((page) => this.list({
1117
+ ...options,
1118
+ page
1119
+ }));
1120
+ }
1121
+ /**
1122
+ * Get a specific backup configuration.
1123
+ *
1124
+ * @example
1125
+ * ```ts
1126
+ * const backup = await forge.server(123).backups.get(789);
1127
+ * ```
1128
+ */
1129
+ async get(backupId) {
1130
+ return (await this.client.get(`${this.basePath}/${backupId}`)).backup;
1131
+ }
1132
+ /**
1133
+ * Create a new backup configuration.
1134
+ *
1135
+ * @example
1136
+ * ```ts
1137
+ * const backup = await forge.server(123).backups.create({
1138
+ * provider: 's3',
1139
+ * credentials: { key: 'ACCESS_KEY', secret: 'SECRET_KEY', region: 'us-east-1', bucket: 'my-bucket' },
1140
+ * frequency: 'weekly',
1141
+ * retention: 7,
1142
+ * databases: [1, 2],
1143
+ * });
1144
+ * ```
1145
+ */
1146
+ async create(data) {
1147
+ return (await this.client.post(this.basePath, data)).backup;
1148
+ }
1149
+ /**
1150
+ * Delete a backup configuration.
1151
+ *
1152
+ * @example
1153
+ * ```ts
1154
+ * await forge.server(123).backups.delete(789);
1155
+ * ```
1156
+ */
1157
+ async delete(backupId) {
1158
+ await this.client.delete(`${this.basePath}/${backupId}`);
1159
+ }
1160
+ };
1161
+ /**
1162
+ * Collection of scheduled jobs (cron jobs) on a server.
1163
+ *
1164
+ * Access via `forge.server(id).scheduledJobs`.
1165
+ *
1166
+ * @example
1167
+ * ```ts
1168
+ * const jobs = await forge.server(123).scheduledJobs.list();
1169
+ * ```
1170
+ */
1171
+ var ScheduledJobsCollection = class extends BaseCollection {
1172
+ /** @internal */
1173
+ constructor(client, serverId) {
1174
+ super(client);
1175
+ this.serverId = serverId;
1176
+ }
1177
+ get basePath() {
1178
+ return `/servers/${this.serverId}/jobs`;
1179
+ }
1180
+ /**
1181
+ * List scheduled jobs on this server.
1182
+ *
1183
+ * @example
1184
+ * ```ts
1185
+ * const jobs = await forge.server(123).scheduledJobs.list();
1186
+ *
1187
+ * // Fetch a specific page:
1188
+ * const page2 = await forge.server(123).scheduledJobs.list({ page: 2 });
1189
+ * ```
1190
+ */
1191
+ async list(options = {}) {
1192
+ const query = options.page !== void 0 ? `?page=${options.page}` : "";
1193
+ return (await this.client.get(`${this.basePath}${query}`)).jobs;
1194
+ }
1195
+ /**
1196
+ * Iterate over all scheduled jobs across all pages.
1197
+ *
1198
+ * @example
1199
+ * ```ts
1200
+ * for await (const job of forge.server(123).scheduledJobs.all()) {
1201
+ * console.log(job);
1202
+ * }
1203
+ *
1204
+ * // Or collect all at once:
1205
+ * const jobs = await forge.server(123).scheduledJobs.all().toArray();
1206
+ * ```
1207
+ */
1208
+ all(options = {}) {
1209
+ return new AsyncPaginatedIterator((page) => this.list({
1210
+ ...options,
1211
+ page
1212
+ }));
1213
+ }
1214
+ /**
1215
+ * Get a specific scheduled job.
1216
+ *
1217
+ * @example
1218
+ * ```ts
1219
+ * const job = await forge.server(123).scheduledJobs.get(789);
1220
+ * ```
1221
+ */
1222
+ async get(jobId) {
1223
+ return (await this.client.get(`${this.basePath}/${jobId}`)).job;
1224
+ }
1225
+ /**
1226
+ * Create a new scheduled job.
1227
+ *
1228
+ * @example
1229
+ * ```ts
1230
+ * const job = await forge.server(123).scheduledJobs.create({
1231
+ * command: 'php /home/forge/artisan schedule:run',
1232
+ * user: 'forge',
1233
+ * frequency: 'minutely',
1234
+ * });
1235
+ * ```
1236
+ */
1237
+ async create(data) {
1238
+ return (await this.client.post(this.basePath, data)).job;
1239
+ }
1240
+ /**
1241
+ * Delete a scheduled job.
1242
+ *
1243
+ * @example
1244
+ * ```ts
1245
+ * await forge.server(123).scheduledJobs.delete(789);
1246
+ * ```
1247
+ */
1248
+ async delete(jobId) {
1249
+ await this.client.delete(`${this.basePath}/${jobId}`);
1250
+ }
1251
+ };
1252
+ /**
1253
+ * Collection of server monitors.
1254
+ *
1255
+ * Access via `forge.server(id).monitors`.
1256
+ *
1257
+ * @example
1258
+ * ```ts
1259
+ * const monitors = await forge.server(123).monitors.list();
1260
+ * ```
1261
+ */
1262
+ var MonitorsCollection = class extends BaseCollection {
1263
+ /** @internal */
1264
+ constructor(client, serverId) {
1265
+ super(client);
1266
+ this.serverId = serverId;
1267
+ }
1268
+ get basePath() {
1269
+ return `/servers/${this.serverId}/monitors`;
1270
+ }
1271
+ /**
1272
+ * List monitors on this server.
1273
+ *
1274
+ * @example
1275
+ * ```ts
1276
+ * const monitors = await forge.server(123).monitors.list();
1277
+ *
1278
+ * // Fetch a specific page:
1279
+ * const page2 = await forge.server(123).monitors.list({ page: 2 });
1280
+ * ```
1281
+ */
1282
+ async list(options = {}) {
1283
+ const query = options.page !== void 0 ? `?page=${options.page}` : "";
1284
+ return (await this.client.get(`${this.basePath}${query}`)).monitors;
1285
+ }
1286
+ /**
1287
+ * Iterate over all monitors across all pages.
1288
+ *
1289
+ * @example
1290
+ * ```ts
1291
+ * for await (const monitor of forge.server(123).monitors.all()) {
1292
+ * console.log(monitor);
1293
+ * }
1294
+ *
1295
+ * // Or collect all at once:
1296
+ * const monitors = await forge.server(123).monitors.all().toArray();
1297
+ * ```
1298
+ */
1299
+ all(options = {}) {
1300
+ return new AsyncPaginatedIterator((page) => this.list({
1301
+ ...options,
1302
+ page
1303
+ }));
1304
+ }
1305
+ /**
1306
+ * Get a specific monitor.
1307
+ *
1308
+ * @example
1309
+ * ```ts
1310
+ * const monitor = await forge.server(123).monitors.get(789);
1311
+ * ```
1312
+ */
1313
+ async get(monitorId) {
1314
+ return (await this.client.get(`${this.basePath}/${monitorId}`)).monitor;
1315
+ }
1316
+ /**
1317
+ * Create a new monitor.
1318
+ *
1319
+ * @example
1320
+ * ```ts
1321
+ * const monitor = await forge.server(123).monitors.create({
1322
+ * type: 'cpu_load',
1323
+ * operator: 'gte',
1324
+ * threshold: 80,
1325
+ * minutes: 5,
1326
+ * });
1327
+ * ```
1328
+ */
1329
+ async create(data) {
1330
+ return (await this.client.post(this.basePath, data)).monitor;
1331
+ }
1332
+ /**
1333
+ * Delete a monitor.
1334
+ *
1335
+ * @example
1336
+ * ```ts
1337
+ * await forge.server(123).monitors.delete(789);
1338
+ * ```
1339
+ */
1340
+ async delete(monitorId) {
1341
+ await this.client.delete(`${this.basePath}/${monitorId}`);
1342
+ }
1343
+ };
1344
+ /**
1345
+ * Collection of firewall rules on a server.
1346
+ *
1347
+ * Access via `forge.server(id).firewallRules`.
1348
+ *
1349
+ * @example
1350
+ * ```ts
1351
+ * const rules = await forge.server(123).firewallRules.list();
1352
+ * ```
1353
+ */
1354
+ var FirewallRulesCollection = class extends BaseCollection {
1355
+ /** @internal */
1356
+ constructor(client, serverId) {
1357
+ super(client);
1358
+ this.serverId = serverId;
1359
+ }
1360
+ get basePath() {
1361
+ return `/servers/${this.serverId}/firewall-rules`;
1362
+ }
1363
+ /**
1364
+ * List firewall rules on this server.
1365
+ *
1366
+ * @example
1367
+ * ```ts
1368
+ * const rules = await forge.server(123).firewallRules.list();
1369
+ *
1370
+ * // Fetch a specific page:
1371
+ * const page2 = await forge.server(123).firewallRules.list({ page: 2 });
1372
+ * ```
1373
+ */
1374
+ async list(options = {}) {
1375
+ const query = options.page !== void 0 ? `?page=${options.page}` : "";
1376
+ return (await this.client.get(`${this.basePath}${query}`)).rules;
1377
+ }
1378
+ /**
1379
+ * Iterate over all firewall rules across all pages.
1380
+ *
1381
+ * @example
1382
+ * ```ts
1383
+ * for await (const rule of forge.server(123).firewallRules.all()) {
1384
+ * console.log(rule);
1385
+ * }
1386
+ *
1387
+ * // Or collect all at once:
1388
+ * const rules = await forge.server(123).firewallRules.all().toArray();
1389
+ * ```
1390
+ */
1391
+ all(options = {}) {
1392
+ return new AsyncPaginatedIterator((page) => this.list({
1393
+ ...options,
1394
+ page
1395
+ }));
1396
+ }
1397
+ /**
1398
+ * Get a specific firewall rule.
1399
+ *
1400
+ * @example
1401
+ * ```ts
1402
+ * const rule = await forge.server(123).firewallRules.get(789);
1403
+ * ```
1404
+ */
1405
+ async get(ruleId) {
1406
+ return (await this.client.get(`${this.basePath}/${ruleId}`)).rule;
1407
+ }
1408
+ /**
1409
+ * Create a new firewall rule.
1410
+ *
1411
+ * @example
1412
+ * ```ts
1413
+ * const rule = await forge.server(123).firewallRules.create({
1414
+ * name: 'Allow HTTP',
1415
+ * port: 80,
1416
+ * type: 'allow',
1417
+ * });
1418
+ * ```
1419
+ */
1420
+ async create(data) {
1421
+ return (await this.client.post(this.basePath, data)).rule;
1422
+ }
1423
+ /**
1424
+ * Delete a firewall rule.
1425
+ *
1426
+ * @example
1427
+ * ```ts
1428
+ * await forge.server(123).firewallRules.delete(789);
1429
+ * ```
1430
+ */
1431
+ async delete(ruleId) {
1432
+ await this.client.delete(`${this.basePath}/${ruleId}`);
1433
+ }
1434
+ };
1435
+ /**
1436
+ * Collection of SSH keys on a server.
1437
+ *
1438
+ * Access via `forge.server(id).sshKeys`.
1439
+ *
1440
+ * @example
1441
+ * ```ts
1442
+ * const keys = await forge.server(123).sshKeys.list();
1443
+ * ```
1444
+ */
1445
+ var SshKeysCollection = class extends BaseCollection {
1446
+ /** @internal */
1447
+ constructor(client, serverId) {
1448
+ super(client);
1449
+ this.serverId = serverId;
1450
+ }
1451
+ get basePath() {
1452
+ return `/servers/${this.serverId}/keys`;
1453
+ }
1454
+ /**
1455
+ * List SSH keys on this server.
1456
+ *
1457
+ * @example
1458
+ * ```ts
1459
+ * const keys = await forge.server(123).sshKeys.list();
1460
+ *
1461
+ * // Fetch a specific page:
1462
+ * const page2 = await forge.server(123).sshKeys.list({ page: 2 });
1463
+ * ```
1464
+ */
1465
+ async list(options = {}) {
1466
+ const query = options.page !== void 0 ? `?page=${options.page}` : "";
1467
+ return (await this.client.get(`${this.basePath}${query}`)).keys;
1468
+ }
1469
+ /**
1470
+ * Iterate over all SSH keys across all pages.
1471
+ *
1472
+ * @example
1473
+ * ```ts
1474
+ * for await (const key of forge.server(123).sshKeys.all()) {
1475
+ * console.log(key);
1476
+ * }
1477
+ *
1478
+ * // Or collect all at once:
1479
+ * const keys = await forge.server(123).sshKeys.all().toArray();
1480
+ * ```
1481
+ */
1482
+ all(options = {}) {
1483
+ return new AsyncPaginatedIterator((page) => this.list({
1484
+ ...options,
1485
+ page
1486
+ }));
1487
+ }
1488
+ /**
1489
+ * Get a specific SSH key.
1490
+ *
1491
+ * @example
1492
+ * ```ts
1493
+ * const key = await forge.server(123).sshKeys.get(789);
1494
+ * ```
1495
+ */
1496
+ async get(keyId) {
1497
+ return (await this.client.get(`${this.basePath}/${keyId}`)).key;
1498
+ }
1499
+ /**
1500
+ * Create a new SSH key.
1501
+ *
1502
+ * @example
1503
+ * ```ts
1504
+ * const key = await forge.server(123).sshKeys.create({
1505
+ * name: 'deploy-key',
1506
+ * key: 'ssh-rsa AAAA...',
1507
+ * });
1508
+ * ```
1509
+ */
1510
+ async create(data) {
1511
+ return (await this.client.post(this.basePath, data)).key;
1512
+ }
1513
+ /**
1514
+ * Delete an SSH key.
1515
+ *
1516
+ * @example
1517
+ * ```ts
1518
+ * await forge.server(123).sshKeys.delete(789);
1519
+ * ```
1520
+ */
1521
+ async delete(keyId) {
1522
+ await this.client.delete(`${this.basePath}/${keyId}`);
1523
+ }
1524
+ };
1525
+ /**
1526
+ * Collection of Nginx templates on a server.
1527
+ *
1528
+ * Access via `forge.server(id).nginxTemplates`.
1529
+ *
1530
+ * @example
1531
+ * ```ts
1532
+ * const templates = await forge.server(123).nginxTemplates.list();
1533
+ * ```
1534
+ */
1535
+ var NginxTemplatesCollection = class extends BaseCollection {
1536
+ /** @internal */
1537
+ constructor(client, serverId) {
1538
+ super(client);
1539
+ this.serverId = serverId;
1540
+ }
1541
+ get basePath() {
1542
+ return `/servers/${this.serverId}/nginx/templates`;
1543
+ }
1544
+ /**
1545
+ * List Nginx templates on this server.
1546
+ *
1547
+ * @example
1548
+ * ```ts
1549
+ * const templates = await forge.server(123).nginxTemplates.list();
1550
+ *
1551
+ * // Fetch a specific page:
1552
+ * const page2 = await forge.server(123).nginxTemplates.list({ page: 2 });
1553
+ * ```
1554
+ */
1555
+ async list(options = {}) {
1556
+ const query = options.page !== void 0 ? `?page=${options.page}` : "";
1557
+ return (await this.client.get(`${this.basePath}${query}`)).templates;
1558
+ }
1559
+ /**
1560
+ * Iterate over all Nginx templates across all pages.
1561
+ *
1562
+ * @example
1563
+ * ```ts
1564
+ * for await (const template of forge.server(123).nginxTemplates.all()) {
1565
+ * console.log(template);
1566
+ * }
1567
+ *
1568
+ * // Or collect all at once:
1569
+ * const templates = await forge.server(123).nginxTemplates.all().toArray();
1570
+ * ```
1571
+ */
1572
+ all(options = {}) {
1573
+ return new AsyncPaginatedIterator((page) => this.list({
1574
+ ...options,
1575
+ page
1576
+ }));
1577
+ }
1578
+ /**
1579
+ * Get a specific Nginx template.
1580
+ *
1581
+ * @example
1582
+ * ```ts
1583
+ * const template = await forge.server(123).nginxTemplates.get(789);
1584
+ * ```
1585
+ */
1586
+ async get(templateId) {
1587
+ return (await this.client.get(`${this.basePath}/${templateId}`)).template;
1588
+ }
1589
+ /**
1590
+ * Create a new Nginx template.
1591
+ *
1592
+ * @example
1593
+ * ```ts
1594
+ * const template = await forge.server(123).nginxTemplates.create({
1595
+ * name: 'Laravel Template',
1596
+ * content: 'server { ... }',
1597
+ * });
1598
+ * ```
1599
+ */
1600
+ async create(data) {
1601
+ return (await this.client.post(this.basePath, data)).template;
1602
+ }
1603
+ /**
1604
+ * Update an existing Nginx template.
1605
+ *
1606
+ * @example
1607
+ * ```ts
1608
+ * const template = await forge.server(123).nginxTemplates.update(789, {
1609
+ * name: 'Updated Template',
1610
+ * content: 'server { ... }',
1611
+ * });
1612
+ * ```
1613
+ */
1614
+ async update(templateId, data) {
1615
+ return (await this.client.put(`${this.basePath}/${templateId}`, data)).template;
1616
+ }
1617
+ /**
1618
+ * Delete a Nginx template.
1619
+ *
1620
+ * @example
1621
+ * ```ts
1622
+ * await forge.server(123).nginxTemplates.delete(789);
1623
+ * ```
1624
+ */
1625
+ async delete(templateId) {
1626
+ await this.client.delete(`${this.basePath}/${templateId}`);
1627
+ }
1628
+ };
1629
+ /**
1630
+ * Collection of servers.
1631
+ *
1632
+ * Access via `forge.servers`.
1633
+ *
1634
+ * @example
1635
+ * ```ts
1636
+ * // List all servers
1637
+ * const servers = await forge.servers.list();
1638
+ *
1639
+ * // Get a specific server
1640
+ * const server = await forge.servers.get(123);
1641
+ *
1642
+ * // Create a new server
1643
+ * const server = await forge.servers.create({ ... });
1644
+ * ```
1645
+ */
1646
+ var ServersCollection = class extends BaseCollection {
1647
+ /** @internal */
1648
+ constructor(client) {
1649
+ super(client);
1650
+ }
1651
+ /**
1652
+ * List servers.
1653
+ *
1654
+ * @example
1655
+ * ```ts
1656
+ * const servers = await forge.servers.list();
1657
+ *
1658
+ * // Fetch a specific page:
1659
+ * const page2 = await forge.servers.list({ page: 2 });
1660
+ * ```
1661
+ */
1662
+ async list(options = {}) {
1663
+ const query = options.page !== void 0 ? `?page=${options.page}` : "";
1664
+ return (await this.client.get(`/servers${query}`)).servers;
1665
+ }
1666
+ /**
1667
+ * Iterate over all servers across all pages.
1668
+ *
1669
+ * @example
1670
+ * ```ts
1671
+ * for await (const server of forge.servers.all()) {
1672
+ * console.log(server);
1673
+ * }
1674
+ *
1675
+ * // Or collect all at once:
1676
+ * const servers = await forge.servers.all().toArray();
1677
+ * ```
1678
+ */
1679
+ all(options = {}) {
1680
+ return new AsyncPaginatedIterator((page) => this.list({
1681
+ ...options,
1682
+ page
1683
+ }));
1684
+ }
1685
+ /**
1686
+ * Get a specific server by ID.
1687
+ *
1688
+ * @example
1689
+ * ```ts
1690
+ * const server = await forge.servers.get(123);
1691
+ * ```
1692
+ */
1693
+ async get(serverId) {
1694
+ return (await this.client.get(`/servers/${serverId}`)).server;
1695
+ }
1696
+ /**
1697
+ * Create a new server.
1698
+ *
1699
+ * @example
1700
+ * ```ts
1701
+ * const server = await forge.servers.create({
1702
+ * provider: 'ocean2',
1703
+ * credential_id: 1,
1704
+ * name: 'web-1',
1705
+ * type: 'app',
1706
+ * size: '01',
1707
+ * region: 'ams3',
1708
+ * });
1709
+ * ```
1710
+ */
1711
+ async create(data) {
1712
+ return (await this.client.post("/servers", data)).server;
1713
+ }
1714
+ /**
1715
+ * Update a server.
1716
+ *
1717
+ * @example
1718
+ * ```ts
1719
+ * await forge.servers.update(123, { name: 'web-1-renamed' });
1720
+ * ```
1721
+ */
1722
+ async update(serverId, data) {
1723
+ return (await this.client.put(`/servers/${serverId}`, data)).server;
1724
+ }
1725
+ /**
1726
+ * Delete a server.
1727
+ *
1728
+ * @example
1729
+ * ```ts
1730
+ * await forge.servers.delete(123);
1731
+ * ```
1732
+ */
1733
+ async delete(serverId) {
1734
+ await this.client.delete(`/servers/${serverId}`);
1735
+ }
1736
+ /**
1737
+ * Reboot a server.
1738
+ *
1739
+ * @example
1740
+ * ```ts
1741
+ * await forge.servers.reboot(123);
1742
+ * ```
1743
+ */
1744
+ async reboot(serverId) {
1745
+ await this.client.post(`/servers/${serverId}/reboot`);
1746
+ }
1747
+ };
1748
+ /**
1749
+ * A specific server with nested resources.
1750
+ *
1751
+ * Access via `forge.server(id)`.
1752
+ *
1753
+ * @example
1754
+ * ```ts
1755
+ * // Access sites on a server
1756
+ * const sites = await forge.server(123).sites.list();
1757
+ *
1758
+ * // Access databases on a server
1759
+ * const dbs = await forge.server(123).databases.list();
1760
+ * ```
1761
+ */
1762
+ var ServerResource = class extends BaseCollection {
1763
+ /** Sites on this server. */
1764
+ sites;
1765
+ /** Databases on this server. */
1766
+ databases;
1767
+ /** Database users on this server. */
1768
+ databaseUsers;
1769
+ /** Daemons (background processes) on this server. */
1770
+ daemons;
1771
+ /** Backup configurations on this server. */
1772
+ backups;
1773
+ /** Scheduled jobs (cron jobs) on this server. */
1774
+ scheduledJobs;
1775
+ /** Monitors on this server. */
1776
+ monitors;
1777
+ /** Firewall rules on this server. */
1778
+ firewallRules;
1779
+ /** SSH keys on this server. */
1780
+ sshKeys;
1781
+ /** Nginx templates on this server. */
1782
+ nginxTemplates;
1783
+ /** @internal */
1784
+ constructor(client, serverId) {
1785
+ super(client);
1786
+ this.serverId = serverId;
1787
+ this.sites = new SitesCollection(client, serverId);
1788
+ this.databases = new DatabasesCollection(client, serverId);
1789
+ this.databaseUsers = new DatabaseUsersCollection(client, serverId);
1790
+ this.daemons = new DaemonsCollection(client, serverId);
1791
+ this.backups = new BackupsCollection(client, serverId);
1792
+ this.scheduledJobs = new ScheduledJobsCollection(client, serverId);
1793
+ this.monitors = new MonitorsCollection(client, serverId);
1794
+ this.firewallRules = new FirewallRulesCollection(client, serverId);
1795
+ this.sshKeys = new SshKeysCollection(client, serverId);
1796
+ this.nginxTemplates = new NginxTemplatesCollection(client, serverId);
1797
+ }
1798
+ /**
1799
+ * Access a specific site on this server, with nested resources.
1800
+ *
1801
+ * @example
1802
+ * ```ts
1803
+ * // Deploy a site
1804
+ * await forge.server(123).site(456).deploy();
1805
+ *
1806
+ * // Get environment variables
1807
+ * const env = await forge.server(123).site(456).env.get();
1808
+ * ```
1809
+ */
1810
+ site(siteId) {
1811
+ return new SiteResource(this.client, this.serverId, siteId);
1812
+ }
1813
+ /**
1814
+ * Get this server's details.
1815
+ *
1816
+ * @example
1817
+ * ```ts
1818
+ * const server = await forge.server(123).get();
1819
+ * ```
1820
+ */
1821
+ async get() {
1822
+ return (await this.client.get(`/servers/${this.serverId}`)).server;
1823
+ }
1824
+ /**
1825
+ * Reboot this server.
1826
+ *
1827
+ * @example
1828
+ * ```ts
1829
+ * await forge.server(123).reboot();
1830
+ * ```
1831
+ */
1832
+ async reboot() {
1833
+ await this.client.post(`/servers/${this.serverId}/reboot`);
1834
+ }
1835
+ /**
1836
+ * Delete this server.
1837
+ *
1838
+ * @example
1839
+ * ```ts
1840
+ * await forge.server(123).delete();
1841
+ * ```
1842
+ */
1843
+ async delete() {
1844
+ await this.client.delete(`/servers/${this.serverId}`);
1845
+ }
1846
+ };
1847
+ /**
1848
+ * Collection of recipes.
1849
+ *
1850
+ * Access via `forge.recipes`.
1851
+ *
1852
+ * @example
1853
+ * ```ts
1854
+ * const recipes = await forge.recipes.list();
1855
+ * ```
1856
+ */
1857
+ var RecipesCollection = class extends BaseCollection {
1858
+ /** @internal */
1859
+ constructor(client) {
1860
+ super(client);
1861
+ }
1862
+ get basePath() {
1863
+ return `/recipes`;
1864
+ }
1865
+ /**
1866
+ * List all recipes.
1867
+ *
1868
+ * @example
1869
+ * ```ts
1870
+ * const recipes = await forge.recipes.list();
1871
+ *
1872
+ * // Fetch a specific page:
1873
+ * const page2 = await forge.recipes.list({ page: 2 });
1874
+ * ```
1875
+ */
1876
+ async list(options = {}) {
1877
+ const query = options.page !== void 0 ? `?page=${options.page}` : "";
1878
+ return (await this.client.get(`${this.basePath}${query}`)).recipes;
1879
+ }
1880
+ /**
1881
+ * Iterate over all recipes across all pages.
1882
+ *
1883
+ * @example
1884
+ * ```ts
1885
+ * for await (const recipe of forge.recipes.all()) {
1886
+ * console.log(recipe);
1887
+ * }
1888
+ *
1889
+ * // Or collect all at once:
1890
+ * const recipes = await forge.recipes.all().toArray();
1891
+ * ```
1892
+ */
1893
+ all(options = {}) {
1894
+ return new AsyncPaginatedIterator((page) => this.list({
1895
+ ...options,
1896
+ page
1897
+ }));
1898
+ }
1899
+ /**
1900
+ * Get a specific recipe.
1901
+ *
1902
+ * @example
1903
+ * ```ts
1904
+ * const recipe = await forge.recipes.get(789);
1905
+ * ```
1906
+ */
1907
+ async get(recipeId) {
1908
+ return (await this.client.get(`${this.basePath}/${recipeId}`)).recipe;
1909
+ }
1910
+ /**
1911
+ * Create a new recipe.
1912
+ *
1913
+ * @example
1914
+ * ```ts
1915
+ * const recipe = await forge.recipes.create({
1916
+ * name: 'Install Node',
1917
+ * user: 'root',
1918
+ * script: 'curl -fsSL https://deb.nodesource.com/setup_20.x | bash -',
1919
+ * });
1920
+ * ```
1921
+ */
1922
+ async create(data) {
1923
+ return (await this.client.post(this.basePath, data)).recipe;
1924
+ }
1925
+ /**
1926
+ * Delete a recipe.
1927
+ *
1928
+ * @example
1929
+ * ```ts
1930
+ * await forge.recipes.delete(789);
1931
+ * ```
1932
+ */
1933
+ async delete(recipeId) {
1934
+ await this.client.delete(`${this.basePath}/${recipeId}`);
1935
+ }
1936
+ /**
1937
+ * Run a recipe on one or more servers.
1938
+ *
1939
+ * @example
1940
+ * ```ts
1941
+ * await forge.recipes.run(789, { servers: [123, 456] });
1942
+ * ```
1943
+ */
1944
+ async run(recipeId, options) {
1945
+ await this.client.post(`${this.basePath}/${recipeId}/run`, options);
1946
+ }
1947
+ };
1948
+ /**
1949
+ * Laravel Forge TypeScript SDK.
1950
+ *
1951
+ * Provides a fluent, chainable API for managing Laravel Forge servers,
1952
+ * sites, deployments, and more.
1953
+ *
1954
+ * @example
1955
+ * ```ts
1956
+ * import { Forge } from '@studiometa/forge-sdk';
1957
+ *
1958
+ * const forge = new Forge('your-api-token');
1959
+ *
1960
+ * // List all servers
1961
+ * const servers = await forge.servers.list();
1962
+ *
1963
+ * // Deploy a site
1964
+ * await forge.server(123).site(456).deploy();
1965
+ *
1966
+ * // Get environment variables
1967
+ * const env = await forge.server(123).site(456).env.get();
1968
+ *
1969
+ * // Manage databases
1970
+ * const dbs = await forge.server(123).databases.list();
1971
+ * ```
1972
+ */
1973
+ var Forge = class {
1974
+ /** @internal */
1975
+ client;
1976
+ /** Server operations (list, get, create, update, delete, reboot). */
1977
+ servers;
1978
+ /** Recipe operations (list, get, create, delete, run). */
1979
+ recipes;
1980
+ /**
1981
+ * Create a new Forge SDK instance.
1982
+ *
1983
+ * @param token Your Laravel Forge API token.
1984
+ * @param options Optional configuration (custom fetch, base URL, rate limiting).
1985
+ *
1986
+ * @example
1987
+ * ```ts
1988
+ * // Basic usage
1989
+ * const forge = new Forge('your-api-token');
1990
+ *
1991
+ * // With custom options
1992
+ * const forge = new Forge('your-api-token', {
1993
+ * baseUrl: 'https://custom-forge-instance.com/api/v1',
1994
+ * });
1995
+ *
1996
+ * // With mock fetch for testing
1997
+ * const forge = new Forge('test-token', { fetch: mockFetch });
1998
+ * ```
1999
+ */
2000
+ constructor(token, options) {
2001
+ this.client = new HttpClient({
2002
+ token,
2003
+ ...options
2004
+ });
2005
+ this.servers = new ServersCollection(this.client);
2006
+ this.recipes = new RecipesCollection(this.client);
2007
+ }
2008
+ /**
2009
+ * Access a specific server by ID, with nested resources.
2010
+ *
2011
+ * Returns a `ServerResource` that provides access to sites, databases,
2012
+ * daemons, and other server-level resources.
2013
+ *
2014
+ * @param serverId The server ID.
2015
+ *
2016
+ * @example
2017
+ * ```ts
2018
+ * // List sites on a server
2019
+ * const sites = await forge.server(123).sites.list();
2020
+ *
2021
+ * // Access a specific site
2022
+ * const site = await forge.server(123).site(456);
2023
+ *
2024
+ * // Deploy a site
2025
+ * await forge.server(123).site(456).deploy();
2026
+ *
2027
+ * // Manage databases
2028
+ * const dbs = await forge.server(123).databases.list();
2029
+ * ```
2030
+ */
2031
+ server(serverId) {
2032
+ return new ServerResource(this.client, serverId);
2033
+ }
2034
+ /**
2035
+ * Get the currently authenticated user.
2036
+ *
2037
+ * @example
2038
+ * ```ts
2039
+ * const user = await forge.user();
2040
+ * console.log(user.name, user.email);
2041
+ * ```
2042
+ */
2043
+ async user() {
2044
+ return (await this.client.get("/user")).user;
2045
+ }
2046
+ };
2047
+ export { AsyncPaginatedIterator, BackupsCollection, BaseCollection, CertificatesCollection, CommandsCollection, DaemonsCollection, DatabaseUsersCollection, DatabasesCollection, DeploymentsCollection, FirewallRulesCollection, Forge, MonitorsCollection, NginxTemplatesCollection, RecipesCollection, RedirectRulesCollection, ScheduledJobsCollection, SecurityRulesCollection, ServerResource, ServersCollection, SiteEnvResource, SiteNginxResource, SiteResource, SitesCollection, SshKeysCollection };
2048
+
2049
+ //# sourceMappingURL=index.js.map