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.
Files changed (294) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +19 -0
  3. package/README.md +2 -0
  4. package/dist/client.d.ts +109 -0
  5. package/dist/client.d.ts.map +1 -0
  6. package/dist/client.js +69 -0
  7. package/dist/client.js.map +1 -0
  8. package/dist/define.d.ts +2 -2
  9. package/dist/define.d.ts.map +1 -1
  10. package/dist/define.js +21 -11
  11. package/dist/define.js.map +1 -1
  12. package/dist/function-ref.d.ts +229 -0
  13. package/dist/function-ref.d.ts.map +1 -0
  14. package/dist/function-ref.js +28 -0
  15. package/dist/function-ref.js.map +1 -0
  16. package/dist/function-sugar.d.ts +57 -0
  17. package/dist/function-sugar.d.ts.map +1 -0
  18. package/dist/function-sugar.js +79 -0
  19. package/dist/function-sugar.js.map +1 -0
  20. package/dist/index.d.ts +10 -3
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +24 -4
  23. package/dist/index.js.map +1 -1
  24. package/dist/providers/analytics/mixpanel.d.ts.map +1 -1
  25. package/dist/providers/analytics/mixpanel.js +21 -18
  26. package/dist/providers/analytics/mixpanel.js.map +1 -1
  27. package/dist/providers/calendar/cal-com.d.ts.map +1 -1
  28. package/dist/providers/calendar/cal-com.js +10 -10
  29. package/dist/providers/calendar/cal-com.js.map +1 -1
  30. package/dist/providers/calendar/google-calendar.d.ts.map +1 -1
  31. package/dist/providers/calendar/google-calendar.js +4 -4
  32. package/dist/providers/calendar/google-calendar.js.map +1 -1
  33. package/dist/providers/crm/hubspot.d.ts.map +1 -1
  34. package/dist/providers/crm/hubspot.js +107 -85
  35. package/dist/providers/crm/hubspot.js.map +1 -1
  36. package/dist/providers/development/github.d.ts.map +1 -1
  37. package/dist/providers/development/github.js +40 -43
  38. package/dist/providers/development/github.js.map +1 -1
  39. package/dist/providers/ecommerce/shopify.d.ts.map +1 -1
  40. package/dist/providers/ecommerce/shopify.js +79 -62
  41. package/dist/providers/ecommerce/shopify.js.map +1 -1
  42. package/dist/providers/email/resend.d.ts.map +1 -1
  43. package/dist/providers/email/resend.js +20 -16
  44. package/dist/providers/email/resend.js.map +1 -1
  45. package/dist/providers/email/sendgrid.d.ts.map +1 -1
  46. package/dist/providers/email/sendgrid.js +12 -9
  47. package/dist/providers/email/sendgrid.js.map +1 -1
  48. package/dist/providers/finance/stripe.d.ts.map +1 -1
  49. package/dist/providers/finance/stripe.js +44 -42
  50. package/dist/providers/finance/stripe.js.map +1 -1
  51. package/dist/providers/forms/typeform.d.ts.map +1 -1
  52. package/dist/providers/forms/typeform.js +68 -58
  53. package/dist/providers/forms/typeform.js.map +1 -1
  54. package/dist/providers/knowledge/notion.d.ts.map +1 -1
  55. package/dist/providers/knowledge/notion.js +75 -41
  56. package/dist/providers/knowledge/notion.js.map +1 -1
  57. package/dist/providers/marketing/mailchimp.d.ts.map +1 -1
  58. package/dist/providers/marketing/mailchimp.js +74 -61
  59. package/dist/providers/marketing/mailchimp.js.map +1 -1
  60. package/dist/providers/media/cloudinary.d.ts.map +1 -1
  61. package/dist/providers/media/cloudinary.js +30 -28
  62. package/dist/providers/media/cloudinary.js.map +1 -1
  63. package/dist/providers/messaging/slack.d.ts.map +1 -1
  64. package/dist/providers/messaging/slack.js +75 -58
  65. package/dist/providers/messaging/slack.js.map +1 -1
  66. package/dist/providers/messaging/twilio-sms.d.ts.map +1 -1
  67. package/dist/providers/messaging/twilio-sms.js +33 -15
  68. package/dist/providers/messaging/twilio-sms.js.map +1 -1
  69. package/dist/providers/project-management/linear.d.ts.map +1 -1
  70. package/dist/providers/project-management/linear.js +31 -27
  71. package/dist/providers/project-management/linear.js.map +1 -1
  72. package/dist/providers/spreadsheet/google-sheets.d.ts.map +1 -1
  73. package/dist/providers/spreadsheet/google-sheets.js +21 -18
  74. package/dist/providers/spreadsheet/google-sheets.js.map +1 -1
  75. package/dist/providers/spreadsheet/xlsx.d.ts.map +1 -1
  76. package/dist/providers/spreadsheet/xlsx.js +4 -4
  77. package/dist/providers/spreadsheet/xlsx.js.map +1 -1
  78. package/dist/providers/storage/index.js +1 -0
  79. package/dist/providers/storage/index.js.map +1 -1
  80. package/dist/providers/storage/s3.d.ts.map +1 -1
  81. package/dist/providers/storage/s3.js +36 -27
  82. package/dist/providers/storage/s3.js.map +1 -1
  83. package/dist/providers/support/zendesk.d.ts.map +1 -1
  84. package/dist/providers/support/zendesk.js +24 -25
  85. package/dist/providers/support/zendesk.js.map +1 -1
  86. package/dist/providers/tasks/todoist.d.ts.map +1 -1
  87. package/dist/providers/tasks/todoist.js +18 -18
  88. package/dist/providers/tasks/todoist.js.map +1 -1
  89. package/dist/providers/video-conferencing/google-meet.d.ts.map +1 -1
  90. package/dist/providers/video-conferencing/google-meet.js +11 -11
  91. package/dist/providers/video-conferencing/google-meet.js.map +1 -1
  92. package/dist/providers/video-conferencing/jitsi.js +14 -14
  93. package/dist/providers/video-conferencing/jitsi.js.map +1 -1
  94. package/dist/providers/video-conferencing/teams.d.ts.map +1 -1
  95. package/dist/providers/video-conferencing/teams.js +9 -7
  96. package/dist/providers/video-conferencing/teams.js.map +1 -1
  97. package/dist/providers/video-conferencing/zoom.d.ts.map +1 -1
  98. package/dist/providers/video-conferencing/zoom.js +26 -24
  99. package/dist/providers/video-conferencing/zoom.js.map +1 -1
  100. package/dist/tools/data.d.ts.map +1 -1
  101. package/dist/tools/data.js +5 -12
  102. package/dist/tools/data.js.map +1 -1
  103. package/dist/tools/index.d.ts +1 -0
  104. package/dist/tools/index.d.ts.map +1 -1
  105. package/dist/tools/index.js +1 -0
  106. package/dist/tools/index.js.map +1 -1
  107. package/dist/tools/system.d.ts +289 -0
  108. package/dist/tools/system.d.ts.map +1 -0
  109. package/dist/tools/system.js +752 -0
  110. package/dist/tools/system.js.map +1 -0
  111. package/dist/tools/web.d.ts.map +1 -1
  112. package/dist/tools/web.js +22 -10
  113. package/dist/tools/web.js.map +1 -1
  114. package/dist/track-record.d.ts +101 -0
  115. package/dist/track-record.d.ts.map +1 -0
  116. package/dist/track-record.js +17 -0
  117. package/dist/track-record.js.map +1 -0
  118. package/dist/types.d.ts +210 -9
  119. package/dist/types.d.ts.map +1 -1
  120. package/dist/verb-registration.d.ts +122 -0
  121. package/dist/verb-registration.d.ts.map +1 -0
  122. package/dist/verb-registration.js +176 -0
  123. package/dist/verb-registration.js.map +1 -0
  124. package/dist/worker.d.ts +93 -0
  125. package/dist/worker.d.ts.map +1 -0
  126. package/dist/worker.js +315 -0
  127. package/dist/worker.js.map +1 -0
  128. package/dist/wrap.d.ts +89 -0
  129. package/dist/wrap.d.ts.map +1 -0
  130. package/dist/wrap.js +225 -0
  131. package/dist/wrap.js.map +1 -0
  132. package/package.json +31 -14
  133. package/src/client.ts +136 -0
  134. package/src/define.ts +30 -24
  135. package/src/function-ref.ts +264 -0
  136. package/src/function-sugar.ts +134 -0
  137. package/src/index.ts +132 -10
  138. package/src/providers/analytics/mixpanel.ts +19 -18
  139. package/src/providers/calendar/cal-com.ts +29 -18
  140. package/src/providers/calendar/google-calendar.ts +20 -14
  141. package/src/providers/crm/hubspot.ts +225 -99
  142. package/src/providers/development/github.ts +206 -135
  143. package/src/providers/ecommerce/shopify.ts +250 -89
  144. package/src/providers/email/resend.ts +101 -28
  145. package/src/providers/email/sendgrid.ts +12 -9
  146. package/src/providers/finance/stripe.ts +128 -49
  147. package/src/providers/forms/typeform.ts +74 -58
  148. package/src/providers/knowledge/notion.ts +340 -88
  149. package/src/providers/marketing/mailchimp.ts +86 -70
  150. package/src/providers/media/cloudinary.ts +99 -41
  151. package/src/providers/messaging/slack.ts +283 -85
  152. package/src/providers/messaging/twilio-sms.ts +35 -15
  153. package/src/providers/project-management/linear.ts +143 -55
  154. package/src/providers/spreadsheet/google-sheets.ts +222 -56
  155. package/src/providers/spreadsheet/xlsx.ts +47 -16
  156. package/src/providers/storage/s3.ts +119 -47
  157. package/src/providers/support/zendesk.ts +196 -46
  158. package/src/providers/tasks/todoist.ts +20 -26
  159. package/src/providers/video-conferencing/google-meet.ts +17 -20
  160. package/src/providers/video-conferencing/jitsi.ts +14 -14
  161. package/src/providers/video-conferencing/teams.ts +14 -13
  162. package/src/providers/video-conferencing/zoom.ts +54 -49
  163. package/src/tools/data.ts +6 -16
  164. package/src/tools/index.ts +1 -0
  165. package/src/tools/system.ts +887 -0
  166. package/src/tools/web.ts +22 -10
  167. package/src/track-record.ts +106 -0
  168. package/src/types.ts +241 -13
  169. package/src/verb-registration.ts +197 -0
  170. package/src/worker.ts +370 -0
  171. package/src/wrap.ts +260 -0
  172. package/test/client.test.ts +146 -0
  173. package/test/communication-tools-extended.test.ts +734 -0
  174. package/test/data-tools-extended.test.ts +743 -0
  175. package/test/define-extended.test.ts +819 -0
  176. package/test/define.test.ts +150 -41
  177. package/test/entities.test.ts +623 -0
  178. package/test/extended-entities.test.ts +1228 -0
  179. package/test/provider-implementations.test.ts +725 -0
  180. package/test/provider-registry-extended.test.ts +583 -0
  181. package/test/providers/google-sheets.test.ts +851 -0
  182. package/test/providers/helpers.ts +554 -0
  183. package/test/providers/hubspot.test.ts +576 -0
  184. package/test/providers/slack.test.ts +932 -0
  185. package/test/providers/stripe.test.ts +701 -0
  186. package/test/providers.test.ts +578 -0
  187. package/test/system-tools-extended.test.ts +632 -0
  188. package/test/system.test.ts +673 -0
  189. package/test/tools.test.ts +15 -11
  190. package/test/types.test.ts +402 -0
  191. package/test/verb-registration.test.ts +395 -0
  192. package/test/web-tools.test.ts +553 -0
  193. package/test/worker-extended.test.ts +699 -0
  194. package/test/worker.test.ts +576 -0
  195. package/test/wrap.test.ts +366 -0
  196. package/tsconfig.json +3 -13
  197. package/vitest.config.ts +37 -0
  198. package/wrangler.jsonc +9 -0
  199. package/LICENSE +0 -21
  200. package/dist/providers/voice/vapi.d.ts +0 -27
  201. package/dist/providers/voice/vapi.d.ts.map +0 -1
  202. package/dist/providers/voice/vapi.js +0 -440
  203. package/dist/providers/voice/vapi.js.map +0 -1
  204. package/src/define.js +0 -259
  205. package/src/entities/advertising.js +0 -999
  206. package/src/entities/ai.js +0 -756
  207. package/src/entities/analytics.js +0 -1588
  208. package/src/entities/automation.js +0 -601
  209. package/src/entities/communication.js +0 -1150
  210. package/src/entities/crm.js +0 -1386
  211. package/src/entities/design.js +0 -546
  212. package/src/entities/development.js +0 -2212
  213. package/src/entities/document.js +0 -874
  214. package/src/entities/ecommerce.js +0 -1429
  215. package/src/entities/experiment.js +0 -1039
  216. package/src/entities/finance.js +0 -3478
  217. package/src/entities/forms.js +0 -1892
  218. package/src/entities/hr.js +0 -661
  219. package/src/entities/identity.js +0 -997
  220. package/src/entities/index.js +0 -282
  221. package/src/entities/infrastructure.js +0 -1153
  222. package/src/entities/knowledge.js +0 -1438
  223. package/src/entities/marketing.js +0 -1610
  224. package/src/entities/media.js +0 -1634
  225. package/src/entities/notification.js +0 -1199
  226. package/src/entities/presentation.js +0 -1274
  227. package/src/entities/productivity.js +0 -1317
  228. package/src/entities/project-management.js +0 -1136
  229. package/src/entities/recruiting.js +0 -736
  230. package/src/entities/shipping.js +0 -509
  231. package/src/entities/signature.js +0 -1102
  232. package/src/entities/site.js +0 -222
  233. package/src/entities/spreadsheet.js +0 -1341
  234. package/src/entities/storage.js +0 -1198
  235. package/src/entities/support.js +0 -1166
  236. package/src/entities/video-conferencing.js +0 -1750
  237. package/src/entities/video.js +0 -950
  238. package/src/entities.js +0 -1663
  239. package/src/index.js +0 -74
  240. package/src/providers/analytics/index.js +0 -17
  241. package/src/providers/analytics/mixpanel.js +0 -255
  242. package/src/providers/calendar/cal-com.js +0 -303
  243. package/src/providers/calendar/google-calendar.js +0 -335
  244. package/src/providers/calendar/index.js +0 -20
  245. package/src/providers/crm/hubspot.js +0 -566
  246. package/src/providers/crm/index.js +0 -17
  247. package/src/providers/development/github.js +0 -472
  248. package/src/providers/development/index.js +0 -17
  249. package/src/providers/ecommerce/index.js +0 -17
  250. package/src/providers/ecommerce/shopify.js +0 -378
  251. package/src/providers/email/index.js +0 -20
  252. package/src/providers/email/resend.js +0 -258
  253. package/src/providers/email/sendgrid.js +0 -161
  254. package/src/providers/finance/index.js +0 -17
  255. package/src/providers/finance/stripe.js +0 -549
  256. package/src/providers/forms/index.js +0 -17
  257. package/src/providers/forms/typeform.js +0 -500
  258. package/src/providers/index.js +0 -123
  259. package/src/providers/knowledge/index.js +0 -17
  260. package/src/providers/knowledge/notion.js +0 -389
  261. package/src/providers/marketing/index.js +0 -17
  262. package/src/providers/marketing/mailchimp.js +0 -443
  263. package/src/providers/media/cloudinary.js +0 -318
  264. package/src/providers/media/index.js +0 -17
  265. package/src/providers/messaging/index.js +0 -20
  266. package/src/providers/messaging/slack.js +0 -393
  267. package/src/providers/messaging/twilio-sms.js +0 -249
  268. package/src/providers/project-management/index.js +0 -17
  269. package/src/providers/project-management/linear.js +0 -575
  270. package/src/providers/registry.js +0 -86
  271. package/src/providers/spreadsheet/google-sheets.js +0 -375
  272. package/src/providers/spreadsheet/index.js +0 -20
  273. package/src/providers/spreadsheet/xlsx.js +0 -423
  274. package/src/providers/storage/index.js +0 -24
  275. package/src/providers/storage/s3.js +0 -419
  276. package/src/providers/support/index.js +0 -17
  277. package/src/providers/support/zendesk.js +0 -373
  278. package/src/providers/tasks/index.js +0 -17
  279. package/src/providers/tasks/todoist.js +0 -286
  280. package/src/providers/types.js +0 -9
  281. package/src/providers/video-conferencing/google-meet.js +0 -286
  282. package/src/providers/video-conferencing/index.js +0 -31
  283. package/src/providers/video-conferencing/jitsi.js +0 -254
  284. package/src/providers/video-conferencing/teams.js +0 -270
  285. package/src/providers/video-conferencing/zoom.js +0 -332
  286. package/src/registry.js +0 -128
  287. package/src/tools/communication.js +0 -184
  288. package/src/tools/data.js +0 -205
  289. package/src/tools/index.js +0 -11
  290. package/src/tools/web.js +0 -137
  291. package/src/types.js +0 -10
  292. package/test/define.test.js +0 -306
  293. package/test/registry.test.js +0 -357
  294. 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'