@symbo.ls/sdk 3.2.3 → 3.2.7
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/README.md +141 -0
- package/dist/cjs/config/environment.js +94 -10
- package/dist/cjs/index.js +152 -12
- package/dist/cjs/services/AdminService.js +351 -0
- package/dist/cjs/services/AuthService.js +738 -305
- package/dist/cjs/services/BaseService.js +158 -6
- package/dist/cjs/services/BranchService.js +484 -0
- package/dist/cjs/services/CollabService.js +439 -116
- package/dist/cjs/services/DnsService.js +340 -0
- package/dist/cjs/services/FeatureFlagService.js +175 -0
- package/dist/cjs/services/FileService.js +201 -0
- package/dist/cjs/services/IntegrationService.js +538 -0
- package/dist/cjs/services/MetricsService.js +62 -0
- package/dist/cjs/services/PaymentService.js +271 -0
- package/dist/cjs/services/PlanService.js +426 -0
- package/dist/cjs/services/ProjectService.js +1207 -0
- package/dist/cjs/services/PullRequestService.js +503 -0
- package/dist/cjs/services/ScreenshotService.js +304 -0
- package/dist/cjs/services/SubscriptionService.js +396 -0
- package/dist/cjs/services/TrackingService.js +661 -0
- package/dist/cjs/services/WaitlistService.js +148 -0
- package/dist/cjs/services/index.js +60 -4
- package/dist/cjs/state/RootStateManager.js +2 -23
- package/dist/cjs/state/rootEventBus.js +9 -0
- package/dist/cjs/utils/CollabClient.js +78 -12
- package/dist/cjs/utils/TokenManager.js +16 -3
- package/dist/cjs/utils/changePreprocessor.js +199 -0
- package/dist/cjs/utils/jsonDiff.js +46 -4
- package/dist/cjs/utils/ordering.js +309 -0
- package/dist/cjs/utils/services.js +285 -128
- package/dist/cjs/utils/validation.js +0 -3
- package/dist/esm/config/environment.js +94 -10
- package/dist/esm/index.js +47862 -18248
- package/dist/esm/services/AdminService.js +1132 -0
- package/dist/esm/services/AuthService.js +1493 -386
- package/dist/esm/services/BaseService.js +757 -6
- package/dist/esm/services/BranchService.js +1265 -0
- package/dist/esm/services/CollabService.js +24956 -16089
- package/dist/esm/services/DnsService.js +1121 -0
- package/dist/esm/services/FeatureFlagService.js +956 -0
- package/dist/esm/services/FileService.js +982 -0
- package/dist/esm/services/IntegrationService.js +1319 -0
- package/dist/esm/services/MetricsService.js +843 -0
- package/dist/esm/services/PaymentService.js +1052 -0
- package/dist/esm/services/PlanService.js +1207 -0
- package/dist/esm/services/ProjectService.js +2526 -0
- package/dist/esm/services/PullRequestService.js +1284 -0
- package/dist/esm/services/ScreenshotService.js +1085 -0
- package/dist/esm/services/SubscriptionService.js +1177 -0
- package/dist/esm/services/TrackingService.js +18454 -0
- package/dist/esm/services/WaitlistService.js +929 -0
- package/dist/esm/services/index.js +47373 -18027
- package/dist/esm/state/RootStateManager.js +11 -23
- package/dist/esm/state/rootEventBus.js +9 -0
- package/dist/esm/utils/CollabClient.js +17526 -16120
- package/dist/esm/utils/TokenManager.js +16 -3
- package/dist/esm/utils/changePreprocessor.js +542 -0
- package/dist/esm/utils/jsonDiff.js +958 -43
- package/dist/esm/utils/ordering.js +291 -0
- package/dist/esm/utils/services.js +285 -128
- package/dist/esm/utils/validation.js +116 -50
- package/dist/node/config/environment.js +94 -10
- package/dist/node/index.js +183 -16
- package/dist/node/services/AdminService.js +332 -0
- package/dist/node/services/AuthService.js +742 -310
- package/dist/node/services/BaseService.js +148 -6
- package/dist/node/services/BranchService.js +465 -0
- package/dist/node/services/CollabService.js +439 -116
- package/dist/node/services/DnsService.js +321 -0
- package/dist/node/services/FeatureFlagService.js +156 -0
- package/dist/node/services/FileService.js +182 -0
- package/dist/node/services/IntegrationService.js +519 -0
- package/dist/node/services/MetricsService.js +43 -0
- package/dist/node/services/PaymentService.js +252 -0
- package/dist/node/services/PlanService.js +407 -0
- package/dist/node/services/ProjectService.js +1188 -0
- package/dist/node/services/PullRequestService.js +484 -0
- package/dist/node/services/ScreenshotService.js +285 -0
- package/dist/node/services/SubscriptionService.js +377 -0
- package/dist/node/services/TrackingService.js +632 -0
- package/dist/node/services/WaitlistService.js +129 -0
- package/dist/node/services/index.js +60 -4
- package/dist/node/state/RootStateManager.js +2 -23
- package/dist/node/state/rootEventBus.js +9 -0
- package/dist/node/utils/CollabClient.js +77 -11
- package/dist/node/utils/TokenManager.js +16 -3
- package/dist/node/utils/changePreprocessor.js +180 -0
- package/dist/node/utils/jsonDiff.js +46 -4
- package/dist/node/utils/ordering.js +290 -0
- package/dist/node/utils/services.js +285 -128
- package/dist/node/utils/validation.js +0 -3
- package/package.json +30 -18
- package/src/config/environment.js +95 -10
- package/src/index.js +190 -23
- package/src/services/AdminService.js +374 -0
- package/src/services/AuthService.js +874 -328
- package/src/services/BaseService.js +166 -6
- package/src/services/BranchService.js +536 -0
- package/src/services/CollabService.js +557 -148
- package/src/services/DnsService.js +366 -0
- package/src/services/FeatureFlagService.js +174 -0
- package/src/services/FileService.js +213 -0
- package/src/services/IntegrationService.js +548 -0
- package/src/services/MetricsService.js +40 -0
- package/src/services/PaymentService.js +287 -0
- package/src/services/PlanService.js +468 -0
- package/src/services/ProjectService.js +1366 -0
- package/src/services/PullRequestService.js +537 -0
- package/src/services/ScreenshotService.js +258 -0
- package/src/services/SubscriptionService.js +425 -0
- package/src/services/TrackingService.js +853 -0
- package/src/services/WaitlistService.js +130 -0
- package/src/services/index.js +79 -5
- package/src/services/tests/BranchService/createBranch.test.js +153 -0
- package/src/services/tests/BranchService/deleteBranch.test.js +173 -0
- package/src/services/tests/BranchService/getBranchChanges.test.js +146 -0
- package/src/services/tests/BranchService/listBranches.test.js +87 -0
- package/src/services/tests/BranchService/mergeBranch.test.js +210 -0
- package/src/services/tests/BranchService/publishVersion.test.js +183 -0
- package/src/services/tests/BranchService/renameBranch.test.js +240 -0
- package/src/services/tests/BranchService/resetBranch.test.js +152 -0
- package/src/services/tests/FeatureFlagService/adminFeatureFlags.test.js +67 -0
- package/src/services/tests/FeatureFlagService/getFeatureFlags.test.js +75 -0
- package/src/services/tests/FileService/createFileFormData.test.js +74 -0
- package/src/services/tests/FileService/getFileUrl.test.js +69 -0
- package/src/services/tests/FileService/updateProjectIcon.test.js +109 -0
- package/src/services/tests/FileService/uploadDocument.test.js +36 -0
- package/src/services/tests/FileService/uploadFile.test.js +78 -0
- package/src/services/tests/FileService/uploadFileWithValidation.test.js +114 -0
- package/src/services/tests/FileService/uploadImage.test.js +36 -0
- package/src/services/tests/FileService/uploadMultipleFiles.test.js +111 -0
- package/src/services/tests/FileService/validateFile.test.js +63 -0
- package/src/services/tests/PlanService/createPlan.test.js +104 -0
- package/src/services/tests/PlanService/createPlanWithValidation.test.js +523 -0
- package/src/services/tests/PlanService/deletePlan.test.js +92 -0
- package/src/services/tests/PlanService/getActivePlans.test.js +123 -0
- package/src/services/tests/PlanService/getAdminPlans.test.js +84 -0
- package/src/services/tests/PlanService/getPlan.test.js +50 -0
- package/src/services/tests/PlanService/getPlanByKey.test.js +109 -0
- package/src/services/tests/PlanService/getPlanWithValidation.test.js +85 -0
- package/src/services/tests/PlanService/getPlans.test.js +53 -0
- package/src/services/tests/PlanService/getPlansByPriceRange.test.js +109 -0
- package/src/services/tests/PlanService/getPlansWithValidation.test.js +48 -0
- package/src/services/tests/PlanService/initializePlans.test.js +75 -0
- package/src/services/tests/PlanService/updatePlan.test.js +111 -0
- package/src/services/tests/PlanService/updatePlanWithValidation.test.js +556 -0
- package/src/state/RootStateManager.js +37 -32
- package/src/state/rootEventBus.js +19 -0
- package/src/utils/CollabClient.js +99 -12
- package/src/utils/TokenManager.js +20 -3
- package/src/utils/changePreprocessor.js +239 -0
- package/src/utils/jsonDiff.js +40 -5
- package/src/utils/ordering.js +271 -0
- package/src/utils/services.js +306 -139
- package/src/utils/validation.js +0 -3
- package/dist/cjs/services/AIService.js +0 -155
- package/dist/cjs/services/BasedService.js +0 -1185
- package/dist/cjs/services/CoreService.js +0 -2295
- package/dist/cjs/services/SocketService.js +0 -309
- package/dist/cjs/services/SymstoryService.js +0 -571
- package/dist/cjs/utils/basedQuerys.js +0 -181
- package/dist/cjs/utils/symstoryClient.js +0 -259
- package/dist/esm/services/AIService.js +0 -185
- package/dist/esm/services/BasedService.js +0 -5262
- package/dist/esm/services/CoreService.js +0 -2827
- package/dist/esm/services/SocketService.js +0 -456
- package/dist/esm/services/SymstoryService.js +0 -7025
- package/dist/esm/utils/basedQuerys.js +0 -163
- package/dist/esm/utils/symstoryClient.js +0 -354
- package/dist/node/services/AIService.js +0 -136
- package/dist/node/services/BasedService.js +0 -1156
- package/dist/node/services/CoreService.js +0 -2266
- package/dist/node/services/SocketService.js +0 -280
- package/dist/node/services/SymstoryService.js +0 -542
- package/dist/node/utils/basedQuerys.js +0 -162
- package/dist/node/utils/symstoryClient.js +0 -230
- package/src/services/AIService.js +0 -150
- package/src/services/BasedService.js +0 -1302
- package/src/services/CoreService.js +0 -2548
- package/src/services/SocketService.js +0 -336
- package/src/services/SymstoryService.js +0 -649
- package/src/utils/basedQuerys.js +0 -164
- package/src/utils/symstoryClient.js +0 -252
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
import { BaseService } from './BaseService.js'
|
|
2
|
+
|
|
3
|
+
export class PaymentService extends BaseService {
|
|
4
|
+
// ==================== PAYMENT METHODS ====================
|
|
5
|
+
|
|
6
|
+
async checkout (options = {}) {
|
|
7
|
+
this._requireReady('checkout')
|
|
8
|
+
const {
|
|
9
|
+
projectId,
|
|
10
|
+
seats = 1,
|
|
11
|
+
price = 'starter_monthly',
|
|
12
|
+
successUrl = `${window.location.origin}/success`,
|
|
13
|
+
cancelUrl = `${window.location.origin}/pricing`
|
|
14
|
+
} = options
|
|
15
|
+
|
|
16
|
+
if (!projectId) {
|
|
17
|
+
throw new Error('Project ID is required for checkout')
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
try {
|
|
21
|
+
const response = await this._request('/payments/checkout', {
|
|
22
|
+
method: 'POST',
|
|
23
|
+
body: JSON.stringify({
|
|
24
|
+
projectId,
|
|
25
|
+
seats,
|
|
26
|
+
price,
|
|
27
|
+
successUrl,
|
|
28
|
+
cancelUrl
|
|
29
|
+
}),
|
|
30
|
+
methodName: 'checkout'
|
|
31
|
+
})
|
|
32
|
+
if (response.success) {
|
|
33
|
+
return response.data
|
|
34
|
+
}
|
|
35
|
+
throw new Error(response.message)
|
|
36
|
+
} catch (error) {
|
|
37
|
+
throw new Error(`Failed to checkout: ${error.message}`, { cause: error })
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
async getSubscriptionStatus (projectId) {
|
|
42
|
+
this._requireReady('getSubscriptionStatus')
|
|
43
|
+
if (!projectId) {
|
|
44
|
+
throw new Error('Project ID is required')
|
|
45
|
+
}
|
|
46
|
+
try {
|
|
47
|
+
const response = await this._request(
|
|
48
|
+
`/payments/subscription/${projectId}`,
|
|
49
|
+
{
|
|
50
|
+
method: 'GET',
|
|
51
|
+
methodName: 'getSubscriptionStatus'
|
|
52
|
+
}
|
|
53
|
+
)
|
|
54
|
+
if (response.success) {
|
|
55
|
+
return response.data
|
|
56
|
+
}
|
|
57
|
+
throw new Error(response.message)
|
|
58
|
+
} catch (error) {
|
|
59
|
+
throw new Error(`Failed to get subscription status: ${error.message}`, { cause: error })
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// ==================== PAYMENT HELPER METHODS ====================
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Helper method to create checkout with validation
|
|
67
|
+
*/
|
|
68
|
+
async checkoutWithValidation (options = {}) {
|
|
69
|
+
const {
|
|
70
|
+
projectId,
|
|
71
|
+
seats,
|
|
72
|
+
price,
|
|
73
|
+
successUrl,
|
|
74
|
+
cancelUrl
|
|
75
|
+
} = options
|
|
76
|
+
|
|
77
|
+
// Validate required fields
|
|
78
|
+
if (!projectId) {
|
|
79
|
+
throw new Error('Project ID is required')
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
if (seats && (typeof seats !== 'number' || seats < 1)) {
|
|
83
|
+
throw new Error('Seats must be a positive number')
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
if (price && typeof price !== 'string') {
|
|
87
|
+
throw new Error('Price must be a string')
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Validate URLs if provided
|
|
91
|
+
if (successUrl && !this._isValidUrl(successUrl)) {
|
|
92
|
+
throw new Error('Success URL must be a valid URL')
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
if (cancelUrl && !this._isValidUrl(cancelUrl)) {
|
|
96
|
+
throw new Error('Cancel URL must be a valid URL')
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return await this.checkout(options)
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Helper method to get subscription status with validation
|
|
104
|
+
*/
|
|
105
|
+
async getSubscriptionStatusWithValidation (projectId) {
|
|
106
|
+
if (!projectId || typeof projectId !== 'string') {
|
|
107
|
+
throw new Error('Project ID must be a valid string')
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return await this.getSubscriptionStatus(projectId)
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Helper method to check if project has active subscription
|
|
115
|
+
*/
|
|
116
|
+
async hasActiveSubscription (projectId) {
|
|
117
|
+
try {
|
|
118
|
+
const status = await this.getSubscriptionStatus(projectId)
|
|
119
|
+
return status?.active === true
|
|
120
|
+
} catch (error) {
|
|
121
|
+
console.warn('Failed to check subscription status:', error.message)
|
|
122
|
+
return false
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Helper method to get subscription details
|
|
128
|
+
*/
|
|
129
|
+
async getSubscriptionDetails (projectId) {
|
|
130
|
+
try {
|
|
131
|
+
const status = await this.getSubscriptionStatus(projectId)
|
|
132
|
+
|
|
133
|
+
if (!status) {
|
|
134
|
+
return {
|
|
135
|
+
hasSubscription: false,
|
|
136
|
+
active: false,
|
|
137
|
+
message: 'No subscription found'
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
return {
|
|
142
|
+
hasSubscription: true,
|
|
143
|
+
active: status.active || false,
|
|
144
|
+
plan: status.plan,
|
|
145
|
+
seats: status.seats,
|
|
146
|
+
nextBillingDate: status.nextBillingDate,
|
|
147
|
+
amount: status.amount,
|
|
148
|
+
currency: status.currency,
|
|
149
|
+
status: status.status
|
|
150
|
+
}
|
|
151
|
+
} catch (error) {
|
|
152
|
+
throw new Error(`Failed to get subscription details: ${error.message}`, { cause: error })
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Helper method to create checkout for specific plan
|
|
158
|
+
*/
|
|
159
|
+
async checkoutForPlan (projectId, planKey, options = {}) {
|
|
160
|
+
if (!projectId) {
|
|
161
|
+
throw new Error('Project ID is required')
|
|
162
|
+
}
|
|
163
|
+
if (!planKey) {
|
|
164
|
+
throw new Error('Plan key is required')
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
const checkoutOptions = {
|
|
168
|
+
projectId,
|
|
169
|
+
price: planKey,
|
|
170
|
+
...options
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
return await this.checkoutWithValidation(checkoutOptions)
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Helper method to create checkout for team plan
|
|
178
|
+
*/
|
|
179
|
+
async checkoutForTeam (projectId, seats, options = {}) {
|
|
180
|
+
if (!projectId) {
|
|
181
|
+
throw new Error('Project ID is required')
|
|
182
|
+
}
|
|
183
|
+
if (!seats || seats < 1) {
|
|
184
|
+
throw new Error('Seats must be a positive number')
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
const checkoutOptions = {
|
|
188
|
+
projectId,
|
|
189
|
+
seats,
|
|
190
|
+
price: 'team_monthly',
|
|
191
|
+
...options
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
return await this.checkoutWithValidation(checkoutOptions)
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Helper method to validate subscription status
|
|
199
|
+
*/
|
|
200
|
+
validateSubscriptionStatus (status) {
|
|
201
|
+
if (!status || typeof status !== 'object') {
|
|
202
|
+
return {
|
|
203
|
+
isValid: false,
|
|
204
|
+
error: 'Invalid subscription status format'
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
const requiredFields = ['active', 'plan', 'seats']
|
|
209
|
+
const missingFields = requiredFields.filter(field => !(field in status))
|
|
210
|
+
|
|
211
|
+
if (missingFields.length > 0) {
|
|
212
|
+
return {
|
|
213
|
+
isValid: false,
|
|
214
|
+
error: `Missing required fields: ${missingFields.join(', ')}`
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
return {
|
|
219
|
+
isValid: true,
|
|
220
|
+
error: null
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Helper method to format subscription amount
|
|
226
|
+
*/
|
|
227
|
+
formatSubscriptionAmount (amount, currency = 'USD') {
|
|
228
|
+
if (!amount || typeof amount !== 'number') {
|
|
229
|
+
return 'N/A'
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
return new Intl.NumberFormat('en-US', {
|
|
233
|
+
style: 'currency',
|
|
234
|
+
currency
|
|
235
|
+
}).format(amount / 100) // Assuming amount is in cents
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Helper method to get subscription summary
|
|
240
|
+
*/
|
|
241
|
+
async getSubscriptionSummary (projectId) {
|
|
242
|
+
try {
|
|
243
|
+
const details = await this.getSubscriptionDetails(projectId)
|
|
244
|
+
|
|
245
|
+
if (!details.hasSubscription) {
|
|
246
|
+
return {
|
|
247
|
+
status: 'no_subscription',
|
|
248
|
+
message: 'No active subscription',
|
|
249
|
+
action: 'subscribe'
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
if (!details.active) {
|
|
254
|
+
return {
|
|
255
|
+
status: 'inactive',
|
|
256
|
+
message: 'Subscription is inactive',
|
|
257
|
+
action: 'reactivate'
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
return {
|
|
262
|
+
status: 'active',
|
|
263
|
+
message: `Active ${details.plan} plan with ${details.seats} seats`,
|
|
264
|
+
action: 'manage',
|
|
265
|
+
details
|
|
266
|
+
}
|
|
267
|
+
} catch (error) {
|
|
268
|
+
return {
|
|
269
|
+
status: 'error',
|
|
270
|
+
message: `Failed to get subscription: ${error.message}`,
|
|
271
|
+
action: 'retry'
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* Private helper to validate URL
|
|
278
|
+
*/
|
|
279
|
+
_isValidUrl (string) {
|
|
280
|
+
try {
|
|
281
|
+
const url = new URL(string)
|
|
282
|
+
return Boolean(url)
|
|
283
|
+
} catch {
|
|
284
|
+
return false
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|