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.
- package/CHANGELOG.md +9 -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 +21 -11
- 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 +31 -14
- package/src/client.ts +136 -0
- package/src/define.ts +30 -24
- 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 -4
- package/LICENSE +0 -21
- 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 -259
- 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
|
@@ -23,6 +23,224 @@ import { defineProvider } from '../registry.js'
|
|
|
23
23
|
const NOTION_API_URL = 'https://api.notion.com/v1'
|
|
24
24
|
const NOTION_VERSION = '2022-06-28'
|
|
25
25
|
|
|
26
|
+
// =============================================================================
|
|
27
|
+
// Notion API Types
|
|
28
|
+
// =============================================================================
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Notion rich text object
|
|
32
|
+
*/
|
|
33
|
+
interface NotionRichText {
|
|
34
|
+
type: 'text' | 'mention' | 'equation'
|
|
35
|
+
text?: {
|
|
36
|
+
content: string
|
|
37
|
+
link?: { url: string } | null
|
|
38
|
+
}
|
|
39
|
+
plain_text: string
|
|
40
|
+
annotations?: {
|
|
41
|
+
bold: boolean
|
|
42
|
+
italic: boolean
|
|
43
|
+
strikethrough: boolean
|
|
44
|
+
underline: boolean
|
|
45
|
+
code: boolean
|
|
46
|
+
color: string
|
|
47
|
+
}
|
|
48
|
+
href?: string | null
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Notion user reference
|
|
53
|
+
*/
|
|
54
|
+
interface NotionUserReference {
|
|
55
|
+
id: string
|
|
56
|
+
object?: 'user'
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Notion icon object
|
|
61
|
+
*/
|
|
62
|
+
interface NotionIcon {
|
|
63
|
+
type: 'emoji' | 'external' | 'file'
|
|
64
|
+
emoji?: string
|
|
65
|
+
external?: { url: string }
|
|
66
|
+
file?: { url: string; expiry_time?: string }
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Notion cover object
|
|
71
|
+
*/
|
|
72
|
+
interface NotionCover {
|
|
73
|
+
type: 'external' | 'file'
|
|
74
|
+
external?: { url: string }
|
|
75
|
+
file?: { url: string; expiry_time?: string }
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Notion parent object
|
|
80
|
+
*/
|
|
81
|
+
interface NotionParent {
|
|
82
|
+
type: 'page_id' | 'database_id' | 'workspace' | 'block_id'
|
|
83
|
+
page_id?: string
|
|
84
|
+
database_id?: string
|
|
85
|
+
workspace?: boolean
|
|
86
|
+
block_id?: string
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Notion property value types
|
|
91
|
+
*/
|
|
92
|
+
interface NotionTitleProperty {
|
|
93
|
+
type: 'title'
|
|
94
|
+
title: NotionRichText[]
|
|
95
|
+
id: string
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
interface NotionRichTextProperty {
|
|
99
|
+
type: 'rich_text'
|
|
100
|
+
rich_text: NotionRichText[]
|
|
101
|
+
id: string
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
interface NotionProperty {
|
|
105
|
+
type: string
|
|
106
|
+
id: string
|
|
107
|
+
title?: NotionRichText[]
|
|
108
|
+
rich_text?: NotionRichText[]
|
|
109
|
+
[key: string]: unknown
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Notion page object from API
|
|
114
|
+
*/
|
|
115
|
+
interface NotionPage {
|
|
116
|
+
object: 'page'
|
|
117
|
+
id: string
|
|
118
|
+
created_time: string
|
|
119
|
+
last_edited_time: string
|
|
120
|
+
created_by: NotionUserReference
|
|
121
|
+
last_edited_by: NotionUserReference
|
|
122
|
+
cover: NotionCover | null
|
|
123
|
+
icon: NotionIcon | null
|
|
124
|
+
parent: NotionParent
|
|
125
|
+
archived: boolean
|
|
126
|
+
in_trash: boolean
|
|
127
|
+
properties: Record<string, NotionProperty>
|
|
128
|
+
url: string
|
|
129
|
+
public_url?: string | null
|
|
130
|
+
child_page?: { title: string }
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Notion database object from API
|
|
135
|
+
*/
|
|
136
|
+
interface NotionDatabase {
|
|
137
|
+
object: 'database'
|
|
138
|
+
id: string
|
|
139
|
+
created_time: string
|
|
140
|
+
last_edited_time: string
|
|
141
|
+
created_by: NotionUserReference
|
|
142
|
+
last_edited_by: NotionUserReference
|
|
143
|
+
title: NotionRichText[]
|
|
144
|
+
description: NotionRichText[]
|
|
145
|
+
icon: NotionIcon | null
|
|
146
|
+
cover: NotionCover | null
|
|
147
|
+
parent: NotionParent
|
|
148
|
+
url: string
|
|
149
|
+
public_url?: string | null
|
|
150
|
+
archived: boolean
|
|
151
|
+
in_trash: boolean
|
|
152
|
+
is_inline: boolean
|
|
153
|
+
properties: Record<string, NotionProperty>
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Notion API error response
|
|
158
|
+
*/
|
|
159
|
+
interface NotionErrorResponse {
|
|
160
|
+
object: 'error'
|
|
161
|
+
status: number
|
|
162
|
+
code: string
|
|
163
|
+
message: string
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Notion paginated response
|
|
168
|
+
*/
|
|
169
|
+
interface NotionPaginatedResponse<T> {
|
|
170
|
+
object: 'list'
|
|
171
|
+
results: T[]
|
|
172
|
+
next_cursor: string | null
|
|
173
|
+
has_more: boolean
|
|
174
|
+
type?: string
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Request body for creating a page
|
|
179
|
+
*/
|
|
180
|
+
interface NotionCreatePageBody {
|
|
181
|
+
parent: { page_id: string } | { database_id: string }
|
|
182
|
+
properties: {
|
|
183
|
+
title: Array<{ text: { content: string } }>
|
|
184
|
+
}
|
|
185
|
+
icon?: { emoji: string }
|
|
186
|
+
cover?: { external: { url: string } }
|
|
187
|
+
children?: NotionBlock[]
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Notion block object
|
|
192
|
+
*/
|
|
193
|
+
interface NotionBlock {
|
|
194
|
+
object: 'block'
|
|
195
|
+
type: string
|
|
196
|
+
paragraph?: {
|
|
197
|
+
rich_text: Array<{
|
|
198
|
+
type: 'text'
|
|
199
|
+
text: { content: string }
|
|
200
|
+
}>
|
|
201
|
+
}
|
|
202
|
+
[key: string]: unknown
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Request body for database query
|
|
207
|
+
*/
|
|
208
|
+
interface NotionDatabaseQueryBody {
|
|
209
|
+
page_size?: number
|
|
210
|
+
start_cursor?: string
|
|
211
|
+
filter?: Record<string, unknown>
|
|
212
|
+
sorts?: Array<Record<string, unknown>>
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Request body for search
|
|
217
|
+
*/
|
|
218
|
+
interface NotionSearchBody {
|
|
219
|
+
query?: string
|
|
220
|
+
page_size?: number
|
|
221
|
+
start_cursor?: string
|
|
222
|
+
filter?: {
|
|
223
|
+
property: 'object'
|
|
224
|
+
value: 'page' | 'database'
|
|
225
|
+
}
|
|
226
|
+
sort?: {
|
|
227
|
+
direction: 'ascending' | 'descending'
|
|
228
|
+
timestamp: 'last_edited_time'
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Request body for updating a page
|
|
234
|
+
*/
|
|
235
|
+
interface NotionUpdatePageBody {
|
|
236
|
+
properties: {
|
|
237
|
+
title?: Array<{ text: { content: string } }>
|
|
238
|
+
}
|
|
239
|
+
icon?: { emoji: string } | null
|
|
240
|
+
cover?: { external: { url: string } } | null
|
|
241
|
+
archived?: boolean
|
|
242
|
+
}
|
|
243
|
+
|
|
26
244
|
/**
|
|
27
245
|
* Notion provider info
|
|
28
246
|
*/
|
|
@@ -48,16 +266,13 @@ export function createNotionProvider(config: ProviderConfig): KnowledgeProvider
|
|
|
48
266
|
/**
|
|
49
267
|
* Make authenticated request to Notion API
|
|
50
268
|
*/
|
|
51
|
-
async function notionRequest(
|
|
52
|
-
endpoint: string,
|
|
53
|
-
options: RequestInit = {}
|
|
54
|
-
): Promise<Response> {
|
|
269
|
+
async function notionRequest(endpoint: string, options: RequestInit = {}): Promise<Response> {
|
|
55
270
|
const url = endpoint.startsWith('http') ? endpoint : `${NOTION_API_URL}${endpoint}`
|
|
56
271
|
|
|
57
272
|
return fetch(url, {
|
|
58
273
|
...options,
|
|
59
274
|
headers: {
|
|
60
|
-
|
|
275
|
+
Authorization: `Bearer ${integrationToken}`,
|
|
61
276
|
'Notion-Version': NOTION_VERSION,
|
|
62
277
|
'Content-Type': 'application/json',
|
|
63
278
|
...options.headers,
|
|
@@ -68,19 +283,24 @@ export function createNotionProvider(config: ProviderConfig): KnowledgeProvider
|
|
|
68
283
|
/**
|
|
69
284
|
* Convert Notion page to PageData
|
|
70
285
|
*/
|
|
71
|
-
function convertNotionPage(notionPage:
|
|
286
|
+
function convertNotionPage(notionPage: NotionPage): PageData {
|
|
72
287
|
const title = extractTitle(notionPage)
|
|
73
288
|
const parentId = notionPage.parent?.page_id || notionPage.parent?.database_id || undefined
|
|
289
|
+
const icon = notionPage.icon?.emoji || notionPage.icon?.external?.url
|
|
290
|
+
const cover = notionPage.cover?.external?.url || notionPage.cover?.file?.url
|
|
74
291
|
|
|
75
292
|
return {
|
|
76
293
|
id: notionPage.id,
|
|
77
294
|
title,
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
295
|
+
...(parentId !== undefined && { parentId }),
|
|
296
|
+
...(notionPage.parent?.workspace
|
|
297
|
+
? { spaceId: 'workspace' }
|
|
298
|
+
: parentId !== undefined
|
|
299
|
+
? { spaceId: parentId }
|
|
300
|
+
: {}),
|
|
81
301
|
url: notionPage.url,
|
|
82
|
-
icon
|
|
83
|
-
cover
|
|
302
|
+
...(icon !== undefined && { icon }),
|
|
303
|
+
...(cover !== undefined && { cover }),
|
|
84
304
|
createdAt: new Date(notionPage.created_time),
|
|
85
305
|
updatedAt: new Date(notionPage.last_edited_time),
|
|
86
306
|
createdBy: notionPage.created_by?.id,
|
|
@@ -91,20 +311,28 @@ export function createNotionProvider(config: ProviderConfig): KnowledgeProvider
|
|
|
91
311
|
/**
|
|
92
312
|
* Extract title from Notion page properties
|
|
93
313
|
*/
|
|
94
|
-
function extractTitle(notionPage:
|
|
95
|
-
//
|
|
314
|
+
function extractTitle(notionPage: NotionPage | NotionDatabase): string {
|
|
315
|
+
// For databases, title is a top-level property
|
|
316
|
+
if ('title' in notionPage && Array.isArray(notionPage.title)) {
|
|
317
|
+
const dbPage = notionPage as NotionDatabase
|
|
318
|
+
if (dbPage.title.length > 0) {
|
|
319
|
+
return dbPage.title.map((t) => t.plain_text).join('')
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
// Check for title property in page properties
|
|
96
324
|
const properties = notionPage.properties || {}
|
|
97
325
|
|
|
98
326
|
// Look for title or Name property
|
|
99
|
-
for (const [
|
|
100
|
-
const prop = value as
|
|
101
|
-
if (prop.type === 'title' && prop.title
|
|
102
|
-
return prop.title.map((t
|
|
327
|
+
for (const [_key, value] of Object.entries(properties)) {
|
|
328
|
+
const prop = value as NotionProperty
|
|
329
|
+
if (prop.type === 'title' && prop.title && prop.title.length > 0) {
|
|
330
|
+
return prop.title.map((t) => t.plain_text).join('')
|
|
103
331
|
}
|
|
104
332
|
}
|
|
105
333
|
|
|
106
334
|
// Fallback to page title in child_page parent
|
|
107
|
-
if (notionPage.child_page?.title) {
|
|
335
|
+
if ('child_page' in notionPage && notionPage.child_page?.title) {
|
|
108
336
|
return notionPage.child_page.title
|
|
109
337
|
}
|
|
110
338
|
|
|
@@ -114,7 +342,7 @@ export function createNotionProvider(config: ProviderConfig): KnowledgeProvider
|
|
|
114
342
|
/**
|
|
115
343
|
* Build page properties for creation/update
|
|
116
344
|
*/
|
|
117
|
-
function buildPageProperties(title: string):
|
|
345
|
+
function buildPageProperties(title: string): { title: Array<{ text: { content: string } }> } {
|
|
118
346
|
return {
|
|
119
347
|
title: [
|
|
120
348
|
{
|
|
@@ -129,7 +357,10 @@ export function createNotionProvider(config: ProviderConfig): KnowledgeProvider
|
|
|
129
357
|
/**
|
|
130
358
|
* Build parent object for page creation
|
|
131
359
|
*/
|
|
132
|
-
function buildParent(
|
|
360
|
+
function buildParent(
|
|
361
|
+
parentId?: string,
|
|
362
|
+
spaceId?: string
|
|
363
|
+
): { page_id: string } | { database_id: string } {
|
|
133
364
|
const targetParent = parentId || spaceId || defaultParentId || defaultDatabaseId
|
|
134
365
|
|
|
135
366
|
if (!targetParent) {
|
|
@@ -149,9 +380,9 @@ export function createNotionProvider(config: ProviderConfig): KnowledgeProvider
|
|
|
149
380
|
info: notionInfo,
|
|
150
381
|
|
|
151
382
|
async initialize(cfg: ProviderConfig): Promise<void> {
|
|
152
|
-
integrationToken = cfg
|
|
153
|
-
defaultParentId = cfg
|
|
154
|
-
defaultDatabaseId = cfg
|
|
383
|
+
integrationToken = cfg['integrationToken'] as string
|
|
384
|
+
defaultParentId = cfg['defaultParentId'] as string | undefined
|
|
385
|
+
defaultDatabaseId = cfg['defaultDatabaseId'] as string | undefined
|
|
155
386
|
|
|
156
387
|
if (!integrationToken) {
|
|
157
388
|
throw new Error('Notion integration token is required')
|
|
@@ -186,7 +417,7 @@ export function createNotionProvider(config: ProviderConfig): KnowledgeProvider
|
|
|
186
417
|
async createPage(page: CreatePageOptions): Promise<PageData> {
|
|
187
418
|
const parent = buildParent(page.parentId, page.spaceId)
|
|
188
419
|
|
|
189
|
-
const body:
|
|
420
|
+
const body: NotionCreatePageBody = {
|
|
190
421
|
parent,
|
|
191
422
|
properties: buildPageProperties(page.title),
|
|
192
423
|
}
|
|
@@ -224,17 +455,19 @@ export function createNotionProvider(config: ProviderConfig): KnowledgeProvider
|
|
|
224
455
|
})
|
|
225
456
|
|
|
226
457
|
if (!response.ok) {
|
|
227
|
-
const errorData = await response
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
)
|
|
458
|
+
const errorData = (await response
|
|
459
|
+
.json()
|
|
460
|
+
.catch(() => ({}))) as Partial<NotionErrorResponse>
|
|
461
|
+
throw new Error(`Failed to create page: ${errorData?.message || response.statusText}`)
|
|
231
462
|
}
|
|
232
463
|
|
|
233
|
-
const notionPage = await response.json() as
|
|
464
|
+
const notionPage = (await response.json()) as NotionPage
|
|
234
465
|
return convertNotionPage(notionPage)
|
|
235
466
|
} catch (error) {
|
|
236
467
|
throw new Error(
|
|
237
|
-
`Failed to create Notion page: ${
|
|
468
|
+
`Failed to create Notion page: ${
|
|
469
|
+
error instanceof Error ? error.message : 'Unknown error'
|
|
470
|
+
}`
|
|
238
471
|
)
|
|
239
472
|
}
|
|
240
473
|
},
|
|
@@ -248,16 +481,16 @@ export function createNotionProvider(config: ProviderConfig): KnowledgeProvider
|
|
|
248
481
|
}
|
|
249
482
|
|
|
250
483
|
if (!response.ok) {
|
|
251
|
-
const errorData = await response
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
)
|
|
484
|
+
const errorData = (await response
|
|
485
|
+
.json()
|
|
486
|
+
.catch(() => ({}))) as Partial<NotionErrorResponse>
|
|
487
|
+
throw new Error(`Failed to get page: ${errorData?.message || response.statusText}`)
|
|
255
488
|
}
|
|
256
489
|
|
|
257
|
-
const notionPage = await response.json() as
|
|
490
|
+
const notionPage = (await response.json()) as NotionPage
|
|
258
491
|
return convertNotionPage(notionPage)
|
|
259
492
|
} catch (error) {
|
|
260
|
-
if (
|
|
493
|
+
if (error instanceof Error && error.message.includes('404')) {
|
|
261
494
|
return null
|
|
262
495
|
}
|
|
263
496
|
throw new Error(
|
|
@@ -267,7 +500,7 @@ export function createNotionProvider(config: ProviderConfig): KnowledgeProvider
|
|
|
267
500
|
},
|
|
268
501
|
|
|
269
502
|
async updatePage(pageId: string, updates: Partial<CreatePageOptions>): Promise<PageData> {
|
|
270
|
-
const body:
|
|
503
|
+
const body: NotionUpdatePageBody = {
|
|
271
504
|
properties: {},
|
|
272
505
|
}
|
|
273
506
|
|
|
@@ -290,17 +523,19 @@ export function createNotionProvider(config: ProviderConfig): KnowledgeProvider
|
|
|
290
523
|
})
|
|
291
524
|
|
|
292
525
|
if (!response.ok) {
|
|
293
|
-
const errorData = await response
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
)
|
|
526
|
+
const errorData = (await response
|
|
527
|
+
.json()
|
|
528
|
+
.catch(() => ({}))) as Partial<NotionErrorResponse>
|
|
529
|
+
throw new Error(`Failed to update page: ${errorData?.message || response.statusText}`)
|
|
297
530
|
}
|
|
298
531
|
|
|
299
|
-
const notionPage = await response.json() as
|
|
532
|
+
const notionPage = (await response.json()) as NotionPage
|
|
300
533
|
return convertNotionPage(notionPage)
|
|
301
534
|
} catch (error) {
|
|
302
535
|
throw new Error(
|
|
303
|
-
`Failed to update Notion page: ${
|
|
536
|
+
`Failed to update Notion page: ${
|
|
537
|
+
error instanceof Error ? error.message : 'Unknown error'
|
|
538
|
+
}`
|
|
304
539
|
)
|
|
305
540
|
}
|
|
306
541
|
},
|
|
@@ -313,16 +548,18 @@ export function createNotionProvider(config: ProviderConfig): KnowledgeProvider
|
|
|
313
548
|
})
|
|
314
549
|
|
|
315
550
|
if (!response.ok) {
|
|
316
|
-
const errorData = await response
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
)
|
|
551
|
+
const errorData = (await response
|
|
552
|
+
.json()
|
|
553
|
+
.catch(() => ({}))) as Partial<NotionErrorResponse>
|
|
554
|
+
throw new Error(`Failed to delete page: ${errorData?.message || response.statusText}`)
|
|
320
555
|
}
|
|
321
556
|
|
|
322
557
|
return true
|
|
323
558
|
} catch (error) {
|
|
324
559
|
throw new Error(
|
|
325
|
-
`Failed to delete Notion page: ${
|
|
560
|
+
`Failed to delete Notion page: ${
|
|
561
|
+
error instanceof Error ? error.message : 'Unknown error'
|
|
562
|
+
}`
|
|
326
563
|
)
|
|
327
564
|
}
|
|
328
565
|
},
|
|
@@ -332,11 +569,13 @@ export function createNotionProvider(config: ProviderConfig): KnowledgeProvider
|
|
|
332
569
|
const parentId = options?.parentId || options?.spaceId || defaultDatabaseId
|
|
333
570
|
|
|
334
571
|
if (!parentId) {
|
|
335
|
-
throw new Error(
|
|
572
|
+
throw new Error(
|
|
573
|
+
'Parent ID, space ID, or default database must be provided for listing pages'
|
|
574
|
+
)
|
|
336
575
|
}
|
|
337
576
|
|
|
338
577
|
try {
|
|
339
|
-
const body:
|
|
578
|
+
const body: NotionDatabaseQueryBody = {
|
|
340
579
|
page_size: options?.limit || 100,
|
|
341
580
|
}
|
|
342
581
|
|
|
@@ -350,19 +589,19 @@ export function createNotionProvider(config: ProviderConfig): KnowledgeProvider
|
|
|
350
589
|
})
|
|
351
590
|
|
|
352
591
|
if (!response.ok) {
|
|
353
|
-
const errorData = await response
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
)
|
|
592
|
+
const errorData = (await response
|
|
593
|
+
.json()
|
|
594
|
+
.catch(() => ({}))) as Partial<NotionErrorResponse>
|
|
595
|
+
throw new Error(`Failed to list pages: ${errorData?.message || response.statusText}`)
|
|
357
596
|
}
|
|
358
597
|
|
|
359
|
-
const data = await response.json() as
|
|
598
|
+
const data = (await response.json()) as NotionPaginatedResponse<NotionPage>
|
|
360
599
|
const pages = data.results.map(convertNotionPage)
|
|
361
600
|
|
|
362
601
|
return {
|
|
363
602
|
items: pages,
|
|
364
603
|
hasMore: data.has_more,
|
|
365
|
-
nextCursor: data.next_cursor
|
|
604
|
+
...(data.next_cursor !== null && { nextCursor: data.next_cursor }),
|
|
366
605
|
}
|
|
367
606
|
} catch (error) {
|
|
368
607
|
throw new Error(
|
|
@@ -371,9 +610,12 @@ export function createNotionProvider(config: ProviderConfig): KnowledgeProvider
|
|
|
371
610
|
}
|
|
372
611
|
},
|
|
373
612
|
|
|
374
|
-
async searchPages(
|
|
613
|
+
async searchPages(
|
|
614
|
+
query: string,
|
|
615
|
+
options?: PaginationOptions
|
|
616
|
+
): Promise<PaginatedResult<PageData>> {
|
|
375
617
|
try {
|
|
376
|
-
const body:
|
|
618
|
+
const body: NotionSearchBody = {
|
|
377
619
|
query,
|
|
378
620
|
page_size: options?.limit || 100,
|
|
379
621
|
filter: {
|
|
@@ -392,23 +634,25 @@ export function createNotionProvider(config: ProviderConfig): KnowledgeProvider
|
|
|
392
634
|
})
|
|
393
635
|
|
|
394
636
|
if (!response.ok) {
|
|
395
|
-
const errorData = await response
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
)
|
|
637
|
+
const errorData = (await response
|
|
638
|
+
.json()
|
|
639
|
+
.catch(() => ({}))) as Partial<NotionErrorResponse>
|
|
640
|
+
throw new Error(`Failed to search pages: ${errorData?.message || response.statusText}`)
|
|
399
641
|
}
|
|
400
642
|
|
|
401
|
-
const data = await response.json() as
|
|
643
|
+
const data = (await response.json()) as NotionPaginatedResponse<NotionPage>
|
|
402
644
|
const pages = data.results.map(convertNotionPage)
|
|
403
645
|
|
|
404
646
|
return {
|
|
405
647
|
items: pages,
|
|
406
648
|
hasMore: data.has_more,
|
|
407
|
-
nextCursor: data.next_cursor
|
|
649
|
+
...(data.next_cursor !== null && { nextCursor: data.next_cursor }),
|
|
408
650
|
}
|
|
409
651
|
} catch (error) {
|
|
410
652
|
throw new Error(
|
|
411
|
-
`Failed to search Notion pages: ${
|
|
653
|
+
`Failed to search Notion pages: ${
|
|
654
|
+
error instanceof Error ? error.message : 'Unknown error'
|
|
655
|
+
}`
|
|
412
656
|
)
|
|
413
657
|
}
|
|
414
658
|
},
|
|
@@ -416,7 +660,7 @@ export function createNotionProvider(config: ProviderConfig): KnowledgeProvider
|
|
|
416
660
|
async listSpaces(): Promise<SpaceData[]> {
|
|
417
661
|
try {
|
|
418
662
|
// List databases as "spaces"
|
|
419
|
-
const body = {
|
|
663
|
+
const body: NotionSearchBody = {
|
|
420
664
|
filter: {
|
|
421
665
|
property: 'object',
|
|
422
666
|
value: 'database',
|
|
@@ -430,24 +674,30 @@ export function createNotionProvider(config: ProviderConfig): KnowledgeProvider
|
|
|
430
674
|
})
|
|
431
675
|
|
|
432
676
|
if (!response.ok) {
|
|
433
|
-
const errorData = await response
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
)
|
|
677
|
+
const errorData = (await response
|
|
678
|
+
.json()
|
|
679
|
+
.catch(() => ({}))) as Partial<NotionErrorResponse>
|
|
680
|
+
throw new Error(`Failed to list spaces: ${errorData?.message || response.statusText}`)
|
|
437
681
|
}
|
|
438
682
|
|
|
439
|
-
const data = await response.json() as
|
|
440
|
-
|
|
441
|
-
return data.results.map((db
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
683
|
+
const data = (await response.json()) as NotionPaginatedResponse<NotionDatabase>
|
|
684
|
+
|
|
685
|
+
return data.results.map((db): SpaceData => {
|
|
686
|
+
const description = db.description?.[0]?.plain_text
|
|
687
|
+
const icon = db.icon?.emoji || db.icon?.external?.url
|
|
688
|
+
return {
|
|
689
|
+
id: db.id,
|
|
690
|
+
name: extractTitle(db),
|
|
691
|
+
...(description !== undefined && { description }),
|
|
692
|
+
...(icon !== undefined && { icon }),
|
|
693
|
+
url: db.url,
|
|
694
|
+
}
|
|
695
|
+
})
|
|
448
696
|
} catch (error) {
|
|
449
697
|
throw new Error(
|
|
450
|
-
`Failed to list Notion spaces: ${
|
|
698
|
+
`Failed to list Notion spaces: ${
|
|
699
|
+
error instanceof Error ? error.message : 'Unknown error'
|
|
700
|
+
}`
|
|
451
701
|
)
|
|
452
702
|
}
|
|
453
703
|
},
|
|
@@ -462,23 +712,25 @@ export function createNotionProvider(config: ProviderConfig): KnowledgeProvider
|
|
|
462
712
|
}
|
|
463
713
|
|
|
464
714
|
if (!response.ok) {
|
|
465
|
-
const errorData = await response
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
)
|
|
715
|
+
const errorData = (await response
|
|
716
|
+
.json()
|
|
717
|
+
.catch(() => ({}))) as Partial<NotionErrorResponse>
|
|
718
|
+
throw new Error(`Failed to get space: ${errorData?.message || response.statusText}`)
|
|
469
719
|
}
|
|
470
720
|
|
|
471
|
-
const db = await response.json() as
|
|
721
|
+
const db = (await response.json()) as NotionDatabase
|
|
722
|
+
const description = db.description?.[0]?.plain_text
|
|
723
|
+
const icon = db.icon?.emoji || db.icon?.external?.url
|
|
472
724
|
|
|
473
725
|
return {
|
|
474
726
|
id: db.id,
|
|
475
727
|
name: extractTitle(db),
|
|
476
|
-
description
|
|
477
|
-
icon
|
|
728
|
+
...(description !== undefined && { description }),
|
|
729
|
+
...(icon !== undefined && { icon }),
|
|
478
730
|
url: db.url,
|
|
479
731
|
}
|
|
480
732
|
} catch (error) {
|
|
481
|
-
if (
|
|
733
|
+
if (error instanceof Error && error.message.includes('404')) {
|
|
482
734
|
return null
|
|
483
735
|
}
|
|
484
736
|
throw new Error(
|