@grainql/analytics-web 2.2.1 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/dist/attribution.d.ts +47 -0
  2. package/dist/attribution.d.ts.map +1 -0
  3. package/dist/attribution.js +228 -0
  4. package/dist/cjs/attribution.d.ts +47 -0
  5. package/dist/cjs/attribution.d.ts.map +1 -0
  6. package/dist/cjs/attribution.js +228 -0
  7. package/dist/cjs/attribution.js.map +1 -0
  8. package/dist/cjs/countries.d.ts +13 -0
  9. package/dist/cjs/countries.d.ts.map +1 -0
  10. package/dist/cjs/countries.js +2907 -0
  11. package/dist/cjs/countries.js.map +1 -0
  12. package/dist/cjs/heartbeat.d.ts +1 -0
  13. package/dist/cjs/heartbeat.d.ts.map +1 -1
  14. package/dist/cjs/heartbeat.js +1 -1
  15. package/dist/cjs/heartbeat.js.map +1 -1
  16. package/dist/cjs/index.d.ts +26 -0
  17. package/dist/cjs/index.d.ts.map +1 -1
  18. package/dist/cjs/index.js.map +1 -1
  19. package/dist/cjs/page-tracking.d.ts +25 -0
  20. package/dist/cjs/page-tracking.d.ts.map +1 -1
  21. package/dist/cjs/page-tracking.js +162 -9
  22. package/dist/cjs/page-tracking.js.map +1 -1
  23. package/dist/countries.d.ts +13 -0
  24. package/dist/countries.d.ts.map +1 -0
  25. package/dist/countries.js +2907 -0
  26. package/dist/esm/attribution.d.ts +47 -0
  27. package/dist/esm/attribution.d.ts.map +1 -0
  28. package/dist/esm/attribution.js +218 -0
  29. package/dist/esm/attribution.js.map +1 -0
  30. package/dist/esm/countries.d.ts +13 -0
  31. package/dist/esm/countries.d.ts.map +1 -0
  32. package/dist/esm/countries.js +2902 -0
  33. package/dist/esm/countries.js.map +1 -0
  34. package/dist/esm/heartbeat.d.ts +1 -0
  35. package/dist/esm/heartbeat.d.ts.map +1 -1
  36. package/dist/esm/heartbeat.js +1 -1
  37. package/dist/esm/heartbeat.js.map +1 -1
  38. package/dist/esm/index.d.ts +26 -0
  39. package/dist/esm/index.d.ts.map +1 -1
  40. package/dist/esm/index.js.map +1 -1
  41. package/dist/esm/page-tracking.d.ts +25 -0
  42. package/dist/esm/page-tracking.d.ts.map +1 -1
  43. package/dist/esm/page-tracking.js +162 -9
  44. package/dist/esm/page-tracking.js.map +1 -1
  45. package/dist/heartbeat.d.ts +1 -0
  46. package/dist/heartbeat.d.ts.map +1 -1
  47. package/dist/heartbeat.js +1 -1
  48. package/dist/index.d.ts +26 -0
  49. package/dist/index.d.ts.map +1 -1
  50. package/dist/index.global.dev.js +3361 -11
  51. package/dist/index.global.dev.js.map +3 -3
  52. package/dist/index.global.js +2 -2
  53. package/dist/index.global.js.map +4 -4
  54. package/dist/index.js +162 -1
  55. package/dist/index.mjs +157 -0
  56. package/dist/page-tracking.d.ts +25 -0
  57. package/dist/page-tracking.d.ts.map +1 -1
  58. package/dist/page-tracking.js +162 -9
  59. package/package.json +1 -1
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Attribution and Referral Tracking for Grain Analytics
3
+ * Handles referral categorization and first-touch attribution
4
+ */
5
+ export type ReferrerCategory = 'organic' | 'paid' | 'social' | 'direct' | 'email' | 'referral';
6
+ export interface UTMParameters {
7
+ utm_source?: string;
8
+ utm_medium?: string;
9
+ utm_campaign?: string;
10
+ utm_term?: string;
11
+ utm_content?: string;
12
+ }
13
+ export interface FirstTouchAttribution {
14
+ source: string;
15
+ medium: string;
16
+ campaign: string;
17
+ referrer: string;
18
+ referrer_category: ReferrerCategory;
19
+ timestamp: number;
20
+ }
21
+ /**
22
+ * Categorize referrer based on domain and parameters
23
+ */
24
+ export declare function categorizeReferrer(referrer: string, currentUrl?: string): ReferrerCategory;
25
+ /**
26
+ * Parse UTM parameters from URL
27
+ */
28
+ export declare function parseUTMParameters(url: string): UTMParameters;
29
+ /**
30
+ * Get first-touch attribution from localStorage
31
+ */
32
+ export declare function getFirstTouchAttribution(tenantId: string): FirstTouchAttribution | null;
33
+ /**
34
+ * Set first-touch attribution in localStorage
35
+ */
36
+ export declare function setFirstTouchAttribution(tenantId: string, attribution: FirstTouchAttribution): void;
37
+ /**
38
+ * Get or create first-touch attribution
39
+ */
40
+ export declare function getOrCreateFirstTouchAttribution(tenantId: string, referrer: string, currentUrl: string, utmParams: UTMParameters): FirstTouchAttribution;
41
+ export declare function getSessionUTMParameters(): UTMParameters | null;
42
+ export declare function setSessionUTMParameters(params: UTMParameters): void;
43
+ /**
44
+ * Clear session UTM parameters
45
+ */
46
+ export declare function clearSessionUTMParameters(): void;
47
+ //# sourceMappingURL=attribution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attribution.d.ts","sourceRoot":"","sources":["../../src/attribution.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU,CAAC;AAE/F,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,gBAAgB,CAAC;IACpC,SAAS,EAAE,MAAM,CAAC;CACnB;AAkFD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,GAAE,MAAW,GAAG,gBAAgB,CAsC9F;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAqB7D;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,qBAAqB,GAAG,IAAI,CAgBvF;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,qBAAqB,GACjC,IAAI,CAWN;AAED;;GAEG;AACH,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,aAAa,GACvB,qBAAqB,CAwBvB;AAOD,wBAAgB,uBAAuB,IAAI,aAAa,GAAG,IAAI,CAE9D;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAEnE;AAED;;GAEG;AACH,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD"}
@@ -0,0 +1,218 @@
1
+ /**
2
+ * Attribution and Referral Tracking for Grain Analytics
3
+ * Handles referral categorization and first-touch attribution
4
+ */
5
+ /**
6
+ * Known paid search parameters
7
+ */
8
+ const PAID_SEARCH_PARAMS = [
9
+ 'gclid', // Google Ads
10
+ 'msclkid', // Microsoft Ads
11
+ 'fbclid', // Facebook Ads
12
+ 'ttclid', // TikTok Ads
13
+ 'li_fat_id', // LinkedIn Ads
14
+ 'twclid', // Twitter Ads
15
+ 'ScCid', // Snapchat Ads
16
+ ];
17
+ /**
18
+ * Known social media domains
19
+ */
20
+ const SOCIAL_DOMAINS = [
21
+ 'facebook.com',
22
+ 'twitter.com',
23
+ 'x.com',
24
+ 'linkedin.com',
25
+ 'instagram.com',
26
+ 'pinterest.com',
27
+ 'reddit.com',
28
+ 'tiktok.com',
29
+ 'youtube.com',
30
+ 'snapchat.com',
31
+ 't.co', // Twitter short links
32
+ 'fb.me', // Facebook short links
33
+ 'lnkd.in', // LinkedIn short links
34
+ ];
35
+ /**
36
+ * Known organic search engines
37
+ */
38
+ const SEARCH_ENGINES = [
39
+ 'google.',
40
+ 'bing.com',
41
+ 'yahoo.com',
42
+ 'duckduckgo.com',
43
+ 'baidu.com',
44
+ 'yandex.com',
45
+ 'ecosia.org',
46
+ 'ask.com',
47
+ ];
48
+ /**
49
+ * Email client domains
50
+ */
51
+ const EMAIL_DOMAINS = [
52
+ 'mail.google.com',
53
+ 'outlook.live.com',
54
+ 'mail.yahoo.com',
55
+ 'mail.aol.com',
56
+ ];
57
+ /**
58
+ * Extract domain from URL
59
+ */
60
+ function extractDomain(url) {
61
+ try {
62
+ const urlObj = new URL(url);
63
+ return urlObj.hostname.toLowerCase();
64
+ }
65
+ catch {
66
+ return '';
67
+ }
68
+ }
69
+ /**
70
+ * Check if URL contains paid search parameters
71
+ */
72
+ function hasPaidSearchParams(url) {
73
+ try {
74
+ const urlObj = new URL(url);
75
+ return PAID_SEARCH_PARAMS.some(param => urlObj.searchParams.has(param));
76
+ }
77
+ catch {
78
+ return false;
79
+ }
80
+ }
81
+ /**
82
+ * Categorize referrer based on domain and parameters
83
+ */
84
+ export function categorizeReferrer(referrer, currentUrl = '') {
85
+ // Direct traffic (no referrer)
86
+ if (!referrer || referrer.trim() === '') {
87
+ return 'direct';
88
+ }
89
+ const domain = extractDomain(referrer);
90
+ // Same domain = direct
91
+ if (currentUrl) {
92
+ const currentDomain = extractDomain(currentUrl);
93
+ if (domain === currentDomain) {
94
+ return 'direct';
95
+ }
96
+ }
97
+ // Check for paid search parameters
98
+ if (hasPaidSearchParams(referrer) || hasPaidSearchParams(currentUrl)) {
99
+ return 'paid';
100
+ }
101
+ // Email clients
102
+ if (EMAIL_DOMAINS.some(emailDomain => domain.includes(emailDomain))) {
103
+ return 'email';
104
+ }
105
+ // Social media
106
+ if (SOCIAL_DOMAINS.some(socialDomain => domain.includes(socialDomain))) {
107
+ return 'social';
108
+ }
109
+ // Organic search engines
110
+ if (SEARCH_ENGINES.some(searchEngine => domain.includes(searchEngine))) {
111
+ return 'organic';
112
+ }
113
+ // Everything else is referral
114
+ return 'referral';
115
+ }
116
+ /**
117
+ * Parse UTM parameters from URL
118
+ */
119
+ export function parseUTMParameters(url) {
120
+ try {
121
+ const urlObj = new URL(url);
122
+ const params = {};
123
+ const utmSource = urlObj.searchParams.get('utm_source');
124
+ const utmMedium = urlObj.searchParams.get('utm_medium');
125
+ const utmCampaign = urlObj.searchParams.get('utm_campaign');
126
+ const utmTerm = urlObj.searchParams.get('utm_term');
127
+ const utmContent = urlObj.searchParams.get('utm_content');
128
+ if (utmSource)
129
+ params.utm_source = utmSource;
130
+ if (utmMedium)
131
+ params.utm_medium = utmMedium;
132
+ if (utmCampaign)
133
+ params.utm_campaign = utmCampaign;
134
+ if (utmTerm)
135
+ params.utm_term = utmTerm;
136
+ if (utmContent)
137
+ params.utm_content = utmContent;
138
+ return params;
139
+ }
140
+ catch {
141
+ return {};
142
+ }
143
+ }
144
+ /**
145
+ * Get first-touch attribution from localStorage
146
+ */
147
+ export function getFirstTouchAttribution(tenantId) {
148
+ if (typeof window === 'undefined' || typeof localStorage === 'undefined') {
149
+ return null;
150
+ }
151
+ try {
152
+ const key = `_grain_first_touch_${tenantId}`;
153
+ const stored = localStorage.getItem(key);
154
+ if (stored) {
155
+ return JSON.parse(stored);
156
+ }
157
+ }
158
+ catch (error) {
159
+ console.warn('[Grain Attribution] Failed to retrieve first-touch attribution:', error);
160
+ }
161
+ return null;
162
+ }
163
+ /**
164
+ * Set first-touch attribution in localStorage
165
+ */
166
+ export function setFirstTouchAttribution(tenantId, attribution) {
167
+ if (typeof window === 'undefined' || typeof localStorage === 'undefined') {
168
+ return;
169
+ }
170
+ try {
171
+ const key = `_grain_first_touch_${tenantId}`;
172
+ localStorage.setItem(key, JSON.stringify(attribution));
173
+ }
174
+ catch (error) {
175
+ console.warn('[Grain Attribution] Failed to store first-touch attribution:', error);
176
+ }
177
+ }
178
+ /**
179
+ * Get or create first-touch attribution
180
+ */
181
+ export function getOrCreateFirstTouchAttribution(tenantId, referrer, currentUrl, utmParams) {
182
+ // Try to get existing first-touch
183
+ const existing = getFirstTouchAttribution(tenantId);
184
+ if (existing) {
185
+ return existing;
186
+ }
187
+ // Create new first-touch attribution
188
+ const referrerCategory = categorizeReferrer(referrer, currentUrl);
189
+ const referrerDomain = extractDomain(referrer);
190
+ const firstTouch = {
191
+ source: utmParams.utm_source || referrerDomain || 'direct',
192
+ medium: utmParams.utm_medium || referrerCategory,
193
+ campaign: utmParams.utm_campaign || 'none',
194
+ referrer: referrer || 'direct',
195
+ referrer_category: referrerCategory,
196
+ timestamp: Date.now(),
197
+ };
198
+ // Store it
199
+ setFirstTouchAttribution(tenantId, firstTouch);
200
+ return firstTouch;
201
+ }
202
+ /**
203
+ * Get session UTM parameters (memory-only, not persisted across page loads)
204
+ */
205
+ let sessionUTMParams = null;
206
+ export function getSessionUTMParameters() {
207
+ return sessionUTMParams;
208
+ }
209
+ export function setSessionUTMParameters(params) {
210
+ sessionUTMParams = params;
211
+ }
212
+ /**
213
+ * Clear session UTM parameters
214
+ */
215
+ export function clearSessionUTMParameters() {
216
+ sessionUTMParams = null;
217
+ }
218
+ //# sourceMappingURL=attribution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attribution.js","sourceRoot":"","sources":["../../src/attribution.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Get full country name from user's timezone
3
+ * @returns Full country name or null if timezone is unavailable
4
+ */
5
+ export declare function getCountry(): string | null;
6
+ /**
7
+ * Get country code (ISO 3166-1 alpha-2) from user's timezone
8
+ * Privacy-friendly alternative to IP geolocation
9
+ * @returns ISO 3166-1 alpha-2 country code (e.g., "US", "GB") or "Unknown"
10
+ */
11
+ export declare function getCountryCodeFromTimezone(): string;
12
+ export declare function getState(): string | null;
13
+ //# sourceMappingURL=countries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"countries.d.ts","sourceRoot":"","sources":["../../src/countries.ts"],"names":[],"mappings":"AAyyFA;;;GAGG;AACH,wBAAgB,UAAU,IAAI,MAAM,GAAG,IAAI,CAe1C;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,IAAI,MAAM,CAanD;AAED,wBAAgB,QAAQ,IAAI,MAAM,GAAG,IAAI,CAUxC"}