@billfn/provider-dodo 0.0.1

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,10 @@
1
+ import type { BillFnProviderAdapter } from '@billfn/core';
2
+ export interface DodoProviderConfig {
3
+ apiKey: string;
4
+ baseUrl?: string;
5
+ fetch?: typeof fetch;
6
+ webhookSecret?: string;
7
+ webhookSignatureHeader?: string;
8
+ }
9
+ export declare function createDodoProvider(config: DodoProviderConfig): BillFnProviderAdapter;
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAMV,qBAAqB,EAQtB,MAAM,cAAc,CAAC;AAItB,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC;AAMD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,qBAAqB,CAmUpF"}
package/dist/index.js ADDED
@@ -0,0 +1,453 @@
1
+ import { createBillFnError } from '@billfn/core';
2
+ import { verifyStandardWebhookSignature } from '@superfunctions/webhooks';
3
+ const DODO_CHECKOUT_SESSION_METADATA_KEY = 'billfn_checkout_session_id';
4
+ const DODO_BILLING_ACCOUNT_METADATA_KEY = 'billfn_billing_account_id';
5
+ const DODO_PRODUCT_METADATA_KEY = 'billfn_product_id';
6
+ export function createDodoProvider(config) {
7
+ const fetchImpl = config.fetch ?? fetch;
8
+ const baseUrl = (config.baseUrl ?? 'https://live.dodopayments.com').replace(/\/$/, '');
9
+ const webhookSignatureHeader = (config.webhookSignatureHeader ?? 'webhook-signature').toLowerCase();
10
+ return {
11
+ provider: 'dodo',
12
+ capabilities: {
13
+ createCheckout: true,
14
+ verifyCheckout: true,
15
+ cancelSubscription: true,
16
+ syncSubscription: true,
17
+ restorePurchases: true,
18
+ webhookIngestion: true,
19
+ changeSubscription: true,
20
+ resumeSubscription: true,
21
+ refundCharge: true
22
+ },
23
+ async createCheckout(input) {
24
+ const isSubscription = input.price.kind === 'subscription';
25
+ const metadata = createDodoMetadata(input);
26
+ const response = await requestJson(fetchImpl, `${baseUrl}/${isSubscription ? 'subscriptions' : 'payments'}`, {
27
+ method: 'POST',
28
+ headers: createHeaders(config.apiKey),
29
+ body: JSON.stringify(isSubscription
30
+ ? {
31
+ customer: input.customer,
32
+ billing: input.customer?.billing,
33
+ payment_link: true,
34
+ return_url: input.returnUrl ?? input.successUrl ?? '',
35
+ product_id: input.price.providerProductId,
36
+ quantity: 1,
37
+ metadata
38
+ }
39
+ : {
40
+ customer: input.customer,
41
+ billing: input.customer?.billing,
42
+ payment_link: true,
43
+ return_url: input.returnUrl ?? input.successUrl ?? '',
44
+ product_cart: [{ product_id: input.price.providerProductId, quantity: 1 }],
45
+ metadata
46
+ })
47
+ });
48
+ return {
49
+ status: 'requires_action',
50
+ providerCheckoutId: readString(response, ['payment_id', 'id']),
51
+ providerSubscriptionId: readString(response, ['subscription_id']),
52
+ providerChargeId: readString(response, ['payment_id']),
53
+ checkoutUrl: readString(response, ['payment_link']),
54
+ raw: response
55
+ };
56
+ },
57
+ async verifyCheckout(input) {
58
+ const subscriptionId = input.checkoutSession.providerSubscriptionId ??
59
+ readString(input.payload ?? {}, ['subscriptionId', 'subscription_id']);
60
+ const chargeId = input.checkoutSession.providerChargeId ??
61
+ input.checkoutSession.providerCheckoutId ??
62
+ readString(input.payload ?? {}, ['paymentId', 'payment_id']);
63
+ const isSubscription = input.price.kind === 'subscription';
64
+ const resourceId = isSubscription ? subscriptionId : chargeId;
65
+ if (!resourceId) {
66
+ throw createBillFnError({
67
+ code: 'BILLFN_VALIDATION_ERROR',
68
+ message: 'Dodo verification requires a subscription or payment identifier'
69
+ });
70
+ }
71
+ const response = await requestJson(fetchImpl, `${baseUrl}/${isSubscription ? 'subscriptions' : 'payments'}/${resourceId}`, {
72
+ method: 'GET',
73
+ headers: createHeaders(config.apiKey)
74
+ });
75
+ assertDodoVerificationOwnership(input, isSubscription, resourceId, response);
76
+ return mapDodoState(isSubscription, response);
77
+ },
78
+ async fetchSubscription(input) {
79
+ const providerSubscriptionId = input.subscription.providerSubscriptionId;
80
+ if (!providerSubscriptionId) {
81
+ throw createBillFnError({
82
+ code: 'BILLFN_VALIDATION_ERROR',
83
+ message: 'Dodo subscription sync requires providerSubscriptionId'
84
+ });
85
+ }
86
+ const response = await requestJson(fetchImpl, `${baseUrl}/subscriptions/${providerSubscriptionId}`, {
87
+ method: 'GET',
88
+ headers: createHeaders(config.apiKey)
89
+ });
90
+ return mapDodoState(true, response);
91
+ },
92
+ async cancelSubscription(input) {
93
+ const providerSubscriptionId = input.subscription.providerSubscriptionId;
94
+ if (!providerSubscriptionId) {
95
+ throw createBillFnError({
96
+ code: 'BILLFN_VALIDATION_ERROR',
97
+ message: 'Dodo cancellation requires providerSubscriptionId'
98
+ });
99
+ }
100
+ const response = await requestJson(fetchImpl, `${baseUrl}/subscriptions/${providerSubscriptionId}`, {
101
+ method: 'PATCH',
102
+ headers: createHeaders(config.apiKey),
103
+ body: JSON.stringify({
104
+ cancel_at_next_billing_date: true
105
+ })
106
+ });
107
+ return {
108
+ operationStatus: 'applied',
109
+ billingState: mapDodoState(true, response),
110
+ raw: response
111
+ };
112
+ },
113
+ async changeSubscription(input) {
114
+ const providerSubscriptionId = input.subscription.providerSubscriptionId;
115
+ if (!providerSubscriptionId) {
116
+ throw createBillFnError({
117
+ code: 'BILLFN_VALIDATION_ERROR',
118
+ message: 'Dodo change subscription requires providerSubscriptionId'
119
+ });
120
+ }
121
+ const attempted = await tryRequestJson(fetchImpl, `${baseUrl}/subscriptions/${providerSubscriptionId}/change-plan`, {
122
+ method: 'POST',
123
+ headers: createHeaders(config.apiKey),
124
+ body: JSON.stringify({
125
+ product_id: input.targetPrice.providerProductId,
126
+ proration_billing_mode: normalizeDodoProration(input.prorationBehavior),
127
+ quantity: 1,
128
+ effective_at: normalizeDodoEffectiveAt(input.effectiveAt)
129
+ })
130
+ });
131
+ if (attempted.ok) {
132
+ return {
133
+ operationStatus: 'applied',
134
+ billingState: mapDodoState(true, attempted.data),
135
+ raw: attempted.data
136
+ };
137
+ }
138
+ if (!shouldFallbackToReplacementCheckout(attempted.error.status)) {
139
+ throw createBillFnError({
140
+ code: 'BILLFN_PROVIDER_ERROR',
141
+ message: `Dodo change subscription failed with status ${attempted.error.status}`,
142
+ details: attempted.error
143
+ });
144
+ }
145
+ const cancellation = await requestJson(fetchImpl, `${baseUrl}/subscriptions/${providerSubscriptionId}`, {
146
+ method: 'PATCH',
147
+ headers: createHeaders(config.apiKey),
148
+ body: JSON.stringify({
149
+ cancel_at_next_billing_date: true
150
+ })
151
+ });
152
+ return {
153
+ operationStatus: 'requires_action',
154
+ billingState: input.effectiveAt === 'immediate' ? mapDodoState(true, cancellation) : undefined,
155
+ clientAction: {
156
+ type: 'redirect',
157
+ metadata: {
158
+ action: 'replacement-checkout',
159
+ targetProductId: input.targetPrice.providerProductId,
160
+ effectiveAt: input.effectiveAt
161
+ }
162
+ },
163
+ raw: {
164
+ fallback: 'replacement-checkout',
165
+ updateError: attempted.error,
166
+ cancellation
167
+ }
168
+ };
169
+ },
170
+ async resumeSubscription(input) {
171
+ const providerSubscriptionId = input.subscription.providerSubscriptionId;
172
+ if (!providerSubscriptionId) {
173
+ throw createBillFnError({
174
+ code: 'BILLFN_VALIDATION_ERROR',
175
+ message: 'Dodo resume subscription requires providerSubscriptionId'
176
+ });
177
+ }
178
+ const attempted = await tryRequestJson(fetchImpl, `${baseUrl}/subscriptions/${providerSubscriptionId}`, {
179
+ method: 'PATCH',
180
+ headers: createHeaders(config.apiKey),
181
+ body: JSON.stringify({
182
+ cancel_at_next_billing_date: false
183
+ })
184
+ });
185
+ if (!attempted.ok) {
186
+ return {
187
+ operationStatus: 'requires_action',
188
+ clientAction: {
189
+ type: 'redirect',
190
+ metadata: {
191
+ action: 'contact-support'
192
+ }
193
+ },
194
+ raw: {
195
+ resumeError: attempted.error
196
+ }
197
+ };
198
+ }
199
+ return {
200
+ operationStatus: 'applied',
201
+ billingState: mapDodoState(true, attempted.data),
202
+ raw: attempted.data
203
+ };
204
+ },
205
+ async refundCharge(input) {
206
+ const paymentId = input.providerChargeId ?? input.subscription?.providerChargeId;
207
+ if (!paymentId) {
208
+ throw createBillFnError({
209
+ code: 'BILLFN_VALIDATION_ERROR',
210
+ message: 'Dodo refund requires providerChargeId'
211
+ });
212
+ }
213
+ const refundBody = {
214
+ payment_id: paymentId,
215
+ reason: input.reason
216
+ };
217
+ if (input.mode === 'custom' || input.mode === 'prorated_remaining_period') {
218
+ if (typeof input.amount === 'number') {
219
+ refundBody.amount = input.amount;
220
+ }
221
+ }
222
+ const response = await requestJson(fetchImpl, `${baseUrl}/refunds`, {
223
+ method: 'POST',
224
+ headers: createHeaders(config.apiKey),
225
+ body: JSON.stringify(refundBody)
226
+ });
227
+ return {
228
+ operationStatus: 'applied',
229
+ providerRefundId: readString(response, ['refund_id', 'id']),
230
+ raw: response
231
+ };
232
+ },
233
+ async restorePurchases(input) {
234
+ const isSubscription = input.price.kind === 'subscription';
235
+ const response = await requestJson(fetchImpl, `${baseUrl}/${isSubscription ? 'subscriptions' : 'payments'}/${input.purchaseReference}`, {
236
+ method: 'GET',
237
+ headers: createHeaders(config.apiKey)
238
+ });
239
+ assertDodoRestoreOwnership(input, isSubscription, response);
240
+ return [mapDodoState(isSubscription, response)];
241
+ },
242
+ async parseWebhook(input) {
243
+ if (!config.webhookSecret) {
244
+ throw createBillFnError({
245
+ code: 'BILLFN_VALIDATION_ERROR',
246
+ message: 'Dodo webhook parsing requires webhookSecret to be configured'
247
+ });
248
+ }
249
+ const webhookId = input.headers.get('webhook-id');
250
+ const webhookTimestamp = input.headers.get('webhook-timestamp');
251
+ const signature = input.headers.get(webhookSignatureHeader);
252
+ if (!webhookId ||
253
+ !webhookTimestamp ||
254
+ !signature ||
255
+ !verifyStandardWebhookSignature(input.rawBody, {
256
+ id: webhookId,
257
+ timestamp: webhookTimestamp,
258
+ signature
259
+ }, config.webhookSecret)) {
260
+ throw createBillFnError({
261
+ code: 'BILLFN_WEBHOOK_SIGNATURE_INVALID',
262
+ message: 'Dodo webhook signature verification failed'
263
+ });
264
+ }
265
+ let payload;
266
+ try {
267
+ payload = JSON.parse(input.rawBody);
268
+ }
269
+ catch {
270
+ throw createBillFnError({
271
+ code: 'BILLFN_VALIDATION_ERROR',
272
+ message: 'Dodo webhook payload must be valid JSON'
273
+ });
274
+ }
275
+ const type = readString(payload, ['type', 'event']) ?? 'unknown';
276
+ const eventId = webhookId;
277
+ const data = asRecord(payload.data) ?? payload;
278
+ const isSubscription = Boolean(readString(data, ['subscription_id'])) || type.includes('subscription');
279
+ return [
280
+ {
281
+ providerEventId: eventId,
282
+ type,
283
+ signatureVerified: true,
284
+ occurredAt: readString(payload, ['created_at', 'timestamp']) ?? undefined,
285
+ priceId: readString(data, ['product_id']) ?? undefined,
286
+ providerSubscriptionId: readString(data, ['subscription_id']) ?? undefined,
287
+ providerChargeId: readString(data, ['payment_id']) ?? undefined,
288
+ checkoutReferenceId: readString(data, ['checkout_session_id']) ?? undefined,
289
+ billingState: mapDodoState(isSubscription, data),
290
+ raw: payload
291
+ }
292
+ ];
293
+ }
294
+ };
295
+ }
296
+ function createHeaders(apiKey) {
297
+ return {
298
+ authorization: `Bearer ${apiKey}`,
299
+ 'content-type': 'application/json'
300
+ };
301
+ }
302
+ function createDodoMetadata(input) {
303
+ const metadata = {};
304
+ for (const [key, value] of Object.entries(input.metadata ?? {})) {
305
+ if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
306
+ metadata[key] = String(value);
307
+ }
308
+ }
309
+ metadata[DODO_CHECKOUT_SESSION_METADATA_KEY] = input.checkoutSessionId;
310
+ metadata[DODO_BILLING_ACCOUNT_METADATA_KEY] = input.billingAccount.id;
311
+ metadata[DODO_PRODUCT_METADATA_KEY] = input.price.providerProductId;
312
+ return metadata;
313
+ }
314
+ function assertDodoVerificationOwnership(input, isSubscription, resourceId, response) {
315
+ const responseId = isSubscription
316
+ ? readString(response, ['subscription_id', 'id'])
317
+ : readString(response, ['payment_id', 'id']);
318
+ const metadata = asRecord(response.metadata);
319
+ const productMatches = dodoProductMatches(response, isSubscription, input.price.providerProductId);
320
+ const metadataMatches = metadata?.[DODO_CHECKOUT_SESSION_METADATA_KEY] === input.checkoutSession.checkoutSessionId &&
321
+ metadata[DODO_BILLING_ACCOUNT_METADATA_KEY] === input.billingAccount.id &&
322
+ metadata[DODO_PRODUCT_METADATA_KEY] === input.price.providerProductId;
323
+ if (responseId !== resourceId || !productMatches || !metadataMatches) {
324
+ throw createBillFnError({
325
+ code: 'BILLFN_CONFLICT',
326
+ message: 'Dodo resource does not match the checkout session, billing account, and product'
327
+ });
328
+ }
329
+ }
330
+ function assertDodoRestoreOwnership(input, isSubscription, response) {
331
+ const responseId = isSubscription
332
+ ? readString(response, ['subscription_id', 'id'])
333
+ : readString(response, ['payment_id', 'id']);
334
+ const metadata = asRecord(response.metadata);
335
+ const productMatches = dodoProductMatches(response, isSubscription, input.price.providerProductId);
336
+ const metadataMatches = metadata?.[DODO_BILLING_ACCOUNT_METADATA_KEY] === input.billingAccount.id &&
337
+ metadata[DODO_PRODUCT_METADATA_KEY] === input.price.providerProductId;
338
+ if (responseId !== input.purchaseReference || !productMatches || !metadataMatches) {
339
+ throw createBillFnError({
340
+ code: 'BILLFN_CONFLICT',
341
+ message: 'Dodo resource does not match the purchase reference, billing account, and product'
342
+ });
343
+ }
344
+ }
345
+ function dodoProductMatches(response, isSubscription, providerProductId) {
346
+ return isSubscription
347
+ ? readString(response, ['product_id']) === providerProductId
348
+ : asArrayOfRecords(response.product_cart).some((item) => readString(item, ['product_id']) === providerProductId);
349
+ }
350
+ async function requestJson(fetchImpl, url, init) {
351
+ const response = await fetchImpl(url, init);
352
+ const raw = await response.text();
353
+ if (!response.ok) {
354
+ throw createBillFnError({
355
+ code: 'BILLFN_PROVIDER_ERROR',
356
+ message: `Dodo request failed with status ${response.status}`,
357
+ details: {
358
+ status: response.status,
359
+ body: raw
360
+ }
361
+ });
362
+ }
363
+ return raw ? JSON.parse(raw) : {};
364
+ }
365
+ async function tryRequestJson(fetchImpl, url, init) {
366
+ const response = await fetchImpl(url, init);
367
+ const raw = await response.text();
368
+ if (!response.ok) {
369
+ return {
370
+ ok: false,
371
+ error: {
372
+ status: response.status,
373
+ body: raw
374
+ }
375
+ };
376
+ }
377
+ return {
378
+ ok: true,
379
+ data: raw ? JSON.parse(raw) : {}
380
+ };
381
+ }
382
+ function mapDodoState(isSubscription, payload) {
383
+ const rawStatus = readString(payload, ['status']) ?? 'pending';
384
+ const normalized = normalizeDodoStatus(rawStatus);
385
+ return {
386
+ subscriptionStatus: normalized,
387
+ checkoutStatus: normalized === 'failed' ? 'failed' : normalized === 'pending' ? 'pending' : 'succeeded',
388
+ providerSubscriptionId: readString(payload, ['subscription_id']) ?? undefined,
389
+ providerChargeId: readString(payload, ['payment_id']) ?? undefined,
390
+ currentPeriodStart: readString(payload, ['current_period_start', 'started_at']) ?? undefined,
391
+ currentPeriodEnd: isSubscription ? readString(payload, ['next_billing_date', 'current_period_end']) ?? undefined : undefined,
392
+ autoRenew: isSubscription ? normalized === 'active' || normalized === 'trialing' || normalized === 'grace' : false,
393
+ raw: payload
394
+ };
395
+ }
396
+ function normalizeDodoStatus(status) {
397
+ switch (status) {
398
+ case 'active':
399
+ return 'active';
400
+ case 'trialing':
401
+ return 'trialing';
402
+ case 'on_hold':
403
+ case 'paused':
404
+ return 'paused';
405
+ case 'cancelled':
406
+ return 'canceled';
407
+ case 'expired':
408
+ return 'expired';
409
+ case 'failed':
410
+ return 'failed';
411
+ case 'grace_period':
412
+ case 'billing_retry':
413
+ return 'grace';
414
+ case 'succeeded':
415
+ return 'active';
416
+ default:
417
+ return 'pending';
418
+ }
419
+ }
420
+ function normalizeDodoProration(value) {
421
+ switch (value) {
422
+ case 'prorate':
423
+ return 'prorated_immediately';
424
+ case 'none':
425
+ return 'do_not_bill';
426
+ default:
427
+ return 'prorated_immediately';
428
+ }
429
+ }
430
+ function normalizeDodoEffectiveAt(value) {
431
+ return value === 'next_renewal' ? 'next_billing_date' : 'immediately';
432
+ }
433
+ function shouldFallbackToReplacementCheckout(status) {
434
+ return status === 405;
435
+ }
436
+ function readString(record, keys) {
437
+ for (const key of keys) {
438
+ const value = record[key];
439
+ if (typeof value === 'string' && value.length > 0) {
440
+ return value;
441
+ }
442
+ }
443
+ return undefined;
444
+ }
445
+ function asRecord(value) {
446
+ return typeof value === 'object' && value !== null ? value : null;
447
+ }
448
+ function asArrayOfRecords(value) {
449
+ return Array.isArray(value)
450
+ ? value.filter((entry) => typeof entry === 'object' && entry !== null)
451
+ : [];
452
+ }
453
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "@billfn/provider-dodo",
3
+ "version": "0.0.1",
4
+ "description": "Dodo provider adapter for billfn",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "default": "./dist/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist"
16
+ ],
17
+ "scripts": {
18
+ "build": "tsc",
19
+ "test": "vitest run",
20
+ "typecheck": "tsc --noEmit",
21
+ "clean": "rm -rf dist"
22
+ },
23
+ "author": "21n",
24
+ "license": "MIT",
25
+ "publishConfig": {
26
+ "access": "public"
27
+ },
28
+ "dependencies": {
29
+ "@billfn/core": "^0.0.1",
30
+ "@superfunctions/webhooks": "^0.1.0"
31
+ },
32
+ "devDependencies": {
33
+ "@types/node": "^22.0.0",
34
+ "typescript": "^5.6.0",
35
+ "vitest": "^3.2.4"
36
+ },
37
+ "gitHead": "f8eb29238bac5f1c40843c938335901ff6cf2a73"
38
+ }