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.
- package/CHANGELOG.md +17 -0
- package/README.md +2 -0
- package/dist/client.d.ts +109 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +69 -0
- package/dist/client.js.map +1 -0
- package/dist/define.d.ts +2 -2
- package/dist/define.d.ts.map +1 -1
- package/dist/define.js +22 -20
- package/dist/define.js.map +1 -1
- package/dist/function-ref.d.ts +229 -0
- package/dist/function-ref.d.ts.map +1 -0
- package/dist/function-ref.js +28 -0
- package/dist/function-ref.js.map +1 -0
- package/dist/function-sugar.d.ts +57 -0
- package/dist/function-sugar.d.ts.map +1 -0
- package/dist/function-sugar.js +79 -0
- package/dist/function-sugar.js.map +1 -0
- package/dist/index.d.ts +10 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -4
- package/dist/index.js.map +1 -1
- package/dist/providers/analytics/mixpanel.d.ts.map +1 -1
- package/dist/providers/analytics/mixpanel.js +21 -18
- package/dist/providers/analytics/mixpanel.js.map +1 -1
- package/dist/providers/calendar/cal-com.d.ts.map +1 -1
- package/dist/providers/calendar/cal-com.js +10 -10
- package/dist/providers/calendar/cal-com.js.map +1 -1
- package/dist/providers/calendar/google-calendar.d.ts.map +1 -1
- package/dist/providers/calendar/google-calendar.js +4 -4
- package/dist/providers/calendar/google-calendar.js.map +1 -1
- package/dist/providers/crm/hubspot.d.ts.map +1 -1
- package/dist/providers/crm/hubspot.js +107 -85
- package/dist/providers/crm/hubspot.js.map +1 -1
- package/dist/providers/development/github.d.ts.map +1 -1
- package/dist/providers/development/github.js +40 -43
- package/dist/providers/development/github.js.map +1 -1
- package/dist/providers/ecommerce/shopify.d.ts.map +1 -1
- package/dist/providers/ecommerce/shopify.js +79 -62
- package/dist/providers/ecommerce/shopify.js.map +1 -1
- package/dist/providers/email/resend.d.ts.map +1 -1
- package/dist/providers/email/resend.js +20 -16
- package/dist/providers/email/resend.js.map +1 -1
- package/dist/providers/email/sendgrid.d.ts.map +1 -1
- package/dist/providers/email/sendgrid.js +12 -9
- package/dist/providers/email/sendgrid.js.map +1 -1
- package/dist/providers/finance/stripe.d.ts.map +1 -1
- package/dist/providers/finance/stripe.js +44 -42
- package/dist/providers/finance/stripe.js.map +1 -1
- package/dist/providers/forms/typeform.d.ts.map +1 -1
- package/dist/providers/forms/typeform.js +68 -58
- package/dist/providers/forms/typeform.js.map +1 -1
- package/dist/providers/knowledge/notion.d.ts.map +1 -1
- package/dist/providers/knowledge/notion.js +75 -41
- package/dist/providers/knowledge/notion.js.map +1 -1
- package/dist/providers/marketing/mailchimp.d.ts.map +1 -1
- package/dist/providers/marketing/mailchimp.js +74 -61
- package/dist/providers/marketing/mailchimp.js.map +1 -1
- package/dist/providers/media/cloudinary.d.ts.map +1 -1
- package/dist/providers/media/cloudinary.js +30 -28
- package/dist/providers/media/cloudinary.js.map +1 -1
- package/dist/providers/messaging/slack.d.ts.map +1 -1
- package/dist/providers/messaging/slack.js +75 -58
- package/dist/providers/messaging/slack.js.map +1 -1
- package/dist/providers/messaging/twilio-sms.d.ts.map +1 -1
- package/dist/providers/messaging/twilio-sms.js +33 -15
- package/dist/providers/messaging/twilio-sms.js.map +1 -1
- package/dist/providers/project-management/linear.d.ts.map +1 -1
- package/dist/providers/project-management/linear.js +31 -27
- package/dist/providers/project-management/linear.js.map +1 -1
- package/dist/providers/spreadsheet/google-sheets.d.ts.map +1 -1
- package/dist/providers/spreadsheet/google-sheets.js +21 -18
- package/dist/providers/spreadsheet/google-sheets.js.map +1 -1
- package/dist/providers/spreadsheet/xlsx.d.ts.map +1 -1
- package/dist/providers/spreadsheet/xlsx.js +4 -4
- package/dist/providers/spreadsheet/xlsx.js.map +1 -1
- package/dist/providers/storage/index.js +1 -0
- package/dist/providers/storage/index.js.map +1 -1
- package/dist/providers/storage/s3.d.ts.map +1 -1
- package/dist/providers/storage/s3.js +36 -27
- package/dist/providers/storage/s3.js.map +1 -1
- package/dist/providers/support/zendesk.d.ts.map +1 -1
- package/dist/providers/support/zendesk.js +24 -25
- package/dist/providers/support/zendesk.js.map +1 -1
- package/dist/providers/tasks/todoist.d.ts.map +1 -1
- package/dist/providers/tasks/todoist.js +18 -18
- package/dist/providers/tasks/todoist.js.map +1 -1
- package/dist/providers/video-conferencing/google-meet.d.ts.map +1 -1
- package/dist/providers/video-conferencing/google-meet.js +11 -11
- package/dist/providers/video-conferencing/google-meet.js.map +1 -1
- package/dist/providers/video-conferencing/jitsi.js +14 -14
- package/dist/providers/video-conferencing/jitsi.js.map +1 -1
- package/dist/providers/video-conferencing/teams.d.ts.map +1 -1
- package/dist/providers/video-conferencing/teams.js +9 -7
- package/dist/providers/video-conferencing/teams.js.map +1 -1
- package/dist/providers/video-conferencing/zoom.d.ts.map +1 -1
- package/dist/providers/video-conferencing/zoom.js +26 -24
- package/dist/providers/video-conferencing/zoom.js.map +1 -1
- package/dist/tools/data.d.ts.map +1 -1
- package/dist/tools/data.js +5 -12
- package/dist/tools/data.js.map +1 -1
- package/dist/tools/index.d.ts +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +1 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/system.d.ts +289 -0
- package/dist/tools/system.d.ts.map +1 -0
- package/dist/tools/system.js +752 -0
- package/dist/tools/system.js.map +1 -0
- package/dist/tools/web.d.ts.map +1 -1
- package/dist/tools/web.js +22 -10
- package/dist/tools/web.js.map +1 -1
- package/dist/track-record.d.ts +101 -0
- package/dist/track-record.d.ts.map +1 -0
- package/dist/track-record.js +17 -0
- package/dist/track-record.js.map +1 -0
- package/dist/types.d.ts +210 -9
- package/dist/types.d.ts.map +1 -1
- package/dist/verb-registration.d.ts +122 -0
- package/dist/verb-registration.d.ts.map +1 -0
- package/dist/verb-registration.js +176 -0
- package/dist/verb-registration.js.map +1 -0
- package/dist/worker.d.ts +93 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +315 -0
- package/dist/worker.js.map +1 -0
- package/dist/wrap.d.ts +89 -0
- package/dist/wrap.d.ts.map +1 -0
- package/dist/wrap.js +225 -0
- package/dist/wrap.js.map +1 -0
- package/package.json +21 -4
- package/src/client.ts +136 -0
- package/src/define.ts +31 -37
- package/src/function-ref.ts +264 -0
- package/src/function-sugar.ts +134 -0
- package/src/index.ts +132 -10
- package/src/providers/analytics/mixpanel.ts +19 -18
- package/src/providers/calendar/cal-com.ts +29 -18
- package/src/providers/calendar/google-calendar.ts +20 -14
- package/src/providers/crm/hubspot.ts +225 -99
- package/src/providers/development/github.ts +206 -135
- package/src/providers/ecommerce/shopify.ts +250 -89
- package/src/providers/email/resend.ts +101 -28
- package/src/providers/email/sendgrid.ts +12 -9
- package/src/providers/finance/stripe.ts +128 -49
- package/src/providers/forms/typeform.ts +74 -58
- package/src/providers/knowledge/notion.ts +340 -88
- package/src/providers/marketing/mailchimp.ts +86 -70
- package/src/providers/media/cloudinary.ts +99 -41
- package/src/providers/messaging/slack.ts +283 -85
- package/src/providers/messaging/twilio-sms.ts +35 -15
- package/src/providers/project-management/linear.ts +143 -55
- package/src/providers/spreadsheet/google-sheets.ts +222 -56
- package/src/providers/spreadsheet/xlsx.ts +47 -16
- package/src/providers/storage/s3.ts +119 -47
- package/src/providers/support/zendesk.ts +196 -46
- package/src/providers/tasks/todoist.ts +20 -26
- package/src/providers/video-conferencing/google-meet.ts +17 -20
- package/src/providers/video-conferencing/jitsi.ts +14 -14
- package/src/providers/video-conferencing/teams.ts +14 -13
- package/src/providers/video-conferencing/zoom.ts +54 -49
- package/src/tools/data.ts +6 -16
- package/src/tools/index.ts +1 -0
- package/src/tools/system.ts +887 -0
- package/src/tools/web.ts +22 -10
- package/src/track-record.ts +106 -0
- package/src/types.ts +241 -13
- package/src/verb-registration.ts +197 -0
- package/src/worker.ts +370 -0
- package/src/wrap.ts +260 -0
- package/test/client.test.ts +146 -0
- package/test/communication-tools-extended.test.ts +734 -0
- package/test/data-tools-extended.test.ts +743 -0
- package/test/define-extended.test.ts +819 -0
- package/test/define.test.ts +150 -41
- package/test/entities.test.ts +623 -0
- package/test/extended-entities.test.ts +1228 -0
- package/test/provider-implementations.test.ts +725 -0
- package/test/provider-registry-extended.test.ts +583 -0
- package/test/providers/google-sheets.test.ts +851 -0
- package/test/providers/helpers.ts +554 -0
- package/test/providers/hubspot.test.ts +576 -0
- package/test/providers/slack.test.ts +932 -0
- package/test/providers/stripe.test.ts +701 -0
- package/test/providers.test.ts +578 -0
- package/test/system-tools-extended.test.ts +632 -0
- package/test/system.test.ts +673 -0
- package/test/tools.test.ts +15 -11
- package/test/types.test.ts +402 -0
- package/test/verb-registration.test.ts +395 -0
- package/test/web-tools.test.ts +553 -0
- package/test/worker-extended.test.ts +699 -0
- package/test/worker.test.ts +576 -0
- package/test/wrap.test.ts +366 -0
- package/tsconfig.json +3 -13
- package/vitest.config.ts +37 -0
- package/wrangler.jsonc +9 -0
- package/.turbo/turbo-build.log +0 -5
- package/dist/providers/voice/vapi.d.ts +0 -27
- package/dist/providers/voice/vapi.d.ts.map +0 -1
- package/dist/providers/voice/vapi.js +0 -440
- package/dist/providers/voice/vapi.js.map +0 -1
- package/src/define.js +0 -267
- package/src/entities/advertising.js +0 -999
- package/src/entities/ai.js +0 -756
- package/src/entities/analytics.js +0 -1588
- package/src/entities/automation.js +0 -601
- package/src/entities/communication.js +0 -1150
- package/src/entities/crm.js +0 -1386
- package/src/entities/design.js +0 -546
- package/src/entities/development.js +0 -2212
- package/src/entities/document.js +0 -874
- package/src/entities/ecommerce.js +0 -1429
- package/src/entities/experiment.js +0 -1039
- package/src/entities/finance.js +0 -3478
- package/src/entities/forms.js +0 -1892
- package/src/entities/hr.js +0 -661
- package/src/entities/identity.js +0 -997
- package/src/entities/index.js +0 -282
- package/src/entities/infrastructure.js +0 -1153
- package/src/entities/knowledge.js +0 -1438
- package/src/entities/marketing.js +0 -1610
- package/src/entities/media.js +0 -1634
- package/src/entities/notification.js +0 -1199
- package/src/entities/presentation.js +0 -1274
- package/src/entities/productivity.js +0 -1317
- package/src/entities/project-management.js +0 -1136
- package/src/entities/recruiting.js +0 -736
- package/src/entities/shipping.js +0 -509
- package/src/entities/signature.js +0 -1102
- package/src/entities/site.js +0 -222
- package/src/entities/spreadsheet.js +0 -1341
- package/src/entities/storage.js +0 -1198
- package/src/entities/support.js +0 -1166
- package/src/entities/video-conferencing.js +0 -1750
- package/src/entities/video.js +0 -950
- package/src/entities.js +0 -1663
- package/src/index.js +0 -74
- package/src/providers/analytics/index.js +0 -17
- package/src/providers/analytics/mixpanel.js +0 -255
- package/src/providers/calendar/cal-com.js +0 -303
- package/src/providers/calendar/google-calendar.js +0 -335
- package/src/providers/calendar/index.js +0 -20
- package/src/providers/crm/hubspot.js +0 -566
- package/src/providers/crm/index.js +0 -17
- package/src/providers/development/github.js +0 -472
- package/src/providers/development/index.js +0 -17
- package/src/providers/ecommerce/index.js +0 -17
- package/src/providers/ecommerce/shopify.js +0 -378
- package/src/providers/email/index.js +0 -20
- package/src/providers/email/resend.js +0 -258
- package/src/providers/email/sendgrid.js +0 -161
- package/src/providers/finance/index.js +0 -17
- package/src/providers/finance/stripe.js +0 -549
- package/src/providers/forms/index.js +0 -17
- package/src/providers/forms/typeform.js +0 -500
- package/src/providers/index.js +0 -123
- package/src/providers/knowledge/index.js +0 -17
- package/src/providers/knowledge/notion.js +0 -389
- package/src/providers/marketing/index.js +0 -17
- package/src/providers/marketing/mailchimp.js +0 -443
- package/src/providers/media/cloudinary.js +0 -318
- package/src/providers/media/index.js +0 -17
- package/src/providers/messaging/index.js +0 -20
- package/src/providers/messaging/slack.js +0 -393
- package/src/providers/messaging/twilio-sms.js +0 -249
- package/src/providers/project-management/index.js +0 -17
- package/src/providers/project-management/linear.js +0 -575
- package/src/providers/registry.js +0 -86
- package/src/providers/spreadsheet/google-sheets.js +0 -375
- package/src/providers/spreadsheet/index.js +0 -20
- package/src/providers/spreadsheet/xlsx.js +0 -423
- package/src/providers/storage/index.js +0 -24
- package/src/providers/storage/s3.js +0 -419
- package/src/providers/support/index.js +0 -17
- package/src/providers/support/zendesk.js +0 -373
- package/src/providers/tasks/index.js +0 -17
- package/src/providers/tasks/todoist.js +0 -286
- package/src/providers/types.js +0 -9
- package/src/providers/video-conferencing/google-meet.js +0 -286
- package/src/providers/video-conferencing/index.js +0 -31
- package/src/providers/video-conferencing/jitsi.js +0 -254
- package/src/providers/video-conferencing/teams.js +0 -270
- package/src/providers/video-conferencing/zoom.js +0 -332
- package/src/registry.js +0 -128
- package/src/tools/communication.js +0 -184
- package/src/tools/data.js +0 -205
- package/src/tools/index.js +0 -11
- package/src/tools/web.js +0 -137
- package/src/types.js +0 -10
- package/test/define.test.js +0 -306
- package/test/registry.test.js +0 -357
- package/test/tools.test.js +0 -363
|
@@ -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<
|
|
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
|
|
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(
|
|
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'${
|
|
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(
|
|
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:
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
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(
|
|
311
|
+
const spreadsheet = await sheetsApi<GoogleSpreadsheet>(
|
|
312
|
+
`/${spreadsheetId}?includeGridData=true`
|
|
313
|
+
)
|
|
181
314
|
|
|
182
|
-
const sheet =
|
|
183
|
-
|
|
184
|
-
|
|
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
|
-
|
|
212
|
-
|
|
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(
|
|
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(
|
|
379
|
+
const data = await sheetsApi<GoogleBatchUpdateResponse>(
|
|
380
|
+
`/${spreadsheetId}:batchUpdate`,
|
|
381
|
+
'POST',
|
|
382
|
+
body
|
|
383
|
+
)
|
|
238
384
|
|
|
239
|
-
const reply = data.replies[0]
|
|
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
|
|
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(
|
|
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
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
|
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(
|
|
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(
|
|
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:
|
|
593
|
+
function mapSpreadsheet(data: GoogleSpreadsheet): SpreadsheetData {
|
|
428
594
|
return {
|
|
429
595
|
id: data.spreadsheetId,
|
|
430
596
|
name: data.properties.title,
|
|
431
|
-
sheets:
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
modifiedAt
|
|
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): {
|
|
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
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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))
|