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
@@ -26,6 +26,114 @@ import { defineProvider } from '../registry.js'
26
26
 
27
27
  const GITHUB_API_URL = 'https://api.github.com'
28
28
 
29
+ // =============================================================================
30
+ // GitHub API Response Types
31
+ // =============================================================================
32
+
33
+ /**
34
+ * GitHub API user/owner object
35
+ */
36
+ interface GitHubUser {
37
+ login: string
38
+ id: number
39
+ avatar_url: string
40
+ type: string
41
+ }
42
+
43
+ /**
44
+ * GitHub API repository response
45
+ */
46
+ interface GitHubRepository {
47
+ id: number
48
+ name: string
49
+ full_name: string
50
+ description: string | null
51
+ private: boolean
52
+ default_branch: string
53
+ html_url: string
54
+ clone_url: string
55
+ stargazers_count: number
56
+ forks_count: number
57
+ open_issues_count: number
58
+ created_at: string
59
+ updated_at: string
60
+ owner: GitHubUser
61
+ }
62
+
63
+ /**
64
+ * GitHub API label object
65
+ */
66
+ interface GitHubLabel {
67
+ id: number
68
+ name: string
69
+ color: string
70
+ description: string | null
71
+ }
72
+
73
+ /**
74
+ * GitHub API issue response
75
+ */
76
+ interface GitHubIssue {
77
+ id: number
78
+ number: number
79
+ title: string
80
+ body: string | null
81
+ state: 'open' | 'closed'
82
+ html_url: string
83
+ created_at: string
84
+ updated_at: string
85
+ closed_at: string | null
86
+ user: GitHubUser
87
+ labels: GitHubLabel[]
88
+ assignees: GitHubUser[]
89
+ pull_request?: {
90
+ url: string
91
+ html_url: string
92
+ }
93
+ }
94
+
95
+ /**
96
+ * GitHub API branch reference
97
+ */
98
+ interface GitHubBranchRef {
99
+ ref: string
100
+ sha: string
101
+ label: string
102
+ user: GitHubUser
103
+ }
104
+
105
+ /**
106
+ * GitHub API pull request response
107
+ */
108
+ interface GitHubPullRequest {
109
+ id: number
110
+ number: number
111
+ title: string
112
+ body: string | null
113
+ state: 'open' | 'closed'
114
+ html_url: string
115
+ created_at: string
116
+ updated_at: string
117
+ closed_at: string | null
118
+ merged_at: string | null
119
+ draft: boolean
120
+ mergeable: boolean | null
121
+ user: GitHubUser
122
+ head: GitHubBranchRef
123
+ base: GitHubBranchRef
124
+ }
125
+
126
+ /**
127
+ * GitHub API comment response
128
+ */
129
+ interface GitHubComment {
130
+ id: number
131
+ body: string
132
+ created_at: string
133
+ updated_at: string
134
+ user: GitHubUser
135
+ }
136
+
29
137
  /**
30
138
  * GitHub provider info
31
139
  */
@@ -105,27 +213,24 @@ export function createGitHubProvider(config: ProviderConfig): DevelopmentProvide
105
213
  params.append('page', options.cursor)
106
214
  }
107
215
 
108
- const response = await fetch(
109
- `${baseUrl}/user/repos?${params.toString()}`,
110
- {
111
- headers: {
112
- Authorization: `Bearer ${accessToken}`,
113
- Accept: 'application/vnd.github.v3+json',
114
- },
115
- }
116
- )
216
+ const response = await fetch(`${baseUrl}/user/repos?${params.toString()}`, {
217
+ headers: {
218
+ Authorization: `Bearer ${accessToken}`,
219
+ Accept: 'application/vnd.github.v3+json',
220
+ },
221
+ })
117
222
 
118
223
  if (!response.ok) {
119
224
  throw new Error(`GitHub API error: ${response.status} ${response.statusText}`)
120
225
  }
121
226
 
122
- const data = await response.json() as any[]
123
- const repos: RepoData[] = data.map((repo: any) => ({
227
+ const data = (await response.json()) as GitHubRepository[]
228
+ const repos: RepoData[] = data.map((repo) => ({
124
229
  id: String(repo.id),
125
230
  owner: repo.owner.login,
126
231
  name: repo.name,
127
232
  fullName: repo.full_name,
128
- description: repo.description,
233
+ ...(repo.description !== null && { description: repo.description }),
129
234
  private: repo.private,
130
235
  defaultBranch: repo.default_branch,
131
236
  url: repo.html_url,
@@ -144,8 +249,7 @@ export function createGitHubProvider(config: ProviderConfig): DevelopmentProvide
144
249
  return {
145
250
  items: repos,
146
251
  hasMore,
147
- nextCursor,
148
- total: undefined,
252
+ ...(nextCursor !== undefined && { nextCursor }),
149
253
  }
150
254
  },
151
255
 
@@ -165,13 +269,13 @@ export function createGitHubProvider(config: ProviderConfig): DevelopmentProvide
165
269
  throw new Error(`GitHub API error: ${response.status} ${response.statusText}`)
166
270
  }
167
271
 
168
- const data = await response.json() as any
272
+ const data = (await response.json()) as GitHubRepository
169
273
  return {
170
274
  id: String(data.id),
171
275
  owner: data.owner.login,
172
276
  name: data.name,
173
277
  fullName: data.full_name,
174
- description: data.description,
278
+ ...(data.description !== null && { description: data.description }),
175
279
  private: data.private,
176
280
  defaultBranch: data.default_branch,
177
281
  url: data.html_url,
@@ -211,37 +315,30 @@ export function createGitHubProvider(config: ProviderConfig): DevelopmentProvide
211
315
  throw new Error(`GitHub API error: ${response.status} ${response.statusText}`)
212
316
  }
213
317
 
214
- const data = await response.json() as any
318
+ const data = (await response.json()) as GitHubIssue
215
319
  return {
216
320
  id: String(data.id),
217
321
  number: data.number,
218
322
  title: data.title,
219
- body: data.body,
323
+ ...(data.body !== null && { body: data.body }),
220
324
  state: data.state,
221
- labels: data.labels.map((l: any) => l.name),
222
- assignees: data.assignees.map((a: any) => a.login),
325
+ labels: data.labels.map((l) => l.name),
326
+ assignees: data.assignees.map((a) => a.login),
223
327
  authorId: data.user.login,
224
328
  url: data.html_url,
225
329
  createdAt: new Date(data.created_at),
226
330
  updatedAt: new Date(data.updated_at),
227
- closedAt: data.closed_at ? new Date(data.closed_at) : undefined,
331
+ ...(data.closed_at !== null && { closedAt: new Date(data.closed_at) }),
228
332
  }
229
333
  },
230
334
 
231
- async getIssue(
232
- owner: string,
233
- repo: string,
234
- issueNumber: number
235
- ): Promise<DevIssueData | null> {
236
- const response = await fetch(
237
- `${baseUrl}/repos/${owner}/${repo}/issues/${issueNumber}`,
238
- {
239
- headers: {
240
- Authorization: `Bearer ${accessToken}`,
241
- Accept: 'application/vnd.github.v3+json',
242
- },
243
- }
244
- )
335
+ async getIssue(owner: string, repo: string, issueNumber: number): Promise<DevIssueData | null> {
336
+ const response = await fetch(`${baseUrl}/repos/${owner}/${repo}/issues/${issueNumber}`, {
337
+ headers: {
338
+ Authorization: `Bearer ${accessToken}`,
339
+ Accept: 'application/vnd.github.v3+json',
340
+ },
341
+ })
245
342
 
246
343
  if (response.status === 404) {
247
344
  return null
@@ -251,20 +348,20 @@ export function createGitHubProvider(config: ProviderConfig): DevelopmentProvide
251
348
  throw new Error(`GitHub API error: ${response.status} ${response.statusText}`)
252
349
  }
253
350
 
254
- const data = await response.json() as any
351
+ const data = (await response.json()) as GitHubIssue
255
352
  return {
256
353
  id: String(data.id),
257
354
  number: data.number,
258
355
  title: data.title,
259
- body: data.body,
356
+ ...(data.body !== null && { body: data.body }),
260
357
  state: data.state,
261
- labels: data.labels.map((l: any) => l.name),
262
- assignees: data.assignees.map((a: any) => a.login),
358
+ labels: data.labels.map((l) => l.name),
359
+ assignees: data.assignees.map((a) => a.login),
263
360
  authorId: data.user.login,
264
361
  url: data.html_url,
265
362
  createdAt: new Date(data.created_at),
266
363
  updatedAt: new Date(data.updated_at),
267
- closedAt: data.closed_at ? new Date(data.closed_at) : undefined,
364
+ ...(data.closed_at !== null && { closedAt: new Date(data.closed_at) }),
268
365
  }
269
366
  },
270
367
 
@@ -276,43 +373,40 @@ export function createGitHubProvider(config: ProviderConfig): DevelopmentProvide
276
373
  ): Promise<DevIssueData> {
277
374
  const body: Record<string, unknown> = {}
278
375
 
279
- if (updates.title !== undefined) body.title = updates.title
280
- if (updates.body !== undefined) body.body = updates.body
281
- if (updates.labels !== undefined) body.labels = updates.labels
282
- if (updates.assignees !== undefined) body.assignees = updates.assignees
283
- if (updates.milestone !== undefined) body.milestone = updates.milestone
376
+ if (updates.title !== undefined) body['title'] = updates.title
377
+ if (updates.body !== undefined) body['body'] = updates.body
378
+ if (updates.labels !== undefined) body['labels'] = updates.labels
379
+ if (updates.assignees !== undefined) body['assignees'] = updates.assignees
380
+ if (updates.milestone !== undefined) body['milestone'] = updates.milestone
284
381
 
285
- const response = await fetch(
286
- `${baseUrl}/repos/${owner}/${repo}/issues/${issueNumber}`,
287
- {
288
- method: 'PATCH',
289
- headers: {
290
- Authorization: `Bearer ${accessToken}`,
291
- Accept: 'application/vnd.github.v3+json',
292
- 'Content-Type': 'application/json',
293
- },
294
- body: JSON.stringify(body),
295
- }
296
- )
382
+ const response = await fetch(`${baseUrl}/repos/${owner}/${repo}/issues/${issueNumber}`, {
383
+ method: 'PATCH',
384
+ headers: {
385
+ Authorization: `Bearer ${accessToken}`,
386
+ Accept: 'application/vnd.github.v3+json',
387
+ 'Content-Type': 'application/json',
388
+ },
389
+ body: JSON.stringify(body),
390
+ })
297
391
 
298
392
  if (!response.ok) {
299
393
  throw new Error(`GitHub API error: ${response.status} ${response.statusText}`)
300
394
  }
301
395
 
302
- const data = await response.json() as any
396
+ const data = (await response.json()) as GitHubIssue
303
397
  return {
304
398
  id: String(data.id),
305
399
  number: data.number,
306
400
  title: data.title,
307
- body: data.body,
401
+ ...(data.body !== null && { body: data.body }),
308
402
  state: data.state,
309
- labels: data.labels.map((l: any) => l.name),
310
- assignees: data.assignees.map((a: any) => a.login),
403
+ labels: data.labels.map((l) => l.name),
404
+ assignees: data.assignees.map((a) => a.login),
311
405
  authorId: data.user.login,
312
406
  url: data.html_url,
313
407
  createdAt: new Date(data.created_at),
314
408
  updatedAt: new Date(data.updated_at),
315
- closedAt: data.closed_at ? new Date(data.closed_at) : undefined,
409
+ ...(data.closed_at !== null && { closedAt: new Date(data.closed_at) }),
316
410
  }
317
411
  },
318
412
 
@@ -356,22 +450,22 @@ export function createGitHubProvider(config: ProviderConfig): DevelopmentProvide
356
450
  throw new Error(`GitHub API error: ${response.status} ${response.statusText}`)
357
451
  }
358
452
 
359
- const data = await response.json() as any
453
+ const data = (await response.json()) as GitHubIssue[]
360
454
  const issues: DevIssueData[] = data
361
- .filter((item: any) => !item.pull_request) // Filter out PRs
362
- .map((issue: any) => ({
455
+ .filter((item) => !item.pull_request) // Filter out PRs
456
+ .map((issue) => ({
363
457
  id: String(issue.id),
364
458
  number: issue.number,
365
459
  title: issue.title,
366
- body: issue.body,
460
+ ...(issue.body !== null && { body: issue.body }),
367
461
  state: issue.state,
368
- labels: issue.labels.map((l: any) => l.name),
369
- assignees: issue.assignees.map((a: any) => a.login),
462
+ labels: issue.labels.map((l) => l.name),
463
+ assignees: issue.assignees.map((a) => a.login),
370
464
  authorId: issue.user.login,
371
465
  url: issue.html_url,
372
466
  createdAt: new Date(issue.created_at),
373
467
  updatedAt: new Date(issue.updated_at),
374
- closedAt: issue.closed_at ? new Date(issue.closed_at) : undefined,
468
+ ...(issue.closed_at !== null && { closedAt: new Date(issue.closed_at) }),
375
469
  }))
376
470
 
377
471
  const linkHeader = response.headers.get('Link')
@@ -381,16 +475,11 @@ export function createGitHubProvider(config: ProviderConfig): DevelopmentProvide
381
475
  return {
382
476
  items: issues,
383
477
  hasMore,
384
- nextCursor,
385
- total: undefined,
478
+ ...(nextCursor !== undefined && { nextCursor }),
386
479
  }
387
480
  },
388
481
 
389
- async createPullRequest(
390
- owner: string,
391
- repo: string,
392
- pr: CreatePROptions
393
- ): Promise<PRData> {
482
+ async createPullRequest(owner: string, repo: string, pr: CreatePROptions): Promise<PRData> {
394
483
  const body = {
395
484
  title: pr.title,
396
485
  body: pr.body,
@@ -413,40 +502,33 @@ export function createGitHubProvider(config: ProviderConfig): DevelopmentProvide
413
502
  throw new Error(`GitHub API error: ${response.status} ${response.statusText}`)
414
503
  }
415
504
 
416
- const data = await response.json() as any
505
+ const data = (await response.json()) as GitHubPullRequest
417
506
  return {
418
507
  id: String(data.id),
419
508
  number: data.number,
420
509
  title: data.title,
421
- body: data.body,
510
+ ...(data.body !== null && { body: data.body }),
422
511
  state: data.merged_at ? 'merged' : data.state,
423
512
  head: data.head.ref,
424
513
  base: data.base.ref,
425
514
  authorId: data.user.login,
426
515
  draft: data.draft,
427
- mergeable: data.mergeable,
516
+ ...(data.mergeable !== null && { mergeable: data.mergeable }),
428
517
  url: data.html_url,
429
518
  createdAt: new Date(data.created_at),
430
519
  updatedAt: new Date(data.updated_at),
431
- mergedAt: data.merged_at ? new Date(data.merged_at) : undefined,
432
- closedAt: data.closed_at ? new Date(data.closed_at) : undefined,
520
+ ...(data.merged_at !== null && { mergedAt: new Date(data.merged_at) }),
521
+ ...(data.closed_at !== null && { closedAt: new Date(data.closed_at) }),
433
522
  }
434
523
  },
435
524
 
436
- async getPullRequest(
437
- owner: string,
438
- repo: string,
439
- prNumber: number
440
- ): Promise<PRData | null> {
441
- const response = await fetch(
442
- `${baseUrl}/repos/${owner}/${repo}/pulls/${prNumber}`,
443
- {
444
- headers: {
445
- Authorization: `Bearer ${accessToken}`,
446
- Accept: 'application/vnd.github.v3+json',
447
- },
448
- }
449
- )
525
+ async getPullRequest(owner: string, repo: string, prNumber: number): Promise<PRData | null> {
526
+ const response = await fetch(`${baseUrl}/repos/${owner}/${repo}/pulls/${prNumber}`, {
527
+ headers: {
528
+ Authorization: `Bearer ${accessToken}`,
529
+ Accept: 'application/vnd.github.v3+json',
530
+ },
531
+ })
450
532
 
451
533
  if (response.status === 404) {
452
534
  return null
@@ -456,23 +538,23 @@ export function createGitHubProvider(config: ProviderConfig): DevelopmentProvide
456
538
  throw new Error(`GitHub API error: ${response.status} ${response.statusText}`)
457
539
  }
458
540
 
459
- const data = await response.json() as any
541
+ const data = (await response.json()) as GitHubPullRequest
460
542
  return {
461
543
  id: String(data.id),
462
544
  number: data.number,
463
545
  title: data.title,
464
- body: data.body,
546
+ ...(data.body !== null && { body: data.body }),
465
547
  state: data.merged_at ? 'merged' : data.state,
466
548
  head: data.head.ref,
467
549
  base: data.base.ref,
468
550
  authorId: data.user.login,
469
551
  draft: data.draft,
470
- mergeable: data.mergeable,
552
+ ...(data.mergeable !== null && { mergeable: data.mergeable }),
471
553
  url: data.html_url,
472
554
  createdAt: new Date(data.created_at),
473
555
  updatedAt: new Date(data.updated_at),
474
- mergedAt: data.merged_at ? new Date(data.merged_at) : undefined,
475
- closedAt: data.closed_at ? new Date(data.closed_at) : undefined,
556
+ ...(data.merged_at !== null && { mergedAt: new Date(data.merged_at) }),
557
+ ...(data.closed_at !== null && { closedAt: new Date(data.closed_at) }),
476
558
  }
477
559
  },
478
560
 
@@ -499,37 +581,34 @@ export function createGitHubProvider(config: ProviderConfig): DevelopmentProvide
499
581
  params.append('page', options.cursor)
500
582
  }
501
583
 
502
- const response = await fetch(
503
- `${baseUrl}/repos/${owner}/${repo}/pulls?${params.toString()}`,
504
- {
505
- headers: {
506
- Authorization: `Bearer ${accessToken}`,
507
- Accept: 'application/vnd.github.v3+json',
508
- },
509
- }
510
- )
584
+ const response = await fetch(`${baseUrl}/repos/${owner}/${repo}/pulls?${params.toString()}`, {
585
+ headers: {
586
+ Authorization: `Bearer ${accessToken}`,
587
+ Accept: 'application/vnd.github.v3+json',
588
+ },
589
+ })
511
590
 
512
591
  if (!response.ok) {
513
592
  throw new Error(`GitHub API error: ${response.status} ${response.statusText}`)
514
593
  }
515
594
 
516
- const data = await response.json() as any
517
- const prs: PRData[] = data.map((pr: any) => ({
595
+ const data = (await response.json()) as GitHubPullRequest[]
596
+ const prs: PRData[] = data.map((pr) => ({
518
597
  id: String(pr.id),
519
598
  number: pr.number,
520
599
  title: pr.title,
521
- body: pr.body,
600
+ ...(pr.body !== null && { body: pr.body }),
522
601
  state: pr.merged_at ? 'merged' : pr.state,
523
602
  head: pr.head.ref,
524
603
  base: pr.base.ref,
525
604
  authorId: pr.user.login,
526
605
  draft: pr.draft,
527
- mergeable: pr.mergeable,
606
+ ...(pr.mergeable !== null && { mergeable: pr.mergeable }),
528
607
  url: pr.html_url,
529
608
  createdAt: new Date(pr.created_at),
530
609
  updatedAt: new Date(pr.updated_at),
531
- mergedAt: pr.merged_at ? new Date(pr.merged_at) : undefined,
532
- closedAt: pr.closed_at ? new Date(pr.closed_at) : undefined,
610
+ ...(pr.merged_at !== null && { mergedAt: new Date(pr.merged_at) }),
611
+ ...(pr.closed_at !== null && { closedAt: new Date(pr.closed_at) }),
533
612
  }))
534
613
 
535
614
  const linkHeader = response.headers.get('Link')
@@ -539,28 +618,20 @@ export function createGitHubProvider(config: ProviderConfig): DevelopmentProvide
539
618
  return {
540
619
  items: prs,
541
620
  hasMore,
542
- nextCursor,
543
- total: undefined,
621
+ ...(nextCursor !== undefined && { nextCursor }),
544
622
  }
545
623
  },
546
624
 
547
- async mergePullRequest(
548
- owner: string,
549
- repo: string,
550
- prNumber: number
551
- ): Promise<boolean> {
552
- const response = await fetch(
553
- `${baseUrl}/repos/${owner}/${repo}/pulls/${prNumber}/merge`,
554
- {
555
- method: 'PUT',
556
- headers: {
557
- Authorization: `Bearer ${accessToken}`,
558
- Accept: 'application/vnd.github.v3+json',
559
- 'Content-Type': 'application/json',
560
- },
561
- body: JSON.stringify({}),
562
- }
563
- )
625
+ async mergePullRequest(owner: string, repo: string, prNumber: number): Promise<boolean> {
626
+ const response = await fetch(`${baseUrl}/repos/${owner}/${repo}/pulls/${prNumber}/merge`, {
627
+ method: 'PUT',
628
+ headers: {
629
+ Authorization: `Bearer ${accessToken}`,
630
+ Accept: 'application/vnd.github.v3+json',
631
+ 'Content-Type': 'application/json',
632
+ },
633
+ body: JSON.stringify({}),
634
+ })
564
635
 
565
636
  return response.ok
566
637
  },
@@ -588,7 +659,7 @@ export function createGitHubProvider(config: ProviderConfig): DevelopmentProvide
588
659
  throw new Error(`GitHub API error: ${response.status} ${response.statusText}`)
589
660
  }
590
661
 
591
- const data = await response.json() as any
662
+ const data = (await response.json()) as GitHubComment
592
663
  return {
593
664
  id: String(data.id),
594
665
  body: data.body,