blocfeed 0.23.0 → 0.25.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.
@@ -14,6 +14,21 @@ interface SessionReplayConfig {
14
14
  };
15
15
  }
16
16
 
17
+ /**
18
+ * PII scrubbing helper. Regex-based, conservative. Used to clean
19
+ * behavioral event payloads (and custom-event properties) before they
20
+ * leave the browser.
21
+ *
22
+ * Three modes:
23
+ * - "off" — no-op fast path
24
+ * - "default" — emails, phones, US SSNs, credit-card-shaped digits
25
+ * - "strict" — adds IPv4 + IBAN
26
+ *
27
+ * Recursion is bounded at MAX_DEPTH so a pathological deeply-nested
28
+ * input cannot blow the call stack.
29
+ */
30
+ type PiiScrubMode = "off" | "default" | "strict";
31
+
17
32
  /**
18
33
  * Behavioral tracking types. Keep this file free of runtime imports —
19
34
  * pure type declarations only.
@@ -65,6 +80,27 @@ interface DeadClickConfig {
65
80
  observationWindowMs?: number;
66
81
  rateLimitPerSelector?: number;
67
82
  }
83
+ interface JsErrorConfig {
84
+ enabled?: boolean;
85
+ /**
86
+ * Per-detector sampling override. Independent of the parent
87
+ * `BehavioralConfig.sampling` — JS errors are usually high-signal,
88
+ * so default is 1.0.
89
+ */
90
+ sampling?: number;
91
+ /**
92
+ * Additional ignore patterns merged with the built-in defaults
93
+ * (cross-origin "Script error.", ResizeObserver loop warnings,
94
+ * Sentry-style "Non-Error promise rejection captured"). Strings
95
+ * are compiled with `new RegExp(...)`; invalid regex is dropped
96
+ * silently.
97
+ */
98
+ ignorePatterns?: string[];
99
+ /** Max events per fingerprint per `rateLimitWindowMs`. Default 5. */
100
+ rateLimitPerFingerprint?: number;
101
+ /** Rate-limit window in milliseconds. Default 60_000. */
102
+ rateLimitWindowMs?: number;
103
+ }
68
104
  interface BehavioralConfig {
69
105
  enabled?: boolean;
70
106
  sampling?: number;
@@ -74,7 +110,15 @@ interface BehavioralConfig {
74
110
  redirectLoop?: RedirectLoopConfig;
75
111
  formDataLoss?: FormDataLossConfig;
76
112
  deadClick?: DeadClickConfig;
113
+ jsError?: JsErrorConfig;
77
114
  sessionReplay?: SessionReplayConfig;
115
+ /**
116
+ * PII scrubbing applied to `element_text` and `event_data` (and
117
+ * `track()` properties) before events leave the browser. Default
118
+ * `"default"` — emails, phones, US SSNs, credit cards. `"strict"`
119
+ * adds IPv4 and IBAN. `"off"` disables scrubbing entirely.
120
+ */
121
+ piiScrub?: PiiScrubMode;
78
122
  }
79
123
 
80
124
  type MaybePromise<T> = T | Promise<T>;
@@ -517,4 +561,4 @@ interface BlocFeedController {
517
561
  }
518
562
  declare function createBlocFeedController(config: BlocFeedConfig): BlocFeedController;
519
563
 
520
- export { type VideoMime as A, type BlocFeedUser as B, type CaptureConfig as C, type DiagnosticsConfig as D, type ElementDescriptor as E, type FeedbackPayload as F, createBlocFeedController as G, type HoverListener as H, type ImageAsset as I, type BehavioralConfig as J, type BehavioralEvent as K, type BehavioralEventType as L, type MetadataConfig as M, type NetworkEntry as N, type CaptureDiagnostics as O, type MaybePromise as P, type PickerConfig as Q, type RecordingConfig as R, type ScreenshotAdapter as S, type ThemeConfig as T, type TransportResult as U, type VideoAsset as V, type WidgetPosition as W, type CaptureResult as a, type ClickEvent as b, type VoiceConfig as c, type MetadataContext as d, type SecuritySnapshot as e, type SecurityConfig as f, type BlocFeedConfig as g, type BlocFeedController as h, type BlocFeedError as i, type BlocFeedHandle as j, type BlocFeedState as k, type BlocFeedStrings as l, type ConsoleEntry as m, type FeedbackApiResponse as n, type FeedbackCategory as o, type Rect as p, type ScreenshotAdapterOptions as q, type ScreenshotIntent as r, type ScreenshotMime as s, type SecurityFinding as t, type SessionPhase as u, type StateListener as v, type SubmitResult as w, type TransportConfig as x, type TriggerStyle as y, type VideoIntent as z };
564
+ export { type VideoMime as A, type BlocFeedUser as B, type CaptureConfig as C, type DiagnosticsConfig as D, type ElementDescriptor as E, type FeedbackPayload as F, createBlocFeedController as G, type HoverListener as H, type ImageAsset as I, type BehavioralConfig as J, type BehavioralEvent as K, type BehavioralEventType as L, type MetadataConfig as M, type NetworkEntry as N, type CaptureDiagnostics as O, type MaybePromise as P, type PickerConfig as Q, type RecordingConfig as R, type ScreenshotAdapter as S, type ThemeConfig as T, type PiiScrubMode as U, type VideoAsset as V, type WidgetPosition as W, type TransportResult as X, type CaptureResult as a, type ClickEvent as b, type VoiceConfig as c, type MetadataContext as d, type SecuritySnapshot as e, type SecurityConfig as f, type BlocFeedConfig as g, type BlocFeedController as h, type BlocFeedError as i, type BlocFeedHandle as j, type BlocFeedState as k, type BlocFeedStrings as l, type ConsoleEntry as m, type FeedbackApiResponse as n, type FeedbackCategory as o, type Rect as p, type ScreenshotAdapterOptions as q, type ScreenshotIntent as r, type ScreenshotMime as s, type SecurityFinding as t, type SessionPhase as u, type StateListener as v, type SubmitResult as w, type TransportConfig as x, type TriggerStyle as y, type VideoIntent as z };
@@ -14,6 +14,21 @@ interface SessionReplayConfig {
14
14
  };
15
15
  }
16
16
 
17
+ /**
18
+ * PII scrubbing helper. Regex-based, conservative. Used to clean
19
+ * behavioral event payloads (and custom-event properties) before they
20
+ * leave the browser.
21
+ *
22
+ * Three modes:
23
+ * - "off" — no-op fast path
24
+ * - "default" — emails, phones, US SSNs, credit-card-shaped digits
25
+ * - "strict" — adds IPv4 + IBAN
26
+ *
27
+ * Recursion is bounded at MAX_DEPTH so a pathological deeply-nested
28
+ * input cannot blow the call stack.
29
+ */
30
+ type PiiScrubMode = "off" | "default" | "strict";
31
+
17
32
  /**
18
33
  * Behavioral tracking types. Keep this file free of runtime imports —
19
34
  * pure type declarations only.
@@ -65,6 +80,27 @@ interface DeadClickConfig {
65
80
  observationWindowMs?: number;
66
81
  rateLimitPerSelector?: number;
67
82
  }
83
+ interface JsErrorConfig {
84
+ enabled?: boolean;
85
+ /**
86
+ * Per-detector sampling override. Independent of the parent
87
+ * `BehavioralConfig.sampling` — JS errors are usually high-signal,
88
+ * so default is 1.0.
89
+ */
90
+ sampling?: number;
91
+ /**
92
+ * Additional ignore patterns merged with the built-in defaults
93
+ * (cross-origin "Script error.", ResizeObserver loop warnings,
94
+ * Sentry-style "Non-Error promise rejection captured"). Strings
95
+ * are compiled with `new RegExp(...)`; invalid regex is dropped
96
+ * silently.
97
+ */
98
+ ignorePatterns?: string[];
99
+ /** Max events per fingerprint per `rateLimitWindowMs`. Default 5. */
100
+ rateLimitPerFingerprint?: number;
101
+ /** Rate-limit window in milliseconds. Default 60_000. */
102
+ rateLimitWindowMs?: number;
103
+ }
68
104
  interface BehavioralConfig {
69
105
  enabled?: boolean;
70
106
  sampling?: number;
@@ -74,7 +110,15 @@ interface BehavioralConfig {
74
110
  redirectLoop?: RedirectLoopConfig;
75
111
  formDataLoss?: FormDataLossConfig;
76
112
  deadClick?: DeadClickConfig;
113
+ jsError?: JsErrorConfig;
77
114
  sessionReplay?: SessionReplayConfig;
115
+ /**
116
+ * PII scrubbing applied to `element_text` and `event_data` (and
117
+ * `track()` properties) before events leave the browser. Default
118
+ * `"default"` — emails, phones, US SSNs, credit cards. `"strict"`
119
+ * adds IPv4 and IBAN. `"off"` disables scrubbing entirely.
120
+ */
121
+ piiScrub?: PiiScrubMode;
78
122
  }
79
123
 
80
124
  type MaybePromise<T> = T | Promise<T>;
@@ -517,4 +561,4 @@ interface BlocFeedController {
517
561
  }
518
562
  declare function createBlocFeedController(config: BlocFeedConfig): BlocFeedController;
519
563
 
520
- export { type VideoMime as A, type BlocFeedUser as B, type CaptureConfig as C, type DiagnosticsConfig as D, type ElementDescriptor as E, type FeedbackPayload as F, createBlocFeedController as G, type HoverListener as H, type ImageAsset as I, type BehavioralConfig as J, type BehavioralEvent as K, type BehavioralEventType as L, type MetadataConfig as M, type NetworkEntry as N, type CaptureDiagnostics as O, type MaybePromise as P, type PickerConfig as Q, type RecordingConfig as R, type ScreenshotAdapter as S, type ThemeConfig as T, type TransportResult as U, type VideoAsset as V, type WidgetPosition as W, type CaptureResult as a, type ClickEvent as b, type VoiceConfig as c, type MetadataContext as d, type SecuritySnapshot as e, type SecurityConfig as f, type BlocFeedConfig as g, type BlocFeedController as h, type BlocFeedError as i, type BlocFeedHandle as j, type BlocFeedState as k, type BlocFeedStrings as l, type ConsoleEntry as m, type FeedbackApiResponse as n, type FeedbackCategory as o, type Rect as p, type ScreenshotAdapterOptions as q, type ScreenshotIntent as r, type ScreenshotMime as s, type SecurityFinding as t, type SessionPhase as u, type StateListener as v, type SubmitResult as w, type TransportConfig as x, type TriggerStyle as y, type VideoIntent as z };
564
+ export { type VideoMime as A, type BlocFeedUser as B, type CaptureConfig as C, type DiagnosticsConfig as D, type ElementDescriptor as E, type FeedbackPayload as F, createBlocFeedController as G, type HoverListener as H, type ImageAsset as I, type BehavioralConfig as J, type BehavioralEvent as K, type BehavioralEventType as L, type MetadataConfig as M, type NetworkEntry as N, type CaptureDiagnostics as O, type MaybePromise as P, type PickerConfig as Q, type RecordingConfig as R, type ScreenshotAdapter as S, type ThemeConfig as T, type PiiScrubMode as U, type VideoAsset as V, type WidgetPosition as W, type TransportResult as X, type CaptureResult as a, type ClickEvent as b, type VoiceConfig as c, type MetadataContext as d, type SecuritySnapshot as e, type SecurityConfig as f, type BlocFeedConfig as g, type BlocFeedController as h, type BlocFeedError as i, type BlocFeedHandle as j, type BlocFeedState as k, type BlocFeedStrings as l, type ConsoleEntry as m, type FeedbackApiResponse as n, type FeedbackCategory as o, type Rect as p, type ScreenshotAdapterOptions as q, type ScreenshotIntent as r, type ScreenshotMime as s, type SecurityFinding as t, type SessionPhase as u, type StateListener as v, type SubmitResult as w, type TransportConfig as x, type TriggerStyle as y, type VideoIntent as z };
package/dist/engine.cjs CHANGED
@@ -1 +1 @@
1
- 'use strict';var chunkSJE73TVR_cjs=require('./chunk-SJE73TVR.cjs');function s(o){if(o?.aborted)throw new Error("Aborted")}async function v(o){return await new Promise((t,e)=>{let r=new Image;r.onload=()=>t({width:r.naturalWidth,height:r.naturalHeight}),r.onerror=()=>e(new Error("Failed to load generated screenshot")),r.src=o;})}async function l(o,t){let{width:e,height:r}=await v(o);return {dataUrl:o,mime:t,width:e,height:r}}function U(o){return {async captureElement(t,e){if(!chunkSJE73TVR_cjs.a())throw new Error("captureElement can only run in the browser");s(e.signal);let r={scale:e.pixelRatio},n=e.mime==="image/jpeg"?await o.domToJpeg(t,{...r,quality:e.quality??.92}):await o.domToPng(t,r);return s(e.signal),await l(n,e.mime)},async captureFullPage(t){if(!chunkSJE73TVR_cjs.a())throw new Error("captureFullPage can only run in the browser");s(t.signal);let e=document.documentElement,r=Math.max(e.scrollWidth,e.clientWidth),n=Math.max(e.scrollHeight,e.clientHeight),i=Math.min(1,t.maxDimension/Math.max(r,n)),c={width:Math.max(1,Math.round(r*i)),height:Math.max(1,Math.round(n*i)),scale:t.pixelRatio},a=t.mime==="image/jpeg"?await o.domToJpeg(e,{...c,quality:t.quality??.92}):await o.domToPng(e,c);return s(t.signal),await l(a,t.mime)}}}function O(o){let[t,e]=o.split(",",2);if(!t||!e)throw new Error("Invalid data URL");let n=/data:(.*?);base64/.exec(t)?.[1]||"application/octet-stream",i=atob(e),c=new Uint8Array(i.length);for(let a=0;a<i.length;a+=1)c[a]=i.charCodeAt(a);return new Blob([c],{type:n})}Object.defineProperty(exports,"clearClickEvents",{enumerable:true,get:function(){return chunkSJE73TVR_cjs.j}});Object.defineProperty(exports,"clearDiagnostics",{enumerable:true,get:function(){return chunkSJE73TVR_cjs.z}});Object.defineProperty(exports,"clearQueue",{enumerable:true,get:function(){return chunkSJE73TVR_cjs.g}});Object.defineProperty(exports,"clearSecurityFindings",{enumerable:true,get:function(){return chunkSJE73TVR_cjs.C}});Object.defineProperty(exports,"collectMetadata",{enumerable:true,get:function(){return chunkSJE73TVR_cjs.d}});Object.defineProperty(exports,"createBlocFeedController",{enumerable:true,get:function(){return chunkSJE73TVR_cjs.u}});Object.defineProperty(exports,"createHtmlToImageAdapter",{enumerable:true,get:function(){return chunkSJE73TVR_cjs.b}});Object.defineProperty(exports,"dequeueAll",{enumerable:true,get:function(){return chunkSJE73TVR_cjs.f}});Object.defineProperty(exports,"drainClickEvents",{enumerable:true,get:function(){return chunkSJE73TVR_cjs.i}});Object.defineProperty(exports,"drainDiagnostics",{enumerable:true,get:function(){return chunkSJE73TVR_cjs.y}});Object.defineProperty(exports,"enqueue",{enumerable:true,get:function(){return chunkSJE73TVR_cjs.e}});Object.defineProperty(exports,"getMyFeedbackUrl",{enumerable:true,get:function(){return chunkSJE73TVR_cjs.p}});Object.defineProperty(exports,"getQueueSize",{enumerable:true,get:function(){return chunkSJE73TVR_cjs.h}});Object.defineProperty(exports,"getSecurityFindings",{enumerable:true,get:function(){return chunkSJE73TVR_cjs.B}});Object.defineProperty(exports,"getViewerToken",{enumerable:true,get:function(){return chunkSJE73TVR_cjs.o}});Object.defineProperty(exports,"installDiagnostics",{enumerable:true,get:function(){return chunkSJE73TVR_cjs.w}});Object.defineProperty(exports,"isRecordingSupported",{enumerable:true,get:function(){return chunkSJE73TVR_cjs.k}});Object.defineProperty(exports,"isVoiceSupported",{enumerable:true,get:function(){return chunkSJE73TVR_cjs.m}});Object.defineProperty(exports,"runCapture",{enumerable:true,get:function(){return chunkSJE73TVR_cjs.c}});Object.defineProperty(exports,"runSecretScan",{enumerable:true,get:function(){return chunkSJE73TVR_cjs.A}});Object.defineProperty(exports,"startRecording",{enumerable:true,get:function(){return chunkSJE73TVR_cjs.l}});Object.defineProperty(exports,"startVoiceRecording",{enumerable:true,get:function(){return chunkSJE73TVR_cjs.n}});Object.defineProperty(exports,"transcribeAudio",{enumerable:true,get:function(){return chunkSJE73TVR_cjs.q}});Object.defineProperty(exports,"uninstallDiagnostics",{enumerable:true,get:function(){return chunkSJE73TVR_cjs.x}});exports.createModernScreenshotAdapter=U;exports.dataUrlToBlob=O;
1
+ 'use strict';var chunkWKHX5Z3E_cjs=require('./chunk-WKHX5Z3E.cjs');function s(o){if(o?.aborted)throw new Error("Aborted")}async function v(o){return await new Promise((t,e)=>{let r=new Image;r.onload=()=>t({width:r.naturalWidth,height:r.naturalHeight}),r.onerror=()=>e(new Error("Failed to load generated screenshot")),r.src=o;})}async function l(o,t){let{width:e,height:r}=await v(o);return {dataUrl:o,mime:t,width:e,height:r}}function U(o){return {async captureElement(t,e){if(!chunkWKHX5Z3E_cjs.a())throw new Error("captureElement can only run in the browser");s(e.signal);let r={scale:e.pixelRatio},n=e.mime==="image/jpeg"?await o.domToJpeg(t,{...r,quality:e.quality??.92}):await o.domToPng(t,r);return s(e.signal),await l(n,e.mime)},async captureFullPage(t){if(!chunkWKHX5Z3E_cjs.a())throw new Error("captureFullPage can only run in the browser");s(t.signal);let e=document.documentElement,r=Math.max(e.scrollWidth,e.clientWidth),n=Math.max(e.scrollHeight,e.clientHeight),i=Math.min(1,t.maxDimension/Math.max(r,n)),c={width:Math.max(1,Math.round(r*i)),height:Math.max(1,Math.round(n*i)),scale:t.pixelRatio},a=t.mime==="image/jpeg"?await o.domToJpeg(e,{...c,quality:t.quality??.92}):await o.domToPng(e,c);return s(t.signal),await l(a,t.mime)}}}function O(o){let[t,e]=o.split(",",2);if(!t||!e)throw new Error("Invalid data URL");let n=/data:(.*?);base64/.exec(t)?.[1]||"application/octet-stream",i=atob(e),c=new Uint8Array(i.length);for(let a=0;a<i.length;a+=1)c[a]=i.charCodeAt(a);return new Blob([c],{type:n})}Object.defineProperty(exports,"clearClickEvents",{enumerable:true,get:function(){return chunkWKHX5Z3E_cjs.j}});Object.defineProperty(exports,"clearDiagnostics",{enumerable:true,get:function(){return chunkWKHX5Z3E_cjs.z}});Object.defineProperty(exports,"clearQueue",{enumerable:true,get:function(){return chunkWKHX5Z3E_cjs.g}});Object.defineProperty(exports,"clearSecurityFindings",{enumerable:true,get:function(){return chunkWKHX5Z3E_cjs.C}});Object.defineProperty(exports,"collectMetadata",{enumerable:true,get:function(){return chunkWKHX5Z3E_cjs.d}});Object.defineProperty(exports,"createBlocFeedController",{enumerable:true,get:function(){return chunkWKHX5Z3E_cjs.u}});Object.defineProperty(exports,"createHtmlToImageAdapter",{enumerable:true,get:function(){return chunkWKHX5Z3E_cjs.b}});Object.defineProperty(exports,"dequeueAll",{enumerable:true,get:function(){return chunkWKHX5Z3E_cjs.f}});Object.defineProperty(exports,"drainClickEvents",{enumerable:true,get:function(){return chunkWKHX5Z3E_cjs.i}});Object.defineProperty(exports,"drainDiagnostics",{enumerable:true,get:function(){return chunkWKHX5Z3E_cjs.y}});Object.defineProperty(exports,"enqueue",{enumerable:true,get:function(){return chunkWKHX5Z3E_cjs.e}});Object.defineProperty(exports,"getMyFeedbackUrl",{enumerable:true,get:function(){return chunkWKHX5Z3E_cjs.p}});Object.defineProperty(exports,"getQueueSize",{enumerable:true,get:function(){return chunkWKHX5Z3E_cjs.h}});Object.defineProperty(exports,"getSecurityFindings",{enumerable:true,get:function(){return chunkWKHX5Z3E_cjs.B}});Object.defineProperty(exports,"getViewerToken",{enumerable:true,get:function(){return chunkWKHX5Z3E_cjs.o}});Object.defineProperty(exports,"installDiagnostics",{enumerable:true,get:function(){return chunkWKHX5Z3E_cjs.w}});Object.defineProperty(exports,"isRecordingSupported",{enumerable:true,get:function(){return chunkWKHX5Z3E_cjs.k}});Object.defineProperty(exports,"isVoiceSupported",{enumerable:true,get:function(){return chunkWKHX5Z3E_cjs.m}});Object.defineProperty(exports,"runCapture",{enumerable:true,get:function(){return chunkWKHX5Z3E_cjs.c}});Object.defineProperty(exports,"runSecretScan",{enumerable:true,get:function(){return chunkWKHX5Z3E_cjs.A}});Object.defineProperty(exports,"startRecording",{enumerable:true,get:function(){return chunkWKHX5Z3E_cjs.l}});Object.defineProperty(exports,"startVoiceRecording",{enumerable:true,get:function(){return chunkWKHX5Z3E_cjs.n}});Object.defineProperty(exports,"transcribeAudio",{enumerable:true,get:function(){return chunkWKHX5Z3E_cjs.q}});Object.defineProperty(exports,"uninstallDiagnostics",{enumerable:true,get:function(){return chunkWKHX5Z3E_cjs.x}});exports.createModernScreenshotAdapter=U;exports.dataUrlToBlob=O;
package/dist/engine.d.cts CHANGED
@@ -1,5 +1,5 @@
1
- import { S as ScreenshotAdapter, C as CaptureConfig, a as CaptureResult, V as VideoAsset, R as RecordingConfig, b as ClickEvent, c as VoiceConfig, M as MetadataConfig, d as MetadataContext, B as BlocFeedUser, F as FeedbackPayload, e as SecuritySnapshot, f as SecurityConfig } from './controller-BPGXlZKD.cjs';
2
- export { g as BlocFeedConfig, h as BlocFeedController, i as BlocFeedError, j as BlocFeedHandle, k as BlocFeedState, l as BlocFeedStrings, m as ConsoleEntry, D as DiagnosticsConfig, E as ElementDescriptor, n as FeedbackApiResponse, o as FeedbackCategory, H as HoverListener, I as ImageAsset, N as NetworkEntry, p as Rect, q as ScreenshotAdapterOptions, r as ScreenshotIntent, s as ScreenshotMime, t as SecurityFinding, u as SessionPhase, v as StateListener, w as SubmitResult, T as ThemeConfig, x as TransportConfig, y as TriggerStyle, z as VideoIntent, A as VideoMime, W as WidgetPosition, G as createBlocFeedController } from './controller-BPGXlZKD.cjs';
1
+ import { S as ScreenshotAdapter, C as CaptureConfig, a as CaptureResult, V as VideoAsset, R as RecordingConfig, b as ClickEvent, c as VoiceConfig, M as MetadataConfig, d as MetadataContext, B as BlocFeedUser, F as FeedbackPayload, e as SecuritySnapshot, f as SecurityConfig } from './controller-v9Hd8d5-.cjs';
2
+ export { g as BlocFeedConfig, h as BlocFeedController, i as BlocFeedError, j as BlocFeedHandle, k as BlocFeedState, l as BlocFeedStrings, m as ConsoleEntry, D as DiagnosticsConfig, E as ElementDescriptor, n as FeedbackApiResponse, o as FeedbackCategory, H as HoverListener, I as ImageAsset, N as NetworkEntry, p as Rect, q as ScreenshotAdapterOptions, r as ScreenshotIntent, s as ScreenshotMime, t as SecurityFinding, u as SessionPhase, v as StateListener, w as SubmitResult, T as ThemeConfig, x as TransportConfig, y as TriggerStyle, z as VideoIntent, A as VideoMime, W as WidgetPosition, G as createBlocFeedController } from './controller-v9Hd8d5-.cjs';
3
3
 
4
4
  declare function createHtmlToImageAdapter(): ScreenshotAdapter;
5
5
 
package/dist/engine.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { S as ScreenshotAdapter, C as CaptureConfig, a as CaptureResult, V as VideoAsset, R as RecordingConfig, b as ClickEvent, c as VoiceConfig, M as MetadataConfig, d as MetadataContext, B as BlocFeedUser, F as FeedbackPayload, e as SecuritySnapshot, f as SecurityConfig } from './controller-BPGXlZKD.js';
2
- export { g as BlocFeedConfig, h as BlocFeedController, i as BlocFeedError, j as BlocFeedHandle, k as BlocFeedState, l as BlocFeedStrings, m as ConsoleEntry, D as DiagnosticsConfig, E as ElementDescriptor, n as FeedbackApiResponse, o as FeedbackCategory, H as HoverListener, I as ImageAsset, N as NetworkEntry, p as Rect, q as ScreenshotAdapterOptions, r as ScreenshotIntent, s as ScreenshotMime, t as SecurityFinding, u as SessionPhase, v as StateListener, w as SubmitResult, T as ThemeConfig, x as TransportConfig, y as TriggerStyle, z as VideoIntent, A as VideoMime, W as WidgetPosition, G as createBlocFeedController } from './controller-BPGXlZKD.js';
1
+ import { S as ScreenshotAdapter, C as CaptureConfig, a as CaptureResult, V as VideoAsset, R as RecordingConfig, b as ClickEvent, c as VoiceConfig, M as MetadataConfig, d as MetadataContext, B as BlocFeedUser, F as FeedbackPayload, e as SecuritySnapshot, f as SecurityConfig } from './controller-v9Hd8d5-.js';
2
+ export { g as BlocFeedConfig, h as BlocFeedController, i as BlocFeedError, j as BlocFeedHandle, k as BlocFeedState, l as BlocFeedStrings, m as ConsoleEntry, D as DiagnosticsConfig, E as ElementDescriptor, n as FeedbackApiResponse, o as FeedbackCategory, H as HoverListener, I as ImageAsset, N as NetworkEntry, p as Rect, q as ScreenshotAdapterOptions, r as ScreenshotIntent, s as ScreenshotMime, t as SecurityFinding, u as SessionPhase, v as StateListener, w as SubmitResult, T as ThemeConfig, x as TransportConfig, y as TriggerStyle, z as VideoIntent, A as VideoMime, W as WidgetPosition, G as createBlocFeedController } from './controller-v9Hd8d5-.js';
3
3
 
4
4
  declare function createHtmlToImageAdapter(): ScreenshotAdapter;
5
5
 
package/dist/engine.js CHANGED
@@ -1 +1 @@
1
- import {a}from'./chunk-NMH3WM6Y.js';export{j as clearClickEvents,z as clearDiagnostics,g as clearQueue,C as clearSecurityFindings,d as collectMetadata,u as createBlocFeedController,b as createHtmlToImageAdapter,f as dequeueAll,i as drainClickEvents,y as drainDiagnostics,e as enqueue,p as getMyFeedbackUrl,h as getQueueSize,B as getSecurityFindings,o as getViewerToken,w as installDiagnostics,k as isRecordingSupported,m as isVoiceSupported,c as runCapture,A as runSecretScan,l as startRecording,n as startVoiceRecording,q as transcribeAudio,x as uninstallDiagnostics}from'./chunk-NMH3WM6Y.js';function s(o){if(o?.aborted)throw new Error("Aborted")}async function v(o){return await new Promise((t,e)=>{let r=new Image;r.onload=()=>t({width:r.naturalWidth,height:r.naturalHeight}),r.onerror=()=>e(new Error("Failed to load generated screenshot")),r.src=o;})}async function l(o,t){let{width:e,height:r}=await v(o);return {dataUrl:o,mime:t,width:e,height:r}}function U(o){return {async captureElement(t,e){if(!a())throw new Error("captureElement can only run in the browser");s(e.signal);let r={scale:e.pixelRatio},n=e.mime==="image/jpeg"?await o.domToJpeg(t,{...r,quality:e.quality??.92}):await o.domToPng(t,r);return s(e.signal),await l(n,e.mime)},async captureFullPage(t){if(!a())throw new Error("captureFullPage can only run in the browser");s(t.signal);let e=document.documentElement,r=Math.max(e.scrollWidth,e.clientWidth),n=Math.max(e.scrollHeight,e.clientHeight),i=Math.min(1,t.maxDimension/Math.max(r,n)),c={width:Math.max(1,Math.round(r*i)),height:Math.max(1,Math.round(n*i)),scale:t.pixelRatio},a$1=t.mime==="image/jpeg"?await o.domToJpeg(e,{...c,quality:t.quality??.92}):await o.domToPng(e,c);return s(t.signal),await l(a$1,t.mime)}}}function O(o){let[t,e]=o.split(",",2);if(!t||!e)throw new Error("Invalid data URL");let n=/data:(.*?);base64/.exec(t)?.[1]||"application/octet-stream",i=atob(e),c=new Uint8Array(i.length);for(let a=0;a<i.length;a+=1)c[a]=i.charCodeAt(a);return new Blob([c],{type:n})}export{U as createModernScreenshotAdapter,O as dataUrlToBlob};
1
+ import {a}from'./chunk-6HNU7ECD.js';export{j as clearClickEvents,z as clearDiagnostics,g as clearQueue,C as clearSecurityFindings,d as collectMetadata,u as createBlocFeedController,b as createHtmlToImageAdapter,f as dequeueAll,i as drainClickEvents,y as drainDiagnostics,e as enqueue,p as getMyFeedbackUrl,h as getQueueSize,B as getSecurityFindings,o as getViewerToken,w as installDiagnostics,k as isRecordingSupported,m as isVoiceSupported,c as runCapture,A as runSecretScan,l as startRecording,n as startVoiceRecording,q as transcribeAudio,x as uninstallDiagnostics}from'./chunk-6HNU7ECD.js';function s(o){if(o?.aborted)throw new Error("Aborted")}async function v(o){return await new Promise((t,e)=>{let r=new Image;r.onload=()=>t({width:r.naturalWidth,height:r.naturalHeight}),r.onerror=()=>e(new Error("Failed to load generated screenshot")),r.src=o;})}async function l(o,t){let{width:e,height:r}=await v(o);return {dataUrl:o,mime:t,width:e,height:r}}function U(o){return {async captureElement(t,e){if(!a())throw new Error("captureElement can only run in the browser");s(e.signal);let r={scale:e.pixelRatio},n=e.mime==="image/jpeg"?await o.domToJpeg(t,{...r,quality:e.quality??.92}):await o.domToPng(t,r);return s(e.signal),await l(n,e.mime)},async captureFullPage(t){if(!a())throw new Error("captureFullPage can only run in the browser");s(t.signal);let e=document.documentElement,r=Math.max(e.scrollWidth,e.clientWidth),n=Math.max(e.scrollHeight,e.clientHeight),i=Math.min(1,t.maxDimension/Math.max(r,n)),c={width:Math.max(1,Math.round(r*i)),height:Math.max(1,Math.round(n*i)),scale:t.pixelRatio},a$1=t.mime==="image/jpeg"?await o.domToJpeg(e,{...c,quality:t.quality??.92}):await o.domToPng(e,c);return s(t.signal),await l(a$1,t.mime)}}}function O(o){let[t,e]=o.split(",",2);if(!t||!e)throw new Error("Invalid data URL");let n=/data:(.*?);base64/.exec(t)?.[1]||"application/octet-stream",i=atob(e),c=new Uint8Array(i.length);for(let a=0;a<i.length;a+=1)c[a]=i.charCodeAt(a);return new Blob([c],{type:n})}export{U as createModernScreenshotAdapter,O as dataUrlToBlob};
package/dist/main.cjs CHANGED
@@ -1,2 +1,2 @@
1
1
  "use client";
2
- 'use strict';var chunkSJE73TVR_cjs=require('./chunk-SJE73TVR.cjs');Object.defineProperty(exports,"BehavioralTracker",{enumerable:true,get:function(){return chunkSJE73TVR_cjs.t}});Object.defineProperty(exports,"BlocFeed",{enumerable:true,get:function(){return chunkSJE73TVR_cjs.G}});Object.defineProperty(exports,"BlocFeedProvider",{enumerable:true,get:function(){return chunkSJE73TVR_cjs.v}});Object.defineProperty(exports,"BlocFeedWidget",{enumerable:true,get:function(){return chunkSJE73TVR_cjs.E}});Object.defineProperty(exports,"SDK_VERSION",{enumerable:true,get:function(){return chunkSJE73TVR_cjs.F}});Object.defineProperty(exports,"track",{enumerable:true,get:function(){return chunkSJE73TVR_cjs.s}});Object.defineProperty(exports,"useBlocFeed",{enumerable:true,get:function(){return chunkSJE73TVR_cjs.D}});
2
+ 'use strict';var chunkWKHX5Z3E_cjs=require('./chunk-WKHX5Z3E.cjs');Object.defineProperty(exports,"BehavioralTracker",{enumerable:true,get:function(){return chunkWKHX5Z3E_cjs.t}});Object.defineProperty(exports,"BlocFeed",{enumerable:true,get:function(){return chunkWKHX5Z3E_cjs.G}});Object.defineProperty(exports,"BlocFeedProvider",{enumerable:true,get:function(){return chunkWKHX5Z3E_cjs.v}});Object.defineProperty(exports,"BlocFeedWidget",{enumerable:true,get:function(){return chunkWKHX5Z3E_cjs.E}});Object.defineProperty(exports,"SDK_VERSION",{enumerable:true,get:function(){return chunkWKHX5Z3E_cjs.F}});Object.defineProperty(exports,"track",{enumerable:true,get:function(){return chunkWKHX5Z3E_cjs.s}});Object.defineProperty(exports,"useBlocFeed",{enumerable:true,get:function(){return chunkWKHX5Z3E_cjs.D}});
package/dist/main.d.cts CHANGED
@@ -1,5 +1,5 @@
1
- import { g as BlocFeedConfig, j as BlocFeedHandle, k as BlocFeedState, h as BlocFeedController, C as CaptureConfig, o as FeedbackCategory, w as SubmitResult, K as BehavioralEvent, J as BehavioralConfig } from './controller-BPGXlZKD.cjs';
2
- export { L as BehavioralEventType, i as BlocFeedError, l as BlocFeedStrings, B as BlocFeedUser, O as CaptureDiagnostics, a as CaptureResult, m as ConsoleEntry, D as DiagnosticsConfig, E as ElementDescriptor, n as FeedbackApiResponse, F as FeedbackPayload, I as ImageAsset, P as MaybePromise, M as MetadataConfig, d as MetadataContext, N as NetworkEntry, Q as PickerConfig, R as RecordingConfig, p as Rect, S as ScreenshotAdapter, q as ScreenshotAdapterOptions, r as ScreenshotIntent, s as ScreenshotMime, f as SecurityConfig, t as SecurityFinding, e as SecuritySnapshot, u as SessionPhase, T as ThemeConfig, x as TransportConfig, U as TransportResult, y as TriggerStyle, V as VideoAsset, z as VideoIntent, A as VideoMime, c as VoiceConfig, W as WidgetPosition } from './controller-BPGXlZKD.cjs';
1
+ import { g as BlocFeedConfig, j as BlocFeedHandle, k as BlocFeedState, h as BlocFeedController, C as CaptureConfig, o as FeedbackCategory, w as SubmitResult, K as BehavioralEvent, J as BehavioralConfig } from './controller-v9Hd8d5-.cjs';
2
+ export { L as BehavioralEventType, i as BlocFeedError, l as BlocFeedStrings, B as BlocFeedUser, O as CaptureDiagnostics, a as CaptureResult, m as ConsoleEntry, D as DiagnosticsConfig, E as ElementDescriptor, n as FeedbackApiResponse, F as FeedbackPayload, I as ImageAsset, P as MaybePromise, M as MetadataConfig, d as MetadataContext, N as NetworkEntry, Q as PickerConfig, U as PiiScrubMode, R as RecordingConfig, p as Rect, S as ScreenshotAdapter, q as ScreenshotAdapterOptions, r as ScreenshotIntent, s as ScreenshotMime, f as SecurityConfig, t as SecurityFinding, e as SecuritySnapshot, u as SessionPhase, T as ThemeConfig, x as TransportConfig, X as TransportResult, y as TriggerStyle, V as VideoAsset, z as VideoIntent, A as VideoMime, c as VoiceConfig, W as WidgetPosition } from './controller-v9Hd8d5-.cjs';
3
3
  import * as react_jsx_runtime from 'react/jsx-runtime';
4
4
  import * as react from 'react';
5
5
  import { ReactNode } from 'react';
@@ -110,7 +110,7 @@ declare function track(name: string, properties?: TrackProperties, options?: Tra
110
110
  * Pinned at publish time. Sent with the heartbeat so the dashboard can
111
111
  * surface SDK version drift to customers.
112
112
  */
113
- declare const SDK_VERSION = "0.23.0";
113
+ declare const SDK_VERSION = "0.24.0";
114
114
 
115
115
  /**
116
116
  * Non-React entry point. Mirrors the shape of the rest of the SDK exports;
package/dist/main.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { g as BlocFeedConfig, j as BlocFeedHandle, k as BlocFeedState, h as BlocFeedController, C as CaptureConfig, o as FeedbackCategory, w as SubmitResult, K as BehavioralEvent, J as BehavioralConfig } from './controller-BPGXlZKD.js';
2
- export { L as BehavioralEventType, i as BlocFeedError, l as BlocFeedStrings, B as BlocFeedUser, O as CaptureDiagnostics, a as CaptureResult, m as ConsoleEntry, D as DiagnosticsConfig, E as ElementDescriptor, n as FeedbackApiResponse, F as FeedbackPayload, I as ImageAsset, P as MaybePromise, M as MetadataConfig, d as MetadataContext, N as NetworkEntry, Q as PickerConfig, R as RecordingConfig, p as Rect, S as ScreenshotAdapter, q as ScreenshotAdapterOptions, r as ScreenshotIntent, s as ScreenshotMime, f as SecurityConfig, t as SecurityFinding, e as SecuritySnapshot, u as SessionPhase, T as ThemeConfig, x as TransportConfig, U as TransportResult, y as TriggerStyle, V as VideoAsset, z as VideoIntent, A as VideoMime, c as VoiceConfig, W as WidgetPosition } from './controller-BPGXlZKD.js';
1
+ import { g as BlocFeedConfig, j as BlocFeedHandle, k as BlocFeedState, h as BlocFeedController, C as CaptureConfig, o as FeedbackCategory, w as SubmitResult, K as BehavioralEvent, J as BehavioralConfig } from './controller-v9Hd8d5-.js';
2
+ export { L as BehavioralEventType, i as BlocFeedError, l as BlocFeedStrings, B as BlocFeedUser, O as CaptureDiagnostics, a as CaptureResult, m as ConsoleEntry, D as DiagnosticsConfig, E as ElementDescriptor, n as FeedbackApiResponse, F as FeedbackPayload, I as ImageAsset, P as MaybePromise, M as MetadataConfig, d as MetadataContext, N as NetworkEntry, Q as PickerConfig, U as PiiScrubMode, R as RecordingConfig, p as Rect, S as ScreenshotAdapter, q as ScreenshotAdapterOptions, r as ScreenshotIntent, s as ScreenshotMime, f as SecurityConfig, t as SecurityFinding, e as SecuritySnapshot, u as SessionPhase, T as ThemeConfig, x as TransportConfig, X as TransportResult, y as TriggerStyle, V as VideoAsset, z as VideoIntent, A as VideoMime, c as VoiceConfig, W as WidgetPosition } from './controller-v9Hd8d5-.js';
3
3
  import * as react_jsx_runtime from 'react/jsx-runtime';
4
4
  import * as react from 'react';
5
5
  import { ReactNode } from 'react';
@@ -110,7 +110,7 @@ declare function track(name: string, properties?: TrackProperties, options?: Tra
110
110
  * Pinned at publish time. Sent with the heartbeat so the dashboard can
111
111
  * surface SDK version drift to customers.
112
112
  */
113
- declare const SDK_VERSION = "0.23.0";
113
+ declare const SDK_VERSION = "0.24.0";
114
114
 
115
115
  /**
116
116
  * Non-React entry point. Mirrors the shape of the rest of the SDK exports;
package/dist/main.js CHANGED
@@ -1,2 +1,2 @@
1
1
  "use client";
2
- export{t as BehavioralTracker,G as BlocFeed,v as BlocFeedProvider,E as BlocFeedWidget,F as SDK_VERSION,s as track,D as useBlocFeed}from'./chunk-NMH3WM6Y.js';
2
+ export{t as BehavioralTracker,G as BlocFeed,v as BlocFeedProvider,E as BlocFeedWidget,F as SDK_VERSION,s as track,D as useBlocFeed}from'./chunk-6HNU7ECD.js';
package/dist/passive.cjs CHANGED
@@ -1 +1 @@
1
- 'use strict';var chunkSJE73TVR_cjs=require('./chunk-SJE73TVR.cjs'),react=require('react');function a(e){e.user?.id&&chunkSJE73TVR_cjs.r(e.user.id);let i=new chunkSJE73TVR_cjs.t({blocfeedId:e.blocfeed_id,...e.config!==void 0?{config:e.config}:{},...e.extraSdkFeatures!==void 0?{extraSdkFeatures:e.extraSdkFeatures}:{}});return i.install(),i}function u(e){return react.useEffect(()=>{let i=a({blocfeed_id:e.blocfeed_id,...e.user!==void 0?{user:e.user}:{},...e.config!==void 0?{config:e.config}:{}});return ()=>{i.uninstall();}},[e.blocfeed_id]),null}var r=null,g={init(e){r||(r=a(e));},identify(e,i){chunkSJE73TVR_cjs.r(e);},track(e,i){chunkSJE73TVR_cjs.s(e,i);},uninstall(){r&&(r.uninstall(),r=null);}};function v(){return r}function k(){r&&(r.uninstall(),r=null);}Object.defineProperty(exports,"SDK_VERSION",{enumerable:true,get:function(){return chunkSJE73TVR_cjs.F}});exports.BlocFeed=g;exports.BlocFeedPassive=u;exports.__getStandaloneTrackerForTesting=v;exports.__resetStandaloneTrackerForTesting=k;
1
+ 'use strict';var chunkWKHX5Z3E_cjs=require('./chunk-WKHX5Z3E.cjs'),react=require('react');function a(e){e.user?.id&&chunkWKHX5Z3E_cjs.r(e.user.id);let i=new chunkWKHX5Z3E_cjs.t({blocfeedId:e.blocfeed_id,...e.config!==void 0?{config:e.config}:{},...e.extraSdkFeatures!==void 0?{extraSdkFeatures:e.extraSdkFeatures}:{}});return i.install(),i}function u(e){return react.useEffect(()=>{let i=a({blocfeed_id:e.blocfeed_id,...e.user!==void 0?{user:e.user}:{},...e.config!==void 0?{config:e.config}:{}});return ()=>{i.uninstall();}},[e.blocfeed_id]),null}var r=null,g={init(e){r||(r=a(e));},identify(e,i){chunkWKHX5Z3E_cjs.r(e);},track(e,i){chunkWKHX5Z3E_cjs.s(e,i);},uninstall(){r&&(r.uninstall(),r=null);}};function v(){return r}function k(){r&&(r.uninstall(),r=null);}Object.defineProperty(exports,"SDK_VERSION",{enumerable:true,get:function(){return chunkWKHX5Z3E_cjs.F}});exports.BlocFeed=g;exports.BlocFeedPassive=u;exports.__getStandaloneTrackerForTesting=v;exports.__resetStandaloneTrackerForTesting=k;
@@ -1,7 +1,7 @@
1
1
  import { TrackProperties, BehavioralTracker } from './main.cjs';
2
2
  export { SDK_VERSION } from './main.cjs';
3
- import { B as BlocFeedUser, J as BehavioralConfig } from './controller-BPGXlZKD.cjs';
4
- export { K as BehavioralEvent } from './controller-BPGXlZKD.cjs';
3
+ import { B as BlocFeedUser, J as BehavioralConfig } from './controller-v9Hd8d5-.cjs';
4
+ export { K as BehavioralEvent } from './controller-v9Hd8d5-.cjs';
5
5
  import 'react/jsx-runtime';
6
6
  import 'react';
7
7
 
package/dist/passive.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { TrackProperties, BehavioralTracker } from './main.js';
2
2
  export { SDK_VERSION } from './main.js';
3
- import { B as BlocFeedUser, J as BehavioralConfig } from './controller-BPGXlZKD.js';
4
- export { K as BehavioralEvent } from './controller-BPGXlZKD.js';
3
+ import { B as BlocFeedUser, J as BehavioralConfig } from './controller-v9Hd8d5-.js';
4
+ export { K as BehavioralEvent } from './controller-v9Hd8d5-.js';
5
5
  import 'react/jsx-runtime';
6
6
  import 'react';
7
7
 
package/dist/passive.js CHANGED
@@ -1 +1 @@
1
- import {s,r as r$1,t}from'./chunk-NMH3WM6Y.js';export{F as SDK_VERSION}from'./chunk-NMH3WM6Y.js';import {useEffect}from'react';function a(e){e.user?.id&&r$1(e.user.id);let i=new t({blocfeedId:e.blocfeed_id,...e.config!==void 0?{config:e.config}:{},...e.extraSdkFeatures!==void 0?{extraSdkFeatures:e.extraSdkFeatures}:{}});return i.install(),i}function u(e){return useEffect(()=>{let i=a({blocfeed_id:e.blocfeed_id,...e.user!==void 0?{user:e.user}:{},...e.config!==void 0?{config:e.config}:{}});return ()=>{i.uninstall();}},[e.blocfeed_id]),null}var r=null,g={init(e){r||(r=a(e));},identify(e,i){r$1(e);},track(e,i){s(e,i);},uninstall(){r&&(r.uninstall(),r=null);}};function v(){return r}function k(){r&&(r.uninstall(),r=null);}export{g as BlocFeed,u as BlocFeedPassive,v as __getStandaloneTrackerForTesting,k as __resetStandaloneTrackerForTesting};
1
+ import {s,r as r$1,t}from'./chunk-6HNU7ECD.js';export{F as SDK_VERSION}from'./chunk-6HNU7ECD.js';import {useEffect}from'react';function a(e){e.user?.id&&r$1(e.user.id);let i=new t({blocfeedId:e.blocfeed_id,...e.config!==void 0?{config:e.config}:{},...e.extraSdkFeatures!==void 0?{extraSdkFeatures:e.extraSdkFeatures}:{}});return i.install(),i}function u(e){return useEffect(()=>{let i=a({blocfeed_id:e.blocfeed_id,...e.user!==void 0?{user:e.user}:{},...e.config!==void 0?{config:e.config}:{}});return ()=>{i.uninstall();}},[e.blocfeed_id]),null}var r=null,g={init(e){r||(r=a(e));},identify(e,i){r$1(e);},track(e,i){s(e,i);},uninstall(){r&&(r.uninstall(),r=null);}};function v(){return r}function k(){r&&(r.uninstall(),r=null);}export{g as BlocFeed,u as BlocFeedPassive,v as __getStandaloneTrackerForTesting,k as __resetStandaloneTrackerForTesting};