crovver-node 1.0.0

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.
@@ -0,0 +1,471 @@
1
+ import axios from "axios";
2
+ import { CROVVER_BASE_URL } from "./constants";
3
+ /**
4
+ * Custom error class for Crovver API errors
5
+ */
6
+ export class CrovverError extends Error {
7
+ constructor(message, statusCode, code, originalError) {
8
+ super(message);
9
+ this.name = "CrovverError";
10
+ this.statusCode = statusCode;
11
+ this.code = code;
12
+ this.originalError = originalError;
13
+ this.isRetryable = CrovverError.isRetryableStatus(statusCode);
14
+ // Maintains proper stack trace for where error was thrown (V8 engines)
15
+ if (Error.captureStackTrace) {
16
+ Error.captureStackTrace(this, CrovverError);
17
+ }
18
+ }
19
+ /**
20
+ * Check if a status code indicates a retryable error
21
+ * - 5xx: Server errors (temporary)
22
+ * - 429: Rate limited
23
+ * - 408: Request timeout
24
+ * - undefined: Network errors
25
+ */
26
+ static isRetryableStatus(status) {
27
+ if (!status)
28
+ return true; // Network errors are retryable
29
+ return status >= 500 || status === 429 || status === 408;
30
+ }
31
+ /**
32
+ * Convert to JSON for logging
33
+ */
34
+ toJSON() {
35
+ return {
36
+ name: this.name,
37
+ message: this.message,
38
+ statusCode: this.statusCode,
39
+ code: this.code,
40
+ isRetryable: this.isRetryable,
41
+ };
42
+ }
43
+ }
44
+ async function sleep(ms) {
45
+ return new Promise((resolve) => setTimeout(resolve, ms));
46
+ }
47
+ function calculateBackoff(attempt, baseDelay, maxDelay) {
48
+ const delay = Math.min(baseDelay * Math.pow(2, attempt), maxDelay);
49
+ // Add jitter (±25%)
50
+ const jitter = delay * 0.25 * (Math.random() * 2 - 1);
51
+ return Math.round(delay + jitter);
52
+ }
53
+ // ════════════════════════════════════════════════════════════════════════
54
+ // CROVVER CLIENT
55
+ // ════════════════════════════════════════════════════════════════════════
56
+ export class CrovverClient {
57
+ constructor(config) {
58
+ if (!config.apiKey) {
59
+ throw new Error("CrovverConfig.apiKey is required");
60
+ }
61
+ this.config = {
62
+ ...config,
63
+ maxRetries: config.maxRetries ?? 3,
64
+ debug: config.debug ?? false,
65
+ };
66
+ this.logger =
67
+ config.logger ||
68
+ ((message, data) => {
69
+ if (this.config.debug) {
70
+ console.log(`[Crovver SDK] ${message}`, data ?? "");
71
+ }
72
+ });
73
+ this.client = axios.create({
74
+ baseURL: config.baseUrl ?? CROVVER_BASE_URL,
75
+ timeout: config.timeout || 30000,
76
+ headers: {
77
+ Authorization: `Bearer ${config.apiKey}`,
78
+ "Content-Type": "application/json",
79
+ },
80
+ });
81
+ this.setupInterceptors();
82
+ }
83
+ setupInterceptors() {
84
+ // Request interceptor for logging
85
+ this.client.interceptors.request.use((config) => {
86
+ this.logger(`Request: ${config.method?.toUpperCase()} ${config.url}`, {
87
+ data: config.data,
88
+ params: config.params,
89
+ });
90
+ return config;
91
+ });
92
+ // Response interceptor to unwrap ApiResponse format
93
+ this.client.interceptors.response.use((response) => {
94
+ const apiResponse = response.data;
95
+ this.logger(`Response: ${response.status}`, {
96
+ success: apiResponse.success,
97
+ hasData: !!apiResponse.data,
98
+ });
99
+ if (apiResponse.success && apiResponse.data !== null) {
100
+ response.data = apiResponse.data;
101
+ return response;
102
+ }
103
+ else if (!apiResponse.success && apiResponse.error) {
104
+ throw new CrovverError(apiResponse.error.message, response.status, apiResponse.error.code);
105
+ }
106
+ return response;
107
+ }, (error) => {
108
+ if (error.response) {
109
+ const apiResponse = error.response.data;
110
+ this.logger(`Error Response: ${error.response.status}`, {
111
+ error: apiResponse?.error,
112
+ });
113
+ if (apiResponse?.error) {
114
+ throw new CrovverError(apiResponse.error.message, error.response.status, apiResponse.error.code, error);
115
+ }
116
+ throw new CrovverError("Request failed", error.response.status, undefined, error);
117
+ }
118
+ this.logger("Network Error", { message: error.message });
119
+ throw new CrovverError(error.message || "Network error", undefined, "NETWORK_ERROR", error);
120
+ });
121
+ }
122
+ /**
123
+ * Execute a request with automatic retry logic
124
+ */
125
+ async withRetry(operation, retryConfig) {
126
+ const config = {
127
+ maxRetries: retryConfig?.maxRetries ?? this.config.maxRetries,
128
+ baseDelay: retryConfig?.baseDelay ?? 1000,
129
+ maxDelay: retryConfig?.maxDelay ?? 30000,
130
+ };
131
+ let lastError;
132
+ for (let attempt = 0; attempt <= config.maxRetries; attempt++) {
133
+ try {
134
+ return await operation();
135
+ }
136
+ catch (error) {
137
+ lastError = error;
138
+ const isCrovverError = error instanceof CrovverError;
139
+ const isRetryable = isCrovverError ? error.isRetryable : true;
140
+ if (!isRetryable || attempt >= config.maxRetries) {
141
+ throw error;
142
+ }
143
+ const delay = calculateBackoff(attempt, config.baseDelay, config.maxDelay);
144
+ this.logger(`Retry attempt ${attempt + 1}/${config.maxRetries} after ${delay}ms`);
145
+ await sleep(delay);
146
+ }
147
+ }
148
+ throw lastError;
149
+ }
150
+ // ────────────────────────────────────────────────────────────────────────
151
+ // TENANT MANAGEMENT (B2B Only)
152
+ // ────────────────────────────────────────────────────────────────────────
153
+ /**
154
+ * Create a new tenant (B2B organizations only)
155
+ *
156
+ * For D2C organizations, tenants are automatically created during checkout.
157
+ *
158
+ * @param request - Tenant creation request
159
+ * @returns Created tenant and owner information
160
+ * @throws {CrovverError} If the organization is D2C or tenant already exists
161
+ *
162
+ * @example
163
+ * ```typescript
164
+ * const result = await crovver.createTenant({
165
+ * externalTenantId: 'company-123',
166
+ * name: 'Acme Corporation',
167
+ * ownerExternalUserId: 'user-456',
168
+ * ownerEmail: 'admin@acme.com',
169
+ * });
170
+ * console.log('Tenant created:', result.tenant.id);
171
+ * ```
172
+ */
173
+ async createTenant(request) {
174
+ return this.withRetry(async () => {
175
+ const response = await this.client.post("/api/public/tenants", request);
176
+ return response.data;
177
+ });
178
+ }
179
+ /**
180
+ * Get tenant information by external tenant ID
181
+ *
182
+ * @param externalTenantId - The external tenant ID from your SaaS app
183
+ * @returns Tenant information with members
184
+ *
185
+ * @example
186
+ * ```typescript
187
+ * const { tenant, members } = await crovver.getTenant('company-123');
188
+ * console.log(`Tenant: ${tenant.name}`);
189
+ * console.log(`Members: ${members.length}`);
190
+ * ```
191
+ */
192
+ async getTenant(externalTenantId) {
193
+ return this.withRetry(async () => {
194
+ const response = await this.client.get("/api/public/tenants", {
195
+ params: { externalUserId: externalTenantId },
196
+ });
197
+ return response.data;
198
+ });
199
+ }
200
+ // ────────────────────────────────────────────────────────────────────────
201
+ // PLANS
202
+ // ────────────────────────────────────────────────────────────────────────
203
+ /**
204
+ * Get all available plans for the organization
205
+ *
206
+ * Use this to render pricing pages or display upgrade options.
207
+ *
208
+ * @returns List of all active plans with pricing and features
209
+ *
210
+ * @example
211
+ * ```typescript
212
+ * const { plans } = await crovver.getPlans();
213
+ * plans.forEach(plan => {
214
+ * console.log(`${plan.name}: $${plan.pricing.amount}/${plan.pricing.interval}`);
215
+ * });
216
+ * ```
217
+ */
218
+ async getPlans() {
219
+ return this.withRetry(async () => {
220
+ const response = await this.client.get("/api/public/plans");
221
+ return response.data;
222
+ });
223
+ }
224
+ // ────────────────────────────────────────────────────────────────────────
225
+ // SUBSCRIPTIONS
226
+ // ────────────────────────────────────────────────────────────────────────
227
+ /**
228
+ * Get active subscriptions for a tenant/user
229
+ *
230
+ * @param requestingEntityId - External tenant ID (B2B) or user ID (D2C)
231
+ * @returns Active subscriptions with plan and billing details
232
+ *
233
+ * @example
234
+ * ```typescript
235
+ * const { subscriptions, tenant } = await crovver.getSubscriptions('company-123');
236
+ * console.log(`${tenant.name} has ${subscriptions.length} subscriptions`);
237
+ * ```
238
+ */
239
+ async getSubscriptions(requestingEntityId) {
240
+ return this.withRetry(async () => {
241
+ const response = await this.client.get("/api/public/subscriptions", {
242
+ params: { requestingEntityId },
243
+ });
244
+ return response.data;
245
+ });
246
+ }
247
+ // ────────────────────────────────────────────────────────────────────────
248
+ // CHECKOUT
249
+ // ────────────────────────────────────────────────────────────────────────
250
+ /**
251
+ * Create a checkout session for payment
252
+ *
253
+ * For B2B: Provide requestingUserId and requestingTenantId
254
+ * For D2C: Provide requestingUserId, userEmail, and userName (tenant auto-created)
255
+ *
256
+ * @param request - Checkout session request
257
+ * @returns Checkout URL to redirect the user to
258
+ *
259
+ * @example
260
+ * ```typescript
261
+ * // B2B checkout
262
+ * const checkout = await crovver.createCheckoutSession({
263
+ * requestingUserId: 'user-456',
264
+ * requestingTenantId: 'company-123',
265
+ * planId: 'plan-uuid',
266
+ * provider: 'stripe',
267
+ * successUrl: 'https://myapp.com/success',
268
+ * cancelUrl: 'https://myapp.com/cancel',
269
+ * });
270
+ * window.location.href = checkout.checkoutUrl;
271
+ * ```
272
+ */
273
+ async createCheckoutSession(request) {
274
+ // Checkout operations should not be retried to avoid duplicate payments
275
+ const response = await this.client.post("/api/public/checkout", request);
276
+ return response.data;
277
+ }
278
+ // ────────────────────────────────────────────────────────────────────────
279
+ // ENTITLEMENT CHECKS
280
+ // ────────────────────────────────────────────────────────────────────────
281
+ /**
282
+ * Check if a tenant/user can access a specific feature
283
+ *
284
+ * @param requestingEntityId - External tenant ID (B2B) or user ID (D2C)
285
+ * @param featureKey - The feature key to check
286
+ * @returns Whether access is allowed
287
+ *
288
+ * @example
289
+ * ```typescript
290
+ * const canAccess = await crovver.canAccess('company-123', 'advanced-analytics');
291
+ * if (canAccess) {
292
+ * // Show the feature
293
+ * } else {
294
+ * // Show upgrade prompt
295
+ * }
296
+ * ```
297
+ */
298
+ async canAccess(requestingEntityId, featureKey) {
299
+ return this.withRetry(async () => {
300
+ const response = await this.client.post("/api/public/can-access", {
301
+ requestingEntityId,
302
+ featureKey,
303
+ });
304
+ return response.data.canAccess;
305
+ });
306
+ }
307
+ /**
308
+ * Record usage for a metric
309
+ *
310
+ * @param requestingEntityId - External tenant ID (B2B) or user ID (D2C)
311
+ * @param metric - The metric key to record usage for
312
+ * @param value - Usage value (default: 1)
313
+ * @param metadata - Optional metadata
314
+ *
315
+ * @example
316
+ * ```typescript
317
+ * await crovver.recordUsage('company-123', 'api-calls', 1, {
318
+ * endpoint: '/api/v1/users',
319
+ * method: 'GET'
320
+ * });
321
+ * ```
322
+ */
323
+ async recordUsage(requestingEntityId, metric, value = 1, metadata) {
324
+ return this.withRetry(async () => {
325
+ const response = await this.client.post("/api/public/record-usage", {
326
+ requestingEntityId,
327
+ metric,
328
+ value,
329
+ metadata,
330
+ });
331
+ return response.data;
332
+ });
333
+ }
334
+ /**
335
+ * Check current usage and limits for a metric
336
+ *
337
+ * @param requestingEntityId - External tenant ID (B2B) or user ID (D2C)
338
+ * @param metric - The metric key to check
339
+ * @returns Usage information including current value, limit, and remaining
340
+ *
341
+ * @example
342
+ * ```typescript
343
+ * const usage = await crovver.checkUsageLimit('company-123', 'api-calls');
344
+ * console.log(`Used: ${usage.current} / ${usage.limit}`);
345
+ * console.log(`Remaining: ${usage.remaining}`);
346
+ * ```
347
+ */
348
+ async checkUsageLimit(requestingEntityId, metric) {
349
+ return this.withRetry(async () => {
350
+ const response = await this.client.post("/api/public/check-usage-limit", {
351
+ requestingEntityId,
352
+ metric,
353
+ });
354
+ return response.data;
355
+ });
356
+ }
357
+ // ────────────────────────────────────────────────────────────────────────
358
+ // PRORATION (Seat-Based Plans)
359
+ // ────────────────────────────────────────────────────────────────────────
360
+ /**
361
+ * Create a proration checkout session for a mid-cycle seat capacity upgrade.
362
+ *
363
+ * The proration amount is calculated server-side. After successful payment
364
+ * the webhook will upgrade the subscription capacity automatically.
365
+ *
366
+ * @param params - Proration checkout details
367
+ * @returns Checkout URL, proration ID, and calculated amount
368
+ *
369
+ * @example
370
+ * ```typescript
371
+ * const checkout = await crovver.createProrationCheckout({
372
+ * requestingEntityId: 'company-123',
373
+ * newCapacity: 15,
374
+ * planId: 'plan-uuid', // optional
375
+ * successUrl: 'https://myapp.com/success',
376
+ * cancelUrl: 'https://myapp.com/cancel',
377
+ * });
378
+ *
379
+ * if (checkout.checkoutUrl) {
380
+ * window.location.href = checkout.checkoutUrl;
381
+ * }
382
+ * ```
383
+ */
384
+ async createProrationCheckout(params) {
385
+ // Payment operations should not be retried to avoid duplicate charges
386
+ const response = await this.client.post("/api/public/capacity/proration-checkout", {
387
+ requestingEntityId: params.requestingEntityId,
388
+ newCapacity: params.newCapacity,
389
+ planId: params.planId,
390
+ successUrl: params.successUrl,
391
+ cancelUrl: params.cancelUrl,
392
+ });
393
+ return response.data;
394
+ }
395
+ // ────────────────────────────────────────────────────────────────────────
396
+ // SUBSCRIPTION MANAGEMENT
397
+ // ────────────────────────────────────────────────────────────────────────
398
+ /**
399
+ * Cancel an active subscription.
400
+ *
401
+ * The subscription remains active until the end of the current billing
402
+ * period (cancel-at-period-end behaviour).
403
+ *
404
+ * @param subscriptionId - The Crovver subscription ID
405
+ * @param reason - Cancellation reason (required by the API)
406
+ * @param feedback - Optional free-text feedback
407
+ *
408
+ * @example
409
+ * ```typescript
410
+ * const result = await crovver.cancelSubscription(
411
+ * 'sub-uuid',
412
+ * 'too_expensive',
413
+ * 'Pricing is a bit high for our team size',
414
+ * );
415
+ * console.log(`Subscription ends at: ${result.willEndAt}`);
416
+ * ```
417
+ */
418
+ async cancelSubscription(subscriptionId, reason, feedback) {
419
+ return this.withRetry(async () => {
420
+ const response = await this.client.post(`/api/public/subscriptions/${subscriptionId}/cancel`, { reason, feedback });
421
+ return response.data;
422
+ });
423
+ }
424
+ // ────────────────────────────────────────────────────────────────────────
425
+ // BILLING / INVOICES
426
+ // ────────────────────────────────────────────────────────────────────────
427
+ /**
428
+ * Get invoices for a tenant.
429
+ *
430
+ * @param externalTenantId - External tenant ID
431
+ * @returns List of invoices
432
+ *
433
+ * @example
434
+ * ```typescript
435
+ * const { invoices } = await crovver.getInvoices('company-123');
436
+ * invoices.forEach(inv => {
437
+ * console.log(`${inv.invoice_number}: ${inv.total_amount} ${inv.currency}`);
438
+ * });
439
+ * ```
440
+ */
441
+ async getInvoices(externalTenantId) {
442
+ return this.withRetry(async () => {
443
+ const response = await this.client.get("/api/public/billing/invoices", { params: { externalTenantId } });
444
+ return response.data;
445
+ });
446
+ }
447
+ // ────────────────────────────────────────────────────────────────────────
448
+ // PAYMENT PROVIDERS
449
+ // ────────────────────────────────────────────────────────────────────────
450
+ /**
451
+ * Get list of supported payment providers
452
+ *
453
+ * Returns all payment providers available on the Crovver platform.
454
+ *
455
+ * @returns List of supported payment providers
456
+ *
457
+ * @example
458
+ * ```typescript
459
+ * const { providers } = await crovver.getSupportedProviders();
460
+ * providers.forEach(p => console.log(`${p.name}: ${p.code}`));
461
+ * ```
462
+ */
463
+ async getSupportedProviders() {
464
+ return this.withRetry(async () => {
465
+ const response = await this.client.get("/api/public/supported-providers");
466
+ return response.data;
467
+ });
468
+ }
469
+ }
470
+ export default CrovverClient;
471
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const CROVVER_BASE_URL = "https://app.crovver.com";
2
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,4BAA4B,CAAC"}