digital-tools 2.1.3 → 2.4.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/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +19 -0
- package/README.md +2 -0
- package/dist/client.d.ts +109 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +69 -0
- package/dist/client.js.map +1 -0
- package/dist/define.d.ts +2 -2
- package/dist/define.d.ts.map +1 -1
- package/dist/define.js +21 -11
- package/dist/define.js.map +1 -1
- package/dist/function-ref.d.ts +229 -0
- package/dist/function-ref.d.ts.map +1 -0
- package/dist/function-ref.js +28 -0
- package/dist/function-ref.js.map +1 -0
- package/dist/function-sugar.d.ts +57 -0
- package/dist/function-sugar.d.ts.map +1 -0
- package/dist/function-sugar.js +79 -0
- package/dist/function-sugar.js.map +1 -0
- package/dist/index.d.ts +10 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -4
- package/dist/index.js.map +1 -1
- package/dist/providers/analytics/mixpanel.d.ts.map +1 -1
- package/dist/providers/analytics/mixpanel.js +21 -18
- package/dist/providers/analytics/mixpanel.js.map +1 -1
- package/dist/providers/calendar/cal-com.d.ts.map +1 -1
- package/dist/providers/calendar/cal-com.js +10 -10
- package/dist/providers/calendar/cal-com.js.map +1 -1
- package/dist/providers/calendar/google-calendar.d.ts.map +1 -1
- package/dist/providers/calendar/google-calendar.js +4 -4
- package/dist/providers/calendar/google-calendar.js.map +1 -1
- package/dist/providers/crm/hubspot.d.ts.map +1 -1
- package/dist/providers/crm/hubspot.js +107 -85
- package/dist/providers/crm/hubspot.js.map +1 -1
- package/dist/providers/development/github.d.ts.map +1 -1
- package/dist/providers/development/github.js +40 -43
- package/dist/providers/development/github.js.map +1 -1
- package/dist/providers/ecommerce/shopify.d.ts.map +1 -1
- package/dist/providers/ecommerce/shopify.js +79 -62
- package/dist/providers/ecommerce/shopify.js.map +1 -1
- package/dist/providers/email/resend.d.ts.map +1 -1
- package/dist/providers/email/resend.js +20 -16
- package/dist/providers/email/resend.js.map +1 -1
- package/dist/providers/email/sendgrid.d.ts.map +1 -1
- package/dist/providers/email/sendgrid.js +12 -9
- package/dist/providers/email/sendgrid.js.map +1 -1
- package/dist/providers/finance/stripe.d.ts.map +1 -1
- package/dist/providers/finance/stripe.js +44 -42
- package/dist/providers/finance/stripe.js.map +1 -1
- package/dist/providers/forms/typeform.d.ts.map +1 -1
- package/dist/providers/forms/typeform.js +68 -58
- package/dist/providers/forms/typeform.js.map +1 -1
- package/dist/providers/knowledge/notion.d.ts.map +1 -1
- package/dist/providers/knowledge/notion.js +75 -41
- package/dist/providers/knowledge/notion.js.map +1 -1
- package/dist/providers/marketing/mailchimp.d.ts.map +1 -1
- package/dist/providers/marketing/mailchimp.js +74 -61
- package/dist/providers/marketing/mailchimp.js.map +1 -1
- package/dist/providers/media/cloudinary.d.ts.map +1 -1
- package/dist/providers/media/cloudinary.js +30 -28
- package/dist/providers/media/cloudinary.js.map +1 -1
- package/dist/providers/messaging/slack.d.ts.map +1 -1
- package/dist/providers/messaging/slack.js +75 -58
- package/dist/providers/messaging/slack.js.map +1 -1
- package/dist/providers/messaging/twilio-sms.d.ts.map +1 -1
- package/dist/providers/messaging/twilio-sms.js +33 -15
- package/dist/providers/messaging/twilio-sms.js.map +1 -1
- package/dist/providers/project-management/linear.d.ts.map +1 -1
- package/dist/providers/project-management/linear.js +31 -27
- package/dist/providers/project-management/linear.js.map +1 -1
- package/dist/providers/spreadsheet/google-sheets.d.ts.map +1 -1
- package/dist/providers/spreadsheet/google-sheets.js +21 -18
- package/dist/providers/spreadsheet/google-sheets.js.map +1 -1
- package/dist/providers/spreadsheet/xlsx.d.ts.map +1 -1
- package/dist/providers/spreadsheet/xlsx.js +4 -4
- package/dist/providers/spreadsheet/xlsx.js.map +1 -1
- package/dist/providers/storage/index.js +1 -0
- package/dist/providers/storage/index.js.map +1 -1
- package/dist/providers/storage/s3.d.ts.map +1 -1
- package/dist/providers/storage/s3.js +36 -27
- package/dist/providers/storage/s3.js.map +1 -1
- package/dist/providers/support/zendesk.d.ts.map +1 -1
- package/dist/providers/support/zendesk.js +24 -25
- package/dist/providers/support/zendesk.js.map +1 -1
- package/dist/providers/tasks/todoist.d.ts.map +1 -1
- package/dist/providers/tasks/todoist.js +18 -18
- package/dist/providers/tasks/todoist.js.map +1 -1
- package/dist/providers/video-conferencing/google-meet.d.ts.map +1 -1
- package/dist/providers/video-conferencing/google-meet.js +11 -11
- package/dist/providers/video-conferencing/google-meet.js.map +1 -1
- package/dist/providers/video-conferencing/jitsi.js +14 -14
- package/dist/providers/video-conferencing/jitsi.js.map +1 -1
- package/dist/providers/video-conferencing/teams.d.ts.map +1 -1
- package/dist/providers/video-conferencing/teams.js +9 -7
- package/dist/providers/video-conferencing/teams.js.map +1 -1
- package/dist/providers/video-conferencing/zoom.d.ts.map +1 -1
- package/dist/providers/video-conferencing/zoom.js +26 -24
- package/dist/providers/video-conferencing/zoom.js.map +1 -1
- package/dist/tools/data.d.ts.map +1 -1
- package/dist/tools/data.js +5 -12
- package/dist/tools/data.js.map +1 -1
- package/dist/tools/index.d.ts +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +1 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/system.d.ts +289 -0
- package/dist/tools/system.d.ts.map +1 -0
- package/dist/tools/system.js +752 -0
- package/dist/tools/system.js.map +1 -0
- package/dist/tools/web.d.ts.map +1 -1
- package/dist/tools/web.js +22 -10
- package/dist/tools/web.js.map +1 -1
- package/dist/track-record.d.ts +101 -0
- package/dist/track-record.d.ts.map +1 -0
- package/dist/track-record.js +17 -0
- package/dist/track-record.js.map +1 -0
- package/dist/types.d.ts +210 -9
- package/dist/types.d.ts.map +1 -1
- package/dist/verb-registration.d.ts +122 -0
- package/dist/verb-registration.d.ts.map +1 -0
- package/dist/verb-registration.js +176 -0
- package/dist/verb-registration.js.map +1 -0
- package/dist/worker.d.ts +93 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +315 -0
- package/dist/worker.js.map +1 -0
- package/dist/wrap.d.ts +89 -0
- package/dist/wrap.d.ts.map +1 -0
- package/dist/wrap.js +225 -0
- package/dist/wrap.js.map +1 -0
- package/package.json +31 -14
- package/src/client.ts +136 -0
- package/src/define.ts +30 -24
- package/src/function-ref.ts +264 -0
- package/src/function-sugar.ts +134 -0
- package/src/index.ts +132 -10
- package/src/providers/analytics/mixpanel.ts +19 -18
- package/src/providers/calendar/cal-com.ts +29 -18
- package/src/providers/calendar/google-calendar.ts +20 -14
- package/src/providers/crm/hubspot.ts +225 -99
- package/src/providers/development/github.ts +206 -135
- package/src/providers/ecommerce/shopify.ts +250 -89
- package/src/providers/email/resend.ts +101 -28
- package/src/providers/email/sendgrid.ts +12 -9
- package/src/providers/finance/stripe.ts +128 -49
- package/src/providers/forms/typeform.ts +74 -58
- package/src/providers/knowledge/notion.ts +340 -88
- package/src/providers/marketing/mailchimp.ts +86 -70
- package/src/providers/media/cloudinary.ts +99 -41
- package/src/providers/messaging/slack.ts +283 -85
- package/src/providers/messaging/twilio-sms.ts +35 -15
- package/src/providers/project-management/linear.ts +143 -55
- package/src/providers/spreadsheet/google-sheets.ts +222 -56
- package/src/providers/spreadsheet/xlsx.ts +47 -16
- package/src/providers/storage/s3.ts +119 -47
- package/src/providers/support/zendesk.ts +196 -46
- package/src/providers/tasks/todoist.ts +20 -26
- package/src/providers/video-conferencing/google-meet.ts +17 -20
- package/src/providers/video-conferencing/jitsi.ts +14 -14
- package/src/providers/video-conferencing/teams.ts +14 -13
- package/src/providers/video-conferencing/zoom.ts +54 -49
- package/src/tools/data.ts +6 -16
- package/src/tools/index.ts +1 -0
- package/src/tools/system.ts +887 -0
- package/src/tools/web.ts +22 -10
- package/src/track-record.ts +106 -0
- package/src/types.ts +241 -13
- package/src/verb-registration.ts +197 -0
- package/src/worker.ts +370 -0
- package/src/wrap.ts +260 -0
- package/test/client.test.ts +146 -0
- package/test/communication-tools-extended.test.ts +734 -0
- package/test/data-tools-extended.test.ts +743 -0
- package/test/define-extended.test.ts +819 -0
- package/test/define.test.ts +150 -41
- package/test/entities.test.ts +623 -0
- package/test/extended-entities.test.ts +1228 -0
- package/test/provider-implementations.test.ts +725 -0
- package/test/provider-registry-extended.test.ts +583 -0
- package/test/providers/google-sheets.test.ts +851 -0
- package/test/providers/helpers.ts +554 -0
- package/test/providers/hubspot.test.ts +576 -0
- package/test/providers/slack.test.ts +932 -0
- package/test/providers/stripe.test.ts +701 -0
- package/test/providers.test.ts +578 -0
- package/test/system-tools-extended.test.ts +632 -0
- package/test/system.test.ts +673 -0
- package/test/tools.test.ts +15 -11
- package/test/types.test.ts +402 -0
- package/test/verb-registration.test.ts +395 -0
- package/test/web-tools.test.ts +553 -0
- package/test/worker-extended.test.ts +699 -0
- package/test/worker.test.ts +576 -0
- package/test/wrap.test.ts +366 -0
- package/tsconfig.json +3 -13
- package/vitest.config.ts +37 -0
- package/wrangler.jsonc +9 -0
- package/LICENSE +0 -21
- package/dist/providers/voice/vapi.d.ts +0 -27
- package/dist/providers/voice/vapi.d.ts.map +0 -1
- package/dist/providers/voice/vapi.js +0 -440
- package/dist/providers/voice/vapi.js.map +0 -1
- package/src/define.js +0 -259
- package/src/entities/advertising.js +0 -999
- package/src/entities/ai.js +0 -756
- package/src/entities/analytics.js +0 -1588
- package/src/entities/automation.js +0 -601
- package/src/entities/communication.js +0 -1150
- package/src/entities/crm.js +0 -1386
- package/src/entities/design.js +0 -546
- package/src/entities/development.js +0 -2212
- package/src/entities/document.js +0 -874
- package/src/entities/ecommerce.js +0 -1429
- package/src/entities/experiment.js +0 -1039
- package/src/entities/finance.js +0 -3478
- package/src/entities/forms.js +0 -1892
- package/src/entities/hr.js +0 -661
- package/src/entities/identity.js +0 -997
- package/src/entities/index.js +0 -282
- package/src/entities/infrastructure.js +0 -1153
- package/src/entities/knowledge.js +0 -1438
- package/src/entities/marketing.js +0 -1610
- package/src/entities/media.js +0 -1634
- package/src/entities/notification.js +0 -1199
- package/src/entities/presentation.js +0 -1274
- package/src/entities/productivity.js +0 -1317
- package/src/entities/project-management.js +0 -1136
- package/src/entities/recruiting.js +0 -736
- package/src/entities/shipping.js +0 -509
- package/src/entities/signature.js +0 -1102
- package/src/entities/site.js +0 -222
- package/src/entities/spreadsheet.js +0 -1341
- package/src/entities/storage.js +0 -1198
- package/src/entities/support.js +0 -1166
- package/src/entities/video-conferencing.js +0 -1750
- package/src/entities/video.js +0 -950
- package/src/entities.js +0 -1663
- package/src/index.js +0 -74
- package/src/providers/analytics/index.js +0 -17
- package/src/providers/analytics/mixpanel.js +0 -255
- package/src/providers/calendar/cal-com.js +0 -303
- package/src/providers/calendar/google-calendar.js +0 -335
- package/src/providers/calendar/index.js +0 -20
- package/src/providers/crm/hubspot.js +0 -566
- package/src/providers/crm/index.js +0 -17
- package/src/providers/development/github.js +0 -472
- package/src/providers/development/index.js +0 -17
- package/src/providers/ecommerce/index.js +0 -17
- package/src/providers/ecommerce/shopify.js +0 -378
- package/src/providers/email/index.js +0 -20
- package/src/providers/email/resend.js +0 -258
- package/src/providers/email/sendgrid.js +0 -161
- package/src/providers/finance/index.js +0 -17
- package/src/providers/finance/stripe.js +0 -549
- package/src/providers/forms/index.js +0 -17
- package/src/providers/forms/typeform.js +0 -500
- package/src/providers/index.js +0 -123
- package/src/providers/knowledge/index.js +0 -17
- package/src/providers/knowledge/notion.js +0 -389
- package/src/providers/marketing/index.js +0 -17
- package/src/providers/marketing/mailchimp.js +0 -443
- package/src/providers/media/cloudinary.js +0 -318
- package/src/providers/media/index.js +0 -17
- package/src/providers/messaging/index.js +0 -20
- package/src/providers/messaging/slack.js +0 -393
- package/src/providers/messaging/twilio-sms.js +0 -249
- package/src/providers/project-management/index.js +0 -17
- package/src/providers/project-management/linear.js +0 -575
- package/src/providers/registry.js +0 -86
- package/src/providers/spreadsheet/google-sheets.js +0 -375
- package/src/providers/spreadsheet/index.js +0 -20
- package/src/providers/spreadsheet/xlsx.js +0 -423
- package/src/providers/storage/index.js +0 -24
- package/src/providers/storage/s3.js +0 -419
- package/src/providers/support/index.js +0 -17
- package/src/providers/support/zendesk.js +0 -373
- package/src/providers/tasks/index.js +0 -17
- package/src/providers/tasks/todoist.js +0 -286
- package/src/providers/types.js +0 -9
- package/src/providers/video-conferencing/google-meet.js +0 -286
- package/src/providers/video-conferencing/index.js +0 -31
- package/src/providers/video-conferencing/jitsi.js +0 -254
- package/src/providers/video-conferencing/teams.js +0 -270
- package/src/providers/video-conferencing/zoom.js +0 -332
- package/src/registry.js +0 -128
- package/src/tools/communication.js +0 -184
- package/src/tools/data.js +0 -205
- package/src/tools/index.js +0 -11
- package/src/tools/web.js +0 -137
- package/src/types.js +0 -10
- package/test/define.test.js +0 -306
- package/test/registry.test.js +0 -357
- package/test/tools.test.js +0 -363
|
@@ -23,6 +23,72 @@ import { defineProvider } from '../registry.js'
|
|
|
23
23
|
|
|
24
24
|
const RESEND_API_URL = 'https://api.resend.com'
|
|
25
25
|
|
|
26
|
+
// =============================================================================
|
|
27
|
+
// Resend API Response Types
|
|
28
|
+
// =============================================================================
|
|
29
|
+
|
|
30
|
+
/** Resend success response for sending email */
|
|
31
|
+
interface ResendSendResponse {
|
|
32
|
+
id: string
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** Resend error response */
|
|
36
|
+
interface ResendErrorResponse {
|
|
37
|
+
name?: string
|
|
38
|
+
message?: string
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** Resend batch send response item */
|
|
42
|
+
interface ResendBatchItem {
|
|
43
|
+
id: string
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** Resend batch send response */
|
|
47
|
+
interface ResendBatchResponse {
|
|
48
|
+
data: ResendBatchItem[]
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** Resend email data from API */
|
|
52
|
+
interface ResendEmailData {
|
|
53
|
+
id: string
|
|
54
|
+
from: string
|
|
55
|
+
to: string | string[]
|
|
56
|
+
cc?: string[]
|
|
57
|
+
bcc?: string[]
|
|
58
|
+
subject: string
|
|
59
|
+
text?: string
|
|
60
|
+
html?: string
|
|
61
|
+
last_event: string
|
|
62
|
+
created_at?: string
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** Resend DNS record from API */
|
|
66
|
+
interface ResendDNSRecord {
|
|
67
|
+
type: string
|
|
68
|
+
name: string
|
|
69
|
+
value: string
|
|
70
|
+
status: string
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/** Resend domain response from API */
|
|
74
|
+
interface ResendDomainResponse {
|
|
75
|
+
name: string
|
|
76
|
+
status: string
|
|
77
|
+
records?: ResendDNSRecord[]
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/** Resend domain list item from API */
|
|
81
|
+
interface ResendDomainListItem {
|
|
82
|
+
name: string
|
|
83
|
+
status: string
|
|
84
|
+
created_at: string
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/** Resend domains list response */
|
|
88
|
+
interface ResendDomainsListResponse {
|
|
89
|
+
data?: ResendDomainListItem[]
|
|
90
|
+
}
|
|
91
|
+
|
|
26
92
|
/**
|
|
27
93
|
* Resend provider info
|
|
28
94
|
*/
|
|
@@ -49,7 +115,7 @@ export function createResendProvider(config: ProviderConfig): EmailProvider {
|
|
|
49
115
|
|
|
50
116
|
async initialize(cfg: ProviderConfig): Promise<void> {
|
|
51
117
|
apiKey = cfg.apiKey as string
|
|
52
|
-
defaultFrom = cfg
|
|
118
|
+
defaultFrom = cfg['defaultFrom'] as string | undefined
|
|
53
119
|
|
|
54
120
|
if (!apiKey) {
|
|
55
121
|
throw new Error('Resend API key is required')
|
|
@@ -108,7 +174,7 @@ export function createResendProvider(config: ProviderConfig): EmailProvider {
|
|
|
108
174
|
}
|
|
109
175
|
|
|
110
176
|
if (options.attachments?.length) {
|
|
111
|
-
body
|
|
177
|
+
body['attachments'] = options.attachments.map((att) => ({
|
|
112
178
|
filename: att.filename,
|
|
113
179
|
content: typeof att.content === 'string' ? att.content : att.content.toString('base64'),
|
|
114
180
|
content_type: att.contentType,
|
|
@@ -116,7 +182,7 @@ export function createResendProvider(config: ProviderConfig): EmailProvider {
|
|
|
116
182
|
}
|
|
117
183
|
|
|
118
184
|
if (options.sendAt) {
|
|
119
|
-
body
|
|
185
|
+
body['scheduled_at'] = options.sendAt.toISOString()
|
|
120
186
|
}
|
|
121
187
|
|
|
122
188
|
try {
|
|
@@ -132,17 +198,19 @@ export function createResendProvider(config: ProviderConfig): EmailProvider {
|
|
|
132
198
|
const data = await response.json()
|
|
133
199
|
|
|
134
200
|
if (response.ok) {
|
|
201
|
+
const sendResponse = data as ResendSendResponse
|
|
135
202
|
return {
|
|
136
203
|
success: true,
|
|
137
|
-
messageId:
|
|
204
|
+
messageId: sendResponse.id,
|
|
138
205
|
}
|
|
139
206
|
}
|
|
140
207
|
|
|
208
|
+
const errorResponse = data as ResendErrorResponse
|
|
141
209
|
return {
|
|
142
210
|
success: false,
|
|
143
211
|
error: {
|
|
144
|
-
code:
|
|
145
|
-
message:
|
|
212
|
+
code: errorResponse.name || `HTTP_${response.status}`,
|
|
213
|
+
message: errorResponse.message || response.statusText,
|
|
146
214
|
},
|
|
147
215
|
}
|
|
148
216
|
} catch (error) {
|
|
@@ -183,18 +251,20 @@ export function createResendProvider(config: ProviderConfig): EmailProvider {
|
|
|
183
251
|
const data = await response.json()
|
|
184
252
|
|
|
185
253
|
if (response.ok) {
|
|
186
|
-
|
|
254
|
+
const batchResponse = data as ResendBatchResponse
|
|
255
|
+
return batchResponse.data.map((item) => ({
|
|
187
256
|
success: true,
|
|
188
257
|
messageId: item.id,
|
|
189
258
|
}))
|
|
190
259
|
}
|
|
191
260
|
|
|
192
261
|
// If batch fails, return error for all
|
|
262
|
+
const errorResponse = data as ResendErrorResponse
|
|
193
263
|
return emails.map(() => ({
|
|
194
264
|
success: false,
|
|
195
265
|
error: {
|
|
196
|
-
code:
|
|
197
|
-
message:
|
|
266
|
+
code: errorResponse.name || `HTTP_${response.status}`,
|
|
267
|
+
message: errorResponse.message || response.statusText,
|
|
198
268
|
},
|
|
199
269
|
}))
|
|
200
270
|
} catch (error) {
|
|
@@ -221,18 +291,18 @@ export function createResendProvider(config: ProviderConfig): EmailProvider {
|
|
|
221
291
|
throw new Error(`HTTP ${response.status}`)
|
|
222
292
|
}
|
|
223
293
|
|
|
224
|
-
const data = (await response.json()) as
|
|
294
|
+
const data = (await response.json()) as ResendEmailData
|
|
225
295
|
return {
|
|
226
296
|
id: data.id,
|
|
227
297
|
from: data.from,
|
|
228
298
|
to: Array.isArray(data.to) ? data.to : [data.to],
|
|
229
|
-
cc: data.cc,
|
|
230
|
-
bcc: data.bcc,
|
|
299
|
+
...(data.cc !== undefined && { cc: data.cc }),
|
|
300
|
+
...(data.bcc !== undefined && { bcc: data.bcc }),
|
|
231
301
|
subject: data.subject,
|
|
232
|
-
text: data.text,
|
|
233
|
-
html: data.html,
|
|
302
|
+
...(data.text !== undefined && { text: data.text }),
|
|
303
|
+
...(data.html !== undefined && { html: data.html }),
|
|
234
304
|
status: mapResendStatus(data.last_event),
|
|
235
|
-
|
|
305
|
+
...(data.created_at !== undefined && { sentAt: new Date(data.created_at) }),
|
|
236
306
|
}
|
|
237
307
|
} catch {
|
|
238
308
|
return null
|
|
@@ -249,17 +319,18 @@ export function createResendProvider(config: ProviderConfig): EmailProvider {
|
|
|
249
319
|
body: JSON.stringify({ name: domain }),
|
|
250
320
|
})
|
|
251
321
|
|
|
252
|
-
const data = (await response.json()) as
|
|
322
|
+
const data = (await response.json()) as ResendDomainResponse
|
|
253
323
|
|
|
254
324
|
return {
|
|
255
325
|
domain: data.name,
|
|
256
326
|
verified: data.status === 'verified',
|
|
257
|
-
dnsRecords:
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
327
|
+
dnsRecords:
|
|
328
|
+
data.records?.map((r) => ({
|
|
329
|
+
type: r.type as 'TXT' | 'CNAME' | 'MX',
|
|
330
|
+
name: r.name,
|
|
331
|
+
value: r.value,
|
|
332
|
+
verified: r.status === 'verified',
|
|
333
|
+
})) || [],
|
|
263
334
|
}
|
|
264
335
|
},
|
|
265
336
|
|
|
@@ -270,12 +341,14 @@ export function createResendProvider(config: ProviderConfig): EmailProvider {
|
|
|
270
341
|
},
|
|
271
342
|
})
|
|
272
343
|
|
|
273
|
-
const data = (await response.json()) as
|
|
274
|
-
return
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
344
|
+
const data = (await response.json()) as ResendDomainsListResponse
|
|
345
|
+
return (
|
|
346
|
+
data.data?.map((d) => ({
|
|
347
|
+
domain: d.name,
|
|
348
|
+
verified: d.status === 'verified',
|
|
349
|
+
createdAt: new Date(d.created_at),
|
|
350
|
+
})) || []
|
|
351
|
+
)
|
|
279
352
|
},
|
|
280
353
|
}
|
|
281
354
|
}
|
|
@@ -47,7 +47,7 @@ export function createSendGridProvider(config: ProviderConfig): EmailProvider {
|
|
|
47
47
|
|
|
48
48
|
async initialize(cfg: ProviderConfig): Promise<void> {
|
|
49
49
|
apiKey = cfg.apiKey as string
|
|
50
|
-
defaultFrom = cfg
|
|
50
|
+
defaultFrom = cfg['defaultFrom'] as string | undefined
|
|
51
51
|
|
|
52
52
|
if (!apiKey) {
|
|
53
53
|
throw new Error('SendGrid API key is required')
|
|
@@ -111,11 +111,11 @@ export function createSendGridProvider(config: ProviderConfig): EmailProvider {
|
|
|
111
111
|
}
|
|
112
112
|
|
|
113
113
|
if (options.replyTo) {
|
|
114
|
-
body
|
|
114
|
+
body['reply_to'] = { email: options.replyTo }
|
|
115
115
|
}
|
|
116
116
|
|
|
117
117
|
if (options.attachments?.length) {
|
|
118
|
-
body
|
|
118
|
+
body['attachments'] = options.attachments.map((att) => ({
|
|
119
119
|
content: typeof att.content === 'string' ? att.content : att.content.toString('base64'),
|
|
120
120
|
filename: att.filename,
|
|
121
121
|
type: att.contentType,
|
|
@@ -125,11 +125,11 @@ export function createSendGridProvider(config: ProviderConfig): EmailProvider {
|
|
|
125
125
|
}
|
|
126
126
|
|
|
127
127
|
if (options.sendAt) {
|
|
128
|
-
body
|
|
128
|
+
body['send_at'] = Math.floor(options.sendAt.getTime() / 1000)
|
|
129
129
|
}
|
|
130
130
|
|
|
131
131
|
if (options.trackOpens !== undefined || options.trackClicks !== undefined) {
|
|
132
|
-
body
|
|
132
|
+
body['tracking_settings'] = {
|
|
133
133
|
...(options.trackOpens !== undefined && {
|
|
134
134
|
open_tracking: { enable: options.trackOpens },
|
|
135
135
|
}),
|
|
@@ -140,11 +140,11 @@ export function createSendGridProvider(config: ProviderConfig): EmailProvider {
|
|
|
140
140
|
}
|
|
141
141
|
|
|
142
142
|
if (options.tags?.length) {
|
|
143
|
-
body
|
|
143
|
+
body['categories'] = options.tags
|
|
144
144
|
}
|
|
145
145
|
|
|
146
146
|
if (options.metadata) {
|
|
147
|
-
body
|
|
147
|
+
body['custom_args'] = options.metadata
|
|
148
148
|
}
|
|
149
149
|
|
|
150
150
|
try {
|
|
@@ -158,8 +158,11 @@ export function createSendGridProvider(config: ProviderConfig): EmailProvider {
|
|
|
158
158
|
})
|
|
159
159
|
|
|
160
160
|
if (response.ok || response.status === 202) {
|
|
161
|
-
const messageId = response.headers.get('X-Message-Id')
|
|
162
|
-
return {
|
|
161
|
+
const messageId = response.headers.get('X-Message-Id')
|
|
162
|
+
return {
|
|
163
|
+
success: true,
|
|
164
|
+
...(messageId !== null && { messageId }),
|
|
165
|
+
}
|
|
163
166
|
}
|
|
164
167
|
|
|
165
168
|
const errorData = await response.json().catch(() => ({}))
|
|
@@ -27,6 +27,80 @@ import { defineProvider } from '../registry.js'
|
|
|
27
27
|
|
|
28
28
|
const STRIPE_API_URL = 'https://api.stripe.com/v1'
|
|
29
29
|
|
|
30
|
+
// =============================================================================
|
|
31
|
+
// Stripe API Response Types
|
|
32
|
+
// =============================================================================
|
|
33
|
+
|
|
34
|
+
/** Stripe API error response */
|
|
35
|
+
interface StripeErrorResponse {
|
|
36
|
+
error?: {
|
|
37
|
+
message?: string
|
|
38
|
+
type?: string
|
|
39
|
+
code?: string
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** Stripe status transitions for invoices */
|
|
44
|
+
interface StripeStatusTransitions {
|
|
45
|
+
paid_at?: number
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** Stripe invoice from API */
|
|
49
|
+
interface StripeInvoice {
|
|
50
|
+
id: string
|
|
51
|
+
number?: string
|
|
52
|
+
customer: string
|
|
53
|
+
status: string
|
|
54
|
+
currency: string
|
|
55
|
+
subtotal: number
|
|
56
|
+
tax?: number
|
|
57
|
+
total: number
|
|
58
|
+
amount_due: number
|
|
59
|
+
amount_paid: number
|
|
60
|
+
due_date?: number
|
|
61
|
+
status_transitions?: StripeStatusTransitions
|
|
62
|
+
hosted_invoice_url?: string
|
|
63
|
+
created: number
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** Stripe payment intent from API */
|
|
67
|
+
interface StripePaymentIntent {
|
|
68
|
+
id: string
|
|
69
|
+
amount: number
|
|
70
|
+
currency: string
|
|
71
|
+
status: string
|
|
72
|
+
customer?: string
|
|
73
|
+
invoice?: string
|
|
74
|
+
payment_method?: string
|
|
75
|
+
description?: string
|
|
76
|
+
created: number
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/** Stripe refund from API */
|
|
80
|
+
interface StripeRefund {
|
|
81
|
+
id: string
|
|
82
|
+
payment_intent: string
|
|
83
|
+
amount: number
|
|
84
|
+
status: string
|
|
85
|
+
created: number
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/** Stripe customer from API */
|
|
89
|
+
interface StripeCustomer {
|
|
90
|
+
id: string
|
|
91
|
+
name?: string
|
|
92
|
+
email?: string
|
|
93
|
+
phone?: string
|
|
94
|
+
balance?: number
|
|
95
|
+
created: number
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/** Stripe list response wrapper */
|
|
99
|
+
interface StripeListResponse<T> {
|
|
100
|
+
data: T[]
|
|
101
|
+
has_more: boolean
|
|
102
|
+
}
|
|
103
|
+
|
|
30
104
|
/**
|
|
31
105
|
* Stripe provider info
|
|
32
106
|
*/
|
|
@@ -88,14 +162,12 @@ export function createStripeProvider(config: ProviderConfig): FinanceProvider {
|
|
|
88
162
|
const response = await fetch(url.toString(), {
|
|
89
163
|
method,
|
|
90
164
|
headers,
|
|
91
|
-
body: requestBody,
|
|
165
|
+
...(requestBody !== undefined && { body: requestBody }),
|
|
92
166
|
})
|
|
93
167
|
|
|
94
168
|
if (!response.ok) {
|
|
95
|
-
const error = await response.json().catch(() => ({}))
|
|
96
|
-
throw new Error(
|
|
97
|
-
(error as any)?.error?.message || `Stripe API error: ${response.status}`
|
|
98
|
-
)
|
|
169
|
+
const error = (await response.json().catch(() => ({}))) as StripeErrorResponse
|
|
170
|
+
throw new Error(error.error?.message || `Stripe API error: ${response.status}`)
|
|
99
171
|
}
|
|
100
172
|
|
|
101
173
|
return response.json() as Promise<T>
|
|
@@ -115,7 +187,10 @@ export function createStripeProvider(config: ProviderConfig): FinanceProvider {
|
|
|
115
187
|
} else if (Array.isArray(value)) {
|
|
116
188
|
value.forEach((item, index) => {
|
|
117
189
|
if (typeof item === 'object' && item !== null) {
|
|
118
|
-
Object.assign(
|
|
190
|
+
Object.assign(
|
|
191
|
+
result,
|
|
192
|
+
flattenParams(item as Record<string, unknown>, `${fullKey}[${index}]`)
|
|
193
|
+
)
|
|
119
194
|
} else {
|
|
120
195
|
result[`${fullKey}[${index}]`] = String(item)
|
|
121
196
|
}
|
|
@@ -168,14 +243,12 @@ export function createStripeProvider(config: ProviderConfig): FinanceProvider {
|
|
|
168
243
|
const response = await fetch(url.toString(), {
|
|
169
244
|
method,
|
|
170
245
|
headers,
|
|
171
|
-
body: requestBody,
|
|
246
|
+
...(requestBody !== undefined && { body: requestBody }),
|
|
172
247
|
})
|
|
173
248
|
|
|
174
249
|
if (!response.ok) {
|
|
175
|
-
const error = await response.json().catch(() => ({}))
|
|
176
|
-
throw new Error(
|
|
177
|
-
(error as any)?.error?.message || `Stripe API error: ${response.status}`
|
|
178
|
-
)
|
|
250
|
+
const error = (await response.json().catch(() => ({}))) as StripeErrorResponse
|
|
251
|
+
throw new Error(error.error?.message || `Stripe API error: ${response.status}`)
|
|
179
252
|
}
|
|
180
253
|
|
|
181
254
|
return response.json() as Promise<T>
|
|
@@ -226,11 +299,11 @@ export function createStripeProvider(config: ProviderConfig): FinanceProvider {
|
|
|
226
299
|
}
|
|
227
300
|
|
|
228
301
|
if (invoice.dueDate) {
|
|
229
|
-
data
|
|
302
|
+
data['due_date'] = Math.floor(invoice.dueDate.getTime() / 1000)
|
|
230
303
|
}
|
|
231
304
|
|
|
232
305
|
if (invoice.memo) {
|
|
233
|
-
data
|
|
306
|
+
data['description'] = invoice.memo
|
|
234
307
|
}
|
|
235
308
|
|
|
236
309
|
// Create the invoice
|
|
@@ -264,14 +337,16 @@ export function createStripeProvider(config: ProviderConfig): FinanceProvider {
|
|
|
264
337
|
status: mapStripeInvoiceStatus(updatedInvoice.status),
|
|
265
338
|
currency: updatedInvoice.currency,
|
|
266
339
|
subtotal: updatedInvoice.subtotal / 100,
|
|
267
|
-
|
|
340
|
+
...(updatedInvoice.tax !== undefined && { tax: updatedInvoice.tax / 100 }),
|
|
268
341
|
total: updatedInvoice.total / 100,
|
|
269
342
|
amountDue: updatedInvoice.amount_due / 100,
|
|
270
343
|
amountPaid: updatedInvoice.amount_paid / 100,
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
344
|
+
...(updatedInvoice.due_date !== undefined && {
|
|
345
|
+
dueDate: new Date(updatedInvoice.due_date * 1000),
|
|
346
|
+
}),
|
|
347
|
+
...(updatedInvoice.status_transitions?.paid_at !== undefined && {
|
|
348
|
+
paidAt: new Date(updatedInvoice.status_transitions.paid_at * 1000),
|
|
349
|
+
}),
|
|
275
350
|
url: updatedInvoice.hosted_invoice_url,
|
|
276
351
|
createdAt: new Date(updatedInvoice.created * 1000),
|
|
277
352
|
}
|
|
@@ -288,14 +363,14 @@ export function createStripeProvider(config: ProviderConfig): FinanceProvider {
|
|
|
288
363
|
status: mapStripeInvoiceStatus(invoice.status),
|
|
289
364
|
currency: invoice.currency,
|
|
290
365
|
subtotal: invoice.subtotal / 100,
|
|
291
|
-
|
|
366
|
+
...(invoice.tax !== undefined && { tax: invoice.tax / 100 }),
|
|
292
367
|
total: invoice.total / 100,
|
|
293
368
|
amountDue: invoice.amount_due / 100,
|
|
294
369
|
amountPaid: invoice.amount_paid / 100,
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
370
|
+
...(invoice.due_date !== undefined && { dueDate: new Date(invoice.due_date * 1000) }),
|
|
371
|
+
...(invoice.status_transitions?.paid_at !== undefined && {
|
|
372
|
+
paidAt: new Date(invoice.status_transitions.paid_at * 1000),
|
|
373
|
+
}),
|
|
299
374
|
url: invoice.hosted_invoice_url,
|
|
300
375
|
createdAt: new Date(invoice.created * 1000),
|
|
301
376
|
}
|
|
@@ -311,11 +386,11 @@ export function createStripeProvider(config: ProviderConfig): FinanceProvider {
|
|
|
311
386
|
const data: Record<string, unknown> = {}
|
|
312
387
|
|
|
313
388
|
if (updates.dueDate) {
|
|
314
|
-
data
|
|
389
|
+
data['due_date'] = Math.floor(updates.dueDate.getTime() / 1000)
|
|
315
390
|
}
|
|
316
391
|
|
|
317
392
|
if (updates.memo) {
|
|
318
|
-
data
|
|
393
|
+
data['description'] = updates.memo
|
|
319
394
|
}
|
|
320
395
|
|
|
321
396
|
const invoice = await stripeRequestWithParams<any>(`/invoices/${invoiceId}`, {
|
|
@@ -330,14 +405,14 @@ export function createStripeProvider(config: ProviderConfig): FinanceProvider {
|
|
|
330
405
|
status: mapStripeInvoiceStatus(invoice.status),
|
|
331
406
|
currency: invoice.currency,
|
|
332
407
|
subtotal: invoice.subtotal / 100,
|
|
333
|
-
|
|
408
|
+
...(invoice.tax !== undefined && { tax: invoice.tax / 100 }),
|
|
334
409
|
total: invoice.total / 100,
|
|
335
410
|
amountDue: invoice.amount_due / 100,
|
|
336
411
|
amountPaid: invoice.amount_paid / 100,
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
412
|
+
...(invoice.due_date !== undefined && { dueDate: new Date(invoice.due_date * 1000) }),
|
|
413
|
+
...(invoice.status_transitions?.paid_at !== undefined && {
|
|
414
|
+
paidAt: new Date(invoice.status_transitions.paid_at * 1000),
|
|
415
|
+
}),
|
|
341
416
|
url: invoice.hosted_invoice_url,
|
|
342
417
|
createdAt: new Date(invoice.created * 1000),
|
|
343
418
|
}
|
|
@@ -347,19 +422,19 @@ export function createStripeProvider(config: ProviderConfig): FinanceProvider {
|
|
|
347
422
|
const params: Record<string, string> = {}
|
|
348
423
|
|
|
349
424
|
if (options.limit) {
|
|
350
|
-
params
|
|
425
|
+
params['limit'] = String(options.limit)
|
|
351
426
|
}
|
|
352
427
|
|
|
353
428
|
if (options.cursor) {
|
|
354
|
-
params
|
|
429
|
+
params['starting_after'] = options.cursor
|
|
355
430
|
}
|
|
356
431
|
|
|
357
432
|
if (options.customerId) {
|
|
358
|
-
params
|
|
433
|
+
params['customer'] = options.customerId
|
|
359
434
|
}
|
|
360
435
|
|
|
361
436
|
if (options.status) {
|
|
362
|
-
params
|
|
437
|
+
params['status'] = options.status
|
|
363
438
|
}
|
|
364
439
|
|
|
365
440
|
const response = await stripeRequest<any>('/invoices', { params })
|
|
@@ -429,11 +504,11 @@ export function createStripeProvider(config: ProviderConfig): FinanceProvider {
|
|
|
429
504
|
}
|
|
430
505
|
|
|
431
506
|
if (payment.customerId) {
|
|
432
|
-
data
|
|
507
|
+
data['customer'] = payment.customerId
|
|
433
508
|
}
|
|
434
509
|
|
|
435
510
|
if (payment.description) {
|
|
436
|
-
data
|
|
511
|
+
data['description'] = payment.description
|
|
437
512
|
}
|
|
438
513
|
|
|
439
514
|
// For Stripe, we create a PaymentIntent
|
|
@@ -479,15 +554,15 @@ export function createStripeProvider(config: ProviderConfig): FinanceProvider {
|
|
|
479
554
|
const params: Record<string, string> = {}
|
|
480
555
|
|
|
481
556
|
if (options.limit) {
|
|
482
|
-
params
|
|
557
|
+
params['limit'] = String(options.limit)
|
|
483
558
|
}
|
|
484
559
|
|
|
485
560
|
if (options.cursor) {
|
|
486
|
-
params
|
|
561
|
+
params['starting_after'] = options.cursor
|
|
487
562
|
}
|
|
488
563
|
|
|
489
564
|
if (options.customerId) {
|
|
490
|
-
params
|
|
565
|
+
params['customer'] = options.customerId
|
|
491
566
|
}
|
|
492
567
|
|
|
493
568
|
const response = await stripeRequest<any>('/payment_intents', { params })
|
|
@@ -515,7 +590,7 @@ export function createStripeProvider(config: ProviderConfig): FinanceProvider {
|
|
|
515
590
|
}
|
|
516
591
|
|
|
517
592
|
if (amount !== undefined) {
|
|
518
|
-
data
|
|
593
|
+
data['amount'] = Math.round(amount * 100)
|
|
519
594
|
}
|
|
520
595
|
|
|
521
596
|
const refund = await stripeRequestWithParams<any>('/refunds', {
|
|
@@ -538,15 +613,15 @@ export function createStripeProvider(config: ProviderConfig): FinanceProvider {
|
|
|
538
613
|
}
|
|
539
614
|
|
|
540
615
|
if (customer.email) {
|
|
541
|
-
data
|
|
616
|
+
data['email'] = customer.email
|
|
542
617
|
}
|
|
543
618
|
|
|
544
619
|
if (customer.phone) {
|
|
545
|
-
data
|
|
620
|
+
data['phone'] = customer.phone
|
|
546
621
|
}
|
|
547
622
|
|
|
548
623
|
if (customer.address) {
|
|
549
|
-
data
|
|
624
|
+
data['address'] = {
|
|
550
625
|
line1: customer.address.line1,
|
|
551
626
|
line2: customer.address.line2,
|
|
552
627
|
city: customer.address.city,
|
|
@@ -566,7 +641,7 @@ export function createStripeProvider(config: ProviderConfig): FinanceProvider {
|
|
|
566
641
|
name: stripeCustomer.name,
|
|
567
642
|
email: stripeCustomer.email,
|
|
568
643
|
phone: stripeCustomer.phone,
|
|
569
|
-
|
|
644
|
+
...(stripeCustomer.balance !== undefined && { balance: stripeCustomer.balance / 100 }),
|
|
570
645
|
createdAt: new Date(stripeCustomer.created * 1000),
|
|
571
646
|
}
|
|
572
647
|
},
|
|
@@ -580,7 +655,7 @@ export function createStripeProvider(config: ProviderConfig): FinanceProvider {
|
|
|
580
655
|
name: customer.name,
|
|
581
656
|
email: customer.email,
|
|
582
657
|
phone: customer.phone,
|
|
583
|
-
|
|
658
|
+
...(customer.balance !== undefined && { balance: customer.balance / 100 }),
|
|
584
659
|
createdAt: new Date(customer.created * 1000),
|
|
585
660
|
}
|
|
586
661
|
} catch (error) {
|
|
@@ -588,15 +663,17 @@ export function createStripeProvider(config: ProviderConfig): FinanceProvider {
|
|
|
588
663
|
}
|
|
589
664
|
},
|
|
590
665
|
|
|
591
|
-
async listCustomers(
|
|
666
|
+
async listCustomers(
|
|
667
|
+
options: PaginationOptions = {}
|
|
668
|
+
): Promise<PaginatedResult<FinanceCustomerData>> {
|
|
592
669
|
const params: Record<string, string> = {}
|
|
593
670
|
|
|
594
671
|
if (options.limit) {
|
|
595
|
-
params
|
|
672
|
+
params['limit'] = String(options.limit)
|
|
596
673
|
}
|
|
597
674
|
|
|
598
675
|
if (options.cursor) {
|
|
599
|
-
params
|
|
676
|
+
params['starting_after'] = options.cursor
|
|
600
677
|
}
|
|
601
678
|
|
|
602
679
|
const response = await stripeRequest<any>('/customers', { params })
|
|
@@ -620,7 +697,9 @@ export function createStripeProvider(config: ProviderConfig): FinanceProvider {
|
|
|
620
697
|
/**
|
|
621
698
|
* Map Stripe invoice status to standard status
|
|
622
699
|
*/
|
|
623
|
-
function mapStripeInvoiceStatus(
|
|
700
|
+
function mapStripeInvoiceStatus(
|
|
701
|
+
status: string
|
|
702
|
+
): 'draft' | 'open' | 'paid' | 'void' | 'uncollectible' {
|
|
624
703
|
switch (status) {
|
|
625
704
|
case 'draft':
|
|
626
705
|
return 'draft'
|