digital-tools 2.1.3 → 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 (294) hide show
  1. package/CHANGELOG.md +9 -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 +21 -11
  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 +31 -14
  132. package/src/client.ts +136 -0
  133. package/src/define.ts +30 -24
  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 -4
  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
@@ -28,6 +28,129 @@ import { defineProvider } from '../registry.js'
28
28
  const SHEETS_API_URL = 'https://sheets.googleapis.com/v4/spreadsheets'
29
29
  const DRIVE_API_URL = 'https://www.googleapis.com/drive/v3/files'
30
30
 
31
+ // =============================================================================
32
+ // Google Sheets API Response Types
33
+ // =============================================================================
34
+
35
+ /** Google API error response */
36
+ interface GoogleErrorResponse {
37
+ error?: {
38
+ message?: string
39
+ code?: number
40
+ }
41
+ }
42
+
43
+ /** Google Drive file from list response */
44
+ interface GoogleDriveFile {
45
+ id: string
46
+ name: string
47
+ createdTime?: string
48
+ modifiedTime?: string
49
+ }
50
+
51
+ /** Google Drive list response */
52
+ interface GoogleDriveListResponse {
53
+ files?: GoogleDriveFile[]
54
+ nextPageToken?: string
55
+ }
56
+
57
+ /** Google Sheets grid properties */
58
+ interface GoogleGridProperties {
59
+ rowCount?: number
60
+ columnCount?: number
61
+ frozenRowCount?: number
62
+ frozenColumnCount?: number
63
+ }
64
+
65
+ /** Google Sheets sheet properties */
66
+ interface GoogleSheetProperties {
67
+ sheetId: number
68
+ title: string
69
+ index: number
70
+ gridProperties?: GoogleGridProperties
71
+ }
72
+
73
+ /** Google Sheets cell effective value */
74
+ interface GoogleCellEffectiveValue {
75
+ numberValue?: number
76
+ stringValue?: string
77
+ boolValue?: boolean
78
+ formulaValue?: string
79
+ errorValue?: { message: string }
80
+ }
81
+
82
+ /** Google Sheets cell data */
83
+ interface GoogleCellData {
84
+ effectiveValue?: GoogleCellEffectiveValue
85
+ }
86
+
87
+ /** Google Sheets row data */
88
+ interface GoogleRowData {
89
+ values?: GoogleCellData[]
90
+ }
91
+
92
+ /** Google Sheets grid data */
93
+ interface GoogleGridData {
94
+ rowData?: GoogleRowData[]
95
+ }
96
+
97
+ /** Google Sheets sheet from API */
98
+ interface GoogleSheet {
99
+ properties: GoogleSheetProperties
100
+ data?: GoogleGridData[]
101
+ }
102
+
103
+ /** Google Sheets spreadsheet from API */
104
+ interface GoogleSpreadsheet {
105
+ spreadsheetId: string
106
+ properties: { title: string }
107
+ sheets?: GoogleSheet[]
108
+ spreadsheetUrl?: string
109
+ }
110
+
111
+ /** Google Sheets value range from API */
112
+ interface GoogleValueRange {
113
+ range: string
114
+ values?: CellValue[][]
115
+ }
116
+
117
+ /** Google Sheets batch update reply */
118
+ interface GoogleBatchUpdateReply {
119
+ addSheet?: {
120
+ properties: GoogleSheetProperties
121
+ }
122
+ }
123
+
124
+ /** Google Sheets batch update response */
125
+ interface GoogleBatchUpdateResponse {
126
+ replies: GoogleBatchUpdateReply[]
127
+ }
128
+
129
+ /** Google Sheets value update response */
130
+ interface GoogleValueUpdateResponse {
131
+ spreadsheetId: string
132
+ updatedRange?: string
133
+ updatedRows?: number
134
+ updatedColumns?: number
135
+ updatedCells?: number
136
+ updates?: {
137
+ updatedRange?: string
138
+ updatedRows?: number
139
+ }
140
+ }
141
+
142
+ /** Google Sheets batch get response */
143
+ interface GoogleBatchGetResponse {
144
+ valueRanges?: GoogleValueRange[]
145
+ }
146
+
147
+ /** Google Sheets batch value update response */
148
+ interface GoogleBatchValueUpdateResponse {
149
+ totalUpdatedRows?: number
150
+ totalUpdatedColumns?: number
151
+ totalUpdatedCells?: number
152
+ }
153
+
31
154
  /**
32
155
  * Google Sheets provider info
33
156
  */
@@ -48,12 +171,12 @@ export const googleSheetsInfo: ProviderInfo = {
48
171
  export function createGoogleSheetsProvider(config: ProviderConfig): SpreadsheetProvider {
49
172
  let accessToken: string
50
173
 
51
- async function sheetsApi(
174
+ async function sheetsApi<T>(
52
175
  path: string,
53
176
  method: string = 'GET',
54
177
  body?: unknown,
55
178
  baseUrl: string = SHEETS_API_URL
56
- ): Promise<any> {
179
+ ): Promise<T> {
57
180
  const url = path.startsWith('http') ? path : `${baseUrl}${path}`
58
181
 
59
182
  const response = await fetch(url, {
@@ -62,15 +185,15 @@ export function createGoogleSheetsProvider(config: ProviderConfig): SpreadsheetP
62
185
  'Content-Type': 'application/json',
63
186
  Authorization: `Bearer ${accessToken}`,
64
187
  },
65
- body: body ? JSON.stringify(body) : undefined,
188
+ ...(body !== undefined && { body: JSON.stringify(body) }),
66
189
  })
67
190
 
68
191
  if (!response.ok) {
69
- const error = await response.json().catch(() => ({}))
70
- throw new Error((error as any)?.error?.message || `HTTP ${response.status}`)
192
+ const error = (await response.json().catch(() => ({}))) as GoogleErrorResponse
193
+ throw new Error(error.error?.message || `HTTP ${response.status}`)
71
194
  }
72
195
 
73
- return response.json()
196
+ return response.json() as Promise<T>
74
197
  }
75
198
 
76
199
  return {
@@ -125,14 +248,14 @@ export function createGoogleSheetsProvider(config: ProviderConfig): SpreadsheetP
125
248
  })),
126
249
  }
127
250
 
128
- const data = await sheetsApi('', 'POST', body)
251
+ const data = await sheetsApi<GoogleSpreadsheet>('', 'POST', body)
129
252
 
130
253
  return mapSpreadsheet(data)
131
254
  },
132
255
 
133
256
  async get(spreadsheetId: string): Promise<SpreadsheetData | null> {
134
257
  try {
135
- const data = await sheetsApi(`/${spreadsheetId}?includeGridData=false`)
258
+ const data = await sheetsApi<GoogleSpreadsheet>(`/${spreadsheetId}?includeGridData=false`)
136
259
  return mapSpreadsheet(data)
137
260
  } catch {
138
261
  return null
@@ -141,7 +264,9 @@ export function createGoogleSheetsProvider(config: ProviderConfig): SpreadsheetP
141
264
 
142
265
  async list(options?: SpreadsheetListOptions): Promise<PaginatedResult<SpreadsheetData>> {
143
266
  const params = new URLSearchParams({
144
- q: `mimeType='application/vnd.google-apps.spreadsheet'${options?.query ? ` and name contains '${options.query}'` : ''}`,
267
+ q: `mimeType='application/vnd.google-apps.spreadsheet'${
268
+ options?.query ? ` and name contains '${options.query}'` : ''
269
+ }`,
145
270
  pageSize: (options?.limit || 100).toString(),
146
271
  fields: 'files(id,name,createdTime,modifiedTime),nextPageToken',
147
272
  })
@@ -150,19 +275,25 @@ export function createGoogleSheetsProvider(config: ProviderConfig): SpreadsheetP
150
275
  params.append('pageToken', options.cursor)
151
276
  }
152
277
 
153
- const data = await sheetsApi(`?${params.toString()}`, 'GET', undefined, DRIVE_API_URL)
278
+ const data = await sheetsApi<GoogleDriveListResponse>(
279
+ `?${params.toString()}`,
280
+ 'GET',
281
+ undefined,
282
+ DRIVE_API_URL
283
+ )
154
284
 
155
285
  return {
156
- items: data.files?.map((f: any) => ({
157
- id: f.id,
158
- name: f.name,
159
- sheets: [], // Would need separate API call to get sheets
160
- createdAt: f.createdTime ? new Date(f.createdTime) : undefined,
161
- modifiedAt: f.modifiedTime ? new Date(f.modifiedTime) : undefined,
162
- url: `https://docs.google.com/spreadsheets/d/${f.id}`,
163
- })) || [],
286
+ items:
287
+ data.files?.map((f) => ({
288
+ id: f.id,
289
+ name: f.name,
290
+ sheets: [], // Would need separate API call to get sheets
291
+ ...(f.createdTime && { createdAt: new Date(f.createdTime) }),
292
+ ...(f.modifiedTime && { modifiedAt: new Date(f.modifiedTime) }),
293
+ url: `https://docs.google.com/spreadsheets/d/${f.id}`,
294
+ })) || [],
164
295
  hasMore: !!data.nextPageToken,
165
- nextCursor: data.nextPageToken,
296
+ ...(data.nextPageToken !== undefined && { nextCursor: data.nextPageToken }),
166
297
  }
167
298
  },
168
299
 
@@ -177,11 +308,14 @@ export function createGoogleSheetsProvider(config: ProviderConfig): SpreadsheetP
177
308
 
178
309
  async getSheet(spreadsheetId: string, sheetId: string | number): Promise<SheetData | null> {
179
310
  try {
180
- const spreadsheet = await sheetsApi(`/${spreadsheetId}?includeGridData=true`)
311
+ const spreadsheet = await sheetsApi<GoogleSpreadsheet>(
312
+ `/${spreadsheetId}?includeGridData=true`
313
+ )
181
314
 
182
- const sheet = typeof sheetId === 'number'
183
- ? spreadsheet.sheets.find((s: any) => s.properties.sheetId === sheetId)
184
- : spreadsheet.sheets.find((s: any) => s.properties.title === sheetId)
315
+ const sheet =
316
+ typeof sheetId === 'number'
317
+ ? spreadsheet.sheets?.find((s) => s.properties.sheetId === sheetId)
318
+ : spreadsheet.sheets?.find((s) => s.properties.title === sheetId)
185
319
 
186
320
  if (!sheet) return null
187
321
 
@@ -208,15 +342,23 @@ export function createGoogleSheetsProvider(config: ProviderConfig): SpreadsheetP
208
342
  rowCount: sheet.properties.gridProperties?.rowCount || 0,
209
343
  columnCount: sheet.properties.gridProperties?.columnCount || 0,
210
344
  data,
211
- frozenRows: sheet.properties.gridProperties?.frozenRowCount,
212
- frozenColumns: sheet.properties.gridProperties?.frozenColumnCount,
345
+ ...(sheet.properties.gridProperties?.frozenRowCount !== undefined && {
346
+ frozenRows: sheet.properties.gridProperties.frozenRowCount,
347
+ }),
348
+ ...(sheet.properties.gridProperties?.frozenColumnCount !== undefined && {
349
+ frozenColumns: sheet.properties.gridProperties.frozenColumnCount,
350
+ }),
213
351
  }
214
352
  } catch {
215
353
  return null
216
354
  }
217
355
  },
218
356
 
219
- async addSheet(spreadsheetId: string, name: string, options?: AddSheetOptions): Promise<SheetData> {
357
+ async addSheet(
358
+ spreadsheetId: string,
359
+ name: string,
360
+ options?: AddSheetOptions
361
+ ): Promise<SheetData> {
220
362
  const body = {
221
363
  requests: [
222
364
  {
@@ -234,9 +376,13 @@ export function createGoogleSheetsProvider(config: ProviderConfig): SpreadsheetP
234
376
  ],
235
377
  }
236
378
 
237
- const data = await sheetsApi(`/${spreadsheetId}:batchUpdate`, 'POST', body)
379
+ const data = await sheetsApi<GoogleBatchUpdateResponse>(
380
+ `/${spreadsheetId}:batchUpdate`,
381
+ 'POST',
382
+ body
383
+ )
238
384
 
239
- const reply = data.replies[0].addSheet
385
+ const reply = data.replies[0]!.addSheet!
240
386
  return {
241
387
  id: reply.properties.sheetId.toString(),
242
388
  name: reply.properties.title,
@@ -253,8 +399,8 @@ export function createGoogleSheetsProvider(config: ProviderConfig): SpreadsheetP
253
399
 
254
400
  if (isNaN(actualSheetId)) {
255
401
  // Look up by name
256
- const spreadsheet = await sheetsApi(`/${spreadsheetId}`)
257
- const sheet = spreadsheet.sheets.find((s: any) => s.properties.title === sheetId)
402
+ const spreadsheet = await sheetsApi<GoogleSpreadsheet>(`/${spreadsheetId}`)
403
+ const sheet = spreadsheet.sheets?.find((s) => s.properties.title === sheetId)
258
404
  if (!sheet) return false
259
405
  actualSheetId = sheet.properties.sheetId
260
406
  }
@@ -276,13 +422,17 @@ export function createGoogleSheetsProvider(config: ProviderConfig): SpreadsheetP
276
422
  }
277
423
  },
278
424
 
279
- async renameSheet(spreadsheetId: string, sheetId: string | number, name: string): Promise<boolean> {
425
+ async renameSheet(
426
+ spreadsheetId: string,
427
+ sheetId: string | number,
428
+ name: string
429
+ ): Promise<boolean> {
280
430
  try {
281
431
  let actualSheetId = typeof sheetId === 'number' ? sheetId : parseInt(sheetId, 10)
282
432
 
283
433
  if (isNaN(actualSheetId)) {
284
- const spreadsheet = await sheetsApi(`/${spreadsheetId}`)
285
- const sheet = spreadsheet.sheets.find((s: any) => s.properties.title === sheetId)
434
+ const spreadsheet = await sheetsApi<GoogleSpreadsheet>(`/${spreadsheetId}`)
435
+ const sheet = spreadsheet.sheets?.find((s) => s.properties.title === sheetId)
286
436
  if (!sheet) return false
287
437
  actualSheetId = sheet.properties.sheetId
288
438
  }
@@ -301,7 +451,7 @@ export function createGoogleSheetsProvider(config: ProviderConfig): SpreadsheetP
301
451
  ],
302
452
  }
303
453
 
304
- await sheetsApi(`/${spreadsheetId}:batchUpdate`, 'POST', body)
454
+ await sheetsApi<GoogleBatchUpdateResponse>(`/${spreadsheetId}:batchUpdate`, 'POST', body)
305
455
  return true
306
456
  } catch {
307
457
  return false
@@ -309,39 +459,49 @@ export function createGoogleSheetsProvider(config: ProviderConfig): SpreadsheetP
309
459
  },
310
460
 
311
461
  async readRange(spreadsheetId: string, range: string): Promise<CellValue[][]> {
312
- const data = await sheetsApi(
462
+ const data = await sheetsApi<GoogleValueRange>(
313
463
  `/${spreadsheetId}/values/${encodeURIComponent(range)}?valueRenderOption=UNFORMATTED_VALUE`
314
464
  )
315
465
 
316
466
  return data.values || []
317
467
  },
318
468
 
319
- async writeRange(spreadsheetId: string, range: string, values: CellValue[][]): Promise<UpdateResult> {
469
+ async writeRange(
470
+ spreadsheetId: string,
471
+ range: string,
472
+ values: CellValue[][]
473
+ ): Promise<UpdateResult> {
320
474
  const body = {
321
475
  values,
322
476
  }
323
477
 
324
- const data = await sheetsApi(
478
+ const data = await sheetsApi<GoogleValueUpdateResponse>(
325
479
  `/${spreadsheetId}/values/${encodeURIComponent(range)}?valueInputOption=USER_ENTERED`,
326
480
  'PUT',
327
481
  body
328
482
  )
329
483
 
330
484
  return {
331
- updatedRange: data.updatedRange,
485
+ updatedRange: data.updatedRange || range,
332
486
  updatedRows: data.updatedRows || 0,
333
487
  updatedColumns: data.updatedColumns || 0,
334
488
  updatedCells: data.updatedCells || 0,
335
489
  }
336
490
  },
337
491
 
338
- async appendRows(spreadsheetId: string, range: string, values: CellValue[][]): Promise<AppendResult> {
492
+ async appendRows(
493
+ spreadsheetId: string,
494
+ range: string,
495
+ values: CellValue[][]
496
+ ): Promise<AppendResult> {
339
497
  const body = {
340
498
  values,
341
499
  }
342
500
 
343
- const data = await sheetsApi(
344
- `/${spreadsheetId}/values/${encodeURIComponent(range)}:append?valueInputOption=USER_ENTERED&insertDataOption=INSERT_ROWS`,
501
+ const data = await sheetsApi<GoogleValueUpdateResponse>(
502
+ `/${spreadsheetId}/values/${encodeURIComponent(
503
+ range
504
+ )}:append?valueInputOption=USER_ENTERED&insertDataOption=INSERT_ROWS`,
345
505
  'POST',
346
506
  body
347
507
  )
@@ -364,12 +524,12 @@ export function createGoogleSheetsProvider(config: ProviderConfig): SpreadsheetP
364
524
 
365
525
  async batchRead(spreadsheetId: string, ranges: string[]): Promise<Map<string, CellValue[][]>> {
366
526
  const params = ranges.map((r) => `ranges=${encodeURIComponent(r)}`).join('&')
367
- const data = await sheetsApi(
527
+ const data = await sheetsApi<GoogleBatchGetResponse>(
368
528
  `/${spreadsheetId}/values:batchGet?${params}&valueRenderOption=UNFORMATTED_VALUE`
369
529
  )
370
530
 
371
531
  const result = new Map<string, CellValue[][]>()
372
- data.valueRanges?.forEach((vr: any) => {
532
+ data.valueRanges?.forEach((vr) => {
373
533
  result.set(vr.range, vr.values || [])
374
534
  })
375
535
 
@@ -388,7 +548,11 @@ export function createGoogleSheetsProvider(config: ProviderConfig): SpreadsheetP
388
548
  })),
389
549
  }
390
550
 
391
- const response = await sheetsApi(`/${spreadsheetId}/values:batchUpdate`, 'POST', body)
551
+ const response = await sheetsApi<GoogleBatchValueUpdateResponse>(
552
+ `/${spreadsheetId}/values:batchUpdate`,
553
+ 'POST',
554
+ body
555
+ )
392
556
 
393
557
  return {
394
558
  updatedRange: 'batch',
@@ -406,7 +570,9 @@ export function createGoogleSheetsProvider(config: ProviderConfig): SpreadsheetP
406
570
  }
407
571
 
408
572
  const response = await fetch(
409
- `${DRIVE_API_URL}/${spreadsheetId}/export?mimeType=${encodeURIComponent(mimeTypes[format]!)}`,
573
+ `${DRIVE_API_URL}/${spreadsheetId}/export?mimeType=${encodeURIComponent(
574
+ mimeTypes[format]!
575
+ )}`,
410
576
  {
411
577
  headers: {
412
578
  Authorization: `Bearer ${accessToken}`,
@@ -424,20 +590,20 @@ export function createGoogleSheetsProvider(config: ProviderConfig): SpreadsheetP
424
590
  }
425
591
  }
426
592
 
427
- function mapSpreadsheet(data: any): SpreadsheetData {
593
+ function mapSpreadsheet(data: GoogleSpreadsheet): SpreadsheetData {
428
594
  return {
429
595
  id: data.spreadsheetId,
430
596
  name: data.properties.title,
431
- sheets: data.sheets?.map((s: any) => ({
432
- id: s.properties.sheetId.toString(),
433
- name: s.properties.title,
434
- index: s.properties.index,
435
- rowCount: s.properties.gridProperties?.rowCount,
436
- columnCount: s.properties.gridProperties?.columnCount,
437
- })) || [],
438
- createdAt: undefined, // Not available from Sheets API
439
- modifiedAt: undefined,
440
- url: data.spreadsheetUrl,
597
+ sheets:
598
+ data.sheets?.map((s) => ({
599
+ id: s.properties.sheetId.toString(),
600
+ name: s.properties.title,
601
+ index: s.properties.index,
602
+ rowCount: s.properties.gridProperties?.rowCount ?? 0,
603
+ columnCount: s.properties.gridProperties?.columnCount ?? 0,
604
+ })) || [],
605
+ // createdAt and modifiedAt not available from Sheets API
606
+ ...(data.spreadsheetUrl !== undefined && { url: data.spreadsheetUrl }),
441
607
  }
442
608
  }
443
609
 
@@ -69,7 +69,13 @@ export function createXlsxProvider(config: ProviderConfig): SpreadsheetProvider
69
69
  return `xlsx_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`
70
70
  }
71
71
 
72
- function parseRange(range: string): { sheet?: string; startRow: number; startCol: number; endRow: number; endCol: number } {
72
+ function parseRange(range: string): {
73
+ sheet?: string
74
+ startRow: number
75
+ startCol: number
76
+ endRow: number
77
+ endCol: number
78
+ } {
73
79
  // Parse A1 notation like "Sheet1!A1:C10" or just "A1:C10"
74
80
  let sheetName: string | undefined
75
81
  let cellRange = range
@@ -85,7 +91,7 @@ export function createXlsxProvider(config: ProviderConfig): SpreadsheetProvider
85
91
  const endCell = end ? parseCell(end) : startCell
86
92
 
87
93
  return {
88
- sheet: sheetName,
94
+ ...(sheetName !== undefined && { sheet: sheetName }),
89
95
  startRow: startCell.row,
90
96
  startCol: startCell.col,
91
97
  endRow: endCell.row,
@@ -125,7 +131,7 @@ export function createXlsxProvider(config: ProviderConfig): SpreadsheetProvider
125
131
  info: xlsxInfo,
126
132
 
127
133
  async initialize(cfg: ProviderConfig): Promise<void> {
128
- basePath = (cfg.basePath as string) || './spreadsheets'
134
+ basePath = (cfg['basePath'] as string) || './spreadsheets'
129
135
  },
130
136
 
131
137
  async healthCheck(): Promise<ProviderHealth> {
@@ -252,12 +258,16 @@ export function createXlsxProvider(config: ProviderConfig): SpreadsheetProvider
252
258
  rowCount: sheet.data.length,
253
259
  columnCount: sheet.data[0]?.length || 0,
254
260
  data: sheet.data,
255
- frozenRows: sheet.frozenRows,
256
- frozenColumns: sheet.frozenColumns,
261
+ ...(sheet.frozenRows !== undefined && { frozenRows: sheet.frozenRows }),
262
+ ...(sheet.frozenColumns !== undefined && { frozenColumns: sheet.frozenColumns }),
257
263
  }
258
264
  },
259
265
 
260
- async addSheet(spreadsheetId: string, name: string, options?: AddSheetOptions): Promise<SheetData> {
266
+ async addSheet(
267
+ spreadsheetId: string,
268
+ name: string,
269
+ options?: AddSheetOptions
270
+ ): Promise<SheetData> {
261
271
  const workbook = spreadsheets.get(spreadsheetId)
262
272
  if (!workbook) {
263
273
  throw new Error(`Spreadsheet ${spreadsheetId} not found`)
@@ -309,7 +319,11 @@ export function createXlsxProvider(config: ProviderConfig): SpreadsheetProvider
309
319
  return deleted
310
320
  },
311
321
 
312
- async renameSheet(spreadsheetId: string, sheetId: string | number, name: string): Promise<boolean> {
322
+ async renameSheet(
323
+ spreadsheetId: string,
324
+ sheetId: string | number,
325
+ name: string
326
+ ): Promise<boolean> {
313
327
  const workbook = spreadsheets.get(spreadsheetId)
314
328
  if (!workbook) return false
315
329
 
@@ -364,7 +378,11 @@ export function createXlsxProvider(config: ProviderConfig): SpreadsheetProvider
364
378
  return result
365
379
  },
366
380
 
367
- async writeRange(spreadsheetId: string, range: string, values: CellValue[][]): Promise<UpdateResult> {
381
+ async writeRange(
382
+ spreadsheetId: string,
383
+ range: string,
384
+ values: CellValue[][]
385
+ ): Promise<UpdateResult> {
368
386
  const workbook = spreadsheets.get(spreadsheetId)
369
387
  if (!workbook) {
370
388
  throw new Error(`Spreadsheet ${spreadsheetId} not found`)
@@ -402,14 +420,20 @@ export function createXlsxProvider(config: ProviderConfig): SpreadsheetProvider
402
420
  const endCol = startCol + (values[0]?.length || 0) - 1
403
421
 
404
422
  return {
405
- updatedRange: `${sheetName || sheet.name}!${colToLetter(startCol)}${startRow}:${colToLetter(endCol)}${endRow}`,
423
+ updatedRange: `${sheetName || sheet.name}!${colToLetter(startCol)}${startRow}:${colToLetter(
424
+ endCol
425
+ )}${endRow}`,
406
426
  updatedRows: values.length,
407
427
  updatedColumns: values[0]?.length || 0,
408
428
  updatedCells,
409
429
  }
410
430
  },
411
431
 
412
- async appendRows(spreadsheetId: string, range: string, values: CellValue[][]): Promise<AppendResult> {
432
+ async appendRows(
433
+ spreadsheetId: string,
434
+ range: string,
435
+ values: CellValue[][]
436
+ ): Promise<AppendResult> {
413
437
  const workbook = spreadsheets.get(spreadsheetId)
414
438
  if (!workbook) {
415
439
  throw new Error(`Spreadsheet ${spreadsheetId} not found`)
@@ -446,7 +470,9 @@ export function createXlsxProvider(config: ProviderConfig): SpreadsheetProvider
446
470
 
447
471
  return {
448
472
  spreadsheetId,
449
- updatedRange: `${sheetName || sheet.name}!${colToLetter(startCol)}${startRow}:${colToLetter(endCol)}${endRow}`,
473
+ updatedRange: `${sheetName || sheet.name}!${colToLetter(startCol)}${startRow}:${colToLetter(
474
+ endCol
475
+ )}${endRow}`,
450
476
  updatedRows: values.length,
451
477
  }
452
478
  },
@@ -486,7 +512,10 @@ export function createXlsxProvider(config: ProviderConfig): SpreadsheetProvider
486
512
  return result
487
513
  },
488
514
 
489
- async batchWrite(spreadsheetId: string, data: Array<{ range: string; values: CellValue[][] }>): Promise<UpdateResult> {
515
+ async batchWrite(
516
+ spreadsheetId: string,
517
+ data: Array<{ range: string; values: CellValue[][] }>
518
+ ): Promise<UpdateResult> {
490
519
  let totalCells = 0
491
520
  let totalRows = 0
492
521
  let totalCols = 0
@@ -525,7 +554,11 @@ export function createXlsxProvider(config: ProviderConfig): SpreadsheetProvider
525
554
  return Buffer.from(content, 'utf-8')
526
555
  },
527
556
 
528
- async import(file: Buffer, format: 'xlsx' | 'csv', options?: ImportOptions): Promise<SpreadsheetData> {
557
+ async import(
558
+ file: Buffer,
559
+ format: 'xlsx' | 'csv',
560
+ options?: ImportOptions
561
+ ): Promise<SpreadsheetData> {
529
562
  // In a real implementation, this would use SheetJS to parse the file
530
563
  // For now, create an empty spreadsheet
531
564
  const name = options?.name || `Imported_${Date.now()}`
@@ -537,6 +570,4 @@ export function createXlsxProvider(config: ProviderConfig): SpreadsheetProvider
537
570
  /**
538
571
  * XLSX provider definition
539
572
  */
540
- export const xlsxProvider = defineProvider(xlsxInfo, async (config) =>
541
- createXlsxProvider(config)
542
- )
573
+ export const xlsxProvider = defineProvider(xlsxInfo, async (config) => createXlsxProvider(config))