@symbo.ls/sdk 2.32.0 → 2.32.2
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.
- package/dist/cjs/config/environment.js +8 -43
- package/dist/cjs/index.js +4 -12
- package/dist/cjs/services/AdminService.js +4 -4
- package/dist/cjs/services/AuthService.js +149 -36
- package/dist/cjs/services/BaseService.js +18 -5
- package/dist/cjs/services/BranchService.js +10 -10
- package/dist/cjs/services/CollabService.js +18 -114
- package/dist/cjs/services/CoreService.js +19 -19
- package/dist/cjs/services/DnsService.js +4 -4
- package/dist/cjs/services/FileService.js +2 -2
- package/dist/cjs/services/PaymentService.js +2 -2
- package/dist/cjs/services/PlanService.js +12 -12
- package/dist/cjs/services/ProjectService.js +34 -39
- package/dist/cjs/services/PullRequestService.js +7 -7
- package/dist/cjs/services/SubscriptionService.js +14 -14
- package/dist/cjs/services/index.js +0 -4
- package/dist/cjs/utils/TokenManager.js +5 -16
- package/dist/cjs/utils/services.js +1 -14
- package/dist/esm/config/environment.js +8 -43
- package/dist/esm/index.js +300 -907
- package/dist/esm/services/AdminService.js +35 -68
- package/dist/esm/services/AuthService.js +168 -100
- package/dist/esm/services/BaseService.js +31 -64
- package/dist/esm/services/BranchService.js +41 -74
- package/dist/esm/services/CollabService.js +50 -452
- package/dist/esm/services/CoreService.js +50 -83
- package/dist/esm/services/DnsService.js +35 -68
- package/dist/esm/services/FileService.js +33 -66
- package/dist/esm/services/PaymentService.js +33 -66
- package/dist/esm/services/PlanService.js +43 -76
- package/dist/esm/services/ProjectService.js +65 -375
- package/dist/esm/services/PullRequestService.js +38 -71
- package/dist/esm/services/SubscriptionService.js +45 -78
- package/dist/esm/services/index.js +295 -884
- package/dist/esm/utils/CollabClient.js +8 -43
- package/dist/esm/utils/TokenManager.js +5 -16
- package/dist/esm/utils/services.js +1 -14
- package/dist/node/config/environment.js +8 -43
- package/dist/node/index.js +5 -14
- package/dist/node/services/AdminService.js +4 -4
- package/dist/node/services/AuthService.js +139 -36
- package/dist/node/services/BaseService.js +18 -5
- package/dist/node/services/BranchService.js +10 -10
- package/dist/node/services/CollabService.js +19 -115
- package/dist/node/services/CoreService.js +19 -19
- package/dist/node/services/DnsService.js +4 -4
- package/dist/node/services/FileService.js +2 -2
- package/dist/node/services/PaymentService.js +2 -2
- package/dist/node/services/PlanService.js +12 -12
- package/dist/node/services/ProjectService.js +34 -39
- package/dist/node/services/PullRequestService.js +7 -7
- package/dist/node/services/SubscriptionService.js +14 -14
- package/dist/node/services/index.js +0 -4
- package/dist/node/utils/TokenManager.js +5 -16
- package/dist/node/utils/services.js +1 -14
- package/package.json +6 -7
- package/src/config/environment.js +9 -48
- package/src/index.js +22 -38
- package/src/services/AdminService.js +4 -4
- package/src/services/AuthService.js +175 -42
- package/src/services/BaseService.js +24 -7
- package/src/services/BranchService.js +10 -10
- package/src/services/CollabService.js +19 -142
- package/src/services/CoreService.js +19 -19
- package/src/services/DnsService.js +4 -4
- package/src/services/FileService.js +2 -2
- package/src/services/PaymentService.js +2 -2
- package/src/services/PlanService.js +12 -12
- package/src/services/ProjectService.js +34 -41
- package/src/services/PullRequestService.js +7 -7
- package/src/services/SubscriptionService.js +14 -14
- package/src/services/index.js +1 -6
- package/src/utils/TokenManager.js +5 -19
- package/src/utils/services.js +1 -15
- package/dist/cjs/services/ScreenshotService.js +0 -304
- package/dist/cjs/utils/ordering.js +0 -295
- package/dist/esm/services/ScreenshotService.js +0 -992
- package/dist/esm/utils/ordering.js +0 -277
- package/dist/node/services/ScreenshotService.js +0 -285
- package/dist/node/utils/ordering.js +0 -276
- package/src/services/ScreenshotService.js +0 -258
- package/src/utils/ordering.js +0 -240
|
@@ -1,277 +0,0 @@
|
|
|
1
|
-
// src/utils/ordering.js
|
|
2
|
-
function isObjectLike(val) {
|
|
3
|
-
return val && typeof val === "object" && !Array.isArray(val);
|
|
4
|
-
}
|
|
5
|
-
function normalizePath(path) {
|
|
6
|
-
if (Array.isArray(path)) {
|
|
7
|
-
return path;
|
|
8
|
-
}
|
|
9
|
-
if (typeof path === "string") {
|
|
10
|
-
return [path];
|
|
11
|
-
}
|
|
12
|
-
return [];
|
|
13
|
-
}
|
|
14
|
-
function getParentPathsFromTuples(tuples = []) {
|
|
15
|
-
const seen = /* @__PURE__ */ new Set();
|
|
16
|
-
const parents = [];
|
|
17
|
-
const META_KEYS = /* @__PURE__ */ new Set([
|
|
18
|
-
"style",
|
|
19
|
-
"class",
|
|
20
|
-
"text",
|
|
21
|
-
"html",
|
|
22
|
-
"content",
|
|
23
|
-
"data",
|
|
24
|
-
"attr",
|
|
25
|
-
"state",
|
|
26
|
-
"scope",
|
|
27
|
-
"props",
|
|
28
|
-
"define",
|
|
29
|
-
"on",
|
|
30
|
-
"extend",
|
|
31
|
-
"extends",
|
|
32
|
-
"childExtend",
|
|
33
|
-
"childExtends",
|
|
34
|
-
"childProps",
|
|
35
|
-
"children",
|
|
36
|
-
"component",
|
|
37
|
-
"context",
|
|
38
|
-
"tag",
|
|
39
|
-
"key",
|
|
40
|
-
"__order",
|
|
41
|
-
"if"
|
|
42
|
-
]);
|
|
43
|
-
for (let i = 0; i < tuples.length; i++) {
|
|
44
|
-
const tuple = tuples[i];
|
|
45
|
-
if (!Array.isArray(tuple) || tuple.length < 2) {
|
|
46
|
-
continue;
|
|
47
|
-
}
|
|
48
|
-
const path = normalizePath(tuple[1]);
|
|
49
|
-
if (!path.length) {
|
|
50
|
-
continue;
|
|
51
|
-
}
|
|
52
|
-
if (path[0] === "schema") {
|
|
53
|
-
continue;
|
|
54
|
-
}
|
|
55
|
-
const immediateParent = path.slice(0, -1);
|
|
56
|
-
if (immediateParent.length) {
|
|
57
|
-
const key = JSON.stringify(immediateParent);
|
|
58
|
-
if (!seen.has(key)) {
|
|
59
|
-
seen.add(key);
|
|
60
|
-
parents.push(immediateParent);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
const last = path[path.length - 1];
|
|
64
|
-
if (META_KEYS.has(last) && path.length >= 2) {
|
|
65
|
-
const containerParent = path.slice(0, -2);
|
|
66
|
-
if (containerParent.length) {
|
|
67
|
-
const key2 = JSON.stringify(containerParent);
|
|
68
|
-
if (!seen.has(key2)) {
|
|
69
|
-
seen.add(key2);
|
|
70
|
-
parents.push(containerParent);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
for (let j = 0; j < path.length; j++) {
|
|
75
|
-
const seg = path[j];
|
|
76
|
-
if (!META_KEYS.has(seg)) {
|
|
77
|
-
continue;
|
|
78
|
-
}
|
|
79
|
-
const containerParent2 = path.slice(0, j);
|
|
80
|
-
if (!containerParent2.length) {
|
|
81
|
-
continue;
|
|
82
|
-
}
|
|
83
|
-
const key3 = JSON.stringify(containerParent2);
|
|
84
|
-
if (!seen.has(key3)) {
|
|
85
|
-
seen.add(key3);
|
|
86
|
-
parents.push(containerParent2);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
return parents;
|
|
91
|
-
}
|
|
92
|
-
function computeOrdersFromState(root, parentPaths = []) {
|
|
93
|
-
if (!root || typeof root.getByPath !== "function") {
|
|
94
|
-
return [];
|
|
95
|
-
}
|
|
96
|
-
const orders = [];
|
|
97
|
-
const EXCLUDE_KEYS = /* @__PURE__ */ new Set(["__order"]);
|
|
98
|
-
for (let i = 0; i < parentPaths.length; i++) {
|
|
99
|
-
const parentPath = parentPaths[i];
|
|
100
|
-
const obj = (() => {
|
|
101
|
-
try {
|
|
102
|
-
return root.getByPath(parentPath);
|
|
103
|
-
} catch {
|
|
104
|
-
return null;
|
|
105
|
-
}
|
|
106
|
-
})();
|
|
107
|
-
if (!isObjectLike(obj)) {
|
|
108
|
-
continue;
|
|
109
|
-
}
|
|
110
|
-
const keys = Object.keys(obj).filter((k) => !EXCLUDE_KEYS.has(k));
|
|
111
|
-
orders.push({ path: parentPath, keys });
|
|
112
|
-
}
|
|
113
|
-
return orders;
|
|
114
|
-
}
|
|
115
|
-
function normaliseSchemaCode(code) {
|
|
116
|
-
if (typeof code !== "string" || !code.length) {
|
|
117
|
-
return "";
|
|
118
|
-
}
|
|
119
|
-
return code.replaceAll("/////n", "\n").replaceAll("/////tilde", "`");
|
|
120
|
-
}
|
|
121
|
-
function extractTopLevelKeysFromCode(code) {
|
|
122
|
-
const src = normaliseSchemaCode(code);
|
|
123
|
-
if (!src) {
|
|
124
|
-
return [];
|
|
125
|
-
}
|
|
126
|
-
const idx = src.indexOf("export default");
|
|
127
|
-
if (idx === -1) {
|
|
128
|
-
return [];
|
|
129
|
-
}
|
|
130
|
-
let i = src.indexOf("{", idx);
|
|
131
|
-
if (i === -1) {
|
|
132
|
-
return [];
|
|
133
|
-
}
|
|
134
|
-
const keys = [];
|
|
135
|
-
let depth = 0;
|
|
136
|
-
let inStr = false;
|
|
137
|
-
let strCh = "";
|
|
138
|
-
let inEsc = false;
|
|
139
|
-
for (; i < src.length; i++) {
|
|
140
|
-
const ch = src[i];
|
|
141
|
-
if (inStr) {
|
|
142
|
-
if (inEsc) {
|
|
143
|
-
inEsc = false;
|
|
144
|
-
} else if (ch === "\\") {
|
|
145
|
-
inEsc = true;
|
|
146
|
-
} else if (ch === strCh) {
|
|
147
|
-
inStr = false;
|
|
148
|
-
strCh = "";
|
|
149
|
-
}
|
|
150
|
-
continue;
|
|
151
|
-
}
|
|
152
|
-
if (ch === '"' || ch === "'" || ch === "`") {
|
|
153
|
-
inStr = true;
|
|
154
|
-
strCh = ch;
|
|
155
|
-
continue;
|
|
156
|
-
}
|
|
157
|
-
if (ch === "{") {
|
|
158
|
-
depth++;
|
|
159
|
-
continue;
|
|
160
|
-
}
|
|
161
|
-
if (ch === "}") {
|
|
162
|
-
depth--;
|
|
163
|
-
if (depth === 0) {
|
|
164
|
-
break;
|
|
165
|
-
}
|
|
166
|
-
continue;
|
|
167
|
-
}
|
|
168
|
-
if (depth !== 1) {
|
|
169
|
-
continue;
|
|
170
|
-
}
|
|
171
|
-
if (/[A-Za-z_$]/u.test(ch)) {
|
|
172
|
-
let j = i;
|
|
173
|
-
while (j < src.length && /[A-Za-z0-9_$]/u.test(src[j])) {
|
|
174
|
-
j++;
|
|
175
|
-
}
|
|
176
|
-
let k = j;
|
|
177
|
-
while (k < src.length && /\s/u.test(src[k])) {
|
|
178
|
-
k++;
|
|
179
|
-
}
|
|
180
|
-
if (src[k] === ":") {
|
|
181
|
-
const key = src.slice(i, j);
|
|
182
|
-
keys.push(key);
|
|
183
|
-
}
|
|
184
|
-
i = j;
|
|
185
|
-
continue;
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
if (!keys.length) {
|
|
189
|
-
const bodyStart = src.indexOf("{", idx);
|
|
190
|
-
const bodyEnd = src.lastIndexOf("}");
|
|
191
|
-
if (bodyStart === -1 || bodyEnd === -1 || bodyEnd <= bodyStart) {
|
|
192
|
-
return Array.from(new Set(keys));
|
|
193
|
-
}
|
|
194
|
-
const body = src.slice(bodyStart + 1, bodyEnd);
|
|
195
|
-
const re = /(?:[A-Za-z_$][A-Za-z0-9_$]*|"[^"]+"|'[^']+')\s*:/gu;
|
|
196
|
-
for (const m of body.matchAll(re)) {
|
|
197
|
-
const raw = m[0].split(":")[0].trim();
|
|
198
|
-
const key = raw[0] === '"' || raw[0] === "'" ? raw.slice(1, -1) : raw;
|
|
199
|
-
keys.push(key);
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
return Array.from(new Set(keys));
|
|
203
|
-
}
|
|
204
|
-
function computeOrdersForTuples(root, tuples = []) {
|
|
205
|
-
const preferredOrderMap = /* @__PURE__ */ new Map();
|
|
206
|
-
for (let i = 0; i < tuples.length; i++) {
|
|
207
|
-
const t = tuples[i];
|
|
208
|
-
if (!Array.isArray(t)) {
|
|
209
|
-
continue;
|
|
210
|
-
}
|
|
211
|
-
const [action, path, value] = t;
|
|
212
|
-
const p = normalizePath(path);
|
|
213
|
-
if (action !== "update" || !Array.isArray(p) || p.length < 3) {
|
|
214
|
-
continue;
|
|
215
|
-
}
|
|
216
|
-
if (p[0] !== "schema") {
|
|
217
|
-
continue;
|
|
218
|
-
}
|
|
219
|
-
const [, type, key] = p;
|
|
220
|
-
const containerPath = [type, key];
|
|
221
|
-
const uses = value && Array.isArray(value.uses) ? value.uses : null;
|
|
222
|
-
const code = value && value.code;
|
|
223
|
-
const obj = (() => {
|
|
224
|
-
try {
|
|
225
|
-
return root && typeof root.getByPath === "function" ? root.getByPath(containerPath) : null;
|
|
226
|
-
} catch {
|
|
227
|
-
return null;
|
|
228
|
-
}
|
|
229
|
-
})();
|
|
230
|
-
if (!obj) {
|
|
231
|
-
continue;
|
|
232
|
-
}
|
|
233
|
-
const present = new Set(Object.keys(obj));
|
|
234
|
-
const EXCLUDE_KEYS = /* @__PURE__ */ new Set(["__order"]);
|
|
235
|
-
const codeKeys = extractTopLevelKeysFromCode(code);
|
|
236
|
-
let resolved = [];
|
|
237
|
-
if (Array.isArray(codeKeys) && codeKeys.length) {
|
|
238
|
-
resolved = codeKeys.filter((k) => present.has(k) && !EXCLUDE_KEYS.has(k));
|
|
239
|
-
}
|
|
240
|
-
if (resolved.length && Array.isArray(uses) && uses.length) {
|
|
241
|
-
for (let u = 0; u < uses.length; u++) {
|
|
242
|
-
const keyName = uses[u];
|
|
243
|
-
if (present.has(keyName) && !EXCLUDE_KEYS.has(keyName) && !resolved.includes(keyName)) {
|
|
244
|
-
resolved.push(keyName);
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
if (resolved.length) {
|
|
249
|
-
preferredOrderMap.set(JSON.stringify(containerPath), { path: containerPath, keys: resolved });
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
const parents = getParentPathsFromTuples(tuples);
|
|
253
|
-
const orders = [];
|
|
254
|
-
const seen = /* @__PURE__ */ new Set();
|
|
255
|
-
preferredOrderMap.forEach((v) => {
|
|
256
|
-
const k = JSON.stringify(v.path);
|
|
257
|
-
if (!seen.has(k)) {
|
|
258
|
-
seen.add(k);
|
|
259
|
-
orders.push(v);
|
|
260
|
-
}
|
|
261
|
-
});
|
|
262
|
-
const fallbackOrders = computeOrdersFromState(root, parents);
|
|
263
|
-
for (let i = 0; i < fallbackOrders.length; i++) {
|
|
264
|
-
const v = fallbackOrders[i];
|
|
265
|
-
const k = JSON.stringify(v.path);
|
|
266
|
-
if (!seen.has(k)) {
|
|
267
|
-
seen.add(k);
|
|
268
|
-
orders.push(v);
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
return orders;
|
|
272
|
-
}
|
|
273
|
-
export {
|
|
274
|
-
computeOrdersForTuples,
|
|
275
|
-
computeOrdersFromState,
|
|
276
|
-
getParentPathsFromTuples
|
|
277
|
-
};
|
|
@@ -1,285 +0,0 @@
|
|
|
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: true,
|
|
246
|
-
process_descriptions: true,
|
|
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
|
-
};
|