@grainql/analytics-web 2.0.0 → 2.1.1

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 (178) hide show
  1. package/dist/activity.d.ts +59 -0
  2. package/dist/activity.d.ts.map +1 -0
  3. package/dist/activity.js +131 -0
  4. package/dist/cjs/activity.d.ts +59 -0
  5. package/dist/cjs/activity.d.ts.map +1 -0
  6. package/dist/cjs/activity.js +131 -0
  7. package/dist/cjs/activity.js.map +1 -0
  8. package/dist/cjs/consent.d.ts +68 -0
  9. package/dist/cjs/consent.d.ts.map +1 -0
  10. package/dist/cjs/consent.js +191 -0
  11. package/dist/cjs/consent.js.map +1 -0
  12. package/dist/cjs/cookies.d.ts +28 -0
  13. package/dist/cjs/cookies.d.ts.map +1 -0
  14. package/dist/cjs/cookies.js +95 -0
  15. package/dist/cjs/cookies.js.map +1 -0
  16. package/dist/cjs/heartbeat.d.ts +42 -0
  17. package/dist/cjs/heartbeat.d.ts.map +1 -0
  18. package/dist/cjs/heartbeat.js +92 -0
  19. package/dist/cjs/heartbeat.js.map +1 -0
  20. package/dist/cjs/index.d.ts +100 -3
  21. package/dist/cjs/index.d.ts.map +1 -1
  22. package/dist/cjs/index.js.map +1 -1
  23. package/dist/cjs/page-tracking.d.ts +60 -0
  24. package/dist/cjs/page-tracking.d.ts.map +1 -0
  25. package/dist/cjs/page-tracking.js +180 -0
  26. package/dist/cjs/page-tracking.js.map +1 -0
  27. package/dist/cjs/react/components/ConsentBanner.d.ts +16 -0
  28. package/dist/cjs/react/components/ConsentBanner.d.ts.map +1 -0
  29. package/dist/cjs/react/components/ConsentBanner.js +112 -0
  30. package/dist/cjs/react/components/ConsentBanner.js.map +1 -0
  31. package/dist/cjs/react/components/CookieNotice.d.ts +12 -0
  32. package/dist/cjs/react/components/CookieNotice.d.ts.map +1 -0
  33. package/dist/cjs/react/components/CookieNotice.js +62 -0
  34. package/dist/cjs/react/components/CookieNotice.js.map +1 -0
  35. package/dist/cjs/react/components/PrivacyPreferenceCenter.d.ts +12 -0
  36. package/dist/cjs/react/components/PrivacyPreferenceCenter.d.ts.map +1 -0
  37. package/dist/cjs/react/components/PrivacyPreferenceCenter.js +120 -0
  38. package/dist/cjs/react/components/PrivacyPreferenceCenter.js.map +1 -0
  39. package/dist/cjs/react/hooks/useConsent.d.ts +13 -0
  40. package/dist/cjs/react/hooks/useConsent.d.ts.map +1 -0
  41. package/dist/cjs/react/hooks/useConsent.js +84 -0
  42. package/dist/cjs/react/hooks/useConsent.js.map +1 -0
  43. package/dist/cjs/react/hooks/useDataDeletion.d.ts +17 -0
  44. package/dist/cjs/react/hooks/useDataDeletion.d.ts.map +1 -0
  45. package/dist/cjs/react/hooks/useDataDeletion.js +117 -0
  46. package/dist/cjs/react/hooks/useDataDeletion.js.map +1 -0
  47. package/dist/cjs/react/hooks/usePrivacyPreferences.d.ts +15 -0
  48. package/dist/cjs/react/hooks/usePrivacyPreferences.d.ts.map +1 -0
  49. package/dist/cjs/react/hooks/usePrivacyPreferences.js +82 -0
  50. package/dist/cjs/react/hooks/usePrivacyPreferences.js.map +1 -0
  51. package/dist/cjs/react/index.d.ts +11 -0
  52. package/dist/cjs/react/index.d.ts.map +1 -1
  53. package/dist/cjs/react/index.js +15 -1
  54. package/dist/cjs/react/index.js.map +1 -1
  55. package/dist/consent.d.ts +68 -0
  56. package/dist/consent.d.ts.map +1 -0
  57. package/dist/consent.js +191 -0
  58. package/dist/cookies.d.ts +28 -0
  59. package/dist/cookies.d.ts.map +1 -0
  60. package/dist/cookies.js +95 -0
  61. package/dist/esm/activity.d.ts +59 -0
  62. package/dist/esm/activity.d.ts.map +1 -0
  63. package/dist/esm/activity.js +127 -0
  64. package/dist/esm/activity.js.map +1 -0
  65. package/dist/esm/consent.d.ts +68 -0
  66. package/dist/esm/consent.d.ts.map +1 -0
  67. package/dist/esm/consent.js +187 -0
  68. package/dist/esm/consent.js.map +1 -0
  69. package/dist/esm/cookies.d.ts +28 -0
  70. package/dist/esm/cookies.d.ts.map +1 -0
  71. package/dist/esm/cookies.js +89 -0
  72. package/dist/esm/cookies.js.map +1 -0
  73. package/dist/esm/heartbeat.d.ts +42 -0
  74. package/dist/esm/heartbeat.d.ts.map +1 -0
  75. package/dist/esm/heartbeat.js +88 -0
  76. package/dist/esm/heartbeat.js.map +1 -0
  77. package/dist/esm/index.d.ts +100 -3
  78. package/dist/esm/index.d.ts.map +1 -1
  79. package/dist/esm/index.js.map +1 -1
  80. package/dist/esm/page-tracking.d.ts +60 -0
  81. package/dist/esm/page-tracking.d.ts.map +1 -0
  82. package/dist/esm/page-tracking.js +176 -0
  83. package/dist/esm/page-tracking.js.map +1 -0
  84. package/dist/esm/react/components/ConsentBanner.d.ts +16 -0
  85. package/dist/esm/react/components/ConsentBanner.d.ts.map +1 -0
  86. package/dist/esm/react/components/ConsentBanner.js +76 -0
  87. package/dist/esm/react/components/ConsentBanner.js.map +1 -0
  88. package/dist/esm/react/components/CookieNotice.d.ts +12 -0
  89. package/dist/esm/react/components/CookieNotice.d.ts.map +1 -0
  90. package/dist/esm/react/components/CookieNotice.js +26 -0
  91. package/dist/esm/react/components/CookieNotice.js.map +1 -0
  92. package/dist/esm/react/components/PrivacyPreferenceCenter.d.ts +12 -0
  93. package/dist/esm/react/components/PrivacyPreferenceCenter.d.ts.map +1 -0
  94. package/dist/esm/react/components/PrivacyPreferenceCenter.js +84 -0
  95. package/dist/esm/react/components/PrivacyPreferenceCenter.js.map +1 -0
  96. package/dist/esm/react/hooks/useConsent.d.ts +13 -0
  97. package/dist/esm/react/hooks/useConsent.d.ts.map +1 -0
  98. package/dist/esm/react/hooks/useConsent.js +48 -0
  99. package/dist/esm/react/hooks/useConsent.js.map +1 -0
  100. package/dist/esm/react/hooks/useDataDeletion.d.ts +17 -0
  101. package/dist/esm/react/hooks/useDataDeletion.d.ts.map +1 -0
  102. package/dist/esm/react/hooks/useDataDeletion.js +81 -0
  103. package/dist/esm/react/hooks/useDataDeletion.js.map +1 -0
  104. package/dist/esm/react/hooks/usePrivacyPreferences.d.ts +15 -0
  105. package/dist/esm/react/hooks/usePrivacyPreferences.d.ts.map +1 -0
  106. package/dist/esm/react/hooks/usePrivacyPreferences.js +46 -0
  107. package/dist/esm/react/hooks/usePrivacyPreferences.js.map +1 -0
  108. package/dist/esm/react/index.d.ts +11 -0
  109. package/dist/esm/react/index.d.ts.map +1 -1
  110. package/dist/esm/react/index.js +8 -0
  111. package/dist/esm/react/index.js.map +1 -1
  112. package/dist/heartbeat.d.ts +42 -0
  113. package/dist/heartbeat.d.ts.map +1 -0
  114. package/dist/heartbeat.js +92 -0
  115. package/dist/index.d.ts +100 -3
  116. package/dist/index.d.ts.map +1 -1
  117. package/dist/index.global.dev.js +903 -12
  118. package/dist/index.global.dev.js.map +3 -3
  119. package/dist/index.global.js +2 -2
  120. package/dist/index.global.js.map +4 -4
  121. package/dist/index.js +321 -11
  122. package/dist/index.mjs +321 -11
  123. package/dist/page-tracking.d.ts +60 -0
  124. package/dist/page-tracking.d.ts.map +1 -0
  125. package/dist/page-tracking.js +180 -0
  126. package/dist/react/activity.d.ts +59 -0
  127. package/dist/react/activity.d.ts.map +1 -0
  128. package/dist/react/activity.js +130 -0
  129. package/dist/react/activity.mjs +126 -0
  130. package/dist/react/consent.d.ts +68 -0
  131. package/dist/react/consent.d.ts.map +1 -0
  132. package/dist/react/consent.js +190 -0
  133. package/dist/react/consent.mjs +186 -0
  134. package/dist/react/cookies.d.ts +28 -0
  135. package/dist/react/cookies.d.ts.map +1 -0
  136. package/dist/react/cookies.js +94 -0
  137. package/dist/react/cookies.mjs +88 -0
  138. package/dist/react/heartbeat.d.ts +42 -0
  139. package/dist/react/heartbeat.d.ts.map +1 -0
  140. package/dist/react/heartbeat.js +91 -0
  141. package/dist/react/heartbeat.mjs +87 -0
  142. package/dist/react/index.d.ts +100 -3
  143. package/dist/react/index.d.ts.map +1 -1
  144. package/dist/react/index.js +321 -11
  145. package/dist/react/index.mjs +321 -11
  146. package/dist/react/page-tracking.d.ts +60 -0
  147. package/dist/react/page-tracking.d.ts.map +1 -0
  148. package/dist/react/page-tracking.js +179 -0
  149. package/dist/react/page-tracking.mjs +175 -0
  150. package/dist/react/react/components/ConsentBanner.d.ts +16 -0
  151. package/dist/react/react/components/ConsentBanner.d.ts.map +1 -0
  152. package/dist/react/react/components/ConsentBanner.js +78 -0
  153. package/dist/react/react/components/ConsentBanner.mjs +75 -0
  154. package/dist/react/react/components/CookieNotice.d.ts +12 -0
  155. package/dist/react/react/components/CookieNotice.d.ts.map +1 -0
  156. package/dist/react/react/components/CookieNotice.js +28 -0
  157. package/dist/react/react/components/CookieNotice.mjs +25 -0
  158. package/dist/react/react/components/PrivacyPreferenceCenter.d.ts +12 -0
  159. package/dist/react/react/components/PrivacyPreferenceCenter.d.ts.map +1 -0
  160. package/dist/react/react/components/PrivacyPreferenceCenter.js +86 -0
  161. package/dist/react/react/components/PrivacyPreferenceCenter.mjs +83 -0
  162. package/dist/react/react/hooks/useConsent.d.ts +13 -0
  163. package/dist/react/react/hooks/useConsent.d.ts.map +1 -0
  164. package/dist/react/react/hooks/useConsent.js +50 -0
  165. package/dist/react/react/hooks/useConsent.mjs +47 -0
  166. package/dist/react/react/hooks/useDataDeletion.d.ts +17 -0
  167. package/dist/react/react/hooks/useDataDeletion.d.ts.map +1 -0
  168. package/dist/react/react/hooks/useDataDeletion.js +83 -0
  169. package/dist/react/react/hooks/useDataDeletion.mjs +80 -0
  170. package/dist/react/react/hooks/usePrivacyPreferences.d.ts +15 -0
  171. package/dist/react/react/hooks/usePrivacyPreferences.d.ts.map +1 -0
  172. package/dist/react/react/hooks/usePrivacyPreferences.js +48 -0
  173. package/dist/react/react/hooks/usePrivacyPreferences.mjs +45 -0
  174. package/dist/react/react/index.d.ts +11 -0
  175. package/dist/react/react/index.d.ts.map +1 -1
  176. package/dist/react/react/index.js +15 -1
  177. package/dist/react/react/index.mjs +8 -0
  178. package/package.json +3 -3
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Activity Detection for Grain Analytics
3
+ * Tracks user activity (mouse, keyboard, touch, scroll) to determine if user is active
4
+ */
5
+ export declare class ActivityDetector {
6
+ private lastActivityTime;
7
+ private activityThreshold;
8
+ private listeners;
9
+ private boundActivityHandler;
10
+ private isDestroyed;
11
+ private readonly activityEvents;
12
+ constructor();
13
+ /**
14
+ * Setup event listeners for activity detection
15
+ */
16
+ private setupListeners;
17
+ /**
18
+ * Handle activity event
19
+ */
20
+ private handleActivity;
21
+ /**
22
+ * Debounce function to limit how often activity handler is called
23
+ */
24
+ private debounce;
25
+ /**
26
+ * Check if user is currently active
27
+ * @param threshold Time in ms to consider user inactive (default: 30s)
28
+ */
29
+ isActive(threshold?: number): boolean;
30
+ /**
31
+ * Get time since last activity in milliseconds
32
+ */
33
+ getTimeSinceLastActivity(): number;
34
+ /**
35
+ * Get last activity timestamp
36
+ */
37
+ getLastActivityTime(): number;
38
+ /**
39
+ * Set activity threshold
40
+ */
41
+ setActivityThreshold(threshold: number): void;
42
+ /**
43
+ * Add listener for activity changes
44
+ */
45
+ addListener(listener: () => void): void;
46
+ /**
47
+ * Remove listener
48
+ */
49
+ removeListener(listener: () => void): void;
50
+ /**
51
+ * Notify all listeners
52
+ */
53
+ private notifyListeners;
54
+ /**
55
+ * Cleanup and remove listeners
56
+ */
57
+ destroy(): void;
58
+ }
59
+ //# sourceMappingURL=activity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity.d.ts","sourceRoot":"","sources":["../src/activity.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,iBAAiB,CAAiB;IAC1C,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,oBAAoB,CAAa;IACzC,OAAO,CAAC,WAAW,CAAS;IAG5B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAOpB;;IAQX;;OAEG;IACH,OAAO,CAAC,cAAc;IAQtB;;OAEG;IACH,OAAO,CAAC,cAAc;IAMtB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAehB;;;OAGG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO;IAMrC;;OAEG;IACH,wBAAwB,IAAI,MAAM;IAIlC;;OAEG;IACH,mBAAmB,IAAI,MAAM;IAI7B;;OAEG;IACH,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAI7C;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;IAIvC;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;IAO1C;;OAEG;IACH,OAAO,CAAC,eAAe;IAUvB;;OAEG;IACH,OAAO,IAAI,IAAI;CAYhB"}
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ /**
3
+ * Activity Detection for Grain Analytics
4
+ * Tracks user activity (mouse, keyboard, touch, scroll) to determine if user is active
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.ActivityDetector = void 0;
8
+ class ActivityDetector {
9
+ constructor() {
10
+ this.activityThreshold = 30000; // 30 seconds
11
+ this.listeners = [];
12
+ this.isDestroyed = false;
13
+ // Events that indicate user activity
14
+ this.activityEvents = [
15
+ 'mousemove',
16
+ 'mousedown',
17
+ 'keydown',
18
+ 'scroll',
19
+ 'touchstart',
20
+ 'click',
21
+ ];
22
+ this.lastActivityTime = Date.now();
23
+ this.boundActivityHandler = this.debounce(this.handleActivity.bind(this), 500);
24
+ this.setupListeners();
25
+ }
26
+ /**
27
+ * Setup event listeners for activity detection
28
+ */
29
+ setupListeners() {
30
+ if (typeof window === 'undefined')
31
+ return;
32
+ for (const event of this.activityEvents) {
33
+ window.addEventListener(event, this.boundActivityHandler, { passive: true });
34
+ }
35
+ }
36
+ /**
37
+ * Handle activity event
38
+ */
39
+ handleActivity() {
40
+ if (this.isDestroyed)
41
+ return;
42
+ this.lastActivityTime = Date.now();
43
+ this.notifyListeners();
44
+ }
45
+ /**
46
+ * Debounce function to limit how often activity handler is called
47
+ */
48
+ debounce(func, wait) {
49
+ let timeout = null;
50
+ return () => {
51
+ if (timeout !== null) {
52
+ clearTimeout(timeout);
53
+ }
54
+ timeout = window.setTimeout(() => {
55
+ func();
56
+ timeout = null;
57
+ }, wait);
58
+ };
59
+ }
60
+ /**
61
+ * Check if user is currently active
62
+ * @param threshold Time in ms to consider user inactive (default: 30s)
63
+ */
64
+ isActive(threshold) {
65
+ const thresholdToUse = threshold ?? this.activityThreshold;
66
+ const now = Date.now();
67
+ return (now - this.lastActivityTime) < thresholdToUse;
68
+ }
69
+ /**
70
+ * Get time since last activity in milliseconds
71
+ */
72
+ getTimeSinceLastActivity() {
73
+ return Date.now() - this.lastActivityTime;
74
+ }
75
+ /**
76
+ * Get last activity timestamp
77
+ */
78
+ getLastActivityTime() {
79
+ return this.lastActivityTime;
80
+ }
81
+ /**
82
+ * Set activity threshold
83
+ */
84
+ setActivityThreshold(threshold) {
85
+ this.activityThreshold = threshold;
86
+ }
87
+ /**
88
+ * Add listener for activity changes
89
+ */
90
+ addListener(listener) {
91
+ this.listeners.push(listener);
92
+ }
93
+ /**
94
+ * Remove listener
95
+ */
96
+ removeListener(listener) {
97
+ const index = this.listeners.indexOf(listener);
98
+ if (index > -1) {
99
+ this.listeners.splice(index, 1);
100
+ }
101
+ }
102
+ /**
103
+ * Notify all listeners
104
+ */
105
+ notifyListeners() {
106
+ for (const listener of this.listeners) {
107
+ try {
108
+ listener();
109
+ }
110
+ catch (error) {
111
+ console.error('[Activity Detector] Listener error:', error);
112
+ }
113
+ }
114
+ }
115
+ /**
116
+ * Cleanup and remove listeners
117
+ */
118
+ destroy() {
119
+ if (this.isDestroyed)
120
+ return;
121
+ if (typeof window !== 'undefined') {
122
+ for (const event of this.activityEvents) {
123
+ window.removeEventListener(event, this.boundActivityHandler);
124
+ }
125
+ }
126
+ this.listeners = [];
127
+ this.isDestroyed = true;
128
+ }
129
+ }
130
+ exports.ActivityDetector = ActivityDetector;
131
+ //# sourceMappingURL=activity.js.map
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Activity Detection for Grain Analytics
3
+ * Tracks user activity (mouse, keyboard, touch, scroll) to determine if user is active
4
+ */
5
+ export declare class ActivityDetector {
6
+ private lastActivityTime;
7
+ private activityThreshold;
8
+ private listeners;
9
+ private boundActivityHandler;
10
+ private isDestroyed;
11
+ private readonly activityEvents;
12
+ constructor();
13
+ /**
14
+ * Setup event listeners for activity detection
15
+ */
16
+ private setupListeners;
17
+ /**
18
+ * Handle activity event
19
+ */
20
+ private handleActivity;
21
+ /**
22
+ * Debounce function to limit how often activity handler is called
23
+ */
24
+ private debounce;
25
+ /**
26
+ * Check if user is currently active
27
+ * @param threshold Time in ms to consider user inactive (default: 30s)
28
+ */
29
+ isActive(threshold?: number): boolean;
30
+ /**
31
+ * Get time since last activity in milliseconds
32
+ */
33
+ getTimeSinceLastActivity(): number;
34
+ /**
35
+ * Get last activity timestamp
36
+ */
37
+ getLastActivityTime(): number;
38
+ /**
39
+ * Set activity threshold
40
+ */
41
+ setActivityThreshold(threshold: number): void;
42
+ /**
43
+ * Add listener for activity changes
44
+ */
45
+ addListener(listener: () => void): void;
46
+ /**
47
+ * Remove listener
48
+ */
49
+ removeListener(listener: () => void): void;
50
+ /**
51
+ * Notify all listeners
52
+ */
53
+ private notifyListeners;
54
+ /**
55
+ * Cleanup and remove listeners
56
+ */
57
+ destroy(): void;
58
+ }
59
+ //# sourceMappingURL=activity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity.d.ts","sourceRoot":"","sources":["../../src/activity.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,iBAAiB,CAAiB;IAC1C,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,oBAAoB,CAAa;IACzC,OAAO,CAAC,WAAW,CAAS;IAG5B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAOpB;;IAQX;;OAEG;IACH,OAAO,CAAC,cAAc;IAQtB;;OAEG;IACH,OAAO,CAAC,cAAc;IAMtB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAehB;;;OAGG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO;IAMrC;;OAEG;IACH,wBAAwB,IAAI,MAAM;IAIlC;;OAEG;IACH,mBAAmB,IAAI,MAAM;IAI7B;;OAEG;IACH,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAI7C;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;IAIvC;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;IAO1C;;OAEG;IACH,OAAO,CAAC,eAAe;IAUvB;;OAEG;IACH,OAAO,IAAI,IAAI;CAYhB"}
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ /**
3
+ * Activity Detection for Grain Analytics
4
+ * Tracks user activity (mouse, keyboard, touch, scroll) to determine if user is active
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.ActivityDetector = void 0;
8
+ class ActivityDetector {
9
+ constructor() {
10
+ this.activityThreshold = 30000; // 30 seconds
11
+ this.listeners = [];
12
+ this.isDestroyed = false;
13
+ // Events that indicate user activity
14
+ this.activityEvents = [
15
+ 'mousemove',
16
+ 'mousedown',
17
+ 'keydown',
18
+ 'scroll',
19
+ 'touchstart',
20
+ 'click',
21
+ ];
22
+ this.lastActivityTime = Date.now();
23
+ this.boundActivityHandler = this.debounce(this.handleActivity.bind(this), 500);
24
+ this.setupListeners();
25
+ }
26
+ /**
27
+ * Setup event listeners for activity detection
28
+ */
29
+ setupListeners() {
30
+ if (typeof window === 'undefined')
31
+ return;
32
+ for (const event of this.activityEvents) {
33
+ window.addEventListener(event, this.boundActivityHandler, { passive: true });
34
+ }
35
+ }
36
+ /**
37
+ * Handle activity event
38
+ */
39
+ handleActivity() {
40
+ if (this.isDestroyed)
41
+ return;
42
+ this.lastActivityTime = Date.now();
43
+ this.notifyListeners();
44
+ }
45
+ /**
46
+ * Debounce function to limit how often activity handler is called
47
+ */
48
+ debounce(func, wait) {
49
+ let timeout = null;
50
+ return () => {
51
+ if (timeout !== null) {
52
+ clearTimeout(timeout);
53
+ }
54
+ timeout = window.setTimeout(() => {
55
+ func();
56
+ timeout = null;
57
+ }, wait);
58
+ };
59
+ }
60
+ /**
61
+ * Check if user is currently active
62
+ * @param threshold Time in ms to consider user inactive (default: 30s)
63
+ */
64
+ isActive(threshold) {
65
+ const thresholdToUse = threshold ?? this.activityThreshold;
66
+ const now = Date.now();
67
+ return (now - this.lastActivityTime) < thresholdToUse;
68
+ }
69
+ /**
70
+ * Get time since last activity in milliseconds
71
+ */
72
+ getTimeSinceLastActivity() {
73
+ return Date.now() - this.lastActivityTime;
74
+ }
75
+ /**
76
+ * Get last activity timestamp
77
+ */
78
+ getLastActivityTime() {
79
+ return this.lastActivityTime;
80
+ }
81
+ /**
82
+ * Set activity threshold
83
+ */
84
+ setActivityThreshold(threshold) {
85
+ this.activityThreshold = threshold;
86
+ }
87
+ /**
88
+ * Add listener for activity changes
89
+ */
90
+ addListener(listener) {
91
+ this.listeners.push(listener);
92
+ }
93
+ /**
94
+ * Remove listener
95
+ */
96
+ removeListener(listener) {
97
+ const index = this.listeners.indexOf(listener);
98
+ if (index > -1) {
99
+ this.listeners.splice(index, 1);
100
+ }
101
+ }
102
+ /**
103
+ * Notify all listeners
104
+ */
105
+ notifyListeners() {
106
+ for (const listener of this.listeners) {
107
+ try {
108
+ listener();
109
+ }
110
+ catch (error) {
111
+ console.error('[Activity Detector] Listener error:', error);
112
+ }
113
+ }
114
+ }
115
+ /**
116
+ * Cleanup and remove listeners
117
+ */
118
+ destroy() {
119
+ if (this.isDestroyed)
120
+ return;
121
+ if (typeof window !== 'undefined') {
122
+ for (const event of this.activityEvents) {
123
+ window.removeEventListener(event, this.boundActivityHandler);
124
+ }
125
+ }
126
+ this.listeners = [];
127
+ this.isDestroyed = true;
128
+ }
129
+ }
130
+ exports.ActivityDetector = ActivityDetector;
131
+ //# sourceMappingURL=activity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity.js","sourceRoot":"","sources":["../../src/activity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Consent management for Grain Analytics
3
+ * Handles GDPR-compliant consent tracking and state management
4
+ */
5
+ export type ConsentMode = 'opt-in' | 'opt-out' | 'disabled';
6
+ export interface ConsentState {
7
+ granted: boolean;
8
+ categories: string[];
9
+ timestamp: Date;
10
+ version: string;
11
+ }
12
+ export declare const DEFAULT_CONSENT_CATEGORIES: string[];
13
+ export declare const CONSENT_VERSION = "1.0.0";
14
+ /**
15
+ * Consent manager for handling user consent state
16
+ */
17
+ export declare class ConsentManager {
18
+ private consentState;
19
+ private consentMode;
20
+ private storageKey;
21
+ private listeners;
22
+ constructor(tenantId: string, consentMode?: ConsentMode);
23
+ /**
24
+ * Load consent state from localStorage
25
+ */
26
+ private loadConsentState;
27
+ /**
28
+ * Save consent state to localStorage
29
+ */
30
+ private saveConsentState;
31
+ /**
32
+ * Grant consent with optional categories
33
+ */
34
+ grantConsent(categories?: string[]): void;
35
+ /**
36
+ * Revoke consent (opt-out)
37
+ */
38
+ revokeConsent(categories?: string[]): void;
39
+ /**
40
+ * Get current consent state
41
+ */
42
+ getConsentState(): ConsentState | null;
43
+ /**
44
+ * Check if user has granted consent
45
+ */
46
+ hasConsent(category?: string): boolean;
47
+ /**
48
+ * Check if we should wait for consent before tracking
49
+ */
50
+ shouldWaitForConsent(): boolean;
51
+ /**
52
+ * Add consent change listener
53
+ */
54
+ addListener(listener: (state: ConsentState) => void): void;
55
+ /**
56
+ * Remove consent change listener
57
+ */
58
+ removeListener(listener: (state: ConsentState) => void): void;
59
+ /**
60
+ * Notify all listeners of consent state change
61
+ */
62
+ private notifyListeners;
63
+ /**
64
+ * Clear all consent data
65
+ */
66
+ clearConsent(): void;
67
+ }
68
+ //# sourceMappingURL=consent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consent.d.ts","sourceRoot":"","sources":["../../src/consent.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC;AAE5D,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,0BAA0B,UAA2C,CAAC;AACnF,eAAO,MAAM,eAAe,UAAU,CAAC;AAEvC;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,SAAS,CAA4C;gBAEjD,QAAQ,EAAE,MAAM,EAAE,WAAW,GAAE,WAAuB;IAMlE;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA0BxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAUxB;;OAEG;IACH,YAAY,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI;IAczC;;OAEG;IACH,aAAa,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI;IA8B1C;;OAEG;IACH,eAAe,IAAI,YAAY,GAAG,IAAI;IAItC;;OAEG;IACH,UAAU,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO;IAwBtC;;OAEG;IACH,oBAAoB,IAAI,OAAO;IAI/B;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,GAAG,IAAI;IAI1D;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,GAAG,IAAI;IAO7D;;OAEG;IACH,OAAO,CAAC,eAAe;IAYvB;;OAEG;IACH,YAAY,IAAI,IAAI;CAUrB"}
@@ -0,0 +1,191 @@
1
+ "use strict";
2
+ /**
3
+ * Consent management for Grain Analytics
4
+ * Handles GDPR-compliant consent tracking and state management
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.ConsentManager = exports.CONSENT_VERSION = exports.DEFAULT_CONSENT_CATEGORIES = void 0;
8
+ exports.DEFAULT_CONSENT_CATEGORIES = ['necessary', 'analytics', 'functional'];
9
+ exports.CONSENT_VERSION = '1.0.0';
10
+ /**
11
+ * Consent manager for handling user consent state
12
+ */
13
+ class ConsentManager {
14
+ constructor(tenantId, consentMode = 'opt-out') {
15
+ this.consentState = null;
16
+ this.listeners = [];
17
+ this.consentMode = consentMode;
18
+ this.storageKey = `grain_consent_${tenantId}`;
19
+ this.loadConsentState();
20
+ }
21
+ /**
22
+ * Load consent state from localStorage
23
+ */
24
+ loadConsentState() {
25
+ if (typeof window === 'undefined')
26
+ return;
27
+ try {
28
+ const stored = localStorage.getItem(this.storageKey);
29
+ if (stored) {
30
+ const parsed = JSON.parse(stored);
31
+ this.consentState = {
32
+ ...parsed,
33
+ timestamp: new Date(parsed.timestamp),
34
+ };
35
+ }
36
+ else if (this.consentMode === 'opt-out' || this.consentMode === 'disabled') {
37
+ // Auto-grant consent for opt-out and disabled modes
38
+ this.consentState = {
39
+ granted: true,
40
+ categories: exports.DEFAULT_CONSENT_CATEGORIES,
41
+ timestamp: new Date(),
42
+ version: exports.CONSENT_VERSION,
43
+ };
44
+ this.saveConsentState();
45
+ }
46
+ }
47
+ catch (error) {
48
+ console.error('[Grain Consent] Failed to load consent state:', error);
49
+ }
50
+ }
51
+ /**
52
+ * Save consent state to localStorage
53
+ */
54
+ saveConsentState() {
55
+ if (typeof window === 'undefined' || !this.consentState)
56
+ return;
57
+ try {
58
+ localStorage.setItem(this.storageKey, JSON.stringify(this.consentState));
59
+ }
60
+ catch (error) {
61
+ console.error('[Grain Consent] Failed to save consent state:', error);
62
+ }
63
+ }
64
+ /**
65
+ * Grant consent with optional categories
66
+ */
67
+ grantConsent(categories) {
68
+ const grantedCategories = categories || exports.DEFAULT_CONSENT_CATEGORIES;
69
+ this.consentState = {
70
+ granted: true,
71
+ categories: grantedCategories,
72
+ timestamp: new Date(),
73
+ version: exports.CONSENT_VERSION,
74
+ };
75
+ this.saveConsentState();
76
+ this.notifyListeners();
77
+ }
78
+ /**
79
+ * Revoke consent (opt-out)
80
+ */
81
+ revokeConsent(categories) {
82
+ if (!this.consentState) {
83
+ this.consentState = {
84
+ granted: false,
85
+ categories: [],
86
+ timestamp: new Date(),
87
+ version: exports.CONSENT_VERSION,
88
+ };
89
+ }
90
+ else if (categories) {
91
+ // Remove specific categories
92
+ this.consentState = {
93
+ ...this.consentState,
94
+ categories: this.consentState.categories.filter(cat => !categories.includes(cat)),
95
+ granted: this.consentState.categories.length > 0,
96
+ timestamp: new Date(),
97
+ };
98
+ }
99
+ else {
100
+ // Revoke all consent
101
+ this.consentState = {
102
+ granted: false,
103
+ categories: [],
104
+ timestamp: new Date(),
105
+ version: exports.CONSENT_VERSION,
106
+ };
107
+ }
108
+ this.saveConsentState();
109
+ this.notifyListeners();
110
+ }
111
+ /**
112
+ * Get current consent state
113
+ */
114
+ getConsentState() {
115
+ return this.consentState ? { ...this.consentState } : null;
116
+ }
117
+ /**
118
+ * Check if user has granted consent
119
+ */
120
+ hasConsent(category) {
121
+ // Disabled mode always returns true (no consent required)
122
+ if (this.consentMode === 'disabled') {
123
+ return true;
124
+ }
125
+ // No consent state in opt-in mode means no consent
126
+ if (this.consentMode === 'opt-in' && !this.consentState) {
127
+ return false;
128
+ }
129
+ // Check consent state
130
+ if (!this.consentState?.granted) {
131
+ return false;
132
+ }
133
+ // Check specific category if provided
134
+ if (category) {
135
+ return this.consentState.categories.includes(category);
136
+ }
137
+ return true;
138
+ }
139
+ /**
140
+ * Check if we should wait for consent before tracking
141
+ */
142
+ shouldWaitForConsent() {
143
+ return this.consentMode === 'opt-in' && !this.consentState?.granted;
144
+ }
145
+ /**
146
+ * Add consent change listener
147
+ */
148
+ addListener(listener) {
149
+ this.listeners.push(listener);
150
+ }
151
+ /**
152
+ * Remove consent change listener
153
+ */
154
+ removeListener(listener) {
155
+ const index = this.listeners.indexOf(listener);
156
+ if (index > -1) {
157
+ this.listeners.splice(index, 1);
158
+ }
159
+ }
160
+ /**
161
+ * Notify all listeners of consent state change
162
+ */
163
+ notifyListeners() {
164
+ if (!this.consentState)
165
+ return;
166
+ this.listeners.forEach(listener => {
167
+ try {
168
+ listener(this.consentState);
169
+ }
170
+ catch (error) {
171
+ console.error('[Grain Consent] Listener error:', error);
172
+ }
173
+ });
174
+ }
175
+ /**
176
+ * Clear all consent data
177
+ */
178
+ clearConsent() {
179
+ if (typeof window === 'undefined')
180
+ return;
181
+ try {
182
+ localStorage.removeItem(this.storageKey);
183
+ this.consentState = null;
184
+ }
185
+ catch (error) {
186
+ console.error('[Grain Consent] Failed to clear consent:', error);
187
+ }
188
+ }
189
+ }
190
+ exports.ConsentManager = ConsentManager;
191
+ //# sourceMappingURL=consent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consent.js","sourceRoot":"","sources":["../../src/consent.ts"],"names":[],"mappings":"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"}