@symbo.ls/sdk 2.32.11 → 2.32.12

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 +141 -0
  2. package/dist/cjs/config/environment.js +18 -7
  3. package/dist/cjs/index.js +21 -11
  4. package/dist/cjs/services/BaseService.js +46 -0
  5. package/dist/cjs/services/DnsService.js +6 -5
  6. package/dist/cjs/services/TrackingService.js +668 -0
  7. package/dist/cjs/services/index.js +5 -5
  8. package/dist/cjs/utils/changePreprocessor.js +8 -1
  9. package/dist/cjs/utils/services.js +27 -3
  10. package/dist/esm/config/environment.js +18 -7
  11. package/dist/esm/index.js +20737 -5911
  12. package/dist/esm/services/AdminService.js +64 -7
  13. package/dist/esm/services/AuthService.js +64 -7
  14. package/dist/esm/services/BaseService.js +64 -7
  15. package/dist/esm/services/BranchService.js +64 -7
  16. package/dist/esm/services/CollabService.js +72 -8
  17. package/dist/esm/services/DnsService.js +70 -12
  18. package/dist/esm/services/FileService.js +64 -7
  19. package/dist/esm/services/PaymentService.js +64 -7
  20. package/dist/esm/services/PlanService.js +64 -7
  21. package/dist/esm/services/ProjectService.js +72 -8
  22. package/dist/esm/services/PullRequestService.js +64 -7
  23. package/dist/esm/services/ScreenshotService.js +64 -7
  24. package/dist/esm/services/SubscriptionService.js +64 -7
  25. package/dist/esm/services/TrackingService.js +18328 -0
  26. package/dist/esm/services/index.js +20673 -5881
  27. package/dist/esm/utils/CollabClient.js +18 -7
  28. package/dist/esm/utils/changePreprocessor.js +8 -1
  29. package/dist/esm/utils/services.js +27 -3
  30. package/dist/node/config/environment.js +18 -7
  31. package/dist/node/index.js +25 -15
  32. package/dist/node/services/BaseService.js +46 -0
  33. package/dist/node/services/DnsService.js +6 -5
  34. package/dist/node/services/TrackingService.js +639 -0
  35. package/dist/node/services/index.js +5 -5
  36. package/dist/node/utils/changePreprocessor.js +8 -1
  37. package/dist/node/utils/services.js +27 -3
  38. package/package.json +8 -6
  39. package/src/config/environment.js +19 -11
  40. package/src/index.js +24 -14
  41. package/src/services/BaseService.js +43 -0
  42. package/src/services/DnsService.js +5 -5
  43. package/src/services/TrackingService.js +861 -0
  44. package/src/services/index.js +6 -5
  45. package/src/utils/changePreprocessor.js +25 -1
  46. package/src/utils/services.js +28 -4
  47. package/dist/cjs/services/CoreService.js +0 -2818
  48. package/dist/esm/services/CoreService.js +0 -3513
  49. package/dist/node/services/CoreService.js +0 -2789
  50. package/src/services/CoreService.js +0 -3208
@@ -17472,7 +17472,9 @@ var CONFIG = {
17472
17472
  // Feature toggles that apply across all environments by default
17473
17473
  features: {
17474
17474
  newUserOnboarding: true,
17475
- betaFeatures: false
17475
+ betaFeatures: false,
17476
+ // Tracking is enabled by default unless overridden per environment
17477
+ trackingEnabled: true
17476
17478
  }
17477
17479
  },
17478
17480
  // Environment-specific configurations
@@ -17490,13 +17492,17 @@ var CONFIG = {
17490
17492
  // For based api
17491
17493
  githubClientId: "Ov23liAFrsR0StbAO6PO",
17492
17494
  // For github api
17493
- grafanaUrl: "https://faro-collector-prod-us-east-0.grafana.net/collect/aef64330db80bdfeaac084317bf72f99",
17495
+ grafanaUrl: "",
17494
17496
  // For grafana tracing
17495
- grafanaAppName: "Localhost Symbols",
17497
+ grafanaAppName: "Symbols Localhost",
17496
17498
  // Environment-specific feature toggles (override common)
17497
17499
  features: {
17498
- betaFeatures: true
17500
+ // Disable tracking by default on localhost/dev machines
17501
+ trackingEnabled: false,
17499
17502
  // Enable beta features in local dev
17503
+ betaFeatures: true,
17504
+ // Preserve common defaults explicitly for local
17505
+ newUserOnboarding: true
17500
17506
  },
17501
17507
  typesenseCollectionName: "docs",
17502
17508
  typesenseApiKey: "vZya3L2zpq8L6iI5WWMUZJZABvT63VDb",
@@ -17524,7 +17530,7 @@ var CONFIG = {
17524
17530
  basedProject: "platform-v2-sm",
17525
17531
  basedOrg: "symbols",
17526
17532
  githubClientId: "Ov23liHxyWFBxS8f1gnF",
17527
- grafanaUrl: "https://faro-collector-prod-us-east-0.grafana.net/collect/7a3ba473cee2025c68513667024316b8",
17533
+ grafanaUrl: "",
17528
17534
  // For grafana tracing
17529
17535
  grafanaAppName: "Symbols Test",
17530
17536
  typesenseCollectionName: "docs",
@@ -17537,7 +17543,7 @@ var CONFIG = {
17537
17543
  socketUrl: "https://upcoming.api.symbols.app",
17538
17544
  apiUrl: "https://upcoming.api.symbols.app",
17539
17545
  githubClientId: "Ov23liWF7NvdZ056RV5J",
17540
- grafanaUrl: "https://faro-collector-prod-us-east-0.grafana.net/collect/7a3ba473cee2025c68513667024316b8",
17546
+ grafanaUrl: "",
17541
17547
  // For grafana tracing
17542
17548
  grafanaAppName: "Symbols Upcoming",
17543
17549
  typesenseCollectionName: "docs",
@@ -17553,7 +17559,7 @@ var CONFIG = {
17553
17559
  basedProject: "platform-v2-sm",
17554
17560
  basedOrg: "symbols",
17555
17561
  githubClientId: "Ov23ligwZDQVD0VfuWNa",
17556
- grafanaUrl: "https://faro-collector-prod-us-east-0.grafana.net/collect/7a3ba473cee2025c68513667024316b8",
17562
+ grafanaUrl: "",
17557
17563
  // For grafana tracing
17558
17564
  grafanaAppName: "Symbols Staging",
17559
17565
  typesenseCollectionName: "docs",
@@ -17592,6 +17598,11 @@ var getConfig = () => {
17592
17598
  const envConfig = { ...CONFIG.common, ...CONFIG[env] };
17593
17599
  const finalConfig = {
17594
17600
  ...envConfig,
17601
+ // Deep-merge feature flags so env-specific overrides don't drop common defaults
17602
+ features: {
17603
+ ...CONFIG.common.features || {},
17604
+ ...CONFIG[env] && CONFIG[env].features || {}
17605
+ },
17595
17606
  socketUrl: process.env.SYMBOLS_APP_SOCKET_URL || envConfig.socketUrl,
17596
17607
  apiUrl: process.env.SYMBOLS_APP_API_URL || envConfig.apiUrl,
17597
17608
  basedEnv: process.env.SYMBOLS_APP_BASED_ENV || envConfig.basedEnv,
@@ -352,7 +352,14 @@ function preprocessChanges(root, tuples = [], options = {}) {
352
352
  if (!canConsiderExpansion || isFilesPath || value && value.type === "files") {
353
353
  return [t];
354
354
  }
355
- const prev = getByPathSafe(root, path) || {};
355
+ const prevRaw = getByPathSafe(root, path);
356
+ const isCreatePath = Array.isArray(path) && action === "update" && // e.g. ['update', ['components', 'NewKey'], {...}]
357
+ (!isSchemaPath && path.length === 2 || // e.g. ['update', ['schema', 'components', 'NewKey'], {...}]
358
+ isSchemaPath && path.length === 3) && (prevRaw === null || typeof prevRaw === "undefined");
359
+ if (isCreatePath) {
360
+ return [t];
361
+ }
362
+ const prev = prevRaw || {};
356
363
  const next = value || {};
357
364
  if (!isPlainObject2(prev) || !isPlainObject2(next)) {
358
365
  return [t];
@@ -223,8 +223,6 @@ var SERVICE_METHODS = {
223
223
  suspendUser: "admin",
224
224
  promoteToAdmin: "admin",
225
225
  demoteFromAdmin: "admin",
226
- // Utility methods
227
- getHealthStatus: "core",
228
226
  // Screenshot methods
229
227
  createScreenshotProject: "screenshot",
230
228
  getProjectScreenshots: "screenshot",
@@ -237,7 +235,33 @@ var SERVICE_METHODS = {
237
235
  getComponentScreenshot: "screenshot",
238
236
  getScreenshotByKey: "screenshot",
239
237
  getQueueStatistics: "screenshot",
240
- refreshThumbnail: "screenshot"
238
+ refreshThumbnail: "screenshot",
239
+ // Tracking methods
240
+ configureTracking: "tracking",
241
+ trackEvent: "tracking",
242
+ trackError: "tracking",
243
+ captureException: "tracking",
244
+ logMessage: "tracking",
245
+ logDebug: "tracking",
246
+ logInfo: "tracking",
247
+ logWarning: "tracking",
248
+ logWarn: "tracking",
249
+ logErrorMessage: "tracking",
250
+ logError: "tracking",
251
+ addBreadcrumb: "tracking",
252
+ trackMeasurement: "tracking",
253
+ trackView: "tracking",
254
+ setUser: "tracking",
255
+ clearUser: "tracking",
256
+ setSession: "tracking",
257
+ clearSession: "tracking",
258
+ setGlobalAttributes: "tracking",
259
+ setGlobalAttribute: "tracking",
260
+ removeGlobalAttribute: "tracking",
261
+ flushQueue: "tracking",
262
+ getClient: "tracking",
263
+ isEnabled: "tracking",
264
+ isInitialized: "tracking"
241
265
  };
242
266
  export {
243
267
  SERVICE_METHODS
@@ -7,7 +7,9 @@ const CONFIG = {
7
7
  // Feature toggles that apply across all environments by default
8
8
  features: {
9
9
  newUserOnboarding: true,
10
- betaFeatures: false
10
+ betaFeatures: false,
11
+ // Tracking is enabled by default unless overridden per environment
12
+ trackingEnabled: true
11
13
  }
12
14
  },
13
15
  // Environment-specific configurations
@@ -25,13 +27,17 @@ const CONFIG = {
25
27
  // For based api
26
28
  githubClientId: "Ov23liAFrsR0StbAO6PO",
27
29
  // For github api
28
- grafanaUrl: "https://faro-collector-prod-us-east-0.grafana.net/collect/aef64330db80bdfeaac084317bf72f99",
30
+ grafanaUrl: "",
29
31
  // For grafana tracing
30
- grafanaAppName: "Localhost Symbols",
32
+ grafanaAppName: "Symbols Localhost",
31
33
  // Environment-specific feature toggles (override common)
32
34
  features: {
33
- betaFeatures: true
35
+ // Disable tracking by default on localhost/dev machines
36
+ trackingEnabled: false,
34
37
  // Enable beta features in local dev
38
+ betaFeatures: true,
39
+ // Preserve common defaults explicitly for local
40
+ newUserOnboarding: true
35
41
  },
36
42
  typesenseCollectionName: "docs",
37
43
  typesenseApiKey: "vZya3L2zpq8L6iI5WWMUZJZABvT63VDb",
@@ -59,7 +65,7 @@ const CONFIG = {
59
65
  basedProject: "platform-v2-sm",
60
66
  basedOrg: "symbols",
61
67
  githubClientId: "Ov23liHxyWFBxS8f1gnF",
62
- grafanaUrl: "https://faro-collector-prod-us-east-0.grafana.net/collect/7a3ba473cee2025c68513667024316b8",
68
+ grafanaUrl: "",
63
69
  // For grafana tracing
64
70
  grafanaAppName: "Symbols Test",
65
71
  typesenseCollectionName: "docs",
@@ -72,7 +78,7 @@ const CONFIG = {
72
78
  socketUrl: "https://upcoming.api.symbols.app",
73
79
  apiUrl: "https://upcoming.api.symbols.app",
74
80
  githubClientId: "Ov23liWF7NvdZ056RV5J",
75
- grafanaUrl: "https://faro-collector-prod-us-east-0.grafana.net/collect/7a3ba473cee2025c68513667024316b8",
81
+ grafanaUrl: "",
76
82
  // For grafana tracing
77
83
  grafanaAppName: "Symbols Upcoming",
78
84
  typesenseCollectionName: "docs",
@@ -88,7 +94,7 @@ const CONFIG = {
88
94
  basedProject: "platform-v2-sm",
89
95
  basedOrg: "symbols",
90
96
  githubClientId: "Ov23ligwZDQVD0VfuWNa",
91
- grafanaUrl: "https://faro-collector-prod-us-east-0.grafana.net/collect/7a3ba473cee2025c68513667024316b8",
97
+ grafanaUrl: "",
92
98
  // For grafana tracing
93
99
  grafanaAppName: "Symbols Staging",
94
100
  typesenseCollectionName: "docs",
@@ -128,6 +134,11 @@ const getConfig = () => {
128
134
  const envConfig = { ...CONFIG.common, ...CONFIG[env] };
129
135
  const finalConfig = {
130
136
  ...envConfig,
137
+ // Deep-merge feature flags so env-specific overrides don't drop common defaults
138
+ features: {
139
+ ...CONFIG.common.features || {},
140
+ ...CONFIG[env] && CONFIG[env].features || {}
141
+ },
131
142
  socketUrl: process.env.SYMBOLS_APP_SOCKET_URL || envConfig.socketUrl,
132
143
  apiUrl: process.env.SYMBOLS_APP_API_URL || envConfig.apiUrl,
133
144
  basedEnv: process.env.SYMBOLS_APP_BASED_ENV || envConfig.basedEnv,
@@ -1,6 +1,5 @@
1
1
  import {
2
2
  createAuthService,
3
- createCoreService,
4
3
  createCollabService,
5
4
  createProjectService,
6
5
  createPlanService,
@@ -11,7 +10,8 @@ import {
11
10
  createPullRequestService,
12
11
  createAdminService,
13
12
  createSubscriptionService,
14
- createScreenshotService
13
+ createScreenshotService,
14
+ createTrackingService
15
15
  } from "./services/index.js";
16
16
  import { SERVICE_METHODS } from "./utils/services.js";
17
17
  import environment from "./config/environment.js";
@@ -38,13 +38,6 @@ class SDK {
38
38
  options: this._options
39
39
  })
40
40
  ),
41
- this._initService(
42
- "core",
43
- createCoreService({
44
- context: this._context,
45
- options: this._options
46
- })
47
- ),
48
41
  this._initService(
49
42
  "collab",
50
43
  createCollabService({
@@ -122,6 +115,13 @@ class SDK {
122
115
  context: this._context,
123
116
  options: this._options
124
117
  })
118
+ ),
119
+ this._initService(
120
+ "tracking",
121
+ createTrackingService({
122
+ context: this._context,
123
+ options: this._options
124
+ })
125
125
  )
126
126
  ]);
127
127
  return this;
@@ -146,9 +146,19 @@ class SDK {
146
146
  socketUrl: environment.socketUrl,
147
147
  timeout: 3e4,
148
148
  retryAttempts: 3,
149
- debug: false
149
+ debug: false,
150
+ tracking: {
151
+ enabled: environment.features.trackingEnabled
152
+ }
153
+ };
154
+ return {
155
+ ...defaults,
156
+ ...options,
157
+ tracking: {
158
+ ...defaults.tracking,
159
+ ...options.tracking || {}
160
+ }
150
161
  };
151
- return { ...defaults, ...options };
152
162
  }
153
163
  // Get service instance
154
164
  getService(name) {
@@ -159,7 +169,7 @@ class SDK {
159
169
  }
160
170
  // Update context
161
171
  updateContext(newContext) {
162
- const { authToken, ...sanitized } = newContext || {};
172
+ const { ...sanitized } = newContext || {};
163
173
  this._context = {
164
174
  ...this._context,
165
175
  ...sanitized
@@ -223,7 +233,6 @@ class SDK {
223
233
  var index_default = SDK;
224
234
  import {
225
235
  createAuthService as createAuthService2,
226
- createCoreService as createCoreService2,
227
236
  createCollabService as createCollabService2,
228
237
  createProjectService as createProjectService2,
229
238
  createPlanService as createPlanService2,
@@ -233,7 +242,8 @@ import {
233
242
  createBranchService as createBranchService2,
234
243
  createPullRequestService as createPullRequestService2,
235
244
  createAdminService as createAdminService2,
236
- createSubscriptionService as createSubscriptionService2
245
+ createSubscriptionService as createSubscriptionService2,
246
+ createTrackingService as createTrackingService2
237
247
  } from "./services/index.js";
238
248
  import { default as default2 } from "./config/environment.js";
239
249
  export {
@@ -242,7 +252,6 @@ export {
242
252
  createAuthService2 as createAuthService,
243
253
  createBranchService2 as createBranchService,
244
254
  createCollabService2 as createCollabService,
245
- createCoreService2 as createCoreService,
246
255
  createDnsService2 as createDnsService,
247
256
  createFileService2 as createFileService,
248
257
  createPaymentService2 as createPaymentService,
@@ -250,6 +259,7 @@ export {
250
259
  createProjectService2 as createProjectService,
251
260
  createPullRequestService2 as createPullRequestService,
252
261
  createSubscriptionService2 as createSubscriptionService,
262
+ createTrackingService2 as createTrackingService,
253
263
  index_default as default,
254
264
  default2 as environment
255
265
  };
@@ -56,6 +56,39 @@ class BaseService {
56
56
  this._ready = false;
57
57
  this._error = error;
58
58
  }
59
+ _getTrackingService() {
60
+ var _a;
61
+ const services = (_a = this._context) == null ? void 0 : _a.services;
62
+ const tracking = services == null ? void 0 : services.tracking;
63
+ if (!tracking || typeof tracking.trackError !== "function") {
64
+ return null;
65
+ }
66
+ return tracking;
67
+ }
68
+ _shouldTrackErrors() {
69
+ var _a;
70
+ const name = (_a = this == null ? void 0 : this.constructor) == null ? void 0 : _a.name;
71
+ return name !== "TrackingService";
72
+ }
73
+ _trackServiceError(error, details = {}) {
74
+ var _a;
75
+ if (!this._shouldTrackErrors()) {
76
+ return;
77
+ }
78
+ try {
79
+ const tracking = this._getTrackingService();
80
+ if (!tracking) {
81
+ return;
82
+ }
83
+ const context = {
84
+ service: ((_a = this == null ? void 0 : this.constructor) == null ? void 0 : _a.name) || "UnknownService",
85
+ apiUrl: this._apiUrl || null,
86
+ ...details
87
+ };
88
+ tracking.trackError(error instanceof Error ? error : new Error(String(error)), context);
89
+ } catch {
90
+ }
91
+ }
59
92
  _requireAuth() {
60
93
  if (!this._context.authToken) {
61
94
  throw new Error("Authentication required");
@@ -105,10 +138,23 @@ class BaseService {
105
138
  error = await response.json();
106
139
  } catch {
107
140
  }
141
+ this._trackServiceError(
142
+ new Error(error.message || error.error || `HTTP ${response.status}: ${response.statusText}`),
143
+ {
144
+ endpoint,
145
+ methodName: options.methodName,
146
+ status: response.status,
147
+ statusText: response.statusText
148
+ }
149
+ );
108
150
  throw new Error(error.message || error.error || "Request failed", { cause: error });
109
151
  }
110
152
  return response.status === 204 ? null : response.json();
111
153
  } catch (error) {
154
+ this._trackServiceError(error, {
155
+ endpoint,
156
+ methodName: options.methodName
157
+ });
112
158
  throw new Error(`Request failed: ${error.message}`, { cause: error });
113
159
  }
114
160
  }
@@ -53,7 +53,7 @@ class DnsService extends BaseService {
53
53
  }
54
54
  throw new Error(response.message);
55
55
  } catch (error) {
56
- throw new Error(`Failed to get custom host: ${error.message}`);
56
+ throw new Error(`Failed to get custom host: ${error.message}`, { cause: error });
57
57
  }
58
58
  }
59
59
  async removeDnsRecord(domain) {
@@ -121,7 +121,8 @@ class DnsService extends BaseService {
121
121
  throw new Error(response.message);
122
122
  } catch (error) {
123
123
  throw new Error(
124
- `Failed to update project custom domains: ${error.message}`
124
+ `Failed to update project custom domains: ${error.message}`,
125
+ { cause: error }
125
126
  );
126
127
  }
127
128
  }
@@ -279,7 +280,7 @@ class DnsService extends BaseService {
279
280
  needsVerification: false
280
281
  };
281
282
  } catch (error) {
282
- throw new Error(`Failed to verify domain ownership: ${error.message}`);
283
+ throw new Error(`Failed to verify domain ownership: ${error.message}`, { cause: error });
283
284
  }
284
285
  }
285
286
  /**
@@ -300,7 +301,7 @@ class DnsService extends BaseService {
300
301
  }
301
302
  throw new Error(response.message);
302
303
  } catch (error) {
303
- throw new Error(`Failed to get project domains: ${error.message}`);
304
+ throw new Error(`Failed to get project domains: ${error.message}`, { cause: error });
304
305
  }
305
306
  }
306
307
  /**
@@ -324,7 +325,7 @@ class DnsService extends BaseService {
324
325
  }
325
326
  throw new Error(response.message);
326
327
  } catch (error) {
327
- throw new Error(`Failed to remove project custom domain: ${error.message}`);
328
+ throw new Error(`Failed to remove project custom domain: ${error.message}`, { cause: error });
328
329
  }
329
330
  }
330
331
  /**