@surgent-dev/surpay 0.1.6 → 0.2.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.
- package/README.md +20 -20
- package/dist/client.d.ts +14 -5
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +51 -22
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/surpay.d.ts +5 -5
- package/dist/surpay.d.ts.map +1 -1
- package/dist/surpay.js +6 -6
- package/dist/surpay.js.map +1 -1
- package/dist/types.d.ts +12 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/case.d.ts +28 -0
- package/dist/utils/case.d.ts.map +1 -0
- package/dist/utils/case.js +58 -0
- package/dist/utils/case.js.map +1 -0
- package/dist/utils/case.test.d.ts +2 -0
- package/dist/utils/case.test.d.ts.map +1 -0
- package/dist/utils/case.test.js +316 -0
- package/dist/utils/case.test.js.map +1 -0
- package/dist/utils/result.d.ts +16 -2
- package/dist/utils/result.d.ts.map +1 -1
- package/dist/utils/result.js +23 -2
- package/dist/utils/result.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -86,7 +86,7 @@ Note: Projects are created via the Surgent dashboard. The SDK provides read-only
|
|
|
86
86
|
|
|
87
87
|
```typescript
|
|
88
88
|
// List projects
|
|
89
|
-
const { data: projects } = await surpay.projects.list()
|
|
89
|
+
const { data: projects, error } = await surpay.projects.list()
|
|
90
90
|
```
|
|
91
91
|
|
|
92
92
|
### Products
|
|
@@ -95,20 +95,19 @@ Manage products within a project.
|
|
|
95
95
|
|
|
96
96
|
```typescript
|
|
97
97
|
// Create a product
|
|
98
|
-
const { data } = await surpay.products.create({
|
|
99
|
-
project_id: 'proj_123',
|
|
98
|
+
const { data: product, error } = await surpay.products.create({
|
|
100
99
|
product_group_id: 'group_456',
|
|
101
100
|
name: 'Pro Plan',
|
|
102
101
|
slug: 'pro-plan',
|
|
103
102
|
})
|
|
104
103
|
|
|
105
104
|
// Update a product
|
|
106
|
-
await surpay.products.update('prod_123', {
|
|
105
|
+
const { data: updated, error: updateError } = await surpay.products.update('prod_123', {
|
|
107
106
|
name: 'Pro Plan v2',
|
|
108
107
|
})
|
|
109
108
|
|
|
110
109
|
// List products with their prices
|
|
111
|
-
const { data: products } = await surpay.products.listWithPrices(
|
|
110
|
+
const { data: products, error: listError } = await surpay.products.listWithPrices()
|
|
112
111
|
```
|
|
113
112
|
|
|
114
113
|
### Prices
|
|
@@ -117,8 +116,7 @@ Manage pricing for your products.
|
|
|
117
116
|
|
|
118
117
|
```typescript
|
|
119
118
|
// Create a price
|
|
120
|
-
const { data } = await surpay.prices.create({
|
|
121
|
-
project_id: 'proj_123',
|
|
119
|
+
const { data: price, error } = await surpay.prices.create({
|
|
122
120
|
product_group_id: 'group_456',
|
|
123
121
|
name: 'Monthly',
|
|
124
122
|
price: 999, // $9.99
|
|
@@ -133,15 +131,17 @@ Create hosted checkout sessions.
|
|
|
133
131
|
|
|
134
132
|
```typescript
|
|
135
133
|
// Create a checkout session
|
|
136
|
-
const { data } = await surpay.checkout.create({
|
|
134
|
+
const { data: checkout, error } = await surpay.checkout.create({
|
|
137
135
|
product_id: 'prod_123',
|
|
138
136
|
price_id: 'price_456',
|
|
139
|
-
customer_id: 'cust_123',
|
|
137
|
+
customer_id: 'cust_123', // Required
|
|
140
138
|
success_url: 'https://example.com/success',
|
|
141
139
|
cancel_url: 'https://example.com/cancel',
|
|
142
140
|
})
|
|
143
141
|
|
|
144
|
-
|
|
142
|
+
if (checkout) {
|
|
143
|
+
console.log(checkout.checkout_url)
|
|
144
|
+
}
|
|
145
145
|
```
|
|
146
146
|
|
|
147
147
|
### Check
|
|
@@ -149,12 +149,12 @@ console.log(data.checkout_url)
|
|
|
149
149
|
Verify if a customer has access to a specific product.
|
|
150
150
|
|
|
151
151
|
```typescript
|
|
152
|
-
const { data } = await surpay.check({
|
|
152
|
+
const { data, error } = await surpay.check({
|
|
153
153
|
customer_id: 'cust_123',
|
|
154
154
|
product_id: 'prod_123',
|
|
155
155
|
})
|
|
156
156
|
|
|
157
|
-
if (data
|
|
157
|
+
if (data?.allowed) {
|
|
158
158
|
console.log('Customer has access')
|
|
159
159
|
}
|
|
160
160
|
```
|
|
@@ -165,10 +165,10 @@ Retrieve customer information.
|
|
|
165
165
|
|
|
166
166
|
```typescript
|
|
167
167
|
// List customers
|
|
168
|
-
const { data: customers } = await surpay.customers.list(
|
|
168
|
+
const { data: customers, error } = await surpay.customers.list()
|
|
169
169
|
|
|
170
170
|
// Get customer with details (subscriptions & transactions)
|
|
171
|
-
const { data: customer } = await surpay.customers.get('
|
|
171
|
+
const { data: customer, error: getError } = await surpay.customers.get('cust_123')
|
|
172
172
|
```
|
|
173
173
|
|
|
174
174
|
### Subscriptions
|
|
@@ -177,7 +177,7 @@ Monitor active subscriptions.
|
|
|
177
177
|
|
|
178
178
|
```typescript
|
|
179
179
|
// List subscriptions
|
|
180
|
-
const { data: subscriptions } = await surpay.subscriptions.list(
|
|
180
|
+
const { data: subscriptions, error } = await surpay.subscriptions.list()
|
|
181
181
|
```
|
|
182
182
|
|
|
183
183
|
### Transactions
|
|
@@ -186,7 +186,7 @@ Track payments and revenue.
|
|
|
186
186
|
|
|
187
187
|
```typescript
|
|
188
188
|
// List transactions
|
|
189
|
-
const { data: transactions } = await surpay.transactions.list(
|
|
189
|
+
const { data: transactions, error } = await surpay.transactions.list()
|
|
190
190
|
```
|
|
191
191
|
|
|
192
192
|
### Accounts
|
|
@@ -195,16 +195,16 @@ Manage connected payment processor accounts.
|
|
|
195
195
|
|
|
196
196
|
```typescript
|
|
197
197
|
// Connect a new account (Stripe)
|
|
198
|
-
const { data } = await surpay.accounts.connect({
|
|
198
|
+
const { data: account, error } = await surpay.accounts.connect({
|
|
199
199
|
processor: 'stripe',
|
|
200
200
|
})
|
|
201
201
|
|
|
202
202
|
// Get account details
|
|
203
|
-
const { data:
|
|
203
|
+
const { data: accountDetails, error: getError } = await surpay.accounts.get('acc_123')
|
|
204
204
|
|
|
205
205
|
// List connected accounts
|
|
206
|
-
const { data: accounts } = await surpay.accounts.list()
|
|
206
|
+
const { data: accounts, error: listError } = await surpay.accounts.list()
|
|
207
207
|
|
|
208
208
|
// Delete/Disconnect an account
|
|
209
|
-
await surpay.accounts.delete('acc_123')
|
|
209
|
+
const { error: deleteError } = await surpay.accounts.delete('acc_123')
|
|
210
210
|
```
|
package/dist/client.d.ts
CHANGED
|
@@ -3,18 +3,27 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Provides core HTTP methods with Result pattern error handling.
|
|
5
5
|
*/
|
|
6
|
+
import { type ToResultOptions } from './utils/result.js';
|
|
6
7
|
import { SurpayError } from './errors.js';
|
|
7
|
-
import type { Result } from './types.js';
|
|
8
|
+
import type { ResponseCase, Result } from './types.js';
|
|
9
|
+
export interface SurpayClientOptions {
|
|
10
|
+
apiKey: string;
|
|
11
|
+
baseUrl?: string;
|
|
12
|
+
responseCase?: ResponseCase;
|
|
13
|
+
/** Request timeout in milliseconds. Default: 30000 (30 seconds) */
|
|
14
|
+
timeoutMs?: number;
|
|
15
|
+
}
|
|
8
16
|
export declare class SurpayClient {
|
|
9
17
|
protected readonly baseUrl: string;
|
|
10
18
|
protected readonly headers: Record<string, string>;
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
});
|
|
19
|
+
protected readonly resultOptions: ToResultOptions;
|
|
20
|
+
protected readonly timeoutMs: number;
|
|
21
|
+
constructor(options: SurpayClientOptions);
|
|
15
22
|
protected get<T>(path: string): Promise<Result<T, SurpayError>>;
|
|
16
23
|
protected post<T>(path: string, body?: unknown): Promise<Result<T, SurpayError>>;
|
|
17
24
|
protected put<T>(path: string, body: unknown): Promise<Result<T, SurpayError>>;
|
|
18
25
|
protected delete<T>(path: string): Promise<Result<T, SurpayError>>;
|
|
26
|
+
private request;
|
|
27
|
+
private handleFetchError;
|
|
19
28
|
}
|
|
20
29
|
//# sourceMappingURL=client.d.ts.map
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAY,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAItD,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B,mEAAmE;IACnE,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAID,qBAAa,YAAY;IACvB,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IAClC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAClD,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,eAAe,CAAA;IACjD,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;gBAExB,OAAO,EAAE,mBAAmB;cAYxB,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;cAIrD,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;cAItE,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;cAIpE,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;YAI1D,OAAO;IAkBrB,OAAO,CAAC,gBAAgB;CA0BzB"}
|
package/dist/client.js
CHANGED
|
@@ -4,46 +4,75 @@
|
|
|
4
4
|
* Provides core HTTP methods with Result pattern error handling.
|
|
5
5
|
*/
|
|
6
6
|
import { toResult } from './utils/result.js';
|
|
7
|
+
import { SurpayError } from './errors.js';
|
|
7
8
|
const DEFAULT_BASE_URL = 'https://pay.surgent.dev';
|
|
9
|
+
const DEFAULT_TIMEOUT_MS = 30000;
|
|
8
10
|
export class SurpayClient {
|
|
9
11
|
baseUrl;
|
|
10
12
|
headers;
|
|
13
|
+
resultOptions;
|
|
14
|
+
timeoutMs;
|
|
11
15
|
constructor(options) {
|
|
12
16
|
this.baseUrl = options.baseUrl || DEFAULT_BASE_URL;
|
|
17
|
+
this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
13
18
|
this.headers = {
|
|
14
19
|
Authorization: `Bearer ${options.apiKey}`,
|
|
15
20
|
'Content-Type': 'application/json',
|
|
16
21
|
};
|
|
22
|
+
this.resultOptions = {
|
|
23
|
+
responseCase: options.responseCase ?? 'snake',
|
|
24
|
+
};
|
|
17
25
|
}
|
|
18
26
|
async get(path) {
|
|
19
|
-
|
|
20
|
-
method: 'GET',
|
|
21
|
-
headers: this.headers,
|
|
22
|
-
});
|
|
23
|
-
return toResult(response);
|
|
27
|
+
return this.request('GET', path);
|
|
24
28
|
}
|
|
25
29
|
async post(path, body) {
|
|
26
|
-
|
|
27
|
-
method: 'POST',
|
|
28
|
-
headers: this.headers,
|
|
29
|
-
body: body !== undefined ? JSON.stringify(body) : undefined,
|
|
30
|
-
});
|
|
31
|
-
return toResult(response);
|
|
30
|
+
return this.request('POST', path, body);
|
|
32
31
|
}
|
|
33
32
|
async put(path, body) {
|
|
34
|
-
|
|
35
|
-
method: 'PUT',
|
|
36
|
-
headers: this.headers,
|
|
37
|
-
body: JSON.stringify(body),
|
|
38
|
-
});
|
|
39
|
-
return toResult(response);
|
|
33
|
+
return this.request('PUT', path, body);
|
|
40
34
|
}
|
|
41
35
|
async delete(path) {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
36
|
+
return this.request('DELETE', path);
|
|
37
|
+
}
|
|
38
|
+
async request(method, path, body) {
|
|
39
|
+
try {
|
|
40
|
+
const response = await fetch(`${this.baseUrl}${path}`, {
|
|
41
|
+
method,
|
|
42
|
+
headers: this.headers,
|
|
43
|
+
body: body !== undefined ? JSON.stringify(body) : undefined,
|
|
44
|
+
signal: AbortSignal.timeout(this.timeoutMs),
|
|
45
|
+
});
|
|
46
|
+
return toResult(response, this.resultOptions);
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
return this.handleFetchError(error);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
handleFetchError(error) {
|
|
53
|
+
// Timeout errors from AbortSignal.timeout()
|
|
54
|
+
if (error instanceof DOMException && error.name === 'TimeoutError') {
|
|
55
|
+
return {
|
|
56
|
+
data: null,
|
|
57
|
+
error: new SurpayError({
|
|
58
|
+
message: `Request timed out after ${this.timeoutMs}ms`,
|
|
59
|
+
code: 'timeout_error',
|
|
60
|
+
statusCode: 0,
|
|
61
|
+
}),
|
|
62
|
+
statusCode: 0,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
// Network errors (DNS failure, connection refused, etc.)
|
|
66
|
+
const message = error instanceof Error ? error.message : 'Network request failed';
|
|
67
|
+
return {
|
|
68
|
+
data: null,
|
|
69
|
+
error: new SurpayError({
|
|
70
|
+
message,
|
|
71
|
+
code: 'network_error',
|
|
72
|
+
statusCode: 0,
|
|
73
|
+
}),
|
|
74
|
+
statusCode: 0,
|
|
75
|
+
};
|
|
47
76
|
}
|
|
48
77
|
}
|
|
49
78
|
//# sourceMappingURL=client.js.map
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAwB,MAAM,mBAAmB,CAAA;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAGzC,MAAM,gBAAgB,GAAG,yBAAyB,CAAA;AAUlD,MAAM,kBAAkB,GAAG,KAAK,CAAA;AAEhC,MAAM,OAAO,YAAY;IACJ,OAAO,CAAQ;IACf,OAAO,CAAwB;IAC/B,aAAa,CAAiB;IAC9B,SAAS,CAAQ;IAEpC,YAAY,OAA4B;QACtC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,gBAAgB,CAAA;QAClD,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,kBAAkB,CAAA;QACxD,IAAI,CAAC,OAAO,GAAG;YACb,aAAa,EAAE,UAAU,OAAO,CAAC,MAAM,EAAE;YACzC,cAAc,EAAE,kBAAkB;SACnC,CAAA;QACD,IAAI,CAAC,aAAa,GAAG;YACnB,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,OAAO;SAC9C,CAAA;IACH,CAAC;IAES,KAAK,CAAC,GAAG,CAAI,IAAY;QACjC,OAAO,IAAI,CAAC,OAAO,CAAI,KAAK,EAAE,IAAI,CAAC,CAAA;IACrC,CAAC;IAES,KAAK,CAAC,IAAI,CAAI,IAAY,EAAE,IAAc;QAClD,OAAO,IAAI,CAAC,OAAO,CAAI,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;IAC5C,CAAC;IAES,KAAK,CAAC,GAAG,CAAI,IAAY,EAAE,IAAa;QAChD,OAAO,IAAI,CAAC,OAAO,CAAI,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;IAC3C,CAAC;IAES,KAAK,CAAC,MAAM,CAAI,IAAY;QACpC,OAAO,IAAI,CAAC,OAAO,CAAI,QAAQ,EAAE,IAAI,CAAC,CAAA;IACxC,CAAC;IAEO,KAAK,CAAC,OAAO,CACnB,MAAc,EACd,IAAY,EACZ,IAAc;QAEd,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,EAAE;gBACrD,MAAM;gBACN,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,IAAI,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;gBAC3D,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC;aAC5C,CAAC,CAAA;YACF,OAAO,QAAQ,CAAI,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC,CAAA;QAClD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,gBAAgB,CAAI,KAAK,CAAC,CAAA;QACxC,CAAC;IACH,CAAC;IAEO,gBAAgB,CAAI,KAAc;QACxC,4CAA4C;QAC5C,IAAI,KAAK,YAAY,YAAY,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;YACnE,OAAO;gBACL,IAAI,EAAE,IAAI;gBACV,KAAK,EAAE,IAAI,WAAW,CAAC;oBACrB,OAAO,EAAE,2BAA2B,IAAI,CAAC,SAAS,IAAI;oBACtD,IAAI,EAAE,eAAe;oBACrB,UAAU,EAAE,CAAC;iBACd,CAAC;gBACF,UAAU,EAAE,CAAC;aACd,CAAA;QACH,CAAC;QAED,yDAAyD;QACzD,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAA;QACjF,OAAO;YACL,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,IAAI,WAAW,CAAC;gBACrB,OAAO;gBACP,IAAI,EAAE,eAAe;gBACrB,UAAU,EAAE,CAAC;aACd,CAAC;YACF,UAAU,EAAE,CAAC;SACd,CAAA;IACH,CAAC;CACF"}
|
package/dist/index.d.ts
CHANGED
|
@@ -28,5 +28,6 @@
|
|
|
28
28
|
*/
|
|
29
29
|
export { Surpay } from './surpay.js';
|
|
30
30
|
export { SurpayError, isSurpayError } from './errors.js';
|
|
31
|
-
export
|
|
31
|
+
export { camelToSnake } from './utils/case.js';
|
|
32
|
+
export type { Result, Success, Failure, SurpayConfig, ResponseCase, SubscriptionStatus, RecurringInterval, TransactionType, CheckoutStatus, CheckoutMode, PayoutStatus, Project, Customer, CustomerWithDetails, TransactionSummary, SubscriptionSummary, Product, CreateProductRequest, CreateProductResponse, UpdateProductRequest, UpdateProductResponse, ProductWithPrices, ProductPrice, CreatePriceRequest, CreatePriceResponse, CreateCheckoutRequest, CreateCheckoutResponse, CheckRequest, CheckResponse, Transaction, Subscription, ConnectAccountRequest, ConnectAccountResponse, ConnectedAccount, } from './types.js';
|
|
32
33
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAGpC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAGxD,YAAY,EAEV,MAAM,EACN,OAAO,EACP,OAAO,EAGP,YAAY,EAGZ,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,YAAY,EACZ,YAAY,EAGZ,OAAO,EAGP,QAAQ,EACR,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EAGnB,OAAO,EACP,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,EAGjB,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EAGnB,qBAAqB,EACrB,sBAAsB,EAGtB,YAAY,EACZ,aAAa,EAGb,WAAW,EAGX,YAAY,EAGZ,qBAAqB,EACrB,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,YAAY,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAGpC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAGxD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAG9C,YAAY,EAEV,MAAM,EACN,OAAO,EACP,OAAO,EAGP,YAAY,EACZ,YAAY,EAGZ,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,YAAY,EACZ,YAAY,EAGZ,OAAO,EAGP,QAAQ,EACR,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EAGnB,OAAO,EACP,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,EAGjB,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EAGnB,qBAAqB,EACrB,sBAAsB,EAGtB,YAAY,EACZ,aAAa,EAGb,WAAW,EAGX,YAAY,EAGZ,qBAAqB,EACrB,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,YAAY,CAAA"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,cAAc;AACd,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,iBAAiB;AACjB,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,cAAc;AACd,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,iBAAiB;AACjB,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAExD,YAAY;AACZ,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA"}
|
package/dist/surpay.d.ts
CHANGED
|
@@ -9,13 +9,13 @@ import type { SurpayConfig, Customer, CustomerWithDetails, CreateProductRequest,
|
|
|
9
9
|
export declare class Surpay extends SurpayClient {
|
|
10
10
|
constructor(options?: SurpayConfig);
|
|
11
11
|
customers: {
|
|
12
|
-
list: (
|
|
13
|
-
get: (
|
|
12
|
+
list: () => Promise<import("./types.js").Result<Customer[], import("./errors.js").SurpayError>>;
|
|
13
|
+
get: (customerId: string) => Promise<import("./types.js").Result<CustomerWithDetails, import("./errors.js").SurpayError>>;
|
|
14
14
|
};
|
|
15
15
|
products: {
|
|
16
16
|
create: (params: CreateProductRequest) => Promise<import("./types.js").Result<CreateProductResponse, import("./errors.js").SurpayError>>;
|
|
17
17
|
update: (productId: string, params: UpdateProductRequest) => Promise<import("./types.js").Result<UpdateProductResponse, import("./errors.js").SurpayError>>;
|
|
18
|
-
listWithPrices: (
|
|
18
|
+
listWithPrices: () => Promise<import("./types.js").Result<ProductWithPrices[], import("./errors.js").SurpayError>>;
|
|
19
19
|
};
|
|
20
20
|
prices: {
|
|
21
21
|
create: (params: CreatePriceRequest) => Promise<import("./types.js").Result<CreatePriceResponse, import("./errors.js").SurpayError>>;
|
|
@@ -25,10 +25,10 @@ export declare class Surpay extends SurpayClient {
|
|
|
25
25
|
};
|
|
26
26
|
check: (params: CheckRequest) => Promise<import("./types.js").Result<CheckResponse, import("./errors.js").SurpayError>>;
|
|
27
27
|
subscriptions: {
|
|
28
|
-
list: (
|
|
28
|
+
list: () => Promise<import("./types.js").Result<Subscription[], import("./errors.js").SurpayError>>;
|
|
29
29
|
};
|
|
30
30
|
transactions: {
|
|
31
|
-
list: (
|
|
31
|
+
list: () => Promise<import("./types.js").Result<Transaction[], import("./errors.js").SurpayError>>;
|
|
32
32
|
};
|
|
33
33
|
projects: {
|
|
34
34
|
list: () => Promise<import("./types.js").Failure<import("./errors.js").SurpayError> | {
|
package/dist/surpay.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"surpay.d.ts","sourceRoot":"","sources":["../src/surpay.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,KAAK,EACV,YAAY,EACZ,QAAQ,EACR,mBAAmB,EACnB,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,sBAAsB,EACtB,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,WAAW,EACX,OAAO,EACP,qBAAqB,EACrB,sBAAsB,EACtB,gBAAgB,EACjB,MAAM,YAAY,CAAA;AAEnB,qBAAa,MAAO,SAAQ,YAAY;gBAC1B,OAAO,CAAC,EAAE,YAAY;IAalC,SAAS
|
|
1
|
+
{"version":3,"file":"surpay.d.ts","sourceRoot":"","sources":["../src/surpay.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,KAAK,EACV,YAAY,EACZ,QAAQ,EACR,mBAAmB,EACnB,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,sBAAsB,EACtB,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,WAAW,EACX,OAAO,EACP,qBAAqB,EACrB,sBAAsB,EACtB,gBAAgB,EACjB,MAAM,YAAY,CAAA;AAEnB,qBAAa,MAAO,SAAQ,YAAY;gBAC1B,OAAO,CAAC,EAAE,YAAY;IAalC,SAAS;;0BAGW,MAAM;MACzB;IAED,QAAQ;yBACW,oBAAoB;4BAEjB,MAAM,UAAU,oBAAoB;;MAIzD;IAED,MAAM;yBACa,kBAAkB;MACpC;IAED,QAAQ;yBACW,qBAAqB;MACvC;IAED,KAAK,GAAI,QAAQ,YAAY,4FAA+C;IAE5E,aAAa;;MAEZ;IAED,YAAY;;MAEX;IAED,QAAQ;;;;;;MAUP;IAED,QAAQ;0BACY,qBAAqB;yBAEtB,MAAM;;4BAIH,MAAM;MAC3B;CACF"}
|
package/dist/surpay.js
CHANGED
|
@@ -14,16 +14,16 @@ export class Surpay extends SurpayClient {
|
|
|
14
14
|
if (!apiKey) {
|
|
15
15
|
throw new Error('Surpay API key is required. Pass it via options or set SURPAY_API_KEY env var.');
|
|
16
16
|
}
|
|
17
|
-
super({ apiKey, baseUrl });
|
|
17
|
+
super({ apiKey, baseUrl, responseCase: options?.responseCase });
|
|
18
18
|
}
|
|
19
19
|
customers = {
|
|
20
|
-
list: (
|
|
21
|
-
get: (
|
|
20
|
+
list: () => this.get('/customers'),
|
|
21
|
+
get: (customerId) => this.get(`/customers/${customerId}`),
|
|
22
22
|
};
|
|
23
23
|
products = {
|
|
24
24
|
create: (params) => this.post('/product', params),
|
|
25
25
|
update: (productId, params) => this.put(`/product/${productId}`, params),
|
|
26
|
-
listWithPrices: (
|
|
26
|
+
listWithPrices: () => this.get('/products'),
|
|
27
27
|
};
|
|
28
28
|
prices = {
|
|
29
29
|
create: (params) => this.post('/product/price', params),
|
|
@@ -33,10 +33,10 @@ export class Surpay extends SurpayClient {
|
|
|
33
33
|
};
|
|
34
34
|
check = (params) => this.post('/check', params);
|
|
35
35
|
subscriptions = {
|
|
36
|
-
list: (
|
|
36
|
+
list: () => this.get('/subscriptions'),
|
|
37
37
|
};
|
|
38
38
|
transactions = {
|
|
39
|
-
list: (
|
|
39
|
+
list: () => this.get('/transactions'),
|
|
40
40
|
};
|
|
41
41
|
projects = {
|
|
42
42
|
list: async () => {
|
package/dist/surpay.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"surpay.js","sourceRoot":"","sources":["../src/surpay.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAwB1C,MAAM,OAAO,MAAO,SAAQ,YAAY;IACtC,YAAY,OAAsB;QAChC,MAAM,SAAS,GAAG,OAAO,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAA;QACzF,MAAM,UAAU,GAAG,OAAO,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,CAAA;QAC3F,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,SAAS,IAAI,EAAE,CAAA;QACjD,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,UAAU,CAAA;QAE9C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,gFAAgF,CAAC,CAAA;QACnG,CAAC;QAED,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"surpay.js","sourceRoot":"","sources":["../src/surpay.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -55,7 +55,6 @@ export interface CustomerWithDetails extends Customer {
|
|
|
55
55
|
subscriptions: SubscriptionSummary[];
|
|
56
56
|
}
|
|
57
57
|
export interface CreateProductRequest {
|
|
58
|
-
project_id: string;
|
|
59
58
|
product_group_id: string;
|
|
60
59
|
name: string;
|
|
61
60
|
description?: string;
|
|
@@ -92,7 +91,6 @@ export interface Product {
|
|
|
92
91
|
version?: number | null;
|
|
93
92
|
}
|
|
94
93
|
export interface CreatePriceRequest {
|
|
95
|
-
project_id: string;
|
|
96
94
|
product_group_id: string;
|
|
97
95
|
name?: string;
|
|
98
96
|
description?: string;
|
|
@@ -192,8 +190,6 @@ export interface Subscription {
|
|
|
192
190
|
project_id?: string | null;
|
|
193
191
|
}
|
|
194
192
|
export interface ConnectAccountRequest {
|
|
195
|
-
/** Required for session auth, optional for API key auth */
|
|
196
|
-
project_id?: string;
|
|
197
193
|
processor: string;
|
|
198
194
|
account_type?: string;
|
|
199
195
|
country?: string;
|
|
@@ -217,10 +213,22 @@ export interface ConnectedAccount {
|
|
|
217
213
|
business_type?: string | null;
|
|
218
214
|
processor_account_id?: string | null;
|
|
219
215
|
}
|
|
216
|
+
/**
|
|
217
|
+
* Response case format for API responses.
|
|
218
|
+
* - 'snake': Transform camelCase keys to snake_case (default, matches TypeScript types)
|
|
219
|
+
* - 'camel': Keep original camelCase keys from API
|
|
220
|
+
*/
|
|
221
|
+
export type ResponseCase = 'snake' | 'camel';
|
|
220
222
|
export interface SurpayConfig {
|
|
221
223
|
/** Your Surpay API key (64 alphabetic characters) */
|
|
222
224
|
apiKey?: string;
|
|
223
225
|
/** Override the base URL (default: https://pay.surgent.dev) */
|
|
224
226
|
baseUrl?: string;
|
|
227
|
+
/**
|
|
228
|
+
* Response key case format.
|
|
229
|
+
* - 'snake' (default): Transform API responses from camelCase to snake_case to match TypeScript types
|
|
230
|
+
* - 'camel': Keep original camelCase keys from API responses
|
|
231
|
+
*/
|
|
232
|
+
responseCase?: ResponseCase;
|
|
225
233
|
}
|
|
226
234
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,MAAM,OAAO,CAAC,CAAC,IAAI;IAAE,IAAI,EAAE,CAAC,CAAC;IAAC,KAAK,EAAE,IAAI,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAA;AACrE,MAAM,MAAM,OAAO,CAAC,CAAC,IAAI;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,CAAC,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAA;AACrE,MAAM,MAAM,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;AAM5D,MAAM,MAAM,kBAAkB,GAC1B,QAAQ,GACR,UAAU,GACV,UAAU,GACV,QAAQ,GACR,UAAU,GACV,YAAY,GACZ,oBAAoB,CAAA;AAExB,MAAM,MAAM,iBAAiB,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAA;AAEjE,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,eAAe,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAA;AAEvG,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,CAAA;AAC5D,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,cAAc,GAAG,OAAO,CAAA;AAE/D,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,SAAS,GAAG,YAAY,GAAG,UAAU,GAAG,QAAQ,CAAA;AAMpF,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAChC;AAMD,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,qBAAqB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC3B;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAA;IACV,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,eAAe,CAAA;IACrB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAA;IACV,UAAU,EAAE,MAAM,CAAA;IAClB,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,MAAM,EAAE,kBAAkB,CAAA;IAC1B,yBAAyB,CAAC,EAAE,MAAM,CAAA;CACnC;AAED,MAAM,WAAW,mBAAoB,SAAQ,QAAQ;IACnD,YAAY,EAAE,kBAAkB,EAAE,CAAA;IAClC,aAAa,EAAE,mBAAmB,EAAE,CAAA;CACrC;AAMD,MAAM,WAAW,oBAAoB;IACnC,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Case transformation utilities for API response normalization.
|
|
3
|
+
*
|
|
4
|
+
* The Surpay API returns camelCase keys (e.g., `productGroupId`), but the SDK's
|
|
5
|
+
* TypeScript types use snake_case (e.g., `product_group_id`) to match Rust conventions.
|
|
6
|
+
* These utilities transform response data to match the expected types.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Recursively transforms all object keys from camelCase to snake_case.
|
|
10
|
+
*
|
|
11
|
+
* Handles:
|
|
12
|
+
* - Nested objects (recursively transforms)
|
|
13
|
+
* - Arrays of objects (transforms each element)
|
|
14
|
+
* - Null/undefined values (passes through unchanged)
|
|
15
|
+
* - Primitive values (passes through unchanged)
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* camelToSnake({ productGroupId: 'pg_123', isDefault: true })
|
|
19
|
+
* // { product_group_id: 'pg_123', is_default: true }
|
|
20
|
+
*
|
|
21
|
+
* camelToSnake([{ customerId: 'cus_1' }, { customerId: 'cus_2' }])
|
|
22
|
+
* // [{ customer_id: 'cus_1' }, { customer_id: 'cus_2' }]
|
|
23
|
+
*
|
|
24
|
+
* @param input - The value to transform (object, array, or primitive)
|
|
25
|
+
* @returns The transformed value with snake_case keys
|
|
26
|
+
*/
|
|
27
|
+
export declare const camelToSnake: <T>(input: T) => T;
|
|
28
|
+
//# sourceMappingURL=case.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"case.d.ts","sourceRoot":"","sources":["../../src/utils/case.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAaH;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,YAAY,GAAI,CAAC,EAAE,OAAO,CAAC,KAAG,CAyB1C,CAAA"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Case transformation utilities for API response normalization.
|
|
3
|
+
*
|
|
4
|
+
* The Surpay API returns camelCase keys (e.g., `productGroupId`), but the SDK's
|
|
5
|
+
* TypeScript types use snake_case (e.g., `product_group_id`) to match Rust conventions.
|
|
6
|
+
* These utilities transform response data to match the expected types.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Converts a single camelCase string to snake_case.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* stringToSnakeCase('productGroupId') // 'product_group_id'
|
|
13
|
+
* stringToSnakeCase('isDefault') // 'is_default'
|
|
14
|
+
*/
|
|
15
|
+
const stringToSnakeCase = (str) => {
|
|
16
|
+
return str.replace(/([a-z])([A-Z])/g, '$1_$2').toLowerCase();
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Recursively transforms all object keys from camelCase to snake_case.
|
|
20
|
+
*
|
|
21
|
+
* Handles:
|
|
22
|
+
* - Nested objects (recursively transforms)
|
|
23
|
+
* - Arrays of objects (transforms each element)
|
|
24
|
+
* - Null/undefined values (passes through unchanged)
|
|
25
|
+
* - Primitive values (passes through unchanged)
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* camelToSnake({ productGroupId: 'pg_123', isDefault: true })
|
|
29
|
+
* // { product_group_id: 'pg_123', is_default: true }
|
|
30
|
+
*
|
|
31
|
+
* camelToSnake([{ customerId: 'cus_1' }, { customerId: 'cus_2' }])
|
|
32
|
+
* // [{ customer_id: 'cus_1' }, { customer_id: 'cus_2' }]
|
|
33
|
+
*
|
|
34
|
+
* @param input - The value to transform (object, array, or primitive)
|
|
35
|
+
* @returns The transformed value with snake_case keys
|
|
36
|
+
*/
|
|
37
|
+
export const camelToSnake = (input) => {
|
|
38
|
+
// Handle null/undefined
|
|
39
|
+
if (input === null || input === undefined) {
|
|
40
|
+
return input;
|
|
41
|
+
}
|
|
42
|
+
// Handle arrays - transform each element
|
|
43
|
+
if (Array.isArray(input)) {
|
|
44
|
+
return input.map((item) => camelToSnake(item));
|
|
45
|
+
}
|
|
46
|
+
// Handle objects - transform keys and recurse into values
|
|
47
|
+
if (typeof input === 'object') {
|
|
48
|
+
const result = {};
|
|
49
|
+
for (const key of Object.keys(input)) {
|
|
50
|
+
const snakeKey = stringToSnakeCase(key);
|
|
51
|
+
result[snakeKey] = camelToSnake(input[key]);
|
|
52
|
+
}
|
|
53
|
+
return result;
|
|
54
|
+
}
|
|
55
|
+
// Primitives pass through unchanged
|
|
56
|
+
return input;
|
|
57
|
+
};
|
|
58
|
+
//# sourceMappingURL=case.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"case.js","sourceRoot":"","sources":["../../src/utils/case.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;GAMG;AACH,MAAM,iBAAiB,GAAG,CAAC,GAAW,EAAU,EAAE;IAChD,OAAO,GAAG,CAAC,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC,WAAW,EAAE,CAAA;AAC9D,CAAC,CAAA;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAI,KAAQ,EAAK,EAAE;IAC7C,wBAAwB;IACxB,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAC1C,OAAO,KAAK,CAAA;IACd,CAAC;IAED,yCAAyC;IACzC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAM,CAAA;IACrD,CAAC;IAED,0DAA0D;IAC1D,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,MAAM,GAA4B,EAAE,CAAA;QAE1C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAA;YACvC,MAAM,CAAC,QAAQ,CAAC,GAAG,YAAY,CAAE,KAAiC,CAAC,GAAG,CAAC,CAAC,CAAA;QAC1E,CAAC;QAED,OAAO,MAAW,CAAA;IACpB,CAAC;IAED,oCAAoC;IACpC,OAAO,KAAK,CAAA;AACd,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"case.test.d.ts","sourceRoot":"","sources":["../../src/utils/case.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
import { describe, test, expect } from 'bun:test';
|
|
2
|
+
import { camelToSnake } from './case.js';
|
|
3
|
+
// ============================================================================
|
|
4
|
+
// camelToSnake utility tests
|
|
5
|
+
// ============================================================================
|
|
6
|
+
describe('camelToSnake', () => {
|
|
7
|
+
describe('primitive values', () => {
|
|
8
|
+
test('passes through string unchanged', () => {
|
|
9
|
+
expect(camelToSnake('hello')).toBe('hello');
|
|
10
|
+
});
|
|
11
|
+
test('passes through number unchanged', () => {
|
|
12
|
+
expect(camelToSnake(42)).toBe(42);
|
|
13
|
+
expect(camelToSnake(3.14)).toBe(3.14);
|
|
14
|
+
});
|
|
15
|
+
test('passes through boolean unchanged', () => {
|
|
16
|
+
expect(camelToSnake(true)).toBe(true);
|
|
17
|
+
expect(camelToSnake(false)).toBe(false);
|
|
18
|
+
});
|
|
19
|
+
test('passes through null unchanged', () => {
|
|
20
|
+
expect(camelToSnake(null)).toBe(null);
|
|
21
|
+
});
|
|
22
|
+
test('passes through undefined unchanged', () => {
|
|
23
|
+
expect(camelToSnake(undefined)).toBe(undefined);
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
describe('simple objects', () => {
|
|
27
|
+
test('transforms camelCase keys to snake_case', () => {
|
|
28
|
+
const input = { productGroupId: 'pg_123', isDefault: true };
|
|
29
|
+
const result = camelToSnake(input);
|
|
30
|
+
expect(result).toEqual({ product_group_id: 'pg_123', is_default: true });
|
|
31
|
+
});
|
|
32
|
+
test('handles single-word keys (no transformation needed)', () => {
|
|
33
|
+
const input = { name: 'Test', slug: 'test-slug' };
|
|
34
|
+
const result = camelToSnake(input);
|
|
35
|
+
expect(result).toEqual({ name: 'Test', slug: 'test-slug' });
|
|
36
|
+
});
|
|
37
|
+
test('keys already in snake_case remain unchanged', () => {
|
|
38
|
+
const input = { product_group_id: 'pg_123', is_default: true };
|
|
39
|
+
const result = camelToSnake(input);
|
|
40
|
+
expect(result).toEqual({ product_group_id: 'pg_123', is_default: true });
|
|
41
|
+
});
|
|
42
|
+
test('handles empty object', () => {
|
|
43
|
+
expect(camelToSnake({})).toEqual({});
|
|
44
|
+
});
|
|
45
|
+
test('transforms mixed case keys correctly', () => {
|
|
46
|
+
const input = {
|
|
47
|
+
productGroupId: 'pg_123',
|
|
48
|
+
processorProductId: 'prod_abc',
|
|
49
|
+
isArchived: false,
|
|
50
|
+
createdAt: '2024-01-01',
|
|
51
|
+
};
|
|
52
|
+
const result = camelToSnake(input);
|
|
53
|
+
expect(result).toEqual({
|
|
54
|
+
product_group_id: 'pg_123',
|
|
55
|
+
processor_product_id: 'prod_abc',
|
|
56
|
+
is_archived: false,
|
|
57
|
+
created_at: '2024-01-01',
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
describe('nested objects', () => {
|
|
62
|
+
test('transforms nested object keys recursively', () => {
|
|
63
|
+
const input = {
|
|
64
|
+
customerId: 'cus_123',
|
|
65
|
+
customerData: {
|
|
66
|
+
emailAddress: 'test@example.com',
|
|
67
|
+
fullName: 'John Doe',
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
const result = camelToSnake(input);
|
|
71
|
+
expect(result).toEqual({
|
|
72
|
+
customer_id: 'cus_123',
|
|
73
|
+
customer_data: {
|
|
74
|
+
email_address: 'test@example.com',
|
|
75
|
+
full_name: 'John Doe',
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
test('handles deeply nested objects', () => {
|
|
80
|
+
const input = {
|
|
81
|
+
levelOne: {
|
|
82
|
+
levelTwo: {
|
|
83
|
+
levelThree: {
|
|
84
|
+
deepValue: 'found',
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
const result = camelToSnake(input);
|
|
90
|
+
expect(result).toEqual({
|
|
91
|
+
level_one: {
|
|
92
|
+
level_two: {
|
|
93
|
+
level_three: {
|
|
94
|
+
deep_value: 'found',
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
test('handles null values in nested objects', () => {
|
|
101
|
+
const input = {
|
|
102
|
+
productId: 'prod_123',
|
|
103
|
+
description: null,
|
|
104
|
+
metadata: {
|
|
105
|
+
customField: null,
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
const result = camelToSnake(input);
|
|
109
|
+
expect(result).toEqual({
|
|
110
|
+
product_id: 'prod_123',
|
|
111
|
+
description: null,
|
|
112
|
+
metadata: {
|
|
113
|
+
custom_field: null,
|
|
114
|
+
},
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
describe('arrays', () => {
|
|
119
|
+
test('transforms array of objects', () => {
|
|
120
|
+
const input = [{ customerId: 'cus_1' }, { customerId: 'cus_2' }];
|
|
121
|
+
const result = camelToSnake(input);
|
|
122
|
+
expect(result).toEqual([{ customer_id: 'cus_1' }, { customer_id: 'cus_2' }]);
|
|
123
|
+
});
|
|
124
|
+
test('handles empty array', () => {
|
|
125
|
+
expect(camelToSnake([])).toEqual([]);
|
|
126
|
+
});
|
|
127
|
+
test('handles array of primitives (unchanged)', () => {
|
|
128
|
+
const input = ['a', 'b', 'c'];
|
|
129
|
+
expect(camelToSnake(input)).toEqual(['a', 'b', 'c']);
|
|
130
|
+
});
|
|
131
|
+
test('handles array of mixed types', () => {
|
|
132
|
+
const input = [{ productId: 'prod_1' }, null, 'string', 42];
|
|
133
|
+
const result = camelToSnake(input);
|
|
134
|
+
expect(result).toEqual([{ product_id: 'prod_1' }, null, 'string', 42]);
|
|
135
|
+
});
|
|
136
|
+
test('handles nested arrays', () => {
|
|
137
|
+
const input = {
|
|
138
|
+
items: [
|
|
139
|
+
{ itemId: 'item_1', tags: ['tag1', 'tag2'] },
|
|
140
|
+
{ itemId: 'item_2', tags: ['tag3'] },
|
|
141
|
+
],
|
|
142
|
+
};
|
|
143
|
+
const result = camelToSnake(input);
|
|
144
|
+
expect(result).toEqual({
|
|
145
|
+
items: [
|
|
146
|
+
{ item_id: 'item_1', tags: ['tag1', 'tag2'] },
|
|
147
|
+
{ item_id: 'item_2', tags: ['tag3'] },
|
|
148
|
+
],
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
// ============================================================================
|
|
154
|
+
// Response shape validation tests
|
|
155
|
+
// ============================================================================
|
|
156
|
+
describe('API response normalization', () => {
|
|
157
|
+
describe('Product response', () => {
|
|
158
|
+
test('transforms API response to match Product type', () => {
|
|
159
|
+
// Simulated API response (camelCase)
|
|
160
|
+
const apiResponse = {
|
|
161
|
+
id: 'prod_123',
|
|
162
|
+
productGroupId: 'pg_456',
|
|
163
|
+
name: 'Pro Plan',
|
|
164
|
+
slug: 'pro-plan',
|
|
165
|
+
description: 'Professional tier',
|
|
166
|
+
isArchived: false,
|
|
167
|
+
isDefault: true,
|
|
168
|
+
processorProductId: 'stripe_prod_abc',
|
|
169
|
+
projectId: 'proj_789',
|
|
170
|
+
version: 1,
|
|
171
|
+
};
|
|
172
|
+
const normalized = camelToSnake(apiResponse);
|
|
173
|
+
// Verify shape matches Product type
|
|
174
|
+
expect(normalized.id).toBe('prod_123');
|
|
175
|
+
expect(normalized.product_group_id).toBe('pg_456');
|
|
176
|
+
expect(normalized.name).toBe('Pro Plan');
|
|
177
|
+
expect(normalized.slug).toBe('pro-plan');
|
|
178
|
+
expect(normalized.description).toBe('Professional tier');
|
|
179
|
+
expect(normalized.is_archived).toBe(false);
|
|
180
|
+
expect(normalized.is_default).toBe(true);
|
|
181
|
+
expect(normalized.processor_product_id).toBe('stripe_prod_abc');
|
|
182
|
+
expect(normalized.project_id).toBe('proj_789');
|
|
183
|
+
expect(normalized.version).toBe(1);
|
|
184
|
+
});
|
|
185
|
+
test('handles Product with null optional fields', () => {
|
|
186
|
+
const apiResponse = {
|
|
187
|
+
id: 'prod_123',
|
|
188
|
+
productGroupId: 'pg_456',
|
|
189
|
+
name: 'Basic Plan',
|
|
190
|
+
slug: 'basic-plan',
|
|
191
|
+
description: null,
|
|
192
|
+
isArchived: null,
|
|
193
|
+
isDefault: null,
|
|
194
|
+
processorProductId: null,
|
|
195
|
+
projectId: null,
|
|
196
|
+
version: null,
|
|
197
|
+
};
|
|
198
|
+
const normalized = camelToSnake(apiResponse);
|
|
199
|
+
expect(normalized.id).toBe('prod_123');
|
|
200
|
+
expect(normalized.product_group_id).toBe('pg_456');
|
|
201
|
+
expect(normalized.description).toBeNull();
|
|
202
|
+
expect(normalized.is_archived).toBeNull();
|
|
203
|
+
expect(normalized.is_default).toBeNull();
|
|
204
|
+
expect(normalized.processor_product_id).toBeNull();
|
|
205
|
+
expect(normalized.project_id).toBeNull();
|
|
206
|
+
expect(normalized.version).toBeNull();
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
describe('ProductPrice response', () => {
|
|
210
|
+
test('transforms API response to match ProductPrice type', () => {
|
|
211
|
+
const apiResponse = {
|
|
212
|
+
id: 'price_123',
|
|
213
|
+
name: 'Monthly',
|
|
214
|
+
description: 'Monthly billing',
|
|
215
|
+
priceAmount: 1999,
|
|
216
|
+
priceCurrency: 'USD',
|
|
217
|
+
isDefault: true,
|
|
218
|
+
recurringInterval: 'month',
|
|
219
|
+
};
|
|
220
|
+
const normalized = camelToSnake(apiResponse);
|
|
221
|
+
expect(normalized.id).toBe('price_123');
|
|
222
|
+
expect(normalized.name).toBe('Monthly');
|
|
223
|
+
expect(normalized.description).toBe('Monthly billing');
|
|
224
|
+
expect(normalized.price_amount).toBe(1999);
|
|
225
|
+
expect(normalized.price_currency).toBe('USD');
|
|
226
|
+
expect(normalized.is_default).toBe(true);
|
|
227
|
+
expect(normalized.recurring_interval).toBe('month');
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
describe('ProductWithPrices response', () => {
|
|
231
|
+
test('transforms nested product with prices array', () => {
|
|
232
|
+
const apiResponse = {
|
|
233
|
+
product: {
|
|
234
|
+
id: 'prod_123',
|
|
235
|
+
productGroupId: 'pg_456',
|
|
236
|
+
name: 'Enterprise',
|
|
237
|
+
slug: 'enterprise',
|
|
238
|
+
description: 'Enterprise tier',
|
|
239
|
+
isArchived: false,
|
|
240
|
+
isDefault: false,
|
|
241
|
+
processorProductId: 'stripe_prod_xyz',
|
|
242
|
+
projectId: 'proj_789',
|
|
243
|
+
version: 2,
|
|
244
|
+
},
|
|
245
|
+
prices: [
|
|
246
|
+
{
|
|
247
|
+
id: 'price_monthly',
|
|
248
|
+
name: 'Monthly',
|
|
249
|
+
description: null,
|
|
250
|
+
priceAmount: 9900,
|
|
251
|
+
priceCurrency: 'USD',
|
|
252
|
+
isDefault: true,
|
|
253
|
+
recurringInterval: 'month',
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
id: 'price_yearly',
|
|
257
|
+
name: 'Yearly',
|
|
258
|
+
description: 'Save 20%',
|
|
259
|
+
priceAmount: 95000,
|
|
260
|
+
priceCurrency: 'USD',
|
|
261
|
+
isDefault: false,
|
|
262
|
+
recurringInterval: 'year',
|
|
263
|
+
},
|
|
264
|
+
],
|
|
265
|
+
};
|
|
266
|
+
const normalized = camelToSnake(apiResponse);
|
|
267
|
+
// Verify product
|
|
268
|
+
expect(normalized.product.id).toBe('prod_123');
|
|
269
|
+
expect(normalized.product.product_group_id).toBe('pg_456');
|
|
270
|
+
expect(normalized.product.processor_product_id).toBe('stripe_prod_xyz');
|
|
271
|
+
// Verify prices array
|
|
272
|
+
expect(normalized.prices).toHaveLength(2);
|
|
273
|
+
const price0 = normalized.prices[0];
|
|
274
|
+
const price1 = normalized.prices[1];
|
|
275
|
+
expect(price0).toBeDefined();
|
|
276
|
+
expect(price0.id).toBe('price_monthly');
|
|
277
|
+
expect(price0.price_amount).toBe(9900);
|
|
278
|
+
expect(price0.recurring_interval).toBe('month');
|
|
279
|
+
expect(price1).toBeDefined();
|
|
280
|
+
expect(price1.id).toBe('price_yearly');
|
|
281
|
+
expect(price1.price_amount).toBe(95000);
|
|
282
|
+
expect(price1.recurring_interval).toBe('year');
|
|
283
|
+
});
|
|
284
|
+
});
|
|
285
|
+
describe('array of Products response', () => {
|
|
286
|
+
test('transforms array of products from list endpoint', () => {
|
|
287
|
+
const apiResponse = [
|
|
288
|
+
{
|
|
289
|
+
id: 'prod_1',
|
|
290
|
+
productGroupId: 'pg_1',
|
|
291
|
+
name: 'Basic',
|
|
292
|
+
slug: 'basic',
|
|
293
|
+
isDefault: true,
|
|
294
|
+
},
|
|
295
|
+
{
|
|
296
|
+
id: 'prod_2',
|
|
297
|
+
productGroupId: 'pg_1',
|
|
298
|
+
name: 'Pro',
|
|
299
|
+
slug: 'pro',
|
|
300
|
+
isDefault: false,
|
|
301
|
+
},
|
|
302
|
+
];
|
|
303
|
+
const normalized = camelToSnake(apiResponse);
|
|
304
|
+
expect(normalized).toHaveLength(2);
|
|
305
|
+
const prod0 = normalized[0];
|
|
306
|
+
const prod1 = normalized[1];
|
|
307
|
+
expect(prod0).toBeDefined();
|
|
308
|
+
expect(prod0.product_group_id).toBe('pg_1');
|
|
309
|
+
expect(prod0.is_default).toBe(true);
|
|
310
|
+
expect(prod1).toBeDefined();
|
|
311
|
+
expect(prod1.product_group_id).toBe('pg_1');
|
|
312
|
+
expect(prod1.is_default).toBe(false);
|
|
313
|
+
});
|
|
314
|
+
});
|
|
315
|
+
});
|
|
316
|
+
//# sourceMappingURL=case.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"case.test.js","sourceRoot":"","sources":["../../src/utils/case.test.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/result.d.ts
CHANGED
|
@@ -1,10 +1,24 @@
|
|
|
1
1
|
import { SurpayError } from '../errors.js';
|
|
2
|
-
import type { Result } from '../types.js';
|
|
2
|
+
import type { ResponseCase, Result } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Options for response processing.
|
|
5
|
+
*/
|
|
6
|
+
export interface ToResultOptions {
|
|
7
|
+
/**
|
|
8
|
+
* Response key case format.
|
|
9
|
+
* - 'snake' (default): Transform camelCase keys to snake_case
|
|
10
|
+
* - 'camel': Keep original camelCase keys
|
|
11
|
+
*/
|
|
12
|
+
responseCase?: ResponseCase;
|
|
13
|
+
}
|
|
3
14
|
/**
|
|
4
15
|
* Converts a fetch Response into a Result container.
|
|
5
16
|
*
|
|
6
17
|
* - Success (2xx): { data: T, error: null, statusCode }
|
|
7
18
|
* - Failure (non-2xx): { data: null, error: SurpayError, statusCode }
|
|
19
|
+
*
|
|
20
|
+
* When responseCase is 'snake' (default), transforms camelCase API response keys
|
|
21
|
+
* to snake_case to match the SDK's TypeScript type definitions.
|
|
8
22
|
*/
|
|
9
|
-
export declare const toResult: <T>(response: Response) => Promise<Result<T, SurpayError>>;
|
|
23
|
+
export declare const toResult: <T>(response: Response, options?: ToResultOptions) => Promise<Result<T, SurpayError>>;
|
|
10
24
|
//# sourceMappingURL=result.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../../src/utils/result.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../../src/utils/result.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAGvD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;OAIG;IACH,YAAY,CAAC,EAAE,YAAY,CAAA;CAC5B;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,QAAQ,GAAU,CAAC,EAC9B,UAAU,QAAQ,EAClB,UAAS,eAAoB,KAC5B,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,CAAC,CAqDhC,CAAA"}
|
package/dist/utils/result.js
CHANGED
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
import { SurpayError } from '../errors.js';
|
|
2
|
+
import { camelToSnake } from './case.js';
|
|
2
3
|
/**
|
|
3
4
|
* Converts a fetch Response into a Result container.
|
|
4
5
|
*
|
|
5
6
|
* - Success (2xx): { data: T, error: null, statusCode }
|
|
6
7
|
* - Failure (non-2xx): { data: null, error: SurpayError, statusCode }
|
|
8
|
+
*
|
|
9
|
+
* When responseCase is 'snake' (default), transforms camelCase API response keys
|
|
10
|
+
* to snake_case to match the SDK's TypeScript type definitions.
|
|
7
11
|
*/
|
|
8
|
-
export const toResult = async (response) => {
|
|
12
|
+
export const toResult = async (response, options = {}) => {
|
|
13
|
+
const { responseCase = 'snake' } = options;
|
|
9
14
|
const statusCode = response.status;
|
|
10
15
|
if (statusCode < 200 || statusCode >= 300) {
|
|
11
16
|
let errorData = {};
|
|
@@ -34,7 +39,23 @@ export const toResult = async (response) => {
|
|
|
34
39
|
if (!text) {
|
|
35
40
|
return { data: {}, error: null, statusCode };
|
|
36
41
|
}
|
|
37
|
-
|
|
42
|
+
let parsed;
|
|
43
|
+
try {
|
|
44
|
+
parsed = JSON.parse(text);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return {
|
|
48
|
+
data: null,
|
|
49
|
+
error: new SurpayError({
|
|
50
|
+
message: 'Server returned invalid JSON response',
|
|
51
|
+
code: 'invalid_json_response',
|
|
52
|
+
statusCode,
|
|
53
|
+
}),
|
|
54
|
+
statusCode,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
// Normalize response keys to snake_case if configured (default behavior)
|
|
58
|
+
const data = responseCase === 'snake' ? camelToSnake(parsed) : parsed;
|
|
38
59
|
return { data, error: null, statusCode };
|
|
39
60
|
};
|
|
40
61
|
const statusToCode = (status) => {
|
package/dist/utils/result.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"result.js","sourceRoot":"","sources":["../../src/utils/result.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"result.js","sourceRoot":"","sources":["../../src/utils/result.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAE1C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAcxC;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAC3B,QAAkB,EAClB,UAA2B,EAAE,EACI,EAAE;IACnC,MAAM,EAAE,YAAY,GAAG,OAAO,EAAE,GAAG,OAAO,CAAA;IAC1C,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAA;IAElC,IAAI,UAAU,GAAG,GAAG,IAAI,UAAU,IAAI,GAAG,EAAE,CAAC;QAC1C,IAAI,SAAS,GAAwC,EAAE,CAAA;QACvD,IAAI,CAAC;YACH,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;QACnC,CAAC;QAAC,MAAM,CAAC;YACP,6BAA6B;QAC/B,CAAC;QAED,OAAO;YACL,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,IAAI,WAAW,CAAC;gBACrB,OAAO,EAAE,SAAS,EAAE,OAAO,IAAI,8BAA8B,UAAU,EAAE;gBACzE,IAAI,EAAE,SAAS,EAAE,IAAI,IAAI,YAAY,CAAC,UAAU,CAAC;gBACjD,UAAU;aACX,CAAC;YACF,UAAU;SACX,CAAA;IACH,CAAC;IAED,wBAAwB;IACxB,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;QACvB,OAAO,EAAE,IAAI,EAAE,EAAO,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,CAAA;IACnD,CAAC;IAED,4BAA4B;IAC5B,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;IAClC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,EAAE,IAAI,EAAE,EAAO,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,CAAA;IACnD,CAAC;IAED,IAAI,MAAe,CAAA;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,IAAI,WAAW,CAAC;gBACrB,OAAO,EAAE,uCAAuC;gBAChD,IAAI,EAAE,uBAAuB;gBAC7B,UAAU;aACX,CAAC;YACF,UAAU;SACX,CAAA;IACH,CAAC;IAED,yEAAyE;IACzE,MAAM,IAAI,GAAG,YAAY,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,MAAW,CAAC,CAAC,CAAC,CAAE,MAAY,CAAA;IAEjF,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,CAAA;AAC1C,CAAC,CAAA;AAED,MAAM,YAAY,GAAG,CAAC,MAAc,EAAU,EAAE;IAC9C,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,GAAG;YACN,OAAO,aAAa,CAAA;QACtB,KAAK,GAAG;YACN,OAAO,cAAc,CAAA;QACvB,KAAK,GAAG;YACN,OAAO,WAAW,CAAA;QACpB,KAAK,GAAG;YACN,OAAO,WAAW,CAAA;QACpB,KAAK,GAAG;YACN,OAAO,UAAU,CAAA;QACnB,KAAK,GAAG;YACN,OAAO,kBAAkB,CAAA;QAC3B,KAAK,GAAG;YACN,OAAO,qBAAqB,CAAA;QAC9B,KAAK,GAAG;YACN,OAAO,gBAAgB,CAAA;QACzB;YACE,OAAO,eAAe,CAAA;IAC1B,CAAC;AACH,CAAC,CAAA"}
|