@symbo.ls/sdk 2.32.11 → 2.32.13

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 +38 -12
  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 +661 -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 +20747 -5912
  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 +18321 -0
  26. package/dist/esm/services/index.js +20667 -5882
  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 +42 -16
  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 +632 -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 +44 -14
  41. package/src/services/BaseService.js +43 -0
  42. package/src/services/DnsService.js +5 -5
  43. package/src/services/TrackingService.js +853 -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,11 +10,20 @@ 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";
18
18
  import { rootBus } from "./state/rootEventBus.js";
19
+ const isBrowserEnvironment = () => typeof window !== "undefined";
20
+ const isLocalhost = () => {
21
+ if (!isBrowserEnvironment()) {
22
+ return false;
23
+ }
24
+ const host = window.location && window.location.hostname;
25
+ return host === "localhost" || host === "127.0.0.1" || host === "::1" || host === "" || !host;
26
+ };
19
27
  class SDK {
20
28
  constructor(options = {}) {
21
29
  this._services = /* @__PURE__ */ new Map();
@@ -38,13 +46,6 @@ class SDK {
38
46
  options: this._options
39
47
  })
40
48
  ),
41
- this._initService(
42
- "core",
43
- createCoreService({
44
- context: this._context,
45
- options: this._options
46
- })
47
- ),
48
49
  this._initService(
49
50
  "collab",
50
51
  createCollabService({
@@ -122,6 +123,13 @@ class SDK {
122
123
  context: this._context,
123
124
  options: this._options
124
125
  })
126
+ ),
127
+ this._initService(
128
+ "tracking",
129
+ createTrackingService({
130
+ context: this._context,
131
+ options: this._options
132
+ })
125
133
  )
126
134
  ]);
127
135
  return this;
@@ -139,6 +147,8 @@ class SDK {
139
147
  this._services.set(name, service);
140
148
  }
141
149
  _validateOptions(options) {
150
+ const onLocalhost = isLocalhost();
151
+ const hasGrafanaUrl = Boolean(environment.grafanaUrl);
142
152
  const defaults = {
143
153
  useNewServices: true,
144
154
  // Use new service implementations by default
@@ -146,9 +156,24 @@ class SDK {
146
156
  socketUrl: environment.socketUrl,
147
157
  timeout: 3e4,
148
158
  retryAttempts: 3,
149
- debug: false
159
+ debug: false,
160
+ tracking: {
161
+ // Force-disabled on localhost or when no Grafana URL is configured
162
+ enabled: onLocalhost ? false : hasGrafanaUrl ? environment.features.trackingEnabled : false
163
+ }
164
+ };
165
+ const merged = {
166
+ ...defaults,
167
+ ...options,
168
+ tracking: {
169
+ ...defaults.tracking,
170
+ ...options.tracking || {}
171
+ }
150
172
  };
151
- return { ...defaults, ...options };
173
+ if (onLocalhost || !hasGrafanaUrl) {
174
+ merged.tracking.enabled = false;
175
+ }
176
+ return merged;
152
177
  }
153
178
  // Get service instance
154
179
  getService(name) {
@@ -159,7 +184,7 @@ class SDK {
159
184
  }
160
185
  // Update context
161
186
  updateContext(newContext) {
162
- const { authToken, ...sanitized } = newContext || {};
187
+ const { ...sanitized } = newContext || {};
163
188
  this._context = {
164
189
  ...this._context,
165
190
  ...sanitized
@@ -223,7 +248,6 @@ class SDK {
223
248
  var index_default = SDK;
224
249
  import {
225
250
  createAuthService as createAuthService2,
226
- createCoreService as createCoreService2,
227
251
  createCollabService as createCollabService2,
228
252
  createProjectService as createProjectService2,
229
253
  createPlanService as createPlanService2,
@@ -233,7 +257,8 @@ import {
233
257
  createBranchService as createBranchService2,
234
258
  createPullRequestService as createPullRequestService2,
235
259
  createAdminService as createAdminService2,
236
- createSubscriptionService as createSubscriptionService2
260
+ createSubscriptionService as createSubscriptionService2,
261
+ createTrackingService as createTrackingService2
237
262
  } from "./services/index.js";
238
263
  import { default as default2 } from "./config/environment.js";
239
264
  export {
@@ -242,7 +267,6 @@ export {
242
267
  createAuthService2 as createAuthService,
243
268
  createBranchService2 as createBranchService,
244
269
  createCollabService2 as createCollabService,
245
- createCoreService2 as createCoreService,
246
270
  createDnsService2 as createDnsService,
247
271
  createFileService2 as createFileService,
248
272
  createPaymentService2 as createPaymentService,
@@ -250,6 +274,8 @@ export {
250
274
  createProjectService2 as createProjectService,
251
275
  createPullRequestService2 as createPullRequestService,
252
276
  createSubscriptionService2 as createSubscriptionService,
277
+ createTrackingService2 as createTrackingService,
253
278
  index_default as default,
254
- default2 as environment
279
+ default2 as environment,
280
+ isLocalhost
255
281
  };
@@ -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
  /**