@databuddy/sdk 1.4.2 → 2.1.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.
@@ -0,0 +1,338 @@
1
+ /**
2
+ * Configuration options for the Databuddy SDK and <Databuddy /> component.
3
+ * All options are passed as data attributes to the injected script.
4
+ */
5
+ interface DatabuddyConfig {
6
+ /**
7
+ * Your Databuddy project client ID.
8
+ * If not provided, will automatically detect from NEXT_PUBLIC_DATABUDDY_CLIENT_ID environment variable.
9
+ * Get this from your Databuddy dashboard.
10
+ * Example: '3ed1fce1-5a56-4cbc-a917-66864f6d18e3'
11
+ */
12
+ clientId?: string;
13
+ /**
14
+ * (Advanced) Your Databuddy client secret for server-side operations.
15
+ * Not required for browser usage.
16
+ */
17
+ clientSecret?: string;
18
+ /**
19
+ * Custom API endpoint for event ingestion.
20
+ * Default: 'https://basket.databuddy.cc'
21
+ */
22
+ apiUrl?: string;
23
+ /**
24
+ * Custom script URL for the Databuddy browser bundle.
25
+ * Default: 'https://cdn.databuddy.cc/databuddy.js'
26
+ */
27
+ scriptUrl?: string;
28
+ /**
29
+ * SDK name for analytics (default: 'web').
30
+ * Only override if you are building a custom integration.
31
+ */
32
+ sdk?: string;
33
+ /**
34
+ * SDK version (defaults to package.json version).
35
+ * Only override for custom builds.
36
+ */
37
+ sdkVersion?: string;
38
+ /**
39
+ * Disable all tracking (default: false).
40
+ * If true, no events will be sent.
41
+ */
42
+ disabled?: boolean;
43
+ /**
44
+ * Wait for user profile before sending events (advanced, default: false).
45
+ */
46
+ waitForProfile?: boolean;
47
+ /**
48
+ * Automatically track screen/page views (default: true).
49
+ */
50
+ trackScreenViews?: boolean;
51
+ /**
52
+ * Track hash changes in the URL (default: false).
53
+ */
54
+ trackHashChanges?: boolean;
55
+ /**
56
+ * Track user sessions (default: true).
57
+ */
58
+ trackSessions?: boolean;
59
+ /**
60
+ * Track data-* attributes on elements (default: false).
61
+ */
62
+ trackAttributes?: boolean;
63
+ /**
64
+ * Track clicks on outgoing links (default: false).
65
+ */
66
+ trackOutgoingLinks?: boolean;
67
+ /**
68
+ * Track user interactions (default: false).
69
+ */
70
+ trackInteractions?: boolean;
71
+ /**
72
+ * Track user engagement metrics (default: false).
73
+ */
74
+ trackEngagement?: boolean;
75
+ /**
76
+ * Track scroll depth (default: false).
77
+ */
78
+ trackScrollDepth?: boolean;
79
+ /**
80
+ * Track exit intent (default: false).
81
+ */
82
+ trackExitIntent?: boolean;
83
+ /**
84
+ * Track bounce rate (default: false).
85
+ */
86
+ trackBounceRate?: boolean;
87
+ /**
88
+ * Track page performance metrics (default: true).
89
+ */
90
+ trackPerformance?: boolean;
91
+ /**
92
+ * Track Web Vitals metrics (default: false).
93
+ */
94
+ trackWebVitals?: boolean;
95
+ /**
96
+ * Track JavaScript errors (default: false).
97
+ */
98
+ trackErrors?: boolean;
99
+ /**
100
+ * Enable observability features (logging, error tracking, tracing) (default: false).
101
+ */
102
+ enableObservability?: boolean;
103
+ /**
104
+ * Service name for observability events.
105
+ */
106
+ observabilityService?: string;
107
+ /**
108
+ * Environment for observability events.
109
+ */
110
+ observabilityEnvironment?: string;
111
+ /**
112
+ * Service version for observability events.
113
+ */
114
+ observabilityVersion?: string;
115
+ /**
116
+ * Enable structured logging (default: false).
117
+ */
118
+ enableLogging?: boolean;
119
+ /**
120
+ * Enable distributed tracing (default: false).
121
+ */
122
+ enableTracing?: boolean;
123
+ /**
124
+ * Enable error tracking (default: false).
125
+ */
126
+ enableErrorTracking?: boolean;
127
+ /**
128
+ * Sampling rate for events (0.0 to 1.0, default: 1.0).
129
+ * Example: 0.5 = 50% of events sent.
130
+ */
131
+ samplingRate?: number;
132
+ /**
133
+ * Enable retries for failed requests (default: true).
134
+ */
135
+ enableRetries?: boolean;
136
+ /**
137
+ * Maximum number of retries for failed requests (default: 3).
138
+ * Only used if enableRetries is true.
139
+ */
140
+ maxRetries?: number;
141
+ /**
142
+ * Initial retry delay in milliseconds (default: 500).
143
+ * Only used if enableRetries is true.
144
+ */
145
+ initialRetryDelay?: number;
146
+ /**
147
+ * Enable event batching (default: false).
148
+ */
149
+ enableBatching?: boolean;
150
+ /**
151
+ * Number of events to batch before sending (default: 10).
152
+ * Only used if enableBatching is true.
153
+ * Min: 1, Max: 50
154
+ */
155
+ batchSize?: number;
156
+ /**
157
+ * Batch timeout in milliseconds (default: 2000).
158
+ * Only used if enableBatching is true.
159
+ * Min: 100, Max: 30000
160
+ */
161
+ batchTimeout?: number;
162
+ }
163
+ /**
164
+ * Base event properties that can be attached to any event
165
+ */
166
+ interface BaseEventProperties {
167
+ /** Page URL */
168
+ __path?: string;
169
+ /** Page title */
170
+ __title?: string;
171
+ /** Referrer URL */
172
+ __referrer?: string;
173
+ /** Event timestamp in milliseconds */
174
+ __timestamp_ms?: number;
175
+ /** Session ID */
176
+ sessionId?: string;
177
+ /** Session start time */
178
+ sessionStartTime?: number;
179
+ /** Page count in session */
180
+ page_count?: number;
181
+ /** Screen resolution */
182
+ screen_resolution?: string;
183
+ /** Viewport size */
184
+ viewport_size?: string;
185
+ /** User timezone */
186
+ timezone?: string;
187
+ /** User language */
188
+ language?: string;
189
+ /** UTM parameters */
190
+ utm_source?: string;
191
+ utm_medium?: string;
192
+ utm_campaign?: string;
193
+ utm_term?: string;
194
+ utm_content?: string;
195
+ }
196
+ /**
197
+ * Custom event properties that can be attached to any event
198
+ */
199
+ interface EventProperties extends BaseEventProperties {
200
+ /** Custom properties for the event */
201
+ [key: string]: string | number | boolean | null | undefined;
202
+ }
203
+ /**
204
+ * Pre-defined event types with their specific properties
205
+ */
206
+ interface EventTypeMap {
207
+ screen_view: {
208
+ time_on_page?: number;
209
+ scroll_depth?: number;
210
+ interaction_count?: number;
211
+ has_exit_intent?: boolean;
212
+ is_bounce?: 0 | 1;
213
+ };
214
+ page_exit: {
215
+ time_on_page: number;
216
+ scroll_depth: number;
217
+ interaction_count: number;
218
+ has_exit_intent: boolean;
219
+ page_count: number;
220
+ is_bounce: 0 | 1;
221
+ };
222
+ button_click: {
223
+ button_text?: string;
224
+ button_type?: string;
225
+ button_id?: string;
226
+ element_class?: string;
227
+ };
228
+ link_out: {
229
+ href: string;
230
+ text?: string;
231
+ target_domain?: string;
232
+ };
233
+ form_submit: {
234
+ form_id?: string;
235
+ form_name?: string;
236
+ form_type?: string;
237
+ success?: boolean;
238
+ };
239
+ web_vitals: {
240
+ fcp?: number;
241
+ lcp?: number;
242
+ cls?: string;
243
+ fid?: number;
244
+ ttfb?: number;
245
+ load_time?: number;
246
+ dom_ready_time?: number;
247
+ render_time?: number;
248
+ request_time?: number;
249
+ };
250
+ error: {
251
+ message: string;
252
+ filename?: string;
253
+ lineno?: number;
254
+ colno?: number;
255
+ stack?: string;
256
+ error_type?: string;
257
+ };
258
+ [eventName: string]: EventProperties;
259
+ }
260
+ /**
261
+ * Available event names
262
+ */
263
+ type EventName = keyof EventTypeMap;
264
+ /**
265
+ * Properties for a specific event type
266
+ */
267
+ type PropertiesForEvent<T extends EventName> = T extends keyof EventTypeMap ? EventTypeMap[T] & EventProperties : EventProperties;
268
+ /**
269
+ * Databuddy tracker instance interface
270
+ */
271
+ interface DatabuddyTracker {
272
+ /**
273
+ * Track a custom event
274
+ */
275
+ track<T extends EventName>(eventName: T, properties?: PropertiesForEvent<T>): Promise<void>;
276
+ /**
277
+ * Track a screen/page view
278
+ */
279
+ screenView(path?: string, properties?: EventProperties): void;
280
+ /**
281
+ * Set global properties that will be attached to all events
282
+ */
283
+ setGlobalProperties(properties: EventProperties): void;
284
+ /**
285
+ * Clear the current user session and generate new IDs
286
+ */
287
+ clear(): void;
288
+ /**
289
+ * Flush any queued events immediately
290
+ */
291
+ flush(): void;
292
+ /**
293
+ * Track a custom event with full type safety
294
+ */
295
+ trackCustomEvent(eventName: string, properties?: EventProperties): void;
296
+ }
297
+ /**
298
+ * Global window interface extensions
299
+ */
300
+ declare global {
301
+ interface Window {
302
+ databuddy?: DatabuddyTracker;
303
+ db?: {
304
+ track: DatabuddyTracker['track'];
305
+ screenView: DatabuddyTracker['screenView'];
306
+ clear: DatabuddyTracker['clear'];
307
+ flush: DatabuddyTracker['flush'];
308
+ setGlobalProperties: DatabuddyTracker['setGlobalProperties'];
309
+ trackCustomEvent: DatabuddyTracker['trackCustomEvent'];
310
+ };
311
+ }
312
+ }
313
+ /**
314
+ * Helper type for HTML data attributes for automatic tracking
315
+ */
316
+ interface DataAttributes {
317
+ /** Event name to track when element is clicked */
318
+ 'data-track': string;
319
+ /** Additional data attributes (converted to camelCase) */
320
+ [key: `data-${string}`]: string;
321
+ }
322
+ /**
323
+ * Utility types for creating typed event tracking functions
324
+ */
325
+ type TrackFunction = <T extends EventName>(eventName: T, properties?: PropertiesForEvent<T>) => Promise<void>;
326
+ type ScreenViewFunction = (path?: string, properties?: EventProperties) => void;
327
+ type SetGlobalPropertiesFunction = (properties: EventProperties) => void;
328
+
329
+ /**
330
+ * <Databuddy /> component for Next.js/React apps
331
+ * Injects the databuddy.js script with all config as data attributes
332
+ * Usage: <Databuddy clientId="..." trackScreenViews trackPerformance ... />
333
+ * Or simply: <Databuddy /> (auto-detects clientId from environment variables)
334
+ */
335
+ declare function Databuddy(props: DatabuddyConfig): null;
336
+
337
+ export { Databuddy as b };
338
+ export type { BaseEventProperties as B, DatabuddyConfig as D, EventProperties as E, PropertiesForEvent as P, ScreenViewFunction as S, TrackFunction as T, DatabuddyTracker as a, EventTypeMap as c, EventName as d, DataAttributes as e, SetGlobalPropertiesFunction as f };
@@ -0,0 +1,25 @@
1
+ const version = "2.0.0";
2
+
3
+ const INJECTED_SCRIPT_ATTRIBUTE = "data-databuddy-injected";
4
+ function isScriptInjected() {
5
+ return !!document.querySelector(`script[${INJECTED_SCRIPT_ATTRIBUTE}]`);
6
+ }
7
+ function createScript({
8
+ scriptUrl,
9
+ sdkVersion,
10
+ ...props
11
+ }) {
12
+ const script = document.createElement("script");
13
+ script.src = scriptUrl || "https://cdn.databuddy.cc/databuddy.js";
14
+ script.async = true;
15
+ script.crossOrigin = "anonymous";
16
+ script.setAttribute(INJECTED_SCRIPT_ATTRIBUTE, "true");
17
+ script.setAttribute("data-sdk-version", sdkVersion || version);
18
+ for (const [key, value] of Object.entries(props)) {
19
+ const dataKey = `data-${key.replace(/([A-Z])/g, "-$1").toLowerCase()}`;
20
+ script.setAttribute(dataKey, String(value));
21
+ }
22
+ return script;
23
+ }
24
+
25
+ export { createScript as c, isScriptInjected as i };
@@ -0,0 +1,182 @@
1
+ import * as vue from 'vue';
2
+
3
+ declare const Databuddy: vue.DefineComponent<{
4
+ clientId?: {
5
+ type: StringConstructor;
6
+ required: false;
7
+ } | undefined;
8
+ clientSecret?: {
9
+ type: StringConstructor;
10
+ required: false;
11
+ } | undefined;
12
+ apiUrl?: {
13
+ type: StringConstructor;
14
+ required: false;
15
+ } | undefined;
16
+ scriptUrl?: {
17
+ type: StringConstructor;
18
+ required: false;
19
+ } | undefined;
20
+ sdk?: {
21
+ type: StringConstructor;
22
+ required: false;
23
+ } | undefined;
24
+ sdkVersion?: {
25
+ type: StringConstructor;
26
+ required: false;
27
+ } | undefined;
28
+ disabled?: {
29
+ type: BooleanConstructor;
30
+ required: false;
31
+ } | undefined;
32
+ waitForProfile?: {
33
+ type: BooleanConstructor;
34
+ required: false;
35
+ } | undefined;
36
+ trackScreenViews?: {
37
+ type: BooleanConstructor;
38
+ required: false;
39
+ } | undefined;
40
+ trackHashChanges?: {
41
+ type: BooleanConstructor;
42
+ required: false;
43
+ } | undefined;
44
+ trackSessions?: {
45
+ type: BooleanConstructor;
46
+ required: false;
47
+ } | undefined;
48
+ trackAttributes?: {
49
+ type: BooleanConstructor;
50
+ required: false;
51
+ } | undefined;
52
+ trackOutgoingLinks?: {
53
+ type: BooleanConstructor;
54
+ required: false;
55
+ } | undefined;
56
+ trackInteractions?: {
57
+ type: BooleanConstructor;
58
+ required: false;
59
+ } | undefined;
60
+ trackEngagement?: {
61
+ type: BooleanConstructor;
62
+ required: false;
63
+ } | undefined;
64
+ trackScrollDepth?: {
65
+ type: BooleanConstructor;
66
+ required: false;
67
+ } | undefined;
68
+ trackExitIntent?: {
69
+ type: BooleanConstructor;
70
+ required: false;
71
+ } | undefined;
72
+ trackBounceRate?: {
73
+ type: BooleanConstructor;
74
+ required: false;
75
+ } | undefined;
76
+ trackPerformance?: {
77
+ type: BooleanConstructor;
78
+ required: false;
79
+ } | undefined;
80
+ trackWebVitals?: {
81
+ type: BooleanConstructor;
82
+ required: false;
83
+ } | undefined;
84
+ trackErrors?: {
85
+ type: BooleanConstructor;
86
+ required: false;
87
+ } | undefined;
88
+ enableObservability?: {
89
+ type: BooleanConstructor;
90
+ required: false;
91
+ } | undefined;
92
+ observabilityService?: {
93
+ type: StringConstructor;
94
+ required: false;
95
+ } | undefined;
96
+ observabilityEnvironment?: {
97
+ type: StringConstructor;
98
+ required: false;
99
+ } | undefined;
100
+ observabilityVersion?: {
101
+ type: StringConstructor;
102
+ required: false;
103
+ } | undefined;
104
+ enableLogging?: {
105
+ type: BooleanConstructor;
106
+ required: false;
107
+ } | undefined;
108
+ enableTracing?: {
109
+ type: BooleanConstructor;
110
+ required: false;
111
+ } | undefined;
112
+ enableErrorTracking?: {
113
+ type: BooleanConstructor;
114
+ required: false;
115
+ } | undefined;
116
+ samplingRate?: {
117
+ type: NumberConstructor;
118
+ required: false;
119
+ } | undefined;
120
+ enableRetries?: {
121
+ type: BooleanConstructor;
122
+ required: false;
123
+ } | undefined;
124
+ maxRetries?: {
125
+ type: NumberConstructor;
126
+ required: false;
127
+ } | undefined;
128
+ initialRetryDelay?: {
129
+ type: NumberConstructor;
130
+ required: false;
131
+ } | undefined;
132
+ enableBatching?: {
133
+ type: BooleanConstructor;
134
+ required: false;
135
+ } | undefined;
136
+ batchSize?: {
137
+ type: NumberConstructor;
138
+ required: false;
139
+ } | undefined;
140
+ batchTimeout?: {
141
+ type: NumberConstructor;
142
+ required: false;
143
+ } | undefined;
144
+ }, () => null, unknown, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, Record<string, any>, string, vue.VNodeProps & vue.AllowedComponentProps & vue.ComponentCustomProps, Readonly<{} & {
145
+ sdk?: string | undefined;
146
+ clientId?: string | undefined;
147
+ clientSecret?: string | undefined;
148
+ apiUrl?: string | undefined;
149
+ scriptUrl?: string | undefined;
150
+ sdkVersion?: string | undefined;
151
+ disabled?: boolean | undefined;
152
+ waitForProfile?: boolean | undefined;
153
+ trackScreenViews?: boolean | undefined;
154
+ trackHashChanges?: boolean | undefined;
155
+ trackSessions?: boolean | undefined;
156
+ trackAttributes?: boolean | undefined;
157
+ trackOutgoingLinks?: boolean | undefined;
158
+ trackInteractions?: boolean | undefined;
159
+ trackEngagement?: boolean | undefined;
160
+ trackScrollDepth?: boolean | undefined;
161
+ trackExitIntent?: boolean | undefined;
162
+ trackBounceRate?: boolean | undefined;
163
+ trackPerformance?: boolean | undefined;
164
+ trackWebVitals?: boolean | undefined;
165
+ trackErrors?: boolean | undefined;
166
+ enableObservability?: boolean | undefined;
167
+ observabilityService?: string | undefined;
168
+ observabilityEnvironment?: string | undefined;
169
+ observabilityVersion?: string | undefined;
170
+ enableLogging?: boolean | undefined;
171
+ enableTracing?: boolean | undefined;
172
+ enableErrorTracking?: boolean | undefined;
173
+ samplingRate?: number | undefined;
174
+ enableRetries?: boolean | undefined;
175
+ maxRetries?: number | undefined;
176
+ initialRetryDelay?: number | undefined;
177
+ enableBatching?: boolean | undefined;
178
+ batchSize?: number | undefined;
179
+ batchTimeout?: number | undefined;
180
+ }>, {}>;
181
+
182
+ export { Databuddy };