digital-tools 2.1.1 → 2.3.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.
Files changed (293) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +2 -0
  3. package/dist/client.d.ts +109 -0
  4. package/dist/client.d.ts.map +1 -0
  5. package/dist/client.js +69 -0
  6. package/dist/client.js.map +1 -0
  7. package/dist/define.d.ts +2 -2
  8. package/dist/define.d.ts.map +1 -1
  9. package/dist/define.js +22 -20
  10. package/dist/define.js.map +1 -1
  11. package/dist/function-ref.d.ts +229 -0
  12. package/dist/function-ref.d.ts.map +1 -0
  13. package/dist/function-ref.js +28 -0
  14. package/dist/function-ref.js.map +1 -0
  15. package/dist/function-sugar.d.ts +57 -0
  16. package/dist/function-sugar.d.ts.map +1 -0
  17. package/dist/function-sugar.js +79 -0
  18. package/dist/function-sugar.js.map +1 -0
  19. package/dist/index.d.ts +10 -3
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +24 -4
  22. package/dist/index.js.map +1 -1
  23. package/dist/providers/analytics/mixpanel.d.ts.map +1 -1
  24. package/dist/providers/analytics/mixpanel.js +21 -18
  25. package/dist/providers/analytics/mixpanel.js.map +1 -1
  26. package/dist/providers/calendar/cal-com.d.ts.map +1 -1
  27. package/dist/providers/calendar/cal-com.js +10 -10
  28. package/dist/providers/calendar/cal-com.js.map +1 -1
  29. package/dist/providers/calendar/google-calendar.d.ts.map +1 -1
  30. package/dist/providers/calendar/google-calendar.js +4 -4
  31. package/dist/providers/calendar/google-calendar.js.map +1 -1
  32. package/dist/providers/crm/hubspot.d.ts.map +1 -1
  33. package/dist/providers/crm/hubspot.js +107 -85
  34. package/dist/providers/crm/hubspot.js.map +1 -1
  35. package/dist/providers/development/github.d.ts.map +1 -1
  36. package/dist/providers/development/github.js +40 -43
  37. package/dist/providers/development/github.js.map +1 -1
  38. package/dist/providers/ecommerce/shopify.d.ts.map +1 -1
  39. package/dist/providers/ecommerce/shopify.js +79 -62
  40. package/dist/providers/ecommerce/shopify.js.map +1 -1
  41. package/dist/providers/email/resend.d.ts.map +1 -1
  42. package/dist/providers/email/resend.js +20 -16
  43. package/dist/providers/email/resend.js.map +1 -1
  44. package/dist/providers/email/sendgrid.d.ts.map +1 -1
  45. package/dist/providers/email/sendgrid.js +12 -9
  46. package/dist/providers/email/sendgrid.js.map +1 -1
  47. package/dist/providers/finance/stripe.d.ts.map +1 -1
  48. package/dist/providers/finance/stripe.js +44 -42
  49. package/dist/providers/finance/stripe.js.map +1 -1
  50. package/dist/providers/forms/typeform.d.ts.map +1 -1
  51. package/dist/providers/forms/typeform.js +68 -58
  52. package/dist/providers/forms/typeform.js.map +1 -1
  53. package/dist/providers/knowledge/notion.d.ts.map +1 -1
  54. package/dist/providers/knowledge/notion.js +75 -41
  55. package/dist/providers/knowledge/notion.js.map +1 -1
  56. package/dist/providers/marketing/mailchimp.d.ts.map +1 -1
  57. package/dist/providers/marketing/mailchimp.js +74 -61
  58. package/dist/providers/marketing/mailchimp.js.map +1 -1
  59. package/dist/providers/media/cloudinary.d.ts.map +1 -1
  60. package/dist/providers/media/cloudinary.js +30 -28
  61. package/dist/providers/media/cloudinary.js.map +1 -1
  62. package/dist/providers/messaging/slack.d.ts.map +1 -1
  63. package/dist/providers/messaging/slack.js +75 -58
  64. package/dist/providers/messaging/slack.js.map +1 -1
  65. package/dist/providers/messaging/twilio-sms.d.ts.map +1 -1
  66. package/dist/providers/messaging/twilio-sms.js +33 -15
  67. package/dist/providers/messaging/twilio-sms.js.map +1 -1
  68. package/dist/providers/project-management/linear.d.ts.map +1 -1
  69. package/dist/providers/project-management/linear.js +31 -27
  70. package/dist/providers/project-management/linear.js.map +1 -1
  71. package/dist/providers/spreadsheet/google-sheets.d.ts.map +1 -1
  72. package/dist/providers/spreadsheet/google-sheets.js +21 -18
  73. package/dist/providers/spreadsheet/google-sheets.js.map +1 -1
  74. package/dist/providers/spreadsheet/xlsx.d.ts.map +1 -1
  75. package/dist/providers/spreadsheet/xlsx.js +4 -4
  76. package/dist/providers/spreadsheet/xlsx.js.map +1 -1
  77. package/dist/providers/storage/index.js +1 -0
  78. package/dist/providers/storage/index.js.map +1 -1
  79. package/dist/providers/storage/s3.d.ts.map +1 -1
  80. package/dist/providers/storage/s3.js +36 -27
  81. package/dist/providers/storage/s3.js.map +1 -1
  82. package/dist/providers/support/zendesk.d.ts.map +1 -1
  83. package/dist/providers/support/zendesk.js +24 -25
  84. package/dist/providers/support/zendesk.js.map +1 -1
  85. package/dist/providers/tasks/todoist.d.ts.map +1 -1
  86. package/dist/providers/tasks/todoist.js +18 -18
  87. package/dist/providers/tasks/todoist.js.map +1 -1
  88. package/dist/providers/video-conferencing/google-meet.d.ts.map +1 -1
  89. package/dist/providers/video-conferencing/google-meet.js +11 -11
  90. package/dist/providers/video-conferencing/google-meet.js.map +1 -1
  91. package/dist/providers/video-conferencing/jitsi.js +14 -14
  92. package/dist/providers/video-conferencing/jitsi.js.map +1 -1
  93. package/dist/providers/video-conferencing/teams.d.ts.map +1 -1
  94. package/dist/providers/video-conferencing/teams.js +9 -7
  95. package/dist/providers/video-conferencing/teams.js.map +1 -1
  96. package/dist/providers/video-conferencing/zoom.d.ts.map +1 -1
  97. package/dist/providers/video-conferencing/zoom.js +26 -24
  98. package/dist/providers/video-conferencing/zoom.js.map +1 -1
  99. package/dist/tools/data.d.ts.map +1 -1
  100. package/dist/tools/data.js +5 -12
  101. package/dist/tools/data.js.map +1 -1
  102. package/dist/tools/index.d.ts +1 -0
  103. package/dist/tools/index.d.ts.map +1 -1
  104. package/dist/tools/index.js +1 -0
  105. package/dist/tools/index.js.map +1 -1
  106. package/dist/tools/system.d.ts +289 -0
  107. package/dist/tools/system.d.ts.map +1 -0
  108. package/dist/tools/system.js +752 -0
  109. package/dist/tools/system.js.map +1 -0
  110. package/dist/tools/web.d.ts.map +1 -1
  111. package/dist/tools/web.js +22 -10
  112. package/dist/tools/web.js.map +1 -1
  113. package/dist/track-record.d.ts +101 -0
  114. package/dist/track-record.d.ts.map +1 -0
  115. package/dist/track-record.js +17 -0
  116. package/dist/track-record.js.map +1 -0
  117. package/dist/types.d.ts +210 -9
  118. package/dist/types.d.ts.map +1 -1
  119. package/dist/verb-registration.d.ts +122 -0
  120. package/dist/verb-registration.d.ts.map +1 -0
  121. package/dist/verb-registration.js +176 -0
  122. package/dist/verb-registration.js.map +1 -0
  123. package/dist/worker.d.ts +93 -0
  124. package/dist/worker.d.ts.map +1 -0
  125. package/dist/worker.js +315 -0
  126. package/dist/worker.js.map +1 -0
  127. package/dist/wrap.d.ts +89 -0
  128. package/dist/wrap.d.ts.map +1 -0
  129. package/dist/wrap.js +225 -0
  130. package/dist/wrap.js.map +1 -0
  131. package/package.json +21 -4
  132. package/src/client.ts +136 -0
  133. package/src/define.ts +31 -37
  134. package/src/function-ref.ts +264 -0
  135. package/src/function-sugar.ts +134 -0
  136. package/src/index.ts +132 -10
  137. package/src/providers/analytics/mixpanel.ts +19 -18
  138. package/src/providers/calendar/cal-com.ts +29 -18
  139. package/src/providers/calendar/google-calendar.ts +20 -14
  140. package/src/providers/crm/hubspot.ts +225 -99
  141. package/src/providers/development/github.ts +206 -135
  142. package/src/providers/ecommerce/shopify.ts +250 -89
  143. package/src/providers/email/resend.ts +101 -28
  144. package/src/providers/email/sendgrid.ts +12 -9
  145. package/src/providers/finance/stripe.ts +128 -49
  146. package/src/providers/forms/typeform.ts +74 -58
  147. package/src/providers/knowledge/notion.ts +340 -88
  148. package/src/providers/marketing/mailchimp.ts +86 -70
  149. package/src/providers/media/cloudinary.ts +99 -41
  150. package/src/providers/messaging/slack.ts +283 -85
  151. package/src/providers/messaging/twilio-sms.ts +35 -15
  152. package/src/providers/project-management/linear.ts +143 -55
  153. package/src/providers/spreadsheet/google-sheets.ts +222 -56
  154. package/src/providers/spreadsheet/xlsx.ts +47 -16
  155. package/src/providers/storage/s3.ts +119 -47
  156. package/src/providers/support/zendesk.ts +196 -46
  157. package/src/providers/tasks/todoist.ts +20 -26
  158. package/src/providers/video-conferencing/google-meet.ts +17 -20
  159. package/src/providers/video-conferencing/jitsi.ts +14 -14
  160. package/src/providers/video-conferencing/teams.ts +14 -13
  161. package/src/providers/video-conferencing/zoom.ts +54 -49
  162. package/src/tools/data.ts +6 -16
  163. package/src/tools/index.ts +1 -0
  164. package/src/tools/system.ts +887 -0
  165. package/src/tools/web.ts +22 -10
  166. package/src/track-record.ts +106 -0
  167. package/src/types.ts +241 -13
  168. package/src/verb-registration.ts +197 -0
  169. package/src/worker.ts +370 -0
  170. package/src/wrap.ts +260 -0
  171. package/test/client.test.ts +146 -0
  172. package/test/communication-tools-extended.test.ts +734 -0
  173. package/test/data-tools-extended.test.ts +743 -0
  174. package/test/define-extended.test.ts +819 -0
  175. package/test/define.test.ts +150 -41
  176. package/test/entities.test.ts +623 -0
  177. package/test/extended-entities.test.ts +1228 -0
  178. package/test/provider-implementations.test.ts +725 -0
  179. package/test/provider-registry-extended.test.ts +583 -0
  180. package/test/providers/google-sheets.test.ts +851 -0
  181. package/test/providers/helpers.ts +554 -0
  182. package/test/providers/hubspot.test.ts +576 -0
  183. package/test/providers/slack.test.ts +932 -0
  184. package/test/providers/stripe.test.ts +701 -0
  185. package/test/providers.test.ts +578 -0
  186. package/test/system-tools-extended.test.ts +632 -0
  187. package/test/system.test.ts +673 -0
  188. package/test/tools.test.ts +15 -11
  189. package/test/types.test.ts +402 -0
  190. package/test/verb-registration.test.ts +395 -0
  191. package/test/web-tools.test.ts +553 -0
  192. package/test/worker-extended.test.ts +699 -0
  193. package/test/worker.test.ts +576 -0
  194. package/test/wrap.test.ts +366 -0
  195. package/tsconfig.json +3 -13
  196. package/vitest.config.ts +37 -0
  197. package/wrangler.jsonc +9 -0
  198. package/.turbo/turbo-build.log +0 -5
  199. package/dist/providers/voice/vapi.d.ts +0 -27
  200. package/dist/providers/voice/vapi.d.ts.map +0 -1
  201. package/dist/providers/voice/vapi.js +0 -440
  202. package/dist/providers/voice/vapi.js.map +0 -1
  203. package/src/define.js +0 -267
  204. package/src/entities/advertising.js +0 -999
  205. package/src/entities/ai.js +0 -756
  206. package/src/entities/analytics.js +0 -1588
  207. package/src/entities/automation.js +0 -601
  208. package/src/entities/communication.js +0 -1150
  209. package/src/entities/crm.js +0 -1386
  210. package/src/entities/design.js +0 -546
  211. package/src/entities/development.js +0 -2212
  212. package/src/entities/document.js +0 -874
  213. package/src/entities/ecommerce.js +0 -1429
  214. package/src/entities/experiment.js +0 -1039
  215. package/src/entities/finance.js +0 -3478
  216. package/src/entities/forms.js +0 -1892
  217. package/src/entities/hr.js +0 -661
  218. package/src/entities/identity.js +0 -997
  219. package/src/entities/index.js +0 -282
  220. package/src/entities/infrastructure.js +0 -1153
  221. package/src/entities/knowledge.js +0 -1438
  222. package/src/entities/marketing.js +0 -1610
  223. package/src/entities/media.js +0 -1634
  224. package/src/entities/notification.js +0 -1199
  225. package/src/entities/presentation.js +0 -1274
  226. package/src/entities/productivity.js +0 -1317
  227. package/src/entities/project-management.js +0 -1136
  228. package/src/entities/recruiting.js +0 -736
  229. package/src/entities/shipping.js +0 -509
  230. package/src/entities/signature.js +0 -1102
  231. package/src/entities/site.js +0 -222
  232. package/src/entities/spreadsheet.js +0 -1341
  233. package/src/entities/storage.js +0 -1198
  234. package/src/entities/support.js +0 -1166
  235. package/src/entities/video-conferencing.js +0 -1750
  236. package/src/entities/video.js +0 -950
  237. package/src/entities.js +0 -1663
  238. package/src/index.js +0 -74
  239. package/src/providers/analytics/index.js +0 -17
  240. package/src/providers/analytics/mixpanel.js +0 -255
  241. package/src/providers/calendar/cal-com.js +0 -303
  242. package/src/providers/calendar/google-calendar.js +0 -335
  243. package/src/providers/calendar/index.js +0 -20
  244. package/src/providers/crm/hubspot.js +0 -566
  245. package/src/providers/crm/index.js +0 -17
  246. package/src/providers/development/github.js +0 -472
  247. package/src/providers/development/index.js +0 -17
  248. package/src/providers/ecommerce/index.js +0 -17
  249. package/src/providers/ecommerce/shopify.js +0 -378
  250. package/src/providers/email/index.js +0 -20
  251. package/src/providers/email/resend.js +0 -258
  252. package/src/providers/email/sendgrid.js +0 -161
  253. package/src/providers/finance/index.js +0 -17
  254. package/src/providers/finance/stripe.js +0 -549
  255. package/src/providers/forms/index.js +0 -17
  256. package/src/providers/forms/typeform.js +0 -500
  257. package/src/providers/index.js +0 -123
  258. package/src/providers/knowledge/index.js +0 -17
  259. package/src/providers/knowledge/notion.js +0 -389
  260. package/src/providers/marketing/index.js +0 -17
  261. package/src/providers/marketing/mailchimp.js +0 -443
  262. package/src/providers/media/cloudinary.js +0 -318
  263. package/src/providers/media/index.js +0 -17
  264. package/src/providers/messaging/index.js +0 -20
  265. package/src/providers/messaging/slack.js +0 -393
  266. package/src/providers/messaging/twilio-sms.js +0 -249
  267. package/src/providers/project-management/index.js +0 -17
  268. package/src/providers/project-management/linear.js +0 -575
  269. package/src/providers/registry.js +0 -86
  270. package/src/providers/spreadsheet/google-sheets.js +0 -375
  271. package/src/providers/spreadsheet/index.js +0 -20
  272. package/src/providers/spreadsheet/xlsx.js +0 -423
  273. package/src/providers/storage/index.js +0 -24
  274. package/src/providers/storage/s3.js +0 -419
  275. package/src/providers/support/index.js +0 -17
  276. package/src/providers/support/zendesk.js +0 -373
  277. package/src/providers/tasks/index.js +0 -17
  278. package/src/providers/tasks/todoist.js +0 -286
  279. package/src/providers/types.js +0 -9
  280. package/src/providers/video-conferencing/google-meet.js +0 -286
  281. package/src/providers/video-conferencing/index.js +0 -31
  282. package/src/providers/video-conferencing/jitsi.js +0 -254
  283. package/src/providers/video-conferencing/teams.js +0 -270
  284. package/src/providers/video-conferencing/zoom.js +0 -332
  285. package/src/registry.js +0 -128
  286. package/src/tools/communication.js +0 -184
  287. package/src/tools/data.js +0 -205
  288. package/src/tools/index.js +0 -11
  289. package/src/tools/web.js +0 -137
  290. package/src/types.js +0 -10
  291. package/test/define.test.js +0 -306
  292. package/test/registry.test.js +0 -357
  293. 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.defaultFrom as string | undefined
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.attachments = options.attachments.map((att) => ({
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.scheduled_at = options.sendAt.toISOString()
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: (data as any).id,
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: (data as any).name || `HTTP_${response.status}`,
145
- message: (data as any).message || response.statusText,
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
- return (data as any).data.map((item: any) => ({
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: (data as any).name || `HTTP_${response.status}`,
197
- message: (data as any).message || response.statusText,
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 any
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
- sentAt: data.created_at ? new Date(data.created_at) : undefined,
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 any
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: data.records?.map((r: any) => ({
258
- type: r.type,
259
- name: r.name,
260
- value: r.value,
261
- verified: r.status === 'verified',
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 any
274
- return data.data?.map((d: any) => ({
275
- domain: d.name,
276
- verified: d.status === 'verified',
277
- createdAt: new Date(d.created_at),
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.defaultFrom as string | undefined
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.reply_to = { email: options.replyTo }
114
+ body['reply_to'] = { email: options.replyTo }
115
115
  }
116
116
 
117
117
  if (options.attachments?.length) {
118
- body.attachments = options.attachments.map((att) => ({
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.send_at = Math.floor(options.sendAt.getTime() / 1000)
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.tracking_settings = {
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.categories = options.tags
143
+ body['categories'] = options.tags
144
144
  }
145
145
 
146
146
  if (options.metadata) {
147
- body.custom_args = options.metadata
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') || undefined
162
- return { success: true, messageId }
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(result, flattenParams(item as Record<string, unknown>, `${fullKey}[${index}]`))
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.due_date = Math.floor(invoice.dueDate.getTime() / 1000)
302
+ data['due_date'] = Math.floor(invoice.dueDate.getTime() / 1000)
230
303
  }
231
304
 
232
305
  if (invoice.memo) {
233
- data.description = invoice.memo
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
- tax: updatedInvoice.tax ? updatedInvoice.tax / 100 : undefined,
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
- dueDate: updatedInvoice.due_date ? new Date(updatedInvoice.due_date * 1000) : undefined,
272
- paidAt: updatedInvoice.status_transitions?.paid_at
273
- ? new Date(updatedInvoice.status_transitions.paid_at * 1000)
274
- : undefined,
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
- tax: invoice.tax ? invoice.tax / 100 : undefined,
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
- dueDate: invoice.due_date ? new Date(invoice.due_date * 1000) : undefined,
296
- paidAt: invoice.status_transitions?.paid_at
297
- ? new Date(invoice.status_transitions.paid_at * 1000)
298
- : undefined,
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.due_date = Math.floor(updates.dueDate.getTime() / 1000)
389
+ data['due_date'] = Math.floor(updates.dueDate.getTime() / 1000)
315
390
  }
316
391
 
317
392
  if (updates.memo) {
318
- data.description = updates.memo
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
- tax: invoice.tax ? invoice.tax / 100 : undefined,
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
- dueDate: invoice.due_date ? new Date(invoice.due_date * 1000) : undefined,
338
- paidAt: invoice.status_transitions?.paid_at
339
- ? new Date(invoice.status_transitions.paid_at * 1000)
340
- : undefined,
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.limit = String(options.limit)
425
+ params['limit'] = String(options.limit)
351
426
  }
352
427
 
353
428
  if (options.cursor) {
354
- params.starting_after = options.cursor
429
+ params['starting_after'] = options.cursor
355
430
  }
356
431
 
357
432
  if (options.customerId) {
358
- params.customer = options.customerId
433
+ params['customer'] = options.customerId
359
434
  }
360
435
 
361
436
  if (options.status) {
362
- params.status = options.status
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.customer = payment.customerId
507
+ data['customer'] = payment.customerId
433
508
  }
434
509
 
435
510
  if (payment.description) {
436
- data.description = payment.description
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.limit = String(options.limit)
557
+ params['limit'] = String(options.limit)
483
558
  }
484
559
 
485
560
  if (options.cursor) {
486
- params.starting_after = options.cursor
561
+ params['starting_after'] = options.cursor
487
562
  }
488
563
 
489
564
  if (options.customerId) {
490
- params.customer = options.customerId
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.amount = Math.round(amount * 100)
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.email = customer.email
616
+ data['email'] = customer.email
542
617
  }
543
618
 
544
619
  if (customer.phone) {
545
- data.phone = customer.phone
620
+ data['phone'] = customer.phone
546
621
  }
547
622
 
548
623
  if (customer.address) {
549
- data.address = {
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
- balance: stripeCustomer.balance ? stripeCustomer.balance / 100 : undefined,
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
- balance: customer.balance ? customer.balance / 100 : undefined,
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(options: PaginationOptions = {}): Promise<PaginatedResult<FinanceCustomerData>> {
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.limit = String(options.limit)
672
+ params['limit'] = String(options.limit)
596
673
  }
597
674
 
598
675
  if (options.cursor) {
599
- params.starting_after = options.cursor
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(status: string): 'draft' | 'open' | 'paid' | 'void' | 'uncollectible' {
700
+ function mapStripeInvoiceStatus(
701
+ status: string
702
+ ): 'draft' | 'open' | 'paid' | 'void' | 'uncollectible' {
624
703
  switch (status) {
625
704
  case 'draft':
626
705
  return 'draft'