sonar-sdk 0.2.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 (62) hide show
  1. package/README.md +78 -0
  2. package/dist/browser/auto.d.ts +28 -0
  3. package/dist/browser/auto.d.ts.map +1 -0
  4. package/dist/browser/auto.js +207 -0
  5. package/dist/browser/auto.js.map +1 -0
  6. package/dist/browser/consent.d.ts +19 -0
  7. package/dist/browser/consent.d.ts.map +1 -0
  8. package/dist/browser/consent.js +132 -0
  9. package/dist/browser/consent.js.map +1 -0
  10. package/dist/browser/frustration.d.ts +34 -0
  11. package/dist/browser/frustration.d.ts.map +1 -0
  12. package/dist/browser/frustration.js +257 -0
  13. package/dist/browser/frustration.js.map +1 -0
  14. package/dist/browser/index.d.ts +10 -0
  15. package/dist/browser/index.d.ts.map +1 -0
  16. package/dist/browser/index.js +9 -0
  17. package/dist/browser/index.js.map +1 -0
  18. package/dist/browser/screenshot.d.ts +21 -0
  19. package/dist/browser/screenshot.d.ts.map +1 -0
  20. package/dist/browser/screenshot.js +143 -0
  21. package/dist/browser/screenshot.js.map +1 -0
  22. package/dist/browser/session-recorder.d.ts +19 -0
  23. package/dist/browser/session-recorder.d.ts.map +1 -0
  24. package/dist/browser/session-recorder.js +68 -0
  25. package/dist/browser/session-recorder.js.map +1 -0
  26. package/dist/browser/sonar-web.d.ts +28 -0
  27. package/dist/browser/sonar-web.d.ts.map +1 -0
  28. package/dist/browser/sonar-web.js +186 -0
  29. package/dist/browser/sonar-web.js.map +1 -0
  30. package/dist/browser/transport.d.ts +19 -0
  31. package/dist/browser/transport.d.ts.map +1 -0
  32. package/dist/browser/transport.js +128 -0
  33. package/dist/browser/transport.js.map +1 -0
  34. package/dist/browser/types.d.ts +119 -0
  35. package/dist/browser/types.d.ts.map +1 -0
  36. package/dist/browser/types.js +2 -0
  37. package/dist/browser/types.js.map +1 -0
  38. package/dist/browser/video-recorder.d.ts +25 -0
  39. package/dist/browser/video-recorder.d.ts.map +1 -0
  40. package/dist/browser/video-recorder.js +121 -0
  41. package/dist/browser/video-recorder.js.map +1 -0
  42. package/dist/browser/visitor.d.ts +9 -0
  43. package/dist/browser/visitor.d.ts.map +1 -0
  44. package/dist/browser/visitor.js +67 -0
  45. package/dist/browser/visitor.js.map +1 -0
  46. package/dist/client.d.ts +12 -0
  47. package/dist/client.d.ts.map +1 -0
  48. package/dist/client.js +81 -0
  49. package/dist/client.js.map +1 -0
  50. package/dist/index.browser.d.ts +13 -0
  51. package/dist/index.browser.d.ts.map +1 -0
  52. package/dist/index.browser.js +11 -0
  53. package/dist/index.browser.js.map +1 -0
  54. package/dist/index.d.ts +15 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +53 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/types.d.ts +33 -0
  59. package/dist/types.d.ts.map +1 -0
  60. package/dist/types.js +2 -0
  61. package/dist/types.js.map +1 -0
  62. package/package.json +52 -0
package/README.md ADDED
@@ -0,0 +1,78 @@
1
+ # sonar-sdk
2
+
3
+ Official Node.js SDK for [Sonar](https://sonar.app) — error capture, deploy tracking, and uptime monitoring.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install sonar-sdk
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ```typescript
14
+ import Sonar from 'sonar-sdk'
15
+
16
+ const sonar = new Sonar({
17
+ apiKey: process.env.SONAR_API_KEY!,
18
+ environment: process.env.SONAR_ENVIRONMENT || 'development',
19
+ })
20
+
21
+ // Capture an error
22
+ try {
23
+ await processOrder(data)
24
+ } catch (err) {
25
+ sonar.captureError(err, {
26
+ fingerprint: 'OrderProcessingError',
27
+ metadata: { orderId: data.id },
28
+ })
29
+ }
30
+
31
+ // Track a deployment
32
+ await sonar.recordDeployment({
33
+ version: 'v1.2.3',
34
+ status: 'succeeded',
35
+ description: 'Release candidate 3',
36
+ deployedBy: 'deploy-bot',
37
+ })
38
+
39
+ // Auto-capture uncaught exceptions and rejections
40
+ sonar.setupGlobalHandlers()
41
+
42
+ // Express error middleware
43
+ app.use(sonar.middleware())
44
+ ```
45
+
46
+ ## API
47
+
48
+ ### `new Sonar(options)`
49
+
50
+ | Option | Type | Default | Description |
51
+ |--------|------|---------|-------------|
52
+ | `apiKey` | `string` | required | Your Sonar API key |
53
+ | `environment` | `string` | required | e.g. `production`, `staging` |
54
+ | `release` | `string` | `undefined` | Current release version |
55
+ | `endpoint` | `string` | `http://localhost:8080` | API base URL |
56
+
57
+ ### `captureError(error, options?)`
58
+
59
+ Send an error to Sonar. Errors with the same fingerprint are grouped automatically.
60
+
61
+ ### `recordDeployment(options)`
62
+
63
+ Record a deployment. Appears on the incident timeline.
64
+
65
+ ### `setupGlobalHandlers()`
66
+
67
+ Registers `process.on('uncaughtException')` and `process.on('unhandledRejection')` handlers.
68
+
69
+ ### `middleware()`
70
+
71
+ Returns an Express error-handling middleware function.
72
+
73
+ ## Publishing
74
+
75
+ ```bash
76
+ npm run build
77
+ npm publish --access public
78
+ ```
@@ -0,0 +1,28 @@
1
+ import type { AutoTrackOptions } from './types';
2
+ export type AutoTrackerHost = {
3
+ track: (event: string, properties?: Record<string, unknown>) => void;
4
+ };
5
+ export declare class AutoTracker {
6
+ private host;
7
+ private opts;
8
+ private scrollDepthsReported;
9
+ private scrollObserver;
10
+ private scrollSentinel;
11
+ private pushStateOriginal;
12
+ private popStateHandler;
13
+ private clickHandler;
14
+ private submitHandler;
15
+ private originalConsoleError;
16
+ private originalConsoleWarn;
17
+ private active;
18
+ constructor(host: AutoTrackerHost, opts: AutoTrackOptions);
19
+ init(): void;
20
+ destroy(): void;
21
+ private trackPageViews;
22
+ private trackLinkClicks;
23
+ private trackFormSubmissions;
24
+ private trackScrollDepth;
25
+ private trackConsoleErrors;
26
+ private trackClicks;
27
+ }
28
+ //# sourceMappingURL=auto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto.d.ts","sourceRoot":"","sources":["../../src/browser/auto.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAE/C,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;CACrE,CAAA;AAID,qBAAa,WAAW;IACtB,OAAO,CAAC,IAAI,CAAiB;IAC7B,OAAO,CAAC,IAAI,CAAkB;IAC9B,OAAO,CAAC,oBAAoB,CAAoB;IAChD,OAAO,CAAC,cAAc,CAAoC;IAC1D,OAAO,CAAC,cAAc,CAA8B;IACpD,OAAO,CAAC,iBAAiB,CAAwC;IACjE,OAAO,CAAC,eAAe,CAA4B;IACnD,OAAO,CAAC,YAAY,CAAyC;IAC7D,OAAO,CAAC,aAAa,CAA0C;IAC/D,OAAO,CAAC,oBAAoB,CAAoC;IAChE,OAAO,CAAC,mBAAmB,CAAmC;IAC9D,OAAO,CAAC,MAAM,CAAQ;gBAEV,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,gBAAgB;IAYzD,IAAI;IAYJ,OAAO;IA6BP,OAAO,CAAC,cAAc;IAatB,OAAO,CAAC,eAAe;IAqBvB,OAAO,CAAC,oBAAoB;IAiB5B,OAAO,CAAC,gBAAgB;IAuDxB,OAAO,CAAC,kBAAkB;IAoB1B,OAAO,CAAC,WAAW;CAmBpB"}
@@ -0,0 +1,207 @@
1
+ const SCROLL_DEPTHS = [25, 50, 75, 100];
2
+ export class AutoTracker {
3
+ host;
4
+ opts;
5
+ scrollDepthsReported = new Set();
6
+ scrollObserver = null;
7
+ scrollSentinel = null;
8
+ pushStateOriginal = null;
9
+ popStateHandler = null;
10
+ clickHandler = null;
11
+ submitHandler = null;
12
+ originalConsoleError = null;
13
+ originalConsoleWarn = null;
14
+ active = false;
15
+ constructor(host, opts) {
16
+ this.host = host;
17
+ this.opts = {
18
+ pageViews: opts.pageViews ?? true,
19
+ linkClicks: opts.linkClicks ?? true,
20
+ formSubmissions: opts.formSubmissions ?? true,
21
+ scrollDepth: opts.scrollDepth ?? true,
22
+ consoleErrors: opts.consoleErrors ?? true,
23
+ clickTracking: opts.clickTracking ?? false,
24
+ };
25
+ }
26
+ init() {
27
+ if (this.active)
28
+ return;
29
+ this.active = true;
30
+ if (this.opts.pageViews)
31
+ this.trackPageViews();
32
+ if (this.opts.linkClicks)
33
+ this.trackLinkClicks();
34
+ if (this.opts.formSubmissions)
35
+ this.trackFormSubmissions();
36
+ if (this.opts.scrollDepth)
37
+ this.trackScrollDepth();
38
+ if (this.opts.consoleErrors)
39
+ this.trackConsoleErrors();
40
+ if (this.opts.clickTracking)
41
+ this.trackClicks();
42
+ }
43
+ destroy() {
44
+ this.active = false;
45
+ if (this.pushStateOriginal && history.pushState !== this.pushStateOriginal) {
46
+ history.pushState = this.pushStateOriginal;
47
+ }
48
+ if (this.popStateHandler) {
49
+ window.removeEventListener('popstate', this.popStateHandler);
50
+ }
51
+ if (this.clickHandler) {
52
+ document.removeEventListener('click', this.clickHandler);
53
+ }
54
+ if (this.submitHandler) {
55
+ document.removeEventListener('submit', this.submitHandler);
56
+ }
57
+ if (this.scrollObserver) {
58
+ this.scrollObserver.disconnect();
59
+ }
60
+ if (this.scrollSentinel?.parentNode) {
61
+ this.scrollSentinel.parentNode.removeChild(this.scrollSentinel);
62
+ }
63
+ if (this.originalConsoleError) {
64
+ console.error = this.originalConsoleError;
65
+ }
66
+ if (this.originalConsoleWarn) {
67
+ console.warn = this.originalConsoleWarn;
68
+ }
69
+ }
70
+ trackPageViews() {
71
+ this.popStateHandler = () => {
72
+ this.host.track('page_view', { title: document.title, url: window.location.href });
73
+ };
74
+ window.addEventListener('popstate', this.popStateHandler);
75
+ this.pushStateOriginal = history.pushState.bind(history);
76
+ history.pushState = (...args) => {
77
+ this.pushStateOriginal.apply(history, args);
78
+ this.host.track('page_view', { title: document.title, url: window.location.href });
79
+ };
80
+ }
81
+ trackLinkClicks() {
82
+ this.clickHandler = (e) => {
83
+ const target = e.target;
84
+ const link = target?.closest?.('a');
85
+ if (!link)
86
+ return;
87
+ const href = link.getAttribute('href');
88
+ if (!href)
89
+ return;
90
+ if (!href.startsWith('http') && !href.startsWith('/') && !href.startsWith('#'))
91
+ return;
92
+ if (href.startsWith('#'))
93
+ return;
94
+ if (link.hasAttribute('data-sonar-ignore'))
95
+ return;
96
+ this.host.track('click', {
97
+ category: 'link',
98
+ name: link.textContent?.trim()?.slice(0, 200) || href,
99
+ url: href,
100
+ href,
101
+ });
102
+ };
103
+ document.addEventListener('click', this.clickHandler);
104
+ }
105
+ trackFormSubmissions() {
106
+ this.submitHandler = (e) => {
107
+ const form = e.target;
108
+ if (!form)
109
+ return;
110
+ if (form.hasAttribute('data-sonar-ignore'))
111
+ return;
112
+ this.host.track('form_submit', {
113
+ category: 'form',
114
+ name: form.getAttribute('name') || form.id || 'unknown',
115
+ url: form.action || window.location.href,
116
+ formId: form.id || undefined,
117
+ formName: form.getAttribute('name') || undefined,
118
+ });
119
+ };
120
+ document.addEventListener('submit', this.submitHandler);
121
+ }
122
+ trackScrollDepth() {
123
+ this.scrollDepthsReported.clear();
124
+ this.scrollSentinel = document.createElement('div');
125
+ this.scrollSentinel.setAttribute('data-sonar-scroll-sentinel', '');
126
+ this.scrollSentinel.style.position = 'absolute';
127
+ this.scrollSentinel.style.width = '1px';
128
+ this.scrollSentinel.style.height = '1px';
129
+ this.scrollSentinel.style.bottom = '0';
130
+ document.body.appendChild(this.scrollSentinel);
131
+ this.scrollObserver = new IntersectionObserver((entries) => {
132
+ for (const entry of entries) {
133
+ if (entry.isIntersecting) {
134
+ this.host.track('scroll', {
135
+ category: 'scroll',
136
+ name: '100%',
137
+ depth: 100,
138
+ });
139
+ this.scrollDepthsReported.add(100);
140
+ }
141
+ }
142
+ }, { threshold: 0 });
143
+ this.scrollObserver.observe(this.scrollSentinel);
144
+ const onScroll = () => {
145
+ const scrollPct = Math.round((window.scrollY + window.innerHeight) / Math.max(document.body.scrollHeight, 1) * 100);
146
+ for (const depth of SCROLL_DEPTHS) {
147
+ if (scrollPct >= depth && !this.scrollDepthsReported.has(depth)) {
148
+ this.scrollDepthsReported.add(depth);
149
+ this.host.track('scroll', {
150
+ category: 'scroll',
151
+ depth,
152
+ });
153
+ }
154
+ }
155
+ };
156
+ let ticking = false;
157
+ window.addEventListener('scroll', () => {
158
+ if (!ticking) {
159
+ window.requestAnimationFrame(() => {
160
+ onScroll();
161
+ ticking = false;
162
+ });
163
+ ticking = true;
164
+ }
165
+ });
166
+ }
167
+ trackConsoleErrors() {
168
+ this.originalConsoleError = console.error;
169
+ console.error = (...args) => {
170
+ this.host.track('console_error', {
171
+ category: 'error',
172
+ name: args.map(String).join(' ').slice(0, 500),
173
+ });
174
+ this.originalConsoleError.apply(console, args);
175
+ };
176
+ this.originalConsoleWarn = console.warn;
177
+ console.warn = (...args) => {
178
+ this.host.track('console_error', {
179
+ category: 'warn',
180
+ name: args.map(String).join(' ').slice(0, 500),
181
+ });
182
+ this.originalConsoleWarn.apply(console, args);
183
+ };
184
+ }
185
+ trackClicks() {
186
+ const handler = (e) => {
187
+ const target = e.target;
188
+ if (!target)
189
+ return;
190
+ if (target.hasAttribute('data-sonar-ignore'))
191
+ return;
192
+ if (!target.closest('[data-sonar-track]'))
193
+ return;
194
+ this.host.track('click', {
195
+ category: 'element',
196
+ name: target.textContent?.trim()?.slice(0, 200) || target.tagName.toLowerCase(),
197
+ tagName: target.tagName.toLowerCase(),
198
+ id: target.id || undefined,
199
+ className: target.className?.slice(0, 200) || undefined,
200
+ x: e.clientX,
201
+ y: e.clientY,
202
+ });
203
+ };
204
+ document.addEventListener('click', handler);
205
+ }
206
+ }
207
+ //# sourceMappingURL=auto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto.js","sourceRoot":"","sources":["../../src/browser/auto.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { ConsentState, ConsentBannerOptions } from './types';
2
+ export declare class ConsentManager {
3
+ private state;
4
+ private listeners;
5
+ private bannerEl;
6
+ private bannerOptions;
7
+ constructor(options?: ConsentBannerOptions);
8
+ private checkDnt;
9
+ private load;
10
+ private save;
11
+ getConsent(): ConsentState;
12
+ setConsent(state: ConsentState): void;
13
+ onChange(cb: (state: ConsentState) => void): () => void;
14
+ private notify;
15
+ showBanner(): void;
16
+ hideBanner(): void;
17
+ private renderBanner;
18
+ }
19
+ //# sourceMappingURL=consent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consent.d.ts","sourceRoot":"","sources":["../../src/browser/consent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAIjE,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAA0B;IACvC,OAAO,CAAC,SAAS,CAA2C;IAC5D,OAAO,CAAC,QAAQ,CAA2B;IAC3C,OAAO,CAAC,aAAa,CAA2B;gBAEpC,OAAO,CAAC,EAAE,oBAAoB;IAQ1C,OAAO,CAAC,QAAQ;IAchB,OAAO,CAAC,IAAI;IAWZ,OAAO,CAAC,IAAI;IAQZ,UAAU,IAAI,YAAY;IAI1B,UAAU,CAAC,KAAK,EAAE,YAAY;IAO9B,QAAQ,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI;IAO1C,OAAO,CAAC,MAAM;IAMd,UAAU;IAMV,UAAU;IAOV,OAAO,CAAC,YAAY;CAkErB"}
@@ -0,0 +1,132 @@
1
+ const STORAGE_KEY = 'sonar_consent';
2
+ export class ConsentManager {
3
+ state = 'pending';
4
+ listeners = [];
5
+ bannerEl = null;
6
+ bannerOptions = {};
7
+ constructor(options) {
8
+ if (options)
9
+ this.bannerOptions = options;
10
+ this.state = this.load();
11
+ if (this.state === 'pending' || this.state === 'denied') {
12
+ this.checkDnt();
13
+ }
14
+ }
15
+ checkDnt() {
16
+ try {
17
+ const dnt = navigator.doNotTrack === '1' ||
18
+ navigator.globalPrivacyControl === true;
19
+ if (dnt) {
20
+ this.state = 'denied';
21
+ this.save('denied');
22
+ }
23
+ }
24
+ catch {
25
+ // ignore
26
+ }
27
+ }
28
+ load() {
29
+ try {
30
+ const stored = localStorage.getItem(STORAGE_KEY);
31
+ if (stored === 'granted')
32
+ return 'granted';
33
+ if (stored === 'denied')
34
+ return 'denied';
35
+ }
36
+ catch {
37
+ // localStorage unavailable
38
+ }
39
+ return 'pending';
40
+ }
41
+ save(state) {
42
+ try {
43
+ localStorage.setItem(STORAGE_KEY, state);
44
+ }
45
+ catch {
46
+ // ignore
47
+ }
48
+ }
49
+ getConsent() {
50
+ return this.state;
51
+ }
52
+ setConsent(state) {
53
+ this.state = state;
54
+ this.save(state);
55
+ this.notify();
56
+ this.hideBanner();
57
+ }
58
+ onChange(cb) {
59
+ this.listeners.push(cb);
60
+ return () => {
61
+ this.listeners = this.listeners.filter((l) => l !== cb);
62
+ };
63
+ }
64
+ notify() {
65
+ for (const cb of this.listeners) {
66
+ try {
67
+ cb(this.state);
68
+ }
69
+ catch { /* noop */ }
70
+ }
71
+ }
72
+ showBanner() {
73
+ if (this.bannerEl || this.state !== 'pending')
74
+ return;
75
+ this.bannerEl = this.renderBanner();
76
+ document.body.appendChild(this.bannerEl);
77
+ }
78
+ hideBanner() {
79
+ if (this.bannerEl) {
80
+ this.bannerEl.remove();
81
+ this.bannerEl = null;
82
+ }
83
+ }
84
+ renderBanner() {
85
+ const opts = this.bannerOptions;
86
+ const position = opts.position ?? 'bottom';
87
+ const text = opts.text ?? 'We use cookies and analytics to understand how our site is used and to improve your experience.';
88
+ const acceptText = opts.acceptText ?? 'Accept All';
89
+ const declineText = opts.declineText ?? 'Reject All';
90
+ const banner = document.createElement('div');
91
+ banner.setAttribute('data-sonar-consent-banner', '');
92
+ const posStyles = {
93
+ bottom: 'bottom:0;left:0;right:0',
94
+ 'bottom-left': 'bottom:16px;left:16px;max-width:400px',
95
+ 'bottom-right': 'bottom:16px;right:16px;max-width:400px',
96
+ top: 'top:0;left:0;right:0',
97
+ };
98
+ banner.setAttribute('style', `position:fixed;z-index:2147483647;${posStyles[position] ?? posStyles.bottom};` +
99
+ `padding:16px 24px;background:#1a1a1a;color:#e0e0e0;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;` +
100
+ `font-size:14px;line-height:1.5;display:flex;align-items:center;gap:16px;flex-wrap:wrap;` +
101
+ `border-top:1px solid #333;box-shadow:0 -4px 24px rgba(0,0,0,0.4);`);
102
+ const textEl = document.createElement('span');
103
+ textEl.style.flex = '1';
104
+ textEl.style.minWidth = '200px';
105
+ textEl.textContent = text;
106
+ banner.appendChild(textEl);
107
+ const actions = document.createElement('div');
108
+ actions.style.display = 'flex';
109
+ actions.style.gap = '8px';
110
+ const declineBtn = document.createElement('button');
111
+ declineBtn.textContent = declineText;
112
+ declineBtn.setAttribute('style', 'padding:8px 16px;border:1px solid #444;background:transparent;color:#aaa;cursor:pointer;font-size:13px;border-radius:4px;');
113
+ declineBtn.onclick = () => this.setConsent('denied');
114
+ actions.appendChild(declineBtn);
115
+ const acceptBtn = document.createElement('button');
116
+ acceptBtn.textContent = acceptText;
117
+ acceptBtn.setAttribute('style', 'padding:8px 16px;border:1px solid #4ade80;background:#4ade80;color:#000;cursor:pointer;font-size:13px;font-weight:600;border-radius:4px;');
118
+ acceptBtn.onclick = () => this.setConsent('granted');
119
+ actions.appendChild(acceptBtn);
120
+ if (opts.privacyPolicyUrl) {
121
+ const link = document.createElement('a');
122
+ link.href = opts.privacyPolicyUrl;
123
+ link.target = '_blank';
124
+ link.textContent = 'Privacy Policy';
125
+ link.setAttribute('style', 'color:#60a5fa;font-size:12px;text-decoration:underline;padding:8px 0;');
126
+ actions.appendChild(link);
127
+ }
128
+ banner.appendChild(actions);
129
+ return banner;
130
+ }
131
+ }
132
+ //# sourceMappingURL=consent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consent.js","sourceRoot":"","sources":["../../src/browser/consent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { FrustrationOptions } from './types';
2
+ export type FrustrationHost = {
3
+ track: (event: string, severity: number, properties?: Record<string, unknown>) => void;
4
+ requestScreenshot: (reason: string) => void;
5
+ };
6
+ export declare class FrustrationDetector {
7
+ private host;
8
+ private opts;
9
+ private clickMap;
10
+ private signalWindow;
11
+ private idleTimer;
12
+ private lastHoveredEl;
13
+ private scrollHistory;
14
+ private mutationObserver;
15
+ private pendingDeadClick;
16
+ private deadClickTimer;
17
+ private clickHandler;
18
+ private mouseMoveHandler;
19
+ private scrollHandler;
20
+ private active;
21
+ private defaults;
22
+ constructor(host: FrustrationHost, opts?: FrustrationOptions);
23
+ private resolveOpts;
24
+ init(): void;
25
+ destroy(): void;
26
+ private handleClick;
27
+ private handleMouseMove;
28
+ private handleScroll;
29
+ private startDeadClick;
30
+ private stopDeadClick;
31
+ private emit;
32
+ private checkCascade;
33
+ }
34
+ //# sourceMappingURL=frustration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frustration.d.ts","sourceRoot":"","sources":["../../src/browser/frustration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAEjD,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;IACtF,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;CAC5C,CAAA;AAkED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,IAAI,CAAiB;IAC7B,OAAO,CAAC,IAAI,CAA4B;IACxC,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,YAAY,CAAoB;IACxC,OAAO,CAAC,SAAS,CAA6C;IAC9D,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,aAAa,CAAyC;IAC9D,OAAO,CAAC,gBAAgB,CAAgC;IACxD,OAAO,CAAC,gBAAgB,CAAuE;IAC/F,OAAO,CAAC,cAAc,CAA6C;IACnE,OAAO,CAAC,YAAY,CAAyC;IAC7D,OAAO,CAAC,gBAAgB,CAAyC;IACjE,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,MAAM,CAAQ;IAEtB,OAAO,CAAC,QAAQ,CAMf;gBAEW,IAAI,EAAE,eAAe,EAAE,IAAI,CAAC,EAAE,kBAAkB;IAK5D,OAAO,CAAC,WAAW;IAgBnB,IAAI;IAcJ,OAAO;IAYP,OAAO,CAAC,WAAW;IAkCnB,OAAO,CAAC,eAAe;IAyBvB,OAAO,CAAC,YAAY;IA4BpB,OAAO,CAAC,cAAc;IAwBtB,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,IAAI;IAYZ,OAAO,CAAC,YAAY;CAmBrB"}