@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
@@ -3,9 +3,8 @@ import { CollabClient } from '../utils/CollabClient.js'
3
3
  import { RootStateManager } from '../state/RootStateManager.js'
4
4
  import { rootBus } from '../state/rootEventBus.js'
5
5
  import { validateParams } from '../utils/validation.js'
6
- // Direct import to allow deep stringification in non-browser (Node) environments
7
- import { deepStringify } from '@domql/utils'
8
- // (helper conversions reserved for future features)
6
+ import { deepStringifyFunctions } from '@domql/utils'
7
+ import { preprocessChanges } from '../utils/changePreprocessor.js'
9
8
 
10
9
  export class CollabService extends BaseService {
11
10
  constructor(config) {
@@ -71,7 +70,7 @@ export class CollabService extends BaseService {
71
70
  }
72
71
 
73
72
  // 🌐 Ensure we always have a usable `__element` stub so that calls like
74
- // `el.call('openNotification', …)` or `el.call('deepStringify', …)` do not
73
+ // `el.call('openNotification', …)` or `el.call('deepStringifyFunctions', …)` do not
75
74
  // crash in headless / Node.js environments (e.g. integration tests).
76
75
  const root = this._stateManager?.root
77
76
 
@@ -92,9 +91,9 @@ export class CollabService extends BaseService {
92
91
  logger(`[Notification] ${title}${message ? ` – ${message}` : ''}`)
93
92
  return
94
93
  }
95
- case 'deepStringify': {
94
+ case 'deepStringifyFunctions': {
96
95
  // Pass-through to the shared utility from `smbls`
97
- return deepStringify(...args)
96
+ return deepStringifyFunctions(...args)
98
97
  }
99
98
  default:
100
99
  return {}
@@ -137,73 +136,65 @@ export class CollabService extends BaseService {
137
136
  await this.disconnect()
138
137
  }
139
138
 
140
- try {
141
- this._client = new CollabClient({
142
- jwt,
143
- projectId,
144
- branch,
145
- live: Boolean(pro)
146
- })
147
-
148
- // Mark as connected once the socket establishes a connection. This prevents
149
- // the SDK from being stuck waiting for an initial snapshot that may never
150
- // arrive (e.g. for new/empty documents).
151
- await new Promise((resolve) => {
152
- if (this._client.socket?.connected) {
153
- resolve()
154
- } else {
155
- this._client.socket?.once('connect', resolve)
156
- }
157
- })
158
-
159
- console.log('[CollabService] socket connected')
139
+ this._client = new CollabClient({
140
+ jwt,
141
+ projectId,
142
+ branch,
143
+ live: Boolean(pro)
144
+ })
160
145
 
161
- // Set up event listeners
162
- this._client.socket?.on('ops', ({ changes }) => {
163
- console.log(`ops event`)
164
- console.log(changes)
165
- this._stateManager.applyChanges(changes, { fromSocket: true })
166
- })
146
+ // Mark as connected once the socket establishes a connection. This prevents
147
+ // the SDK from being stuck waiting for an initial snapshot that may never
148
+ // arrive (e.g. for new/empty documents).
149
+ await new Promise((resolve) => {
150
+ if (this._client.socket?.connected) {
151
+ resolve()
152
+ } else {
153
+ this._client.socket?.once('connect', resolve)
154
+ }
155
+ })
167
156
 
168
- this._client.socket?.on('commit', ({ version }) => {
169
- if (version) {
170
- this._stateManager.setVersion(version)
171
- }
157
+ // Set up event listeners
158
+ this._client.socket?.on('ops', ({ changes }) => {
159
+ console.log(`ops event`)
160
+ this._stateManager.applyChanges(changes, { fromSocket: true })
161
+ })
172
162
 
173
- // Inform UI about automatic commit
174
- rootBus.emit('checkpoint:done', { version, origin: 'auto' })
175
- })
163
+ this._client.socket?.on('commit', ({ version }) => {
164
+ if (version) {
165
+ this._stateManager.setVersion(version)
166
+ }
176
167
 
177
- // 🔄 Presence / members / cursor updates
178
- this._client.socket?.on('clients', this._handleClientsEvent.bind(this))
168
+ // Inform UI about automatic commit
169
+ rootBus.emit('checkpoint:done', { version, origin: 'auto' })
170
+ })
179
171
 
180
- // 🗜️ Bundle events emitted by the dependency bundler service
181
- this._client.socket?.on(
182
- 'bundle:done',
183
- this._handleBundleDoneEvent.bind(this)
184
- )
185
- this._client.socket?.on(
186
- 'bundle:error',
187
- this._handleBundleErrorEvent.bind(this)
172
+ // 🔄 Presence / members / cursor updates
173
+ this._client.socket?.on('clients', this._handleClientsEvent.bind(this))
174
+
175
+ // 🗜️ Bundle events – emitted by the dependency bundler service
176
+ this._client.socket?.on(
177
+ 'bundle:done',
178
+ this._handleBundleDoneEvent.bind(this)
179
+ )
180
+ this._client.socket?.on(
181
+ 'bundle:error',
182
+ this._handleBundleErrorEvent.bind(this)
183
+ )
184
+
185
+ // Flush any operations that were queued while we were offline.
186
+ if (this._pendingOps.length) {
187
+ console.log(
188
+ `[CollabService] Flushing ${this._pendingOps.length} offline operation batch(es)`
188
189
  )
189
-
190
- // Flush any operations that were queued while we were offline.
191
- if (this._pendingOps.length) {
192
- console.log(
193
- `[CollabService] Flushing ${this._pendingOps.length} offline operation batch(es)`
194
- )
195
- this._pendingOps.forEach(({ tuples }) => {
196
- this.socket.emit('ops', { changes: tuples, ts: Date.now() })
197
- })
198
- this._pendingOps.length = 0
199
- }
200
-
201
- this._connected = true
202
- console.log('[CollabService] Connected to project:', projectId)
203
- } catch (err) {
204
- console.error('[CollabService] Connection failed:', err)
205
- throw err
190
+ this._pendingOps.forEach(({ changes, granularChanges, orders }) => {
191
+ this.socket.emit('ops', { changes, granularChanges, orders, ts: Date.now() })
192
+ })
193
+ this._pendingOps.length = 0
206
194
  }
195
+
196
+ this._connected = true
197
+ // console.log('[CollabService] Connected to project:', projectId)
207
198
  }
208
199
 
209
200
  disconnect() {
@@ -249,26 +240,72 @@ export class CollabService extends BaseService {
249
240
  this._trackForUndo(tuples, options)
250
241
  }
251
242
 
243
+ // Preprocess into granular changes and derive orders
244
+ const root = this._stateManager?.root
245
+ const { granularChanges: processedTuples, orders } = preprocessChanges(
246
+ root,
247
+ tuples,
248
+ options
249
+ )
250
+
252
251
  // Include any additional changes passed via opts
253
252
  if (options.append && options.append.length) {
254
- tuples.push(...options.append)
253
+ processedTuples.push(...options.append)
255
254
  }
256
255
 
257
256
  // Apply changes to local state tree immediately.
258
257
  this._stateManager.applyChanges(tuples, { ...options })
259
258
 
260
- tuples = deepStringify(tuples, [])
259
+ const state = this._stateManager?.root
260
+ const el = state?.__element
261
+
262
+ // orders already derived by preprocessor
263
+
264
+ const stringifiedGranularTuples = el?.call
265
+ ? el.call(
266
+ 'deepStringifyFunctions',
267
+ processedTuples,
268
+ Array.isArray(processedTuples) ? [] : {}
269
+ )
270
+ : deepStringifyFunctions(
271
+ processedTuples,
272
+ Array.isArray(processedTuples) ? [] : {}
273
+ )
274
+
275
+ const stringifiedTuples = el?.call
276
+ ? el.call(
277
+ 'deepStringifyFunctions',
278
+ tuples,
279
+ Array.isArray(tuples) ? [] : {}
280
+ )
281
+ : deepStringifyFunctions(tuples, Array.isArray(tuples) ? [] : {})
261
282
 
262
283
  // If not connected yet, queue the operations for later synchronisation.
263
284
  if (!this.isConnected()) {
264
285
  console.warn('[CollabService] Not connected, queuing real-time update')
265
- this._pendingOps.push({ tuples, options })
286
+ this._pendingOps.push({
287
+ changes: stringifiedTuples,
288
+ granularChanges: stringifiedGranularTuples,
289
+ orders,
290
+ options
291
+ })
266
292
  return
267
293
  }
268
294
 
269
295
  // When connected, send the operations to the backend.
270
296
  if (this.socket?.connected) {
271
- this.socket.emit('ops', { changes: tuples, ts: Date.now() })
297
+ console.log('[CollabService] Sending operations to the backend', {
298
+ changes: stringifiedTuples,
299
+ granularChanges: stringifiedGranularTuples,
300
+ orders,
301
+ ts: Date.now()
302
+ })
303
+ this.socket.emit('ops', {
304
+ changes: stringifiedTuples,
305
+ granularChanges: stringifiedGranularTuples,
306
+ orders,
307
+ ts: Date.now()
308
+ })
272
309
  }
273
310
 
274
311
  return { success: true }
@@ -446,7 +483,7 @@ export class CollabService extends BaseService {
446
483
 
447
484
  return this.updateData(tuples, updatedOpts)
448
485
  } catch (error) {
449
- throw new Error(`Failed to add item: ${error.message}`)
486
+ throw new Error(`Failed to add item: ${error.message}`, { cause: error })
450
487
  }
451
488
  }
452
489
 
@@ -479,7 +516,7 @@ export class CollabService extends BaseService {
479
516
  title: 'Failed to add item',
480
517
  message: error.message
481
518
  })
482
- throw new Error(`Failed to add item: ${error.message}`)
519
+ throw new Error(`Failed to add item: ${error.message}`, { cause: error })
483
520
  }
484
521
  }
485
522
 
@@ -502,7 +539,9 @@ export class CollabService extends BaseService {
502
539
  title: 'Failed to update item',
503
540
  message: error.message
504
541
  })
505
- throw new Error(`Failed to update item: ${error.message}`)
542
+ throw new Error(`Failed to update item: ${error.message}`, {
543
+ cause: error
544
+ })
506
545
  }
507
546
  }
508
547
 
@@ -528,7 +567,9 @@ export class CollabService extends BaseService {
528
567
  title: 'Failed to delete item',
529
568
  message: error.message
530
569
  })
531
- throw new Error(`Failed to delete item: ${error.message}`)
570
+ throw new Error(`Failed to delete item: ${error.message}`, {
571
+ cause: error
572
+ })
532
573
  }
533
574
  }
534
575
 
@@ -186,12 +186,12 @@ export class CoreService extends BaseService {
186
186
  } catch {
187
187
  // Use default error message
188
188
  }
189
- throw new Error(error.message || error.error || 'Request failed')
189
+ throw new Error(error.message || error.error || 'Request failed', { cause: error })
190
190
  }
191
191
 
192
192
  return response.status === 204 ? null : response.json()
193
193
  } catch (error) {
194
- throw new Error(`Request failed: ${error.message}`)
194
+ throw new Error(`Request failed: ${error.message}`, { cause: error })
195
195
  }
196
196
  }
197
197
 
@@ -209,7 +209,7 @@ export class CoreService extends BaseService {
209
209
  }
210
210
  throw new Error(response.message)
211
211
  } catch (error) {
212
- throw new Error(`Registration failed: ${error.message}`)
212
+ throw new Error(`Registration failed: ${error.message}`, { cause: error })
213
213
  }
214
214
  }
215
215
 
@@ -245,7 +245,7 @@ export class CoreService extends BaseService {
245
245
  }
246
246
  throw new Error(response.message)
247
247
  } catch (error) {
248
- throw new Error(`Login failed: ${error.message}`)
248
+ throw new Error(`Login failed: ${error.message}`, { cause: error })
249
249
  }
250
250
  }
251
251
 
@@ -270,7 +270,7 @@ export class CoreService extends BaseService {
270
270
  }
271
271
  this.updateContext({ authToken: null })
272
272
 
273
- throw new Error(`Logout failed: ${error.message}`)
273
+ throw new Error(`Logout failed: ${error.message}`, { cause: error })
274
274
  }
275
275
  }
276
276
 
@@ -286,7 +286,7 @@ export class CoreService extends BaseService {
286
286
  }
287
287
  throw new Error(response.message)
288
288
  } catch (error) {
289
- throw new Error(`Token refresh failed: ${error.message}`)
289
+ throw new Error(`Token refresh failed: ${error.message}`, { cause: error })
290
290
  }
291
291
  }
292
292
 
@@ -325,7 +325,7 @@ export class CoreService extends BaseService {
325
325
  }
326
326
  throw new Error(response.message)
327
327
  } catch (error) {
328
- throw new Error(`Google auth failed: ${error.message}`)
328
+ throw new Error(`Google auth failed: ${error.message}`, { cause: error })
329
329
  }
330
330
  }
331
331
 
@@ -364,7 +364,7 @@ export class CoreService extends BaseService {
364
364
  }
365
365
  throw new Error(response.message)
366
366
  } catch (error) {
367
- throw new Error(`GitHub auth failed: ${error.message}`)
367
+ throw new Error(`GitHub auth failed: ${error.message}`, { cause: error })
368
368
  }
369
369
  }
370
370
 
@@ -405,7 +405,7 @@ export class CoreService extends BaseService {
405
405
  }
406
406
  throw new Error(response.message)
407
407
  } catch (error) {
408
- throw new Error(`Google auth callback failed: ${error.message}`)
408
+ throw new Error(`Google auth callback failed: ${error.message}`, { cause: error })
409
409
  }
410
410
  }
411
411
 
@@ -421,7 +421,7 @@ export class CoreService extends BaseService {
421
421
  }
422
422
  throw new Error(response.message)
423
423
  } catch (error) {
424
- throw new Error(`Password reset request failed: ${error.message}`)
424
+ throw new Error(`Password reset request failed: ${error.message}`, { cause: error })
425
425
  }
426
426
  }
427
427
 
@@ -437,7 +437,7 @@ export class CoreService extends BaseService {
437
437
  }
438
438
  throw new Error(response.message)
439
439
  } catch (error) {
440
- throw new Error(`Password reset confirmation failed: ${error.message}`)
440
+ throw new Error(`Password reset confirmation failed: ${error.message}`, { cause: error })
441
441
  }
442
442
  }
443
443
 
@@ -453,7 +453,7 @@ export class CoreService extends BaseService {
453
453
  }
454
454
  throw new Error(response.message)
455
455
  } catch (error) {
456
- throw new Error(`Registration confirmation failed: ${error.message}`)
456
+ throw new Error(`Registration confirmation failed: ${error.message}`, { cause: error })
457
457
  }
458
458
  }
459
459
 
@@ -469,7 +469,7 @@ export class CoreService extends BaseService {
469
469
  }
470
470
  throw new Error(response.message)
471
471
  } catch (error) {
472
- throw new Error(`Password change request failed: ${error.message}`)
472
+ throw new Error(`Password change request failed: ${error.message}`, { cause: error })
473
473
  }
474
474
  }
475
475
 
@@ -486,7 +486,7 @@ export class CoreService extends BaseService {
486
486
  }
487
487
  throw new Error(response.message)
488
488
  } catch (error) {
489
- throw new Error(`Password change confirmation failed: ${error.message}`)
489
+ throw new Error(`Password change confirmation failed: ${error.message}`, { cause: error })
490
490
  }
491
491
  }
492
492
 
@@ -502,7 +502,7 @@ export class CoreService extends BaseService {
502
502
  }
503
503
  throw new Error(response.message)
504
504
  } catch (error) {
505
- throw new Error(`Failed to get user profile: ${error.message}`)
505
+ throw new Error(`Failed to get user profile: ${error.message}`, { cause: error })
506
506
  }
507
507
  }
508
508
 
@@ -643,7 +643,7 @@ export class CoreService extends BaseService {
643
643
  }
644
644
  throw new Error(response.message)
645
645
  } catch (error) {
646
- throw new Error(`Failed to update user profile: ${error.message}`)
646
+ throw new Error(`Failed to update user profile: ${error.message}`, { cause: error })
647
647
  }
648
648
  }
649
649
 
@@ -667,7 +667,7 @@ export class CoreService extends BaseService {
667
667
  }
668
668
  throw new Error(response.message)
669
669
  } catch (error) {
670
- throw new Error(`Failed to get user projects: ${error.message}`)
670
+ throw new Error(`Failed to get user projects: ${error.message}`, { cause: error })
671
671
  }
672
672
  }
673
673
 
@@ -686,7 +686,7 @@ export class CoreService extends BaseService {
686
686
  }
687
687
  throw new Error(response.message)
688
688
  } catch (error) {
689
- throw new Error(`Failed to get user: ${error.message}`)
689
+ throw new Error(`Failed to get user: ${error.message}`, { cause: error })
690
690
  }
691
691
  }
692
692
 
@@ -705,7 +705,7 @@ export class CoreService extends BaseService {
705
705
  }
706
706
  throw new Error(response.message)
707
707
  } catch (error) {
708
- throw new Error(`Failed to get user by email: ${error.message}`)
708
+ throw new Error(`Failed to get user by email: ${error.message}`, { cause: error })
709
709
  }
710
710
  }
711
711
 
@@ -19,7 +19,7 @@ export class DnsService extends BaseService {
19
19
  }
20
20
  throw new Error(response.message)
21
21
  } catch (error) {
22
- throw new Error(`Failed to create DNS record: ${error.message}`)
22
+ throw new Error(`Failed to create DNS record: ${error.message}`, { cause: error })
23
23
  }
24
24
  }
25
25
 
@@ -38,7 +38,7 @@ export class DnsService extends BaseService {
38
38
  }
39
39
  throw new Error(response.message)
40
40
  } catch (error) {
41
- throw new Error(`Failed to get DNS record: ${error.message}`)
41
+ throw new Error(`Failed to get DNS record: ${error.message}`, { cause: error })
42
42
  }
43
43
  }
44
44
 
@@ -76,7 +76,7 @@ export class DnsService extends BaseService {
76
76
  }
77
77
  throw new Error(response.message)
78
78
  } catch (error) {
79
- throw new Error(`Failed to remove DNS record: ${error.message}`)
79
+ throw new Error(`Failed to remove DNS record: ${error.message}`, { cause: error })
80
80
  }
81
81
  }
82
82
 
@@ -105,7 +105,7 @@ export class DnsService extends BaseService {
105
105
  }
106
106
  throw new Error(response.message)
107
107
  } catch (error) {
108
- throw new Error(`Failed to set project domains: ${error.message}`)
108
+ throw new Error(`Failed to set project domains: ${error.message}`, { cause: error })
109
109
  }
110
110
  }
111
111
 
@@ -45,7 +45,7 @@ export class FileService extends BaseService {
45
45
  message: response.message
46
46
  }
47
47
  } catch (error) {
48
- throw new Error(`File upload failed: ${error.message}`)
48
+ throw new Error(`File upload failed: ${error.message}`, { cause: error })
49
49
  }
50
50
  }
51
51
 
@@ -71,7 +71,7 @@ export class FileService extends BaseService {
71
71
  }
72
72
  throw new Error(response.message)
73
73
  } catch (error) {
74
- throw new Error(`Failed to update project icon: ${error.message}`)
74
+ throw new Error(`Failed to update project icon: ${error.message}`, { cause: error })
75
75
  }
76
76
  }
77
77
 
@@ -34,7 +34,7 @@ export class PaymentService extends BaseService {
34
34
  }
35
35
  throw new Error(response.message)
36
36
  } catch (error) {
37
- throw new Error(`Failed to checkout: ${error.message}`)
37
+ throw new Error(`Failed to checkout: ${error.message}`, { cause: error })
38
38
  }
39
39
  }
40
40
 
@@ -56,7 +56,7 @@ export class PaymentService extends BaseService {
56
56
  }
57
57
  throw new Error(response.message)
58
58
  } catch (error) {
59
- throw new Error(`Failed to get subscription status: ${error.message}`)
59
+ throw new Error(`Failed to get subscription status: ${error.message}`, { cause: error })
60
60
  }
61
61
  }
62
62
 
@@ -17,7 +17,7 @@ export class PlanService extends BaseService {
17
17
  }
18
18
  throw new Error(response.message)
19
19
  } catch (error) {
20
- throw new Error(`Failed to get plans: ${error.message}`)
20
+ throw new Error(`Failed to get plans: ${error.message}`, { cause: error })
21
21
  }
22
22
  }
23
23
 
@@ -38,7 +38,7 @@ export class PlanService extends BaseService {
38
38
  }
39
39
  throw new Error(response.message)
40
40
  } catch (error) {
41
- throw new Error(`Failed to get plan: ${error.message}`)
41
+ throw new Error(`Failed to get plan: ${error.message}`, { cause: error })
42
42
  }
43
43
  }
44
44
 
@@ -59,7 +59,7 @@ export class PlanService extends BaseService {
59
59
  }
60
60
  throw new Error(response.message)
61
61
  } catch (error) {
62
- throw new Error(`Failed to get admin plans: ${error.message}`)
62
+ throw new Error(`Failed to get admin plans: ${error.message}`, { cause: error })
63
63
  }
64
64
  }
65
65
 
@@ -82,7 +82,7 @@ export class PlanService extends BaseService {
82
82
  }
83
83
  throw new Error(response.message)
84
84
  } catch (error) {
85
- throw new Error(`Failed to create plan: ${error.message}`)
85
+ throw new Error(`Failed to create plan: ${error.message}`, { cause: error })
86
86
  }
87
87
  }
88
88
 
@@ -108,7 +108,7 @@ export class PlanService extends BaseService {
108
108
  }
109
109
  throw new Error(response.message)
110
110
  } catch (error) {
111
- throw new Error(`Failed to update plan: ${error.message}`)
111
+ throw new Error(`Failed to update plan: ${error.message}`, { cause: error })
112
112
  }
113
113
  }
114
114
 
@@ -130,7 +130,7 @@ export class PlanService extends BaseService {
130
130
  }
131
131
  throw new Error(response.message)
132
132
  } catch (error) {
133
- throw new Error(`Failed to delete plan: ${error.message}`)
133
+ throw new Error(`Failed to delete plan: ${error.message}`, { cause: error })
134
134
  }
135
135
  }
136
136
 
@@ -149,7 +149,7 @@ export class PlanService extends BaseService {
149
149
  }
150
150
  throw new Error(response.message)
151
151
  } catch (error) {
152
- throw new Error(`Failed to initialize plans: ${error.message}`)
152
+ throw new Error(`Failed to initialize plans: ${error.message}`, { cause: error })
153
153
  }
154
154
  }
155
155
 
@@ -166,7 +166,7 @@ export class PlanService extends BaseService {
166
166
  }
167
167
  return plans
168
168
  } catch (error) {
169
- throw new Error(`Failed to get plans with validation: ${error.message}`)
169
+ throw new Error(`Failed to get plans with validation: ${error.message}`, { cause: error })
170
170
  }
171
171
  }
172
172
 
@@ -185,7 +185,7 @@ export class PlanService extends BaseService {
185
185
  }
186
186
  return plan
187
187
  } catch (error) {
188
- throw new Error(`Failed to get plan with validation: ${error.message}`)
188
+ throw new Error(`Failed to get plan with validation: ${error.message}`, { cause: error })
189
189
  }
190
190
  }
191
191
 
@@ -252,7 +252,7 @@ export class PlanService extends BaseService {
252
252
  const plans = await this.getPlans()
253
253
  return plans.filter(plan => plan.active !== false)
254
254
  } catch (error) {
255
- throw new Error(`Failed to get active plans: ${error.message}`)
255
+ throw new Error(`Failed to get active plans: ${error.message}`, { cause: error })
256
256
  }
257
257
  }
258
258
 
@@ -267,7 +267,7 @@ export class PlanService extends BaseService {
267
267
  return price >= minPrice && price <= maxPrice
268
268
  })
269
269
  } catch (error) {
270
- throw new Error(`Failed to get plans by price range: ${error.message}`)
270
+ throw new Error(`Failed to get plans by price range: ${error.message}`, { cause: error })
271
271
  }
272
272
  }
273
273
 
@@ -289,7 +289,7 @@ export class PlanService extends BaseService {
289
289
 
290
290
  return plan
291
291
  } catch (error) {
292
- throw new Error(`Failed to get plan by key: ${error.message}`)
292
+ throw new Error(`Failed to get plan by key: ${error.message}`, { cause: error })
293
293
  }
294
294
  }
295
295
  }