@grainql/analytics-web 2.0.0 → 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.
- package/dist/activity.d.ts +59 -0
- package/dist/activity.d.ts.map +1 -0
- package/dist/cjs/activity.d.ts +59 -0
- package/dist/cjs/activity.d.ts.map +1 -0
- package/dist/cjs/activity.js +131 -0
- package/dist/cjs/activity.js.map +1 -0
- package/dist/cjs/consent.d.ts +68 -0
- package/dist/cjs/consent.d.ts.map +1 -0
- package/dist/cjs/consent.js +191 -0
- package/dist/cjs/consent.js.map +1 -0
- package/dist/cjs/cookies.d.ts +28 -0
- package/dist/cjs/cookies.d.ts.map +1 -0
- package/dist/cjs/cookies.js +95 -0
- package/dist/cjs/cookies.js.map +1 -0
- package/dist/cjs/heartbeat.d.ts +42 -0
- package/dist/cjs/heartbeat.d.ts.map +1 -0
- package/dist/cjs/heartbeat.js +92 -0
- package/dist/cjs/heartbeat.js.map +1 -0
- package/dist/cjs/index.d.ts +100 -3
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/page-tracking.d.ts +60 -0
- package/dist/cjs/page-tracking.d.ts.map +1 -0
- package/dist/cjs/page-tracking.js +180 -0
- package/dist/cjs/page-tracking.js.map +1 -0
- package/dist/cjs/react/components/ConsentBanner.d.ts +16 -0
- package/dist/cjs/react/components/ConsentBanner.d.ts.map +1 -0
- package/dist/cjs/react/components/ConsentBanner.js +112 -0
- package/dist/cjs/react/components/ConsentBanner.js.map +1 -0
- package/dist/cjs/react/components/CookieNotice.d.ts +12 -0
- package/dist/cjs/react/components/CookieNotice.d.ts.map +1 -0
- package/dist/cjs/react/components/CookieNotice.js +62 -0
- package/dist/cjs/react/components/CookieNotice.js.map +1 -0
- package/dist/cjs/react/components/PrivacyPreferenceCenter.d.ts +12 -0
- package/dist/cjs/react/components/PrivacyPreferenceCenter.d.ts.map +1 -0
- package/dist/cjs/react/components/PrivacyPreferenceCenter.js +120 -0
- package/dist/cjs/react/components/PrivacyPreferenceCenter.js.map +1 -0
- package/dist/cjs/react/hooks/useConsent.d.ts +13 -0
- package/dist/cjs/react/hooks/useConsent.d.ts.map +1 -0
- package/dist/cjs/react/hooks/useConsent.js +84 -0
- package/dist/cjs/react/hooks/useConsent.js.map +1 -0
- package/dist/cjs/react/hooks/useDataDeletion.d.ts +17 -0
- package/dist/cjs/react/hooks/useDataDeletion.d.ts.map +1 -0
- package/dist/cjs/react/hooks/useDataDeletion.js +117 -0
- package/dist/cjs/react/hooks/useDataDeletion.js.map +1 -0
- package/dist/cjs/react/hooks/usePrivacyPreferences.d.ts +15 -0
- package/dist/cjs/react/hooks/usePrivacyPreferences.d.ts.map +1 -0
- package/dist/cjs/react/hooks/usePrivacyPreferences.js +82 -0
- package/dist/cjs/react/hooks/usePrivacyPreferences.js.map +1 -0
- package/dist/cjs/react/index.d.ts +11 -0
- package/dist/cjs/react/index.d.ts.map +1 -1
- package/dist/cjs/react/index.js +15 -1
- package/dist/cjs/react/index.js.map +1 -1
- package/dist/consent.d.ts +68 -0
- package/dist/consent.d.ts.map +1 -0
- package/dist/cookies.d.ts +28 -0
- package/dist/cookies.d.ts.map +1 -0
- package/dist/esm/activity.d.ts +59 -0
- package/dist/esm/activity.d.ts.map +1 -0
- package/dist/esm/activity.js +127 -0
- package/dist/esm/activity.js.map +1 -0
- package/dist/esm/consent.d.ts +68 -0
- package/dist/esm/consent.d.ts.map +1 -0
- package/dist/esm/consent.js +187 -0
- package/dist/esm/consent.js.map +1 -0
- package/dist/esm/cookies.d.ts +28 -0
- package/dist/esm/cookies.d.ts.map +1 -0
- package/dist/esm/cookies.js +89 -0
- package/dist/esm/cookies.js.map +1 -0
- package/dist/esm/heartbeat.d.ts +42 -0
- package/dist/esm/heartbeat.d.ts.map +1 -0
- package/dist/esm/heartbeat.js +88 -0
- package/dist/esm/heartbeat.js.map +1 -0
- package/dist/esm/index.d.ts +100 -3
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/page-tracking.d.ts +60 -0
- package/dist/esm/page-tracking.d.ts.map +1 -0
- package/dist/esm/page-tracking.js +176 -0
- package/dist/esm/page-tracking.js.map +1 -0
- package/dist/esm/react/components/ConsentBanner.d.ts +16 -0
- package/dist/esm/react/components/ConsentBanner.d.ts.map +1 -0
- package/dist/esm/react/components/ConsentBanner.js +76 -0
- package/dist/esm/react/components/ConsentBanner.js.map +1 -0
- package/dist/esm/react/components/CookieNotice.d.ts +12 -0
- package/dist/esm/react/components/CookieNotice.d.ts.map +1 -0
- package/dist/esm/react/components/CookieNotice.js +26 -0
- package/dist/esm/react/components/CookieNotice.js.map +1 -0
- package/dist/esm/react/components/PrivacyPreferenceCenter.d.ts +12 -0
- package/dist/esm/react/components/PrivacyPreferenceCenter.d.ts.map +1 -0
- package/dist/esm/react/components/PrivacyPreferenceCenter.js +84 -0
- package/dist/esm/react/components/PrivacyPreferenceCenter.js.map +1 -0
- package/dist/esm/react/hooks/useConsent.d.ts +13 -0
- package/dist/esm/react/hooks/useConsent.d.ts.map +1 -0
- package/dist/esm/react/hooks/useConsent.js +48 -0
- package/dist/esm/react/hooks/useConsent.js.map +1 -0
- package/dist/esm/react/hooks/useDataDeletion.d.ts +17 -0
- package/dist/esm/react/hooks/useDataDeletion.d.ts.map +1 -0
- package/dist/esm/react/hooks/useDataDeletion.js +81 -0
- package/dist/esm/react/hooks/useDataDeletion.js.map +1 -0
- package/dist/esm/react/hooks/usePrivacyPreferences.d.ts +15 -0
- package/dist/esm/react/hooks/usePrivacyPreferences.d.ts.map +1 -0
- package/dist/esm/react/hooks/usePrivacyPreferences.js +46 -0
- package/dist/esm/react/hooks/usePrivacyPreferences.js.map +1 -0
- package/dist/esm/react/index.d.ts +11 -0
- package/dist/esm/react/index.d.ts.map +1 -1
- package/dist/esm/react/index.js +8 -0
- package/dist/esm/react/index.js.map +1 -1
- package/dist/heartbeat.d.ts +42 -0
- package/dist/heartbeat.d.ts.map +1 -0
- package/dist/index.d.ts +100 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.global.dev.js +903 -12
- package/dist/index.global.dev.js.map +3 -3
- package/dist/index.global.js +2 -2
- package/dist/index.global.js.map +4 -4
- package/dist/index.js +321 -11
- package/dist/index.mjs +321 -11
- package/dist/page-tracking.d.ts +60 -0
- package/dist/page-tracking.d.ts.map +1 -0
- package/dist/react/activity.d.ts +59 -0
- package/dist/react/activity.d.ts.map +1 -0
- package/dist/react/activity.js +130 -0
- package/dist/react/activity.mjs +126 -0
- package/dist/react/consent.d.ts +68 -0
- package/dist/react/consent.d.ts.map +1 -0
- package/dist/react/consent.js +190 -0
- package/dist/react/consent.mjs +186 -0
- package/dist/react/cookies.d.ts +28 -0
- package/dist/react/cookies.d.ts.map +1 -0
- package/dist/react/cookies.js +94 -0
- package/dist/react/cookies.mjs +88 -0
- package/dist/react/heartbeat.d.ts +42 -0
- package/dist/react/heartbeat.d.ts.map +1 -0
- package/dist/react/heartbeat.js +91 -0
- package/dist/react/heartbeat.mjs +87 -0
- package/dist/react/index.d.ts +100 -3
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +321 -11
- package/dist/react/index.mjs +321 -11
- package/dist/react/page-tracking.d.ts +60 -0
- package/dist/react/page-tracking.d.ts.map +1 -0
- package/dist/react/page-tracking.js +179 -0
- package/dist/react/page-tracking.mjs +175 -0
- package/dist/react/react/components/ConsentBanner.d.ts +16 -0
- package/dist/react/react/components/ConsentBanner.d.ts.map +1 -0
- package/dist/react/react/components/ConsentBanner.js +78 -0
- package/dist/react/react/components/ConsentBanner.mjs +75 -0
- package/dist/react/react/components/CookieNotice.d.ts +12 -0
- package/dist/react/react/components/CookieNotice.d.ts.map +1 -0
- package/dist/react/react/components/CookieNotice.js +28 -0
- package/dist/react/react/components/CookieNotice.mjs +25 -0
- package/dist/react/react/components/PrivacyPreferenceCenter.d.ts +12 -0
- package/dist/react/react/components/PrivacyPreferenceCenter.d.ts.map +1 -0
- package/dist/react/react/components/PrivacyPreferenceCenter.js +86 -0
- package/dist/react/react/components/PrivacyPreferenceCenter.mjs +83 -0
- package/dist/react/react/hooks/useConsent.d.ts +13 -0
- package/dist/react/react/hooks/useConsent.d.ts.map +1 -0
- package/dist/react/react/hooks/useConsent.js +50 -0
- package/dist/react/react/hooks/useConsent.mjs +47 -0
- package/dist/react/react/hooks/useDataDeletion.d.ts +17 -0
- package/dist/react/react/hooks/useDataDeletion.d.ts.map +1 -0
- package/dist/react/react/hooks/useDataDeletion.js +83 -0
- package/dist/react/react/hooks/useDataDeletion.mjs +80 -0
- package/dist/react/react/hooks/usePrivacyPreferences.d.ts +15 -0
- package/dist/react/react/hooks/usePrivacyPreferences.d.ts.map +1 -0
- package/dist/react/react/hooks/usePrivacyPreferences.js +48 -0
- package/dist/react/react/hooks/usePrivacyPreferences.mjs +45 -0
- package/dist/react/react/index.d.ts +11 -0
- package/dist/react/react/index.d.ts.map +1 -1
- package/dist/react/react/index.js +15 -1
- package/dist/react/react/index.mjs +8 -0
- package/package.json +1 -1
|
@@ -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,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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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cookie utilities for Grain Analytics
|
|
3
|
+
* Provides GDPR-compliant cookie management with configurable options
|
|
4
|
+
*/
|
|
5
|
+
export interface CookieConfig {
|
|
6
|
+
domain?: string;
|
|
7
|
+
path?: string;
|
|
8
|
+
sameSite?: 'strict' | 'lax' | 'none';
|
|
9
|
+
secure?: boolean;
|
|
10
|
+
maxAge?: number;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Set a cookie with configurable options
|
|
14
|
+
*/
|
|
15
|
+
export declare function setCookie(name: string, value: string, config?: CookieConfig): void;
|
|
16
|
+
/**
|
|
17
|
+
* Get a cookie value by name
|
|
18
|
+
*/
|
|
19
|
+
export declare function getCookie(name: string): string | null;
|
|
20
|
+
/**
|
|
21
|
+
* Delete a cookie by name
|
|
22
|
+
*/
|
|
23
|
+
export declare function deleteCookie(name: string, config?: Pick<CookieConfig, 'domain' | 'path'>): void;
|
|
24
|
+
/**
|
|
25
|
+
* Check if cookies are available and working
|
|
26
|
+
*/
|
|
27
|
+
export declare function areCookiesEnabled(): boolean;
|
|
28
|
+
//# sourceMappingURL=cookies.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cookies.d.ts","sourceRoot":"","sources":["../../src/cookies.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;IACrC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,YAAY,GAAG,IAAI,CA4BlF;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiBrD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,GAAG,MAAM,CAAC,GAAG,IAAI,CAmB/F;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAY3C"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Cookie utilities for Grain Analytics
|
|
4
|
+
* Provides GDPR-compliant cookie management with configurable options
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.setCookie = setCookie;
|
|
8
|
+
exports.getCookie = getCookie;
|
|
9
|
+
exports.deleteCookie = deleteCookie;
|
|
10
|
+
exports.areCookiesEnabled = areCookiesEnabled;
|
|
11
|
+
/**
|
|
12
|
+
* Set a cookie with configurable options
|
|
13
|
+
*/
|
|
14
|
+
function setCookie(name, value, config) {
|
|
15
|
+
if (typeof document === 'undefined')
|
|
16
|
+
return;
|
|
17
|
+
const parts = [`${encodeURIComponent(name)}=${encodeURIComponent(value)}`];
|
|
18
|
+
if (config?.maxAge !== undefined) {
|
|
19
|
+
parts.push(`max-age=${config.maxAge}`);
|
|
20
|
+
}
|
|
21
|
+
if (config?.domain) {
|
|
22
|
+
parts.push(`domain=${config.domain}`);
|
|
23
|
+
}
|
|
24
|
+
if (config?.path) {
|
|
25
|
+
parts.push(`path=${config.path}`);
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
parts.push('path=/');
|
|
29
|
+
}
|
|
30
|
+
if (config?.sameSite) {
|
|
31
|
+
parts.push(`samesite=${config.sameSite}`);
|
|
32
|
+
}
|
|
33
|
+
if (config?.secure) {
|
|
34
|
+
parts.push('secure');
|
|
35
|
+
}
|
|
36
|
+
document.cookie = parts.join('; ');
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Get a cookie value by name
|
|
40
|
+
*/
|
|
41
|
+
function getCookie(name) {
|
|
42
|
+
if (typeof document === 'undefined')
|
|
43
|
+
return null;
|
|
44
|
+
const nameEQ = encodeURIComponent(name) + '=';
|
|
45
|
+
const cookies = document.cookie.split(';');
|
|
46
|
+
for (let i = 0; i < cookies.length; i++) {
|
|
47
|
+
let cookie = cookies[i];
|
|
48
|
+
while (cookie.charAt(0) === ' ') {
|
|
49
|
+
cookie = cookie.substring(1);
|
|
50
|
+
}
|
|
51
|
+
if (cookie.indexOf(nameEQ) === 0) {
|
|
52
|
+
return decodeURIComponent(cookie.substring(nameEQ.length));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Delete a cookie by name
|
|
59
|
+
*/
|
|
60
|
+
function deleteCookie(name, config) {
|
|
61
|
+
if (typeof document === 'undefined')
|
|
62
|
+
return;
|
|
63
|
+
const parts = [
|
|
64
|
+
`${encodeURIComponent(name)}=`,
|
|
65
|
+
'max-age=0',
|
|
66
|
+
];
|
|
67
|
+
if (config?.domain) {
|
|
68
|
+
parts.push(`domain=${config.domain}`);
|
|
69
|
+
}
|
|
70
|
+
if (config?.path) {
|
|
71
|
+
parts.push(`path=${config.path}`);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
parts.push('path=/');
|
|
75
|
+
}
|
|
76
|
+
document.cookie = parts.join('; ');
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Check if cookies are available and working
|
|
80
|
+
*/
|
|
81
|
+
function areCookiesEnabled() {
|
|
82
|
+
if (typeof document === 'undefined')
|
|
83
|
+
return false;
|
|
84
|
+
try {
|
|
85
|
+
const testCookie = '_grain_cookie_test';
|
|
86
|
+
setCookie(testCookie, 'test', { maxAge: 1 });
|
|
87
|
+
const result = getCookie(testCookie) === 'test';
|
|
88
|
+
deleteCookie(testCookie);
|
|
89
|
+
return result;
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=cookies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cookies.js","sourceRoot":"","sources":["../../src/cookies.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAaH,8BA4BC;AAKD,8BAiBC;AAKD,oCAmBC;AAKD,8CAYC;AA9FD;;GAEG;AACH,SAAgB,SAAS,CAAC,IAAY,EAAE,KAAa,EAAE,MAAqB;IAC1E,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO;IAE5C,MAAM,KAAK,GAAG,CAAC,GAAG,kBAAkB,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAE3E,IAAI,MAAM,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,IAAI,MAAM,EAAE,MAAM,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI,CAAC,UAAU,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,IAAI,MAAM,EAAE,IAAI,EAAE,CAAC;QACjB,KAAK,CAAC,IAAI,CAAC,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACpC,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvB,CAAC;IAED,IAAI,MAAM,EAAE,QAAQ,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,YAAY,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,IAAI,MAAM,EAAE,MAAM,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvB,CAAC;IAED,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,SAAgB,SAAS,CAAC,IAAY;IACpC,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IAEjD,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;IAC9C,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAE3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,IAAI,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACxB,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YAChC,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC;QACD,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YACjC,OAAO,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAgB,YAAY,CAAC,IAAY,EAAE,MAA8C;IACvF,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO;IAE5C,MAAM,KAAK,GAAG;QACZ,GAAG,kBAAkB,CAAC,IAAI,CAAC,GAAG;QAC9B,WAAW;KACZ,CAAC;IAEF,IAAI,MAAM,EAAE,MAAM,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI,CAAC,UAAU,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,IAAI,MAAM,EAAE,IAAI,EAAE,CAAC;QACjB,KAAK,CAAC,IAAI,CAAC,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACpC,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvB,CAAC;IAED,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB;IAC/B,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO,KAAK,CAAC;IAElD,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,oBAAoB,CAAC;QACxC,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,KAAK,MAAM,CAAC;QAChD,YAAY,CAAC,UAAU,CAAC,CAAC;QACzB,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|