@symbo.ls/sdk 2.32.2 → 2.32.5

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 (90) hide show
  1. package/dist/cjs/config/environment.js +43 -8
  2. package/dist/cjs/index.js +12 -4
  3. package/dist/cjs/services/AdminService.js +4 -4
  4. package/dist/cjs/services/AuthService.js +36 -149
  5. package/dist/cjs/services/BaseService.js +5 -18
  6. package/dist/cjs/services/BranchService.js +10 -10
  7. package/dist/cjs/services/CollabService.js +94 -61
  8. package/dist/cjs/services/CoreService.js +19 -19
  9. package/dist/cjs/services/DnsService.js +4 -4
  10. package/dist/cjs/services/FileService.js +2 -2
  11. package/dist/cjs/services/PaymentService.js +2 -2
  12. package/dist/cjs/services/PlanService.js +12 -12
  13. package/dist/cjs/services/ProjectService.js +45 -35
  14. package/dist/cjs/services/PullRequestService.js +7 -7
  15. package/dist/cjs/services/ScreenshotService.js +304 -0
  16. package/dist/cjs/services/SubscriptionService.js +14 -14
  17. package/dist/cjs/services/index.js +4 -0
  18. package/dist/cjs/utils/TokenManager.js +16 -5
  19. package/dist/cjs/utils/changePreprocessor.js +134 -0
  20. package/dist/cjs/utils/jsonDiff.js +46 -4
  21. package/dist/cjs/utils/ordering.js +274 -0
  22. package/dist/cjs/utils/services.js +14 -1
  23. package/dist/esm/config/environment.js +43 -8
  24. package/dist/esm/index.js +1099 -417
  25. package/dist/esm/services/AdminService.js +68 -35
  26. package/dist/esm/services/AuthService.js +100 -168
  27. package/dist/esm/services/BaseService.js +64 -31
  28. package/dist/esm/services/BranchService.js +74 -41
  29. package/dist/esm/services/CollabService.js +570 -97
  30. package/dist/esm/services/CoreService.js +83 -50
  31. package/dist/esm/services/DnsService.js +68 -35
  32. package/dist/esm/services/FileService.js +66 -33
  33. package/dist/esm/services/PaymentService.js +66 -33
  34. package/dist/esm/services/PlanService.js +76 -43
  35. package/dist/esm/services/ProjectService.js +547 -66
  36. package/dist/esm/services/PullRequestService.js +71 -38
  37. package/dist/esm/services/ScreenshotService.js +992 -0
  38. package/dist/esm/services/SubscriptionService.js +78 -45
  39. package/dist/esm/services/index.js +1076 -412
  40. package/dist/esm/utils/CollabClient.js +89 -12
  41. package/dist/esm/utils/TokenManager.js +16 -5
  42. package/dist/esm/utils/changePreprocessor.js +442 -0
  43. package/dist/esm/utils/jsonDiff.js +46 -4
  44. package/dist/esm/utils/ordering.js +256 -0
  45. package/dist/esm/utils/services.js +14 -1
  46. package/dist/node/config/environment.js +43 -8
  47. package/dist/node/index.js +14 -5
  48. package/dist/node/services/AdminService.js +4 -4
  49. package/dist/node/services/AuthService.js +36 -139
  50. package/dist/node/services/BaseService.js +5 -18
  51. package/dist/node/services/BranchService.js +10 -10
  52. package/dist/node/services/CollabService.js +95 -62
  53. package/dist/node/services/CoreService.js +19 -19
  54. package/dist/node/services/DnsService.js +4 -4
  55. package/dist/node/services/FileService.js +2 -2
  56. package/dist/node/services/PaymentService.js +2 -2
  57. package/dist/node/services/PlanService.js +12 -12
  58. package/dist/node/services/ProjectService.js +45 -35
  59. package/dist/node/services/PullRequestService.js +7 -7
  60. package/dist/node/services/ScreenshotService.js +285 -0
  61. package/dist/node/services/SubscriptionService.js +14 -14
  62. package/dist/node/services/index.js +4 -0
  63. package/dist/node/utils/TokenManager.js +16 -5
  64. package/dist/node/utils/changePreprocessor.js +115 -0
  65. package/dist/node/utils/jsonDiff.js +46 -4
  66. package/dist/node/utils/ordering.js +255 -0
  67. package/dist/node/utils/services.js +14 -1
  68. package/package.json +7 -6
  69. package/src/config/environment.js +48 -9
  70. package/src/index.js +38 -22
  71. package/src/services/AdminService.js +4 -4
  72. package/src/services/AuthService.js +42 -175
  73. package/src/services/BaseService.js +7 -24
  74. package/src/services/BranchService.js +10 -10
  75. package/src/services/CollabService.js +115 -74
  76. package/src/services/CoreService.js +19 -19
  77. package/src/services/DnsService.js +4 -4
  78. package/src/services/FileService.js +2 -2
  79. package/src/services/PaymentService.js +2 -2
  80. package/src/services/PlanService.js +12 -12
  81. package/src/services/ProjectService.js +50 -35
  82. package/src/services/PullRequestService.js +7 -7
  83. package/src/services/ScreenshotService.js +258 -0
  84. package/src/services/SubscriptionService.js +14 -14
  85. package/src/services/index.js +6 -1
  86. package/src/utils/TokenManager.js +19 -5
  87. package/src/utils/changePreprocessor.js +139 -0
  88. package/src/utils/jsonDiff.js +40 -5
  89. package/src/utils/ordering.js +244 -0
  90. package/src/utils/services.js +15 -1
@@ -1,4 +1,7 @@
1
1
  import { BaseService } from "./BaseService.js";
2
+ import { computeOrdersForTuples } from "../utils/ordering.js";
3
+ import { preprocessChanges } from "../utils/changePreprocessor.js";
4
+ import { deepStringifyFunctions } from "@domql/utils";
2
5
  class ProjectService extends BaseService {
3
6
  // ==================== PROJECT METHODS ====================
4
7
  async createProject(projectData) {
@@ -14,7 +17,7 @@ class ProjectService extends BaseService {
14
17
  }
15
18
  throw new Error(response.message);
16
19
  } catch (error) {
17
- throw new Error(`Failed to create project: ${error.message}`);
20
+ throw new Error(`Failed to create project: ${error.message}`, { cause: error });
18
21
  }
19
22
  }
20
23
  async getProjects(params = {}) {
@@ -37,7 +40,7 @@ class ProjectService extends BaseService {
37
40
  }
38
41
  throw new Error(response.message);
39
42
  } catch (error) {
40
- throw new Error(`Failed to get projects: ${error.message}`);
43
+ throw new Error(`Failed to get projects: ${error.message}`, { cause: error });
41
44
  }
42
45
  }
43
46
  /**
@@ -68,7 +71,7 @@ class ProjectService extends BaseService {
68
71
  }
69
72
  throw new Error(response.message);
70
73
  } catch (error) {
71
- throw new Error(`Failed to list public projects: ${error.message}`);
74
+ throw new Error(`Failed to list public projects: ${error.message}`, { cause: error });
72
75
  }
73
76
  }
74
77
  async getProject(projectId) {
@@ -90,7 +93,7 @@ class ProjectService extends BaseService {
90
93
  }
91
94
  throw new Error(response.message);
92
95
  } catch (error) {
93
- throw new Error(`Failed to get project: ${error.message}`);
96
+ throw new Error(`Failed to get project: ${error.message}`, { cause: error });
94
97
  }
95
98
  }
96
99
  /**
@@ -115,7 +118,7 @@ class ProjectService extends BaseService {
115
118
  }
116
119
  throw new Error(response.message);
117
120
  } catch (error) {
118
- throw new Error(`Failed to get public project: ${error.message}`);
121
+ throw new Error(`Failed to get public project: ${error.message}`, { cause: error });
119
122
  }
120
123
  }
121
124
  async getProjectByKey(key) {
@@ -137,7 +140,7 @@ class ProjectService extends BaseService {
137
140
  }
138
141
  throw new Error(response.message);
139
142
  } catch (error) {
140
- throw new Error(`Failed to get project by key: ${error.message}`);
143
+ throw new Error(`Failed to get project by key: ${error.message}`, { cause: error });
141
144
  }
142
145
  }
143
146
  /**
@@ -171,7 +174,7 @@ class ProjectService extends BaseService {
171
174
  }
172
175
  throw new Error(response.message);
173
176
  } catch (error) {
174
- throw new Error(`Failed to get project data by key: ${error.message}`);
177
+ throw new Error(`Failed to get project data by key: ${error.message}`, { cause: error });
175
178
  }
176
179
  }
177
180
  async updateProject(projectId, data) {
@@ -190,7 +193,7 @@ class ProjectService extends BaseService {
190
193
  }
191
194
  throw new Error(response.message);
192
195
  } catch (error) {
193
- throw new Error(`Failed to update project: ${error.message}`);
196
+ throw new Error(`Failed to update project: ${error.message}`, { cause: error });
194
197
  }
195
198
  }
196
199
  async updateProjectComponents(projectId, components) {
@@ -212,7 +215,7 @@ class ProjectService extends BaseService {
212
215
  }
213
216
  throw new Error(response.message);
214
217
  } catch (error) {
215
- throw new Error(`Failed to update project components: ${error.message}`);
218
+ throw new Error(`Failed to update project components: ${error.message}`, { cause: error });
216
219
  }
217
220
  }
218
221
  async updateProjectSettings(projectId, settings) {
@@ -231,7 +234,7 @@ class ProjectService extends BaseService {
231
234
  }
232
235
  throw new Error(response.message);
233
236
  } catch (error) {
234
- throw new Error(`Failed to update project settings: ${error.message}`);
237
+ throw new Error(`Failed to update project settings: ${error.message}`, { cause: error });
235
238
  }
236
239
  }
237
240
  async updateProjectName(projectId, name) {
@@ -250,7 +253,7 @@ class ProjectService extends BaseService {
250
253
  }
251
254
  throw new Error(response.message);
252
255
  } catch (error) {
253
- throw new Error(`Failed to update project name: ${error.message}`);
256
+ throw new Error(`Failed to update project name: ${error.message}`, { cause: error });
254
257
  }
255
258
  }
256
259
  async updateProjectPackage(projectId, pkg) {
@@ -269,7 +272,7 @@ class ProjectService extends BaseService {
269
272
  }
270
273
  throw new Error(response.message);
271
274
  } catch (error) {
272
- throw new Error(`Failed to update project package: ${error.message}`);
275
+ throw new Error(`Failed to update project package: ${error.message}`, { cause: error });
273
276
  }
274
277
  }
275
278
  async duplicateProject(projectId, newName, newKey, targetUserId) {
@@ -288,7 +291,7 @@ class ProjectService extends BaseService {
288
291
  }
289
292
  throw new Error(response.message);
290
293
  } catch (error) {
291
- throw new Error(`Failed to duplicate project: ${error.message}`);
294
+ throw new Error(`Failed to duplicate project: ${error.message}`, { cause: error });
292
295
  }
293
296
  }
294
297
  async removeProject(projectId) {
@@ -306,7 +309,7 @@ class ProjectService extends BaseService {
306
309
  }
307
310
  throw new Error(response.message);
308
311
  } catch (error) {
309
- throw new Error(`Failed to remove project: ${error.message}`);
312
+ throw new Error(`Failed to remove project: ${error.message}`, { cause: error });
310
313
  }
311
314
  }
312
315
  async checkProjectKeyAvailability(key) {
@@ -325,7 +328,8 @@ class ProjectService extends BaseService {
325
328
  throw new Error(response.message);
326
329
  } catch (error) {
327
330
  throw new Error(
328
- `Failed to check project key availability: ${error.message}`
331
+ `Failed to check project key availability: ${error.message}`,
332
+ { cause: error }
329
333
  );
330
334
  }
331
335
  }
@@ -345,7 +349,7 @@ class ProjectService extends BaseService {
345
349
  }
346
350
  throw new Error(response.message);
347
351
  } catch (error) {
348
- throw new Error(`Failed to get project members: ${error.message}`);
352
+ throw new Error(`Failed to get project members: ${error.message}`, { cause: error });
349
353
  }
350
354
  }
351
355
  async inviteMember(projectId, email, role = "guest", options = {}) {
@@ -374,7 +378,7 @@ class ProjectService extends BaseService {
374
378
  }
375
379
  throw new Error(response.message);
376
380
  } catch (error) {
377
- throw new Error(`Failed to invite member: ${error.message}`);
381
+ throw new Error(`Failed to invite member: ${error.message}`, { cause: error });
378
382
  }
379
383
  }
380
384
  async acceptInvite(token) {
@@ -393,7 +397,7 @@ class ProjectService extends BaseService {
393
397
  }
394
398
  throw new Error(response.message);
395
399
  } catch (error) {
396
- throw new Error(`Failed to accept invite: ${error.message}`);
400
+ throw new Error(`Failed to accept invite: ${error.message}`, { cause: error });
397
401
  }
398
402
  }
399
403
  async updateMemberRole(projectId, memberId, role) {
@@ -415,7 +419,7 @@ class ProjectService extends BaseService {
415
419
  }
416
420
  throw new Error(response.message);
417
421
  } catch (error) {
418
- throw new Error(`Failed to update member role: ${error.message}`);
422
+ throw new Error(`Failed to update member role: ${error.message}`, { cause: error });
419
423
  }
420
424
  }
421
425
  async removeMember(projectId, memberId) {
@@ -436,7 +440,7 @@ class ProjectService extends BaseService {
436
440
  }
437
441
  throw new Error(response.message);
438
442
  } catch (error) {
439
- throw new Error(`Failed to remove member: ${error.message}`);
443
+ throw new Error(`Failed to remove member: ${error.message}`, { cause: error });
440
444
  }
441
445
  }
442
446
  // ==================== PROJECT LIBRARY METHODS ====================
@@ -456,7 +460,7 @@ class ProjectService extends BaseService {
456
460
  }
457
461
  throw new Error(response.message);
458
462
  } catch (error) {
459
- throw new Error(`Failed to get available libraries: ${error.message}`);
463
+ throw new Error(`Failed to get available libraries: ${error.message}`, { cause: error });
460
464
  }
461
465
  }
462
466
  async getProjectLibraries(projectId) {
@@ -474,7 +478,7 @@ class ProjectService extends BaseService {
474
478
  }
475
479
  throw new Error(response.message);
476
480
  } catch (error) {
477
- throw new Error(`Failed to get project libraries: ${error.message}`);
481
+ throw new Error(`Failed to get project libraries: ${error.message}`, { cause: error });
478
482
  }
479
483
  }
480
484
  async addProjectLibraries(projectId, libraryIds) {
@@ -489,11 +493,11 @@ class ProjectService extends BaseService {
489
493
  methodName: "addProjectLibraries"
490
494
  });
491
495
  if (response.success) {
492
- return response.data;
496
+ return response;
493
497
  }
494
498
  throw new Error(response.message);
495
499
  } catch (error) {
496
- throw new Error(`Failed to add project libraries: ${error.message}`);
500
+ throw new Error(`Failed to add project libraries: ${error.message}`, { cause: error });
497
501
  }
498
502
  }
499
503
  async removeProjectLibraries(projectId, libraryIds) {
@@ -512,7 +516,7 @@ class ProjectService extends BaseService {
512
516
  }
513
517
  throw new Error(response.message);
514
518
  } catch (error) {
515
- throw new Error(`Failed to remove project libraries: ${error.message}`);
519
+ throw new Error(`Failed to remove project libraries: ${error.message}`, { cause: error });
516
520
  }
517
521
  }
518
522
  // ==================== PROJECT DATA METHODS (SYMSTORY REPLACEMENT) ====================
@@ -529,14 +533,20 @@ class ProjectService extends BaseService {
529
533
  throw new Error("Changes must be an array");
530
534
  }
531
535
  const { message, branch = "main", type = "patch" } = options;
536
+ const state = this._context && this._context.state;
537
+ const { granularChanges, orders: preprocessorOrders } = preprocessChanges(state, changes, options);
538
+ const derivedOrders = options.orders || (preprocessorOrders && preprocessorOrders.length ? preprocessorOrders : state ? computeOrdersForTuples(state, granularChanges) : []);
539
+ const stringify = (val) => deepStringifyFunctions(val, Array.isArray(val) ? [] : {});
532
540
  try {
533
541
  const response = await this._request(`/projects/${projectId}/changes`, {
534
542
  method: "POST",
535
543
  body: JSON.stringify({
536
- changes,
544
+ changes: stringify(changes),
545
+ granularChanges: stringify(granularChanges),
537
546
  message,
538
547
  branch,
539
- type
548
+ type,
549
+ ...derivedOrders && derivedOrders.length ? { orders: derivedOrders } : {}
540
550
  }),
541
551
  methodName: "applyProjectChanges"
542
552
  });
@@ -545,7 +555,7 @@ class ProjectService extends BaseService {
545
555
  }
546
556
  throw new Error(response.message);
547
557
  } catch (error) {
548
- throw new Error(`Failed to apply project changes: ${error.message}`);
558
+ throw new Error(`Failed to apply project changes: ${error.message}`, { cause: error });
549
559
  }
550
560
  }
551
561
  /**
@@ -580,7 +590,7 @@ class ProjectService extends BaseService {
580
590
  }
581
591
  throw new Error(response.message);
582
592
  } catch (error) {
583
- throw new Error(`Failed to get project data: ${error.message}`);
593
+ throw new Error(`Failed to get project data: ${error.message}`, { cause: error });
584
594
  }
585
595
  }
586
596
  /**
@@ -610,7 +620,7 @@ class ProjectService extends BaseService {
610
620
  }
611
621
  throw new Error(response.message);
612
622
  } catch (error) {
613
- throw new Error(`Failed to get project versions: ${error.message}`);
623
+ throw new Error(`Failed to get project versions: ${error.message}`, { cause: error });
614
624
  }
615
625
  }
616
626
  /**
@@ -642,7 +652,7 @@ class ProjectService extends BaseService {
642
652
  }
643
653
  throw new Error(response.message);
644
654
  } catch (error) {
645
- throw new Error(`Failed to restore project version: ${error.message}`);
655
+ throw new Error(`Failed to restore project version: ${error.message}`, { cause: error });
646
656
  }
647
657
  }
648
658
  /**
@@ -742,7 +752,7 @@ class ProjectService extends BaseService {
742
752
  }
743
753
  throw new Error(response.message);
744
754
  } catch (error) {
745
- throw new Error(`Failed to get favorite projects: ${error.message}`);
755
+ throw new Error(`Failed to get favorite projects: ${error.message}`, { cause: error });
746
756
  }
747
757
  }
748
758
  async addFavoriteProject(projectId) {
@@ -760,7 +770,7 @@ class ProjectService extends BaseService {
760
770
  }
761
771
  throw new Error(response.message);
762
772
  } catch (error) {
763
- throw new Error(`Failed to add favorite project: ${error.message}`);
773
+ throw new Error(`Failed to add favorite project: ${error.message}`, { cause: error });
764
774
  }
765
775
  }
766
776
  async removeFavoriteProject(projectId) {
@@ -778,7 +788,7 @@ class ProjectService extends BaseService {
778
788
  }
779
789
  throw new Error(response.message);
780
790
  } catch (error) {
781
- throw new Error(`Failed to remove favorite project: ${error.message}`);
791
+ throw new Error(`Failed to remove favorite project: ${error.message}`, { cause: error });
782
792
  }
783
793
  }
784
794
  // ==================== RECENT PROJECT METHODS ====================
@@ -807,7 +817,7 @@ class ProjectService extends BaseService {
807
817
  }
808
818
  throw new Error(response.message);
809
819
  } catch (error) {
810
- throw new Error(`Failed to get recent projects: ${error.message}`);
820
+ throw new Error(`Failed to get recent projects: ${error.message}`, { cause: error });
811
821
  }
812
822
  }
813
823
  }
@@ -26,7 +26,7 @@ class PullRequestService extends BaseService {
26
26
  }
27
27
  throw new Error(response.message);
28
28
  } catch (error) {
29
- throw new Error(`Failed to create pull request: ${error.message}`);
29
+ throw new Error(`Failed to create pull request: ${error.message}`, { cause: error });
30
30
  }
31
31
  }
32
32
  /**
@@ -62,7 +62,7 @@ class PullRequestService extends BaseService {
62
62
  }
63
63
  throw new Error(response.message);
64
64
  } catch (error) {
65
- throw new Error(`Failed to list pull requests: ${error.message}`);
65
+ throw new Error(`Failed to list pull requests: ${error.message}`, { cause: error });
66
66
  }
67
67
  }
68
68
  /**
@@ -89,7 +89,7 @@ class PullRequestService extends BaseService {
89
89
  }
90
90
  throw new Error(response.message);
91
91
  } catch (error) {
92
- throw new Error(`Failed to get pull request: ${error.message}`);
92
+ throw new Error(`Failed to get pull request: ${error.message}`, { cause: error });
93
93
  }
94
94
  }
95
95
  /**
@@ -123,7 +123,7 @@ class PullRequestService extends BaseService {
123
123
  }
124
124
  throw new Error(response.message);
125
125
  } catch (error) {
126
- throw new Error(`Failed to review pull request: ${error.message}`);
126
+ throw new Error(`Failed to review pull request: ${error.message}`, { cause: error });
127
127
  }
128
128
  }
129
129
  /**
@@ -154,7 +154,7 @@ class PullRequestService extends BaseService {
154
154
  }
155
155
  throw new Error(response.message);
156
156
  } catch (error) {
157
- throw new Error(`Failed to add pull request comment: ${error.message}`);
157
+ throw new Error(`Failed to add pull request comment: ${error.message}`, { cause: error });
158
158
  }
159
159
  }
160
160
  /**
@@ -184,7 +184,7 @@ class PullRequestService extends BaseService {
184
184
  if (error.message.includes("conflicts") || error.message.includes("409")) {
185
185
  throw new Error(`Pull request has merge conflicts: ${error.message}`);
186
186
  }
187
- throw new Error(`Failed to merge pull request: ${error.message}`);
187
+ throw new Error(`Failed to merge pull request: ${error.message}`, { cause: error });
188
188
  }
189
189
  }
190
190
  /**
@@ -211,7 +211,7 @@ class PullRequestService extends BaseService {
211
211
  }
212
212
  throw new Error(response.message);
213
213
  } catch (error) {
214
- throw new Error(`Failed to get pull request diff: ${error.message}`);
214
+ throw new Error(`Failed to get pull request diff: ${error.message}`, { cause: error });
215
215
  }
216
216
  }
217
217
  // ==================== PULL REQUEST HELPER METHODS ====================
@@ -0,0 +1,285 @@
1
+ import { BaseService } from "./BaseService.js";
2
+ class ScreenshotService extends BaseService {
3
+ constructor(config) {
4
+ super(config);
5
+ this._debounceTimers = /* @__PURE__ */ new Map();
6
+ this._inflightRefreshes = /* @__PURE__ */ new Map();
7
+ }
8
+ // ==================== PROJECT-LEVEL OPERATIONS ====================
9
+ async createScreenshotProject(payload) {
10
+ this._requireReady("createScreenshotProject");
11
+ try {
12
+ const response = await this._request("/screenshots/projects", {
13
+ method: "POST",
14
+ body: JSON.stringify(payload),
15
+ methodName: "createScreenshotProject"
16
+ });
17
+ if (response.success) {
18
+ return response;
19
+ }
20
+ throw new Error(response.message);
21
+ } catch (error) {
22
+ throw new Error(`Failed to create screenshot project: ${error.message}`, { cause: error });
23
+ }
24
+ }
25
+ async getProjectScreenshots(projectKey, params = {}) {
26
+ this._requireReady("getProjectScreenshots");
27
+ if (!projectKey) {
28
+ throw new Error("projectKey is required");
29
+ }
30
+ const { type = "all", status, limit = 50, offset = 0 } = params;
31
+ const qs = new URLSearchParams();
32
+ if (type) {
33
+ qs.set("type", type);
34
+ }
35
+ if (status) {
36
+ qs.set("status", status);
37
+ }
38
+ if (limit != null) {
39
+ qs.set("limit", String(limit));
40
+ }
41
+ if (offset != null) {
42
+ qs.set("offset", String(offset));
43
+ }
44
+ try {
45
+ const response = await this._request(
46
+ `/screenshots/projects/${encodeURIComponent(projectKey)}${qs.toString() ? `?${qs.toString()}` : ""}`,
47
+ { method: "GET", methodName: "getProjectScreenshots" }
48
+ );
49
+ if (response.success) {
50
+ return response;
51
+ }
52
+ throw new Error(response.message);
53
+ } catch (error) {
54
+ throw new Error(`Failed to get project screenshots: ${error.message}`, { cause: error });
55
+ }
56
+ }
57
+ async reprocessProjectScreenshots(projectKey, body = {}) {
58
+ this._requireReady("reprocessProjectScreenshots");
59
+ if (!projectKey) {
60
+ throw new Error("projectKey is required");
61
+ }
62
+ try {
63
+ const response = await this._request(
64
+ `/screenshots/projects/${encodeURIComponent(projectKey)}/reprocess`,
65
+ { method: "POST", body: JSON.stringify(body), methodName: "reprocessProjectScreenshots" }
66
+ );
67
+ if (response.success) {
68
+ return response;
69
+ }
70
+ throw new Error(response.message);
71
+ } catch (error) {
72
+ throw new Error(`Failed to reprocess screenshots: ${error.message}`, { cause: error });
73
+ }
74
+ }
75
+ async recreateProjectScreenshots(projectKey, body = {}) {
76
+ this._requireReady("recreateProjectScreenshots");
77
+ if (!projectKey) {
78
+ throw new Error("projectKey is required");
79
+ }
80
+ try {
81
+ const response = await this._request(
82
+ `/screenshots/projects/${encodeURIComponent(projectKey)}/recreate`,
83
+ { method: "POST", body: JSON.stringify(body), methodName: "recreateProjectScreenshots" }
84
+ );
85
+ if (response.success) {
86
+ return response;
87
+ }
88
+ throw new Error(response.message);
89
+ } catch (error) {
90
+ throw new Error(`Failed to recreate screenshots: ${error.message}`, { cause: error });
91
+ }
92
+ }
93
+ async deleteProjectScreenshots(projectKey) {
94
+ this._requireReady("deleteProjectScreenshots");
95
+ if (!projectKey) {
96
+ throw new Error("projectKey is required");
97
+ }
98
+ try {
99
+ const response = await this._request(
100
+ `/screenshots/projects/${encodeURIComponent(projectKey)}`,
101
+ { method: "DELETE", methodName: "deleteProjectScreenshots" }
102
+ );
103
+ if (response.success) {
104
+ return response;
105
+ }
106
+ throw new Error(response.message);
107
+ } catch (error) {
108
+ throw new Error(`Failed to delete project screenshots: ${error.message}`, { cause: error });
109
+ }
110
+ }
111
+ // ==================== THUMBNAIL ====================
112
+ async getThumbnailCandidate(projectKey, options = {}) {
113
+ this._requireReady("getThumbnailCandidate");
114
+ if (!projectKey) {
115
+ throw new Error("projectKey is required");
116
+ }
117
+ const { includeData = false } = options;
118
+ const qs = new URLSearchParams();
119
+ if (includeData) {
120
+ qs.set("include_data", "true");
121
+ }
122
+ try {
123
+ const response = await this._request(
124
+ `/screenshots/projects/${encodeURIComponent(projectKey)}/thumbnail/candidate${qs.toString() ? `?${qs.toString()}` : ""}`,
125
+ { method: "GET", methodName: "getThumbnailCandidate" }
126
+ );
127
+ if (response.success) {
128
+ return response;
129
+ }
130
+ throw new Error(response.message);
131
+ } catch (error) {
132
+ throw new Error(`Failed to get thumbnail candidate: ${error.message}`, { cause: error });
133
+ }
134
+ }
135
+ async updateProjectThumbnail(projectKey, body = {}) {
136
+ this._requireReady("updateProjectThumbnail");
137
+ if (!projectKey) {
138
+ throw new Error("projectKey is required");
139
+ }
140
+ try {
141
+ const response = await this._request(
142
+ `/screenshots/projects/${encodeURIComponent(projectKey)}/thumbnail`,
143
+ { method: "POST", body: JSON.stringify(body), methodName: "updateProjectThumbnail" }
144
+ );
145
+ if (response.success) {
146
+ return response;
147
+ }
148
+ throw new Error(response.message);
149
+ } catch (error) {
150
+ throw new Error(`Failed to update project thumbnail: ${error.message}`, { cause: error });
151
+ }
152
+ }
153
+ // ==================== INDIVIDUAL SHOTS ====================
154
+ async getPageScreenshot(screenshotId, format = "json") {
155
+ this._requireReady("getPageScreenshot");
156
+ if (!screenshotId) {
157
+ throw new Error("screenshotId is required");
158
+ }
159
+ const qs = new URLSearchParams();
160
+ if (format) {
161
+ qs.set("format", format);
162
+ }
163
+ try {
164
+ return await this._request(
165
+ `/screenshots/pages/${encodeURIComponent(screenshotId)}${qs.toString() ? `?${qs.toString()}` : ""}`,
166
+ { method: "GET", methodName: "getPageScreenshot" }
167
+ );
168
+ } catch (error) {
169
+ throw new Error(`Failed to get page screenshot: ${error.message}`, { cause: error });
170
+ }
171
+ }
172
+ async getComponentScreenshot(screenshotId, format = "json") {
173
+ this._requireReady("getComponentScreenshot");
174
+ if (!screenshotId) {
175
+ throw new Error("screenshotId is required");
176
+ }
177
+ const qs = new URLSearchParams();
178
+ if (format) {
179
+ qs.set("format", format);
180
+ }
181
+ try {
182
+ return await this._request(
183
+ `/screenshots/components/${encodeURIComponent(screenshotId)}${qs.toString() ? `?${qs.toString()}` : ""}`,
184
+ { method: "GET", methodName: "getComponentScreenshot" }
185
+ );
186
+ } catch (error) {
187
+ throw new Error(`Failed to get component screenshot: ${error.message}`, { cause: error });
188
+ }
189
+ }
190
+ async getScreenshotByKey(projectKey, type, key, format = "json") {
191
+ this._requireReady("getScreenshotByKey");
192
+ if (!projectKey) {
193
+ throw new Error("projectKey is required");
194
+ }
195
+ if (!type || !["component", "page"].includes(String(type))) {
196
+ throw new Error("type must be 'component' or 'page'");
197
+ }
198
+ if (!key) {
199
+ throw new Error("key is required");
200
+ }
201
+ const qs = new URLSearchParams();
202
+ if (format) {
203
+ qs.set("format", format);
204
+ }
205
+ const sub = type === "component" ? "components" : "pages";
206
+ try {
207
+ return await this._request(
208
+ `/screenshots/projects/${encodeURIComponent(projectKey)}/${sub}/${encodeURIComponent(key)}${qs.toString() ? `?${qs.toString()}` : ""}`,
209
+ { method: "GET", methodName: "getScreenshotByKey" }
210
+ );
211
+ } catch (error) {
212
+ throw new Error(`Failed to get screenshot by key: ${error.message}`, { cause: error });
213
+ }
214
+ }
215
+ async getQueueStatistics() {
216
+ this._requireReady("getQueueStatistics");
217
+ try {
218
+ const response = await this._request("/screenshots/queue/stats", {
219
+ method: "GET",
220
+ methodName: "getQueueStatistics"
221
+ });
222
+ if (response.success) {
223
+ return response;
224
+ }
225
+ throw new Error(response.message);
226
+ } catch (error) {
227
+ throw new Error(`Failed to get queue statistics: ${error.message}`, { cause: error });
228
+ }
229
+ }
230
+ // ==================== COMBINATION/DEBOUNCED ====================
231
+ /**
232
+ * Debounced thumbnail refresh that recreates screenshots and then updates thumbnail.
233
+ * Subsequent calls within debounce window reset the timer.
234
+ */
235
+ async refreshThumbnail(projectKey, options = {}) {
236
+ this._requireReady("refreshThumbnail");
237
+ if (!projectKey) {
238
+ throw new Error("projectKey is required");
239
+ }
240
+ const {
241
+ debounceMs = 15e3,
242
+ waitAfterRecreateMs = 2e4,
243
+ recreate = {
244
+ process_pages: true,
245
+ process_components: false,
246
+ process_descriptions: false,
247
+ force: false,
248
+ priority: 5
249
+ },
250
+ thumbnail = {
251
+ strategy: "auto",
252
+ force: true
253
+ }
254
+ } = options;
255
+ const existingTimer = this._debounceTimers.get(projectKey);
256
+ if (existingTimer) {
257
+ clearTimeout(existingTimer);
258
+ }
259
+ const executionPromise = await new Promise((resolve) => {
260
+ const timer = setTimeout(async () => {
261
+ try {
262
+ await this.recreateProjectScreenshots(projectKey, recreate);
263
+ await new Promise((resolveDelay) => {
264
+ setTimeout(resolveDelay, waitAfterRecreateMs);
265
+ });
266
+ const result = await this.updateProjectThumbnail(projectKey, thumbnail);
267
+ resolve(result);
268
+ } catch (e) {
269
+ resolve({ success: false, error: (e == null ? void 0 : e.message) || String(e) });
270
+ } finally {
271
+ this._debounceTimers.delete(projectKey);
272
+ this._inflightRefreshes.delete(projectKey);
273
+ }
274
+ }, debounceMs);
275
+ this._debounceTimers.set(projectKey, timer);
276
+ });
277
+ this._inflightRefreshes.set(projectKey, executionPromise);
278
+ return executionPromise;
279
+ }
280
+ }
281
+ var ScreenshotService_default = ScreenshotService;
282
+ export {
283
+ ScreenshotService,
284
+ ScreenshotService_default as default
285
+ };