@agentuity/frontend 0.1.1 → 0.1.3

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 (80) hide show
  1. package/dist/analytics/beacon-standalone.d.ts +106 -0
  2. package/dist/analytics/beacon-standalone.d.ts.map +1 -0
  3. package/dist/analytics/beacon-standalone.js +577 -0
  4. package/dist/analytics/beacon-standalone.js.map +1 -0
  5. package/dist/analytics/index.d.ts +15 -5
  6. package/dist/analytics/index.d.ts.map +1 -1
  7. package/dist/analytics/index.js +21 -5
  8. package/dist/analytics/index.js.map +1 -1
  9. package/dist/analytics/types.d.ts +63 -35
  10. package/dist/analytics/types.d.ts.map +1 -1
  11. package/dist/beacon-script.d.ts +16 -0
  12. package/dist/beacon-script.d.ts.map +1 -0
  13. package/dist/beacon-script.js +3 -0
  14. package/dist/beacon-script.js.map +1 -0
  15. package/dist/beacon.js +1 -0
  16. package/dist/index.d.ts +2 -1
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +5 -2
  19. package/dist/index.js.map +1 -1
  20. package/package.json +4 -4
  21. package/src/analytics/beacon-standalone.ts +718 -0
  22. package/src/analytics/index.ts +29 -8
  23. package/src/analytics/types.ts +78 -49
  24. package/src/beacon-script.ts +24 -0
  25. package/src/index.ts +10 -7
  26. package/dist/analytics/beacon.d.ts +0 -15
  27. package/dist/analytics/beacon.d.ts.map +0 -1
  28. package/dist/analytics/beacon.js +0 -177
  29. package/dist/analytics/beacon.js.map +0 -1
  30. package/dist/analytics/collectors/clicks.d.ts +0 -10
  31. package/dist/analytics/collectors/clicks.d.ts.map +0 -1
  32. package/dist/analytics/collectors/clicks.js +0 -84
  33. package/dist/analytics/collectors/clicks.js.map +0 -1
  34. package/dist/analytics/collectors/errors.d.ts +0 -5
  35. package/dist/analytics/collectors/errors.d.ts.map +0 -1
  36. package/dist/analytics/collectors/errors.js +0 -43
  37. package/dist/analytics/collectors/errors.js.map +0 -1
  38. package/dist/analytics/collectors/forms.d.ts +0 -5
  39. package/dist/analytics/collectors/forms.d.ts.map +0 -1
  40. package/dist/analytics/collectors/forms.js +0 -55
  41. package/dist/analytics/collectors/forms.js.map +0 -1
  42. package/dist/analytics/collectors/pageview.d.ts +0 -15
  43. package/dist/analytics/collectors/pageview.d.ts.map +0 -1
  44. package/dist/analytics/collectors/pageview.js +0 -64
  45. package/dist/analytics/collectors/pageview.js.map +0 -1
  46. package/dist/analytics/collectors/scroll.d.ts +0 -17
  47. package/dist/analytics/collectors/scroll.d.ts.map +0 -1
  48. package/dist/analytics/collectors/scroll.js +0 -93
  49. package/dist/analytics/collectors/scroll.js.map +0 -1
  50. package/dist/analytics/collectors/spa.d.ts +0 -10
  51. package/dist/analytics/collectors/spa.d.ts.map +0 -1
  52. package/dist/analytics/collectors/spa.js +0 -53
  53. package/dist/analytics/collectors/spa.js.map +0 -1
  54. package/dist/analytics/collectors/visibility.d.ts +0 -18
  55. package/dist/analytics/collectors/visibility.d.ts.map +0 -1
  56. package/dist/analytics/collectors/visibility.js +0 -81
  57. package/dist/analytics/collectors/visibility.js.map +0 -1
  58. package/dist/analytics/collectors/webvitals.d.ts +0 -6
  59. package/dist/analytics/collectors/webvitals.d.ts.map +0 -1
  60. package/dist/analytics/collectors/webvitals.js +0 -111
  61. package/dist/analytics/collectors/webvitals.js.map +0 -1
  62. package/dist/analytics/events.d.ts +0 -18
  63. package/dist/analytics/events.d.ts.map +0 -1
  64. package/dist/analytics/events.js +0 -126
  65. package/dist/analytics/events.js.map +0 -1
  66. package/dist/analytics/offline.d.ts +0 -19
  67. package/dist/analytics/offline.d.ts.map +0 -1
  68. package/dist/analytics/offline.js +0 -145
  69. package/dist/analytics/offline.js.map +0 -1
  70. package/src/analytics/beacon.ts +0 -203
  71. package/src/analytics/collectors/clicks.ts +0 -100
  72. package/src/analytics/collectors/errors.ts +0 -49
  73. package/src/analytics/collectors/forms.ts +0 -64
  74. package/src/analytics/collectors/pageview.ts +0 -76
  75. package/src/analytics/collectors/scroll.ts +0 -112
  76. package/src/analytics/collectors/spa.ts +0 -60
  77. package/src/analytics/collectors/visibility.ts +0 -94
  78. package/src/analytics/collectors/webvitals.ts +0 -129
  79. package/src/analytics/events.ts +0 -146
  80. package/src/analytics/offline.ts +0 -163
@@ -1,21 +1,42 @@
1
1
  /**
2
2
  * Web Analytics for Agentuity SDK applications
3
3
  *
4
- * This module provides client-side analytics tracking for web applications
5
- * built with the Agentuity SDK.
4
+ * The analytics beacon is bundled separately via beacon-standalone.ts
5
+ * and injected as a script tag by the SDK runtime.
6
+ *
7
+ * This module re-exports types and utilities for programmatic access.
6
8
  */
7
9
 
8
- export { getAnalytics, track, initBeacon } from './beacon';
10
+ import type { AnalyticsClient } from './types';
9
11
 
10
12
  export type {
11
13
  AnalyticsClient,
12
- AnalyticsEvent,
13
- AnalyticsEventType,
14
- AnalyticsBatchPayload,
14
+ AnalyticsPayload,
15
15
  AnalyticsPageConfig,
16
+ PageViewPayload,
17
+ ScrollEvent,
18
+ AnalyticsCustomEvent,
19
+ GeoLocation,
16
20
  } from './types';
17
21
 
18
- // Re-export utilities for advanced usage
19
- export { trackPageview, createBaseEvent } from './collectors/pageview';
20
22
  export { getVisitorId, isOptedOut, setOptOut } from './utils/storage';
21
23
  export { getUTMParams } from './utils/utm';
24
+
25
+ /**
26
+ * Get the analytics client from the global window object.
27
+ * Returns null if the beacon hasn't been initialized.
28
+ */
29
+ export function getAnalytics(): AnalyticsClient | null {
30
+ if (typeof window !== 'undefined') {
31
+ const client = (window as { agentuityAnalytics?: AnalyticsClient }).agentuityAnalytics;
32
+ return client ?? null;
33
+ }
34
+ return null;
35
+ }
36
+
37
+ /**
38
+ * Track a custom event. No-op if analytics isn't initialized.
39
+ */
40
+ export function track(eventName: string, properties?: Record<string, unknown>): void {
41
+ getAnalytics()?.track(eventName, properties);
42
+ }
@@ -1,34 +1,54 @@
1
1
  /**
2
- * Analytics event types
2
+ * Scroll milestone event - records when a scroll depth milestone was first crossed
3
3
  */
4
- export type AnalyticsEventType =
5
- | 'pageview'
6
- | 'click'
7
- | 'scroll'
8
- | 'visibility'
9
- | 'error'
10
- | 'custom'
11
- | 'web_vital'
12
- | 'form_submit'
13
- | 'outbound_link';
4
+ export interface ScrollEvent {
5
+ depth: number; // 25, 50, 75, or 100
6
+ timestamp: number; // ms since page load
7
+ }
14
8
 
15
9
  /**
16
- * Analytics event sent to the collection endpoint
10
+ * Custom event tracked during the page session
17
11
  */
18
- export interface AnalyticsEvent {
12
+ export interface AnalyticsCustomEvent {
13
+ timestamp: number; // ms since epoch
14
+ name: string;
15
+ data?: string; // JSON string
16
+ }
17
+
18
+ /**
19
+ * Geo location data from agentuity.sh/location
20
+ */
21
+ export interface GeoLocation {
22
+ country?: string;
23
+ country_latitude?: number;
24
+ country_longitude?: number;
25
+ region?: string;
26
+ region_latitude?: number;
27
+ region_longitude?: number;
28
+ city?: string;
29
+ city_latitude?: number;
30
+ city_longitude?: number;
31
+ timezone?: string;
32
+ latitude?: number;
33
+ longitude?: number;
34
+ }
35
+
36
+ /**
37
+ * Page view payload sent to the collection endpoint
38
+ * Represents a single page view with all aggregated data
39
+ */
40
+ export interface PageViewPayload {
19
41
  id: string;
20
42
  timestamp: number;
21
43
  timezone_offset: number;
22
44
 
23
- event_type: AnalyticsEventType;
24
- event_name?: string;
25
- event_data?: Record<string, unknown>;
26
-
45
+ // Page context
27
46
  url: string;
28
47
  path: string;
29
48
  referrer: string;
30
49
  title: string;
31
50
 
51
+ // Device/browser
32
52
  screen_width: number;
33
53
  screen_height: number;
34
54
  viewport_width: number;
@@ -37,17 +57,42 @@ export interface AnalyticsEvent {
37
57
  user_agent: string;
38
58
  language: string;
39
59
 
60
+ // Geography
61
+ country?: string;
62
+ country_latitude?: number;
63
+ country_longitude?: number;
64
+ region?: string;
65
+ region_latitude?: number;
66
+ region_longitude?: number;
67
+ city?: string;
68
+ city_latitude?: number;
69
+ city_longitude?: number;
70
+ timezone?: string;
71
+ latitude?: number;
72
+ longitude?: number;
73
+
74
+ // Performance metrics
40
75
  load_time?: number;
41
76
  dom_ready?: number;
42
77
  ttfb?: number;
78
+
79
+ // Web vitals (collected during session)
43
80
  fcp?: number;
44
81
  lcp?: number;
45
82
  cls?: number;
46
83
  inp?: number;
47
84
 
48
- scroll_depth?: number;
49
- time_on_page?: number;
85
+ // Engagement metrics
86
+ scroll_depth: number; // max scroll depth reached
87
+ time_on_page: number; // ms
88
+
89
+ // Scroll events: when milestones were first crossed
90
+ scroll_events: ScrollEvent[];
91
+
92
+ // Custom events (max 1000)
93
+ custom_events: AnalyticsCustomEvent[];
50
94
 
95
+ // UTM parameters
51
96
  utm_source?: string;
52
97
  utm_medium?: string;
53
98
  utm_campaign?: string;
@@ -56,16 +101,17 @@ export interface AnalyticsEvent {
56
101
  }
57
102
 
58
103
  /**
59
- * Batch payload sent to /_agentuity/webanalytics/collect
104
+ * Payload sent to /_agentuity/webanalytics/collect
60
105
  */
61
- export interface AnalyticsBatchPayload {
106
+ export interface AnalyticsPayload {
62
107
  org_id: string;
63
108
  project_id: string;
64
- session_id: string;
65
109
  thread_id: string;
66
110
  visitor_id: string;
111
+ user_id: string;
112
+ user_traits: Record<string, string>;
67
113
  is_devmode: boolean;
68
- events: AnalyticsEvent[];
114
+ pageview: PageViewPayload;
69
115
  }
70
116
 
71
117
  /**
@@ -75,7 +121,6 @@ export interface AnalyticsPageConfig {
75
121
  enabled: boolean;
76
122
  orgId: string;
77
123
  projectId: string;
78
- sessionId: string;
79
124
  threadId: string;
80
125
  isDevmode: boolean;
81
126
 
@@ -93,47 +138,31 @@ export interface AnalyticsPageConfig {
93
138
  }
94
139
 
95
140
  /**
96
- * Public analytics client interface
141
+ * Public analytics client interface (exposed on window.agentuityAnalytics)
97
142
  */
98
143
  export interface AnalyticsClient {
99
144
  /**
100
- * Track a custom event
145
+ * Track a custom event (aggregated and sent on page exit)
101
146
  */
102
147
  track(eventName: string, properties?: Record<string, unknown>): void;
103
148
 
104
149
  /**
105
- * Identify the current user (sets visitor properties)
150
+ * Identify the current user
106
151
  */
107
152
  identify(userId: string, traits?: Record<string, unknown>): void;
108
153
 
109
154
  /**
110
- * Manually track a page view
111
- */
112
- pageview(path?: string): void;
113
-
114
- /**
115
- * Flush pending events immediately
116
- */
117
- flush(): Promise<void>;
118
-
119
- /**
120
- * Opt out of analytics
121
- */
122
- optOut(): void;
123
-
124
- /**
125
- * Opt back in to analytics
126
- */
127
- optIn(): void;
128
-
129
- /**
130
- * Check if analytics is currently enabled
155
+ * Flush pending page view data immediately
131
156
  */
132
- isEnabled(): boolean;
157
+ flush(): void;
133
158
  }
134
159
 
135
160
  declare global {
136
161
  interface Window {
137
162
  __AGENTUITY_ANALYTICS__?: AnalyticsPageConfig;
163
+ __AGENTUITY_SESSION__?: {
164
+ threadId?: string;
165
+ };
166
+ agentuityAnalytics?: AnalyticsClient;
138
167
  }
139
168
  }
@@ -0,0 +1,24 @@
1
+ /**
2
+ * This file is a placeholder for TypeScript compilation.
3
+ * The actual BEACON_SCRIPT value is generated at build time by scripts/build-beacon.ts
4
+ * and written directly to dist/beacon-script.js, overwriting the compiled output.
5
+ *
6
+ * This allows TypeScript to generate proper .d.ts files during compilation,
7
+ * while the actual minified beacon code is injected during the build step.
8
+ */
9
+
10
+ export const BEACON_SCRIPT: string = '';
11
+
12
+ /**
13
+ * Validates that the beacon script has been properly injected at build time.
14
+ * Call this early in the runtime to fail fast if the build step was missed.
15
+ * @throws Error if BEACON_SCRIPT is empty (build step not run)
16
+ */
17
+ export function validateBeaconScript(): void {
18
+ if (!BEACON_SCRIPT || BEACON_SCRIPT.length === 0) {
19
+ throw new Error(
20
+ 'BEACON_SCRIPT is empty. The frontend package was not built correctly. ' +
21
+ 'Run "bun run build" in @agentuity/frontend to generate the beacon script.'
22
+ );
23
+ }
24
+ }
package/src/index.ts CHANGED
@@ -31,20 +31,23 @@ export type {
31
31
  EventHandler,
32
32
  } from './client/types';
33
33
 
34
- // Export analytics
34
+ // Export analytics (beacon is bundled separately via beacon-standalone.ts)
35
35
  export {
36
36
  getAnalytics,
37
37
  track,
38
- initBeacon,
39
- trackPageview,
40
- createBaseEvent,
41
38
  getVisitorId,
42
39
  isOptedOut,
43
40
  setOptOut,
44
41
  getUTMParams,
45
42
  type AnalyticsClient,
46
- type AnalyticsEvent,
47
- type AnalyticsEventType,
48
- type AnalyticsBatchPayload,
43
+ type AnalyticsPayload,
49
44
  type AnalyticsPageConfig,
45
+ type PageViewPayload,
46
+ type ScrollEvent,
47
+ type AnalyticsCustomEvent,
48
+ type GeoLocation,
50
49
  } from './analytics';
50
+
51
+ // Re-export beacon script for server-side use
52
+ // The actual value is replaced at build time by scripts/build-beacon.ts
53
+ export { BEACON_SCRIPT, validateBeaconScript } from './beacon-script';
@@ -1,15 +0,0 @@
1
- import type { AnalyticsClient } from './types';
2
- /**
3
- * Initialize the analytics beacon
4
- * Called automatically when the script loads
5
- */
6
- export declare function initBeacon(): void;
7
- /**
8
- * Get the analytics client instance
9
- */
10
- export declare function getAnalytics(): AnalyticsClient;
11
- /**
12
- * Convenience function to track a custom event
13
- */
14
- export declare function track(eventName: string, properties?: Record<string, unknown>): void;
15
- //# sourceMappingURL=beacon.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"beacon.d.ts","sourceRoot":"","sources":["../../src/analytics/beacon.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAuB,eAAe,EAAE,MAAM,SAAS,CAAC;AA6BpE;;;GAGG;AACH,wBAAgB,UAAU,IAAI,IAAI,CAoBjC;AA6HD;;GAEG;AACH,wBAAgB,YAAY,IAAI,eAAe,CAK9C;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAEnF"}
@@ -1,177 +0,0 @@
1
- import { initEventQueue, queueEvent, flushEvents } from './events';
2
- import { initPageviewTracking, createBaseEvent, trackPageview } from './collectors/pageview';
3
- import { initSPATracking } from './collectors/spa';
4
- import { initClickTracking, initOutboundLinkTracking } from './collectors/clicks';
5
- import { initScrollTracking } from './collectors/scroll';
6
- import { initErrorTracking } from './collectors/errors';
7
- import { initVisibilityTracking } from './collectors/visibility';
8
- import { initFormTracking } from './collectors/forms';
9
- import { initWebVitalsTracking } from './collectors/webvitals';
10
- import { isOptedOut, setOptOut } from './utils/storage';
11
- import { initOfflineSupport, getAndClearOfflineEvents } from './offline';
12
- let initialized = false;
13
- let trackingStarted = false;
14
- let analyticsEnabled = true;
15
- let consentRequired = false;
16
- let consentGiven = false;
17
- /**
18
- * Check if analytics should run
19
- */
20
- function shouldTrack() {
21
- if (!analyticsEnabled)
22
- return false;
23
- if (isOptedOut())
24
- return false;
25
- if (consentRequired && !consentGiven)
26
- return false;
27
- return true;
28
- }
29
- /**
30
- * Initialize the analytics beacon
31
- * Called automatically when the script loads
32
- */
33
- export function initBeacon() {
34
- if (initialized) {
35
- return;
36
- }
37
- const config = window.__AGENTUITY_ANALYTICS__;
38
- if (!config || !config.enabled) {
39
- analyticsEnabled = false;
40
- return;
41
- }
42
- initialized = true;
43
- consentRequired = config.requireConsent ?? false;
44
- // If consent is required and not given, wait for optIn
45
- if (consentRequired && !consentGiven) {
46
- return;
47
- }
48
- startTracking(config);
49
- }
50
- /**
51
- * Start all tracking based on config
52
- */
53
- function startTracking(config) {
54
- if (trackingStarted) {
55
- return;
56
- }
57
- trackingStarted = true;
58
- // Initialize event queue
59
- initEventQueue(config);
60
- // Initialize offline support
61
- initOfflineSupport(async () => {
62
- // Flush offline events when coming back online
63
- const offlineEvents = await getAndClearOfflineEvents();
64
- for (const event of offlineEvents) {
65
- queueEvent(event);
66
- }
67
- flushEvents();
68
- });
69
- // Always track pageviews
70
- initPageviewTracking();
71
- // Initialize visibility tracking (for time on page)
72
- initVisibilityTracking();
73
- // Conditional tracking based on config (all default to true except requireConsent)
74
- if (config.trackSPANavigation !== false) {
75
- initSPATracking();
76
- }
77
- if (config.trackClicks !== false) {
78
- initClickTracking();
79
- }
80
- if (config.trackOutboundLinks !== false) {
81
- initOutboundLinkTracking();
82
- }
83
- if (config.trackScroll !== false) {
84
- initScrollTracking();
85
- }
86
- if (config.trackErrors !== false) {
87
- initErrorTracking();
88
- }
89
- if (config.trackForms !== false) {
90
- initFormTracking();
91
- }
92
- if (config.trackWebVitals !== false) {
93
- initWebVitalsTracking();
94
- }
95
- }
96
- /**
97
- * Create the analytics client API
98
- */
99
- function createClient() {
100
- return {
101
- track(eventName, properties) {
102
- if (!shouldTrack())
103
- return;
104
- const event = createBaseEvent('custom');
105
- event.event_name = eventName;
106
- if (properties) {
107
- event.event_data = properties;
108
- }
109
- queueEvent(event);
110
- },
111
- identify(userId, traits) {
112
- if (!shouldTrack())
113
- return;
114
- const event = createBaseEvent('custom');
115
- event.event_name = 'identify';
116
- event.event_data = {
117
- user_id: userId,
118
- ...traits,
119
- };
120
- queueEvent(event);
121
- },
122
- pageview(path) {
123
- if (!shouldTrack())
124
- return;
125
- trackPageview(path);
126
- },
127
- async flush() {
128
- flushEvents();
129
- },
130
- optOut() {
131
- setOptOut(true);
132
- analyticsEnabled = false;
133
- },
134
- optIn() {
135
- setOptOut(false);
136
- analyticsEnabled = true;
137
- consentGiven = true;
138
- // If consent was required and now given, start tracking
139
- if (consentRequired && !trackingStarted) {
140
- const config = window.__AGENTUITY_ANALYTICS__;
141
- if (config) {
142
- startTracking(config);
143
- }
144
- }
145
- },
146
- isEnabled() {
147
- return shouldTrack();
148
- },
149
- };
150
- }
151
- // Singleton client instance
152
- let clientInstance = null;
153
- /**
154
- * Get the analytics client instance
155
- */
156
- export function getAnalytics() {
157
- if (!clientInstance) {
158
- clientInstance = createClient();
159
- }
160
- return clientInstance;
161
- }
162
- /**
163
- * Convenience function to track a custom event
164
- */
165
- export function track(eventName, properties) {
166
- getAnalytics().track(eventName, properties);
167
- }
168
- // Auto-initialize when script loads
169
- if (typeof window !== 'undefined') {
170
- if (document.readyState === 'loading') {
171
- document.addEventListener('DOMContentLoaded', initBeacon);
172
- }
173
- else {
174
- initBeacon();
175
- }
176
- }
177
- //# sourceMappingURL=beacon.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"beacon.js","sourceRoot":"","sources":["../../src/analytics/beacon.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC7F,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AAEzE,IAAI,WAAW,GAAG,KAAK,CAAC;AACxB,IAAI,eAAe,GAAG,KAAK,CAAC;AAC5B,IAAI,gBAAgB,GAAG,IAAI,CAAC;AAC5B,IAAI,eAAe,GAAG,KAAK,CAAC;AAC5B,IAAI,YAAY,GAAG,KAAK,CAAC;AAEzB;;GAEG;AACH,SAAS,WAAW;IACnB,IAAI,CAAC,gBAAgB;QAAE,OAAO,KAAK,CAAC;IACpC,IAAI,UAAU,EAAE;QAAE,OAAO,KAAK,CAAC;IAC/B,IAAI,eAAe,IAAI,CAAC,YAAY;QAAE,OAAO,KAAK,CAAC;IACnD,OAAO,IAAI,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU;IACzB,IAAI,WAAW,EAAE,CAAC;QACjB,OAAO;IACR,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,uBAAuB,CAAC;IAC9C,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAChC,gBAAgB,GAAG,KAAK,CAAC;QACzB,OAAO;IACR,CAAC;IAED,WAAW,GAAG,IAAI,CAAC;IACnB,eAAe,GAAG,MAAM,CAAC,cAAc,IAAI,KAAK,CAAC;IAEjD,uDAAuD;IACvD,IAAI,eAAe,IAAI,CAAC,YAAY,EAAE,CAAC;QACtC,OAAO;IACR,CAAC;IAED,aAAa,CAAC,MAAM,CAAC,CAAC;AACvB,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,MAA2B;IACjD,IAAI,eAAe,EAAE,CAAC;QACrB,OAAO;IACR,CAAC;IACD,eAAe,GAAG,IAAI,CAAC;IAEvB,yBAAyB;IACzB,cAAc,CAAC,MAAM,CAAC,CAAC;IAEvB,6BAA6B;IAC7B,kBAAkB,CAAC,KAAK,IAAI,EAAE;QAC7B,+CAA+C;QAC/C,MAAM,aAAa,GAAG,MAAM,wBAAwB,EAAE,CAAC;QACvD,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;YACnC,UAAU,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC;QACD,WAAW,EAAE,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,yBAAyB;IACzB,oBAAoB,EAAE,CAAC;IAEvB,oDAAoD;IACpD,sBAAsB,EAAE,CAAC;IAEzB,mFAAmF;IACnF,IAAI,MAAM,CAAC,kBAAkB,KAAK,KAAK,EAAE,CAAC;QACzC,eAAe,EAAE,CAAC;IACnB,CAAC;IAED,IAAI,MAAM,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;QAClC,iBAAiB,EAAE,CAAC;IACrB,CAAC;IAED,IAAI,MAAM,CAAC,kBAAkB,KAAK,KAAK,EAAE,CAAC;QACzC,wBAAwB,EAAE,CAAC;IAC5B,CAAC;IAED,IAAI,MAAM,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;QAClC,kBAAkB,EAAE,CAAC;IACtB,CAAC;IAED,IAAI,MAAM,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;QAClC,iBAAiB,EAAE,CAAC;IACrB,CAAC;IAED,IAAI,MAAM,CAAC,UAAU,KAAK,KAAK,EAAE,CAAC;QACjC,gBAAgB,EAAE,CAAC;IACpB,CAAC;IAED,IAAI,MAAM,CAAC,cAAc,KAAK,KAAK,EAAE,CAAC;QACrC,qBAAqB,EAAE,CAAC;IACzB,CAAC;AACF,CAAC;AAED;;GAEG;AACH,SAAS,YAAY;IACpB,OAAO;QACN,KAAK,CAAC,SAAiB,EAAE,UAAoC;YAC5D,IAAI,CAAC,WAAW,EAAE;gBAAE,OAAO;YAE3B,MAAM,KAAK,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;YACxC,KAAK,CAAC,UAAU,GAAG,SAAS,CAAC;YAC7B,IAAI,UAAU,EAAE,CAAC;gBAChB,KAAK,CAAC,UAAU,GAAG,UAAU,CAAC;YAC/B,CAAC;YACD,UAAU,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC;QAED,QAAQ,CAAC,MAAc,EAAE,MAAgC;YACxD,IAAI,CAAC,WAAW,EAAE;gBAAE,OAAO;YAE3B,MAAM,KAAK,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;YACxC,KAAK,CAAC,UAAU,GAAG,UAAU,CAAC;YAC9B,KAAK,CAAC,UAAU,GAAG;gBAClB,OAAO,EAAE,MAAM;gBACf,GAAG,MAAM;aACT,CAAC;YACF,UAAU,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC;QAED,QAAQ,CAAC,IAAa;YACrB,IAAI,CAAC,WAAW,EAAE;gBAAE,OAAO;YAC3B,aAAa,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;QAED,KAAK,CAAC,KAAK;YACV,WAAW,EAAE,CAAC;QACf,CAAC;QAED,MAAM;YACL,SAAS,CAAC,IAAI,CAAC,CAAC;YAChB,gBAAgB,GAAG,KAAK,CAAC;QAC1B,CAAC;QAED,KAAK;YACJ,SAAS,CAAC,KAAK,CAAC,CAAC;YACjB,gBAAgB,GAAG,IAAI,CAAC;YACxB,YAAY,GAAG,IAAI,CAAC;YAEpB,wDAAwD;YACxD,IAAI,eAAe,IAAI,CAAC,eAAe,EAAE,CAAC;gBACzC,MAAM,MAAM,GAAG,MAAM,CAAC,uBAAuB,CAAC;gBAC9C,IAAI,MAAM,EAAE,CAAC;oBACZ,aAAa,CAAC,MAAM,CAAC,CAAC;gBACvB,CAAC;YACF,CAAC;QACF,CAAC;QAED,SAAS;YACR,OAAO,WAAW,EAAE,CAAC;QACtB,CAAC;KACD,CAAC;AACH,CAAC;AAED,4BAA4B;AAC5B,IAAI,cAAc,GAA2B,IAAI,CAAC;AAElD;;GAEG;AACH,MAAM,UAAU,YAAY;IAC3B,IAAI,CAAC,cAAc,EAAE,CAAC;QACrB,cAAc,GAAG,YAAY,EAAE,CAAC;IACjC,CAAC;IACD,OAAO,cAAc,CAAC;AACvB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,KAAK,CAAC,SAAiB,EAAE,UAAoC;IAC5E,YAAY,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;AAC7C,CAAC;AAED,oCAAoC;AACpC,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;IACnC,IAAI,QAAQ,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACvC,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,UAAU,CAAC,CAAC;IAC3D,CAAC;SAAM,CAAC;QACP,UAAU,EAAE,CAAC;IACd,CAAC;AACF,CAAC"}
@@ -1,10 +0,0 @@
1
- /**
2
- * Initialize click tracking
3
- * Tracks clicks on elements with data-analytics attribute
4
- */
5
- export declare function initClickTracking(): void;
6
- /**
7
- * Initialize outbound link tracking
8
- */
9
- export declare function initOutboundLinkTracking(): void;
10
- //# sourceMappingURL=clicks.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"clicks.d.ts","sourceRoot":"","sources":["../../../src/analytics/collectors/clicks.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAgDxC;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,IAAI,CAuC/C"}
@@ -1,84 +0,0 @@
1
- import { createBaseEvent } from './pageview';
2
- import { queueEvent } from '../events';
3
- /**
4
- * Initialize click tracking
5
- * Tracks clicks on elements with data-analytics attribute
6
- */
7
- export function initClickTracking() {
8
- if (typeof document === 'undefined') {
9
- return;
10
- }
11
- document.addEventListener('click', (e) => {
12
- const target = e.target;
13
- if (!target)
14
- return;
15
- // Find closest element with data-analytics attribute
16
- const analyticsElement = target.closest('[data-analytics]');
17
- if (!analyticsElement)
18
- return;
19
- const eventName = analyticsElement.getAttribute('data-analytics');
20
- if (!eventName)
21
- return;
22
- const event = createBaseEvent('click');
23
- event.event_name = eventName;
24
- // Collect additional data attributes
25
- const eventData = {};
26
- for (const attr of Array.from(analyticsElement.attributes)) {
27
- if (attr.name.startsWith('data-analytics-')) {
28
- const key = attr.name.replace('data-analytics-', '');
29
- eventData[key] = attr.value;
30
- }
31
- }
32
- // Add element info
33
- eventData.tag = analyticsElement.tagName.toLowerCase();
34
- if (analyticsElement.id) {
35
- eventData.id = analyticsElement.id;
36
- }
37
- const text = analyticsElement.innerText?.slice(0, 100);
38
- if (text) {
39
- eventData.text = text;
40
- }
41
- if (Object.keys(eventData).length > 0) {
42
- event.event_data = eventData;
43
- }
44
- queueEvent(event);
45
- }, { capture: true, passive: true });
46
- }
47
- /**
48
- * Initialize outbound link tracking
49
- */
50
- export function initOutboundLinkTracking() {
51
- if (typeof document === 'undefined') {
52
- return;
53
- }
54
- document.addEventListener('click', (e) => {
55
- const target = e.target;
56
- if (!target)
57
- return;
58
- const link = target.closest('a');
59
- if (!link)
60
- return;
61
- const href = link.href;
62
- if (!href)
63
- return;
64
- // Check if it's an outbound link
65
- try {
66
- const url = new URL(href, window.location.origin);
67
- if (url.hostname === window.location.hostname) {
68
- return; // Same domain, not outbound
69
- }
70
- const event = createBaseEvent('outbound_link');
71
- event.event_name = 'outbound_link';
72
- event.event_data = {
73
- href,
74
- hostname: url.hostname,
75
- text: link.innerText?.slice(0, 100) || '',
76
- };
77
- queueEvent(event);
78
- }
79
- catch {
80
- // Invalid URL, ignore
81
- }
82
- }, { capture: true, passive: true });
83
- }
84
- //# sourceMappingURL=clicks.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"clicks.js","sourceRoot":"","sources":["../../../src/analytics/collectors/clicks.ts"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- /**
2
- * Initialize JavaScript error tracking
3
- */
4
- export declare function initErrorTracking(): void;
5
- //# sourceMappingURL=errors.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/analytics/collectors/errors.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CA0CxC"}
@@ -1,43 +0,0 @@
1
- import { createBaseEvent } from './pageview';
2
- import { queueEvent } from '../events';
3
- /**
4
- * Initialize JavaScript error tracking
5
- */
6
- export function initErrorTracking() {
7
- if (typeof window === 'undefined') {
8
- return;
9
- }
10
- // Handle uncaught errors
11
- window.addEventListener('error', (e) => {
12
- const event = createBaseEvent('error');
13
- event.event_name = 'js_error';
14
- event.event_data = {
15
- message: e.message || 'Unknown error',
16
- filename: e.filename || '',
17
- lineno: e.lineno || 0,
18
- colno: e.colno || 0,
19
- stack: e.error?.stack?.slice(0, 1000) || '',
20
- };
21
- queueEvent(event);
22
- });
23
- // Handle unhandled promise rejections
24
- window.addEventListener('unhandledrejection', (e) => {
25
- const event = createBaseEvent('error');
26
- event.event_name = 'unhandled_rejection';
27
- let message = 'Unhandled Promise Rejection';
28
- let stack = '';
29
- if (e.reason instanceof Error) {
30
- message = e.reason.message;
31
- stack = e.reason.stack?.slice(0, 1000) || '';
32
- }
33
- else if (typeof e.reason === 'string') {
34
- message = e.reason;
35
- }
36
- event.event_data = {
37
- message,
38
- stack,
39
- };
40
- queueEvent(event);
41
- });
42
- }
43
- //# sourceMappingURL=errors.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/analytics/collectors/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAChC,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QACnC,OAAO;IACR,CAAC;IAED,yBAAyB;IACzB,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;QACtC,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;QACvC,KAAK,CAAC,UAAU,GAAG,UAAU,CAAC;QAC9B,KAAK,CAAC,UAAU,GAAG;YAClB,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,eAAe;YACrC,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,EAAE;YAC1B,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC;YACrB,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC;YACnB,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE;SAC3C,CAAC;QAEF,UAAU,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,sCAAsC;IACtC,MAAM,CAAC,gBAAgB,CAAC,oBAAoB,EAAE,CAAC,CAAC,EAAE,EAAE;QACnD,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;QACvC,KAAK,CAAC,UAAU,GAAG,qBAAqB,CAAC;QAEzC,IAAI,OAAO,GAAG,6BAA6B,CAAC;QAC5C,IAAI,KAAK,GAAG,EAAE,CAAC;QAEf,IAAI,CAAC,CAAC,MAAM,YAAY,KAAK,EAAE,CAAC;YAC/B,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;YAC3B,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QAC9C,CAAC;aAAM,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YACzC,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC;QACpB,CAAC;QAED,KAAK,CAAC,UAAU,GAAG;YAClB,OAAO;YACP,KAAK;SACL,CAAC;QAEF,UAAU,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC,CAAC,CAAC;AACJ,CAAC"}