humanbehavior-js 0.2.2 → 0.2.3

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 (22) hide show
  1. package/dist/cjs/index.js +14 -22
  2. package/dist/cjs/index.js.map +1 -1
  3. package/dist/esm/index.js +14 -22
  4. package/dist/esm/index.js.map +1 -1
  5. package/dist/index.min.js +2 -2
  6. package/dist/index.min.js.map +1 -1
  7. package/dist/types/index.d.ts +5 -6
  8. package/package.json +1 -1
  9. package/src/tracker.ts +15 -22
  10. package/.rollup.cache/Users/hudsonch/Desktop/HumanBehaviorInternship/humanbehavior-js/dist/.tsbuildinfo +0 -1
  11. package/.rollup.cache/Users/hudsonch/Desktop/HumanBehaviorInternship/humanbehavior-js/dist/api.js +0 -312
  12. package/.rollup.cache/Users/hudsonch/Desktop/HumanBehaviorInternship/humanbehavior-js/dist/api.js.map +0 -1
  13. package/.rollup.cache/Users/hudsonch/Desktop/HumanBehaviorInternship/humanbehavior-js/dist/index.js +0 -19
  14. package/.rollup.cache/Users/hudsonch/Desktop/HumanBehaviorInternship/humanbehavior-js/dist/index.js.map +0 -1
  15. package/.rollup.cache/Users/hudsonch/Desktop/HumanBehaviorInternship/humanbehavior-js/dist/react/index.js +0 -222
  16. package/.rollup.cache/Users/hudsonch/Desktop/HumanBehaviorInternship/humanbehavior-js/dist/react/index.js.map +0 -1
  17. package/.rollup.cache/Users/hudsonch/Desktop/HumanBehaviorInternship/humanbehavior-js/dist/redact.js +0 -416
  18. package/.rollup.cache/Users/hudsonch/Desktop/HumanBehaviorInternship/humanbehavior-js/dist/redact.js.map +0 -1
  19. package/.rollup.cache/Users/hudsonch/Desktop/HumanBehaviorInternship/humanbehavior-js/dist/tracker.js +0 -950
  20. package/.rollup.cache/Users/hudsonch/Desktop/HumanBehaviorInternship/humanbehavior-js/dist/tracker.js.map +0 -1
  21. package/.rollup.cache/Users/hudsonch/Desktop/HumanBehaviorInternship/humanbehavior-js/dist/utils/logger.js +0 -117
  22. package/.rollup.cache/Users/hudsonch/Desktop/HumanBehaviorInternship/humanbehavior-js/dist/utils/logger.js.map +0 -1
@@ -1,222 +0,0 @@
1
- import { __awaiter } from "tslib";
2
- import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { useEffect, useState, createContext, useContext, useCallback, useMemo, useRef } from "react";
4
- import { HumanBehaviorTracker } from "..";
5
- import { logError, logWarn, logDebug } from "../utils/logger";
6
- // Check if we're in a browser environment
7
- const isBrowser = () => typeof window !== 'undefined';
8
- // Default context to prevent unnecessary re-renders
9
- const defaultContext = {
10
- humanBehavior: null,
11
- queueEvent: (event) => {
12
- // In server-side, just no-op
13
- if (typeof window === 'undefined') {
14
- return;
15
- }
16
- logWarn('HumanBehavior not initialized yet, event queued:', event);
17
- }
18
- };
19
- const HumanBehaviorContext = createContext(null);
20
- export const HumanBehaviorProvider = ({ apiKey, client, children, options }) => {
21
- const [humanBehavior, setHumanBehavior] = useState(client || null);
22
- const [eventQueue, setEventQueue] = useState([]);
23
- const [isMounted, setIsMounted] = useState(false);
24
- const [isInitialized, setIsInitialized] = useState(false);
25
- // Use refs to avoid dependency issues in useEffect
26
- const apiKeyRef = useRef(apiKey);
27
- const clientRef = useRef(client);
28
- const eventQueueRef = useRef(eventQueue);
29
- // Update refs when props change
30
- useEffect(() => {
31
- apiKeyRef.current = apiKey;
32
- clientRef.current = client;
33
- }, [apiKey, client]);
34
- // Update eventQueue ref when queue changes
35
- useEffect(() => {
36
- eventQueueRef.current = eventQueue;
37
- }, [eventQueue]);
38
- // Memoized queueEvent function to prevent unnecessary re-renders
39
- const queueEvent = useCallback((event) => {
40
- setEventQueue(prev => [...prev, event]);
41
- }, []);
42
- // Handle mounting state
43
- useEffect(() => {
44
- setIsMounted(true);
45
- }, []);
46
- useEffect(() => {
47
- var _a;
48
- // Only run in browser
49
- if (!(isBrowser())) {
50
- return;
51
- }
52
- // Skip if not mounted yet (handles Next.js hydration)
53
- if (!isMounted) {
54
- return;
55
- }
56
- // If client is provided, use that
57
- if (clientRef.current) {
58
- setHumanBehavior(clientRef.current);
59
- setIsInitialized(true);
60
- return;
61
- }
62
- // If no client is provided, apiKey is required
63
- if (!apiKeyRef.current || apiKeyRef.current.trim() === '') {
64
- logError("An apiKey is required when no client is provided");
65
- return;
66
- }
67
- if (humanBehavior !== null) {
68
- return;
69
- }
70
- // Create new tracker instance with the validated apiKey
71
- const tracker = new HumanBehaviorTracker(apiKeyRef.current.trim(), 'https://ingest.humanbehavior.co');
72
- setHumanBehavior(tracker);
73
- // Wait for initialization to complete
74
- (_a = tracker.initializationPromise) === null || _a === void 0 ? void 0 : _a.then(() => __awaiter(void 0, void 0, void 0, function* () {
75
- yield tracker.start();
76
- setIsInitialized(true);
77
- // Process any queued events
78
- const currentQueue = eventQueueRef.current;
79
- if (currentQueue.length > 0) {
80
- for (const event of currentQueue) {
81
- if (event.type === 'identify') {
82
- logDebug('Processing queued identify event', event.userProperties);
83
- try {
84
- yield tracker.addUserInfo(event.userProperties);
85
- }
86
- catch (error) {
87
- logError('Failed to process queued user info:', error);
88
- }
89
- }
90
- else {
91
- tracker.addEvent(event);
92
- }
93
- }
94
- setEventQueue([]); // Clear the queue
95
- }
96
- })).catch(error => {
97
- logError('Failed to initialize HumanBehaviorTracker:', error);
98
- });
99
- }, [isMounted, humanBehavior]); // Removed apiKey, client, eventQueue from dependencies
100
- // Memoized context value to prevent unnecessary re-renders
101
- const contextValue = useMemo(() => {
102
- if (!isMounted) {
103
- return null;
104
- }
105
- if (!isInitialized) {
106
- return null;
107
- }
108
- return humanBehavior;
109
- }, [isMounted, isInitialized, humanBehavior]);
110
- // If not in browser, render children without context
111
- if (!(isBrowser())) {
112
- return _jsx(_Fragment, { children: children });
113
- }
114
- return (_jsxs(HumanBehaviorContext.Provider, { value: contextValue, children: [_jsx(HumanBehaviorPageView, {}), children] }));
115
- };
116
- // No-op implementation for server-side
117
- const serverSideImplementation = {
118
- addEvent: () => { },
119
- addUserInfo: () => __awaiter(void 0, void 0, void 0, function* () { }),
120
- start: () => { },
121
- stop: () => { },
122
- viewLogs: () => { },
123
- };
124
- // Memoized queuing implementation for initialization period
125
- const createQueuingImplementation = (queueEvent) => ({
126
- addEvent: (event) => {
127
- queueEvent(event);
128
- },
129
- addUserInfo: (userProperties) => __awaiter(void 0, void 0, void 0, function* () {
130
- queueEvent({
131
- type: 'identify',
132
- userProperties,
133
- });
134
- }),
135
- start: () => {
136
- // Start will be called automatically when initialized
137
- },
138
- stop: () => {
139
- // Stop is a no-op when not initialized
140
- },
141
- viewLogs: () => {
142
- logWarn('Logs are not available until HumanBehaviorTracker is initialized');
143
- }
144
- });
145
- export const useHumanBehavior = () => {
146
- const tracker = useContext(HumanBehaviorContext);
147
- if (!tracker) {
148
- throw new Error('useHumanBehavior must be used within a HumanBehaviorProvider');
149
- }
150
- return tracker;
151
- };
152
- // Custom hook for managing redaction fields dynamically
153
- export const useRedaction = () => {
154
- const tracker = useHumanBehavior();
155
- const setRedactedFields = useCallback((fields) => {
156
- tracker.setRedactedFields(fields);
157
- }, [tracker]);
158
- const isRedactionActive = useCallback(() => {
159
- return tracker.isRedactionActive();
160
- }, [tracker]);
161
- const getRedactedFields = useCallback(() => {
162
- return tracker.getRedactedFields();
163
- }, [tracker]);
164
- return {
165
- setRedactedFields,
166
- isRedactionActive,
167
- getRedactedFields
168
- };
169
- };
170
- // Custom hook for managing user info
171
- export const useUserTracking = () => {
172
- const tracker = useHumanBehavior();
173
- const addUserInfo = useCallback((userId, userProperties) => __awaiter(void 0, void 0, void 0, function* () {
174
- try {
175
- yield tracker.addUserInfo({ userId, userProperties });
176
- return { success: true };
177
- }
178
- catch (error) {
179
- logError('Failed to add user info:', error);
180
- return { success: false, error };
181
- }
182
- }), [tracker]);
183
- return {
184
- addUserInfo
185
- };
186
- };
187
- // Automatic page tracking component (similar to PostHog's PostHogPageView)
188
- function HumanBehaviorPageView() {
189
- const tracker = useContext(HumanBehaviorContext);
190
- useEffect(() => {
191
- if (tracker && typeof window !== 'undefined') {
192
- // Track initial page load
193
- tracker.trackPageView();
194
- // Listen for route changes (for SPAs)
195
- const handleRouteChange = () => {
196
- tracker.trackPageView();
197
- };
198
- // Listen for popstate (back/forward navigation)
199
- window.addEventListener('popstate', handleRouteChange);
200
- // Listen for pushstate/replacestate (programmatic navigation)
201
- const originalPushState = history.pushState;
202
- const originalReplaceState = history.replaceState;
203
- history.pushState = function (...args) {
204
- originalPushState.apply(this, args);
205
- handleRouteChange();
206
- };
207
- history.replaceState = function (...args) {
208
- originalReplaceState.apply(this, args);
209
- handleRouteChange();
210
- };
211
- return () => {
212
- window.removeEventListener('popstate', handleRouteChange);
213
- history.pushState = originalPushState;
214
- history.replaceState = originalReplaceState;
215
- };
216
- }
217
- }, [tracker]);
218
- return null;
219
- }
220
- // Export the tracker class for direct use
221
- export { HumanBehaviorTracker };
222
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.tsx"],"names":[],"mappings":"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"}
@@ -1,416 +0,0 @@
1
- // Redaction functionality for sensitive input fields
2
- // This module provides methods to redact sensitive input fields in event recordings
3
- import { logDebug, logWarn } from './utils/logger';
4
- // Check if we're in a browser environment
5
- const isBrowser = typeof window !== 'undefined';
6
- export class RedactionManager {
7
- constructor(options) {
8
- this.redactedText = '[REDACTED]';
9
- this.userSelectedFields = new Set(); // User-selected fields to redact
10
- this.excludeSelectors = [
11
- '[data-no-redact="true"]',
12
- '.human-behavior-no-redact'
13
- ];
14
- if (options === null || options === void 0 ? void 0 : options.redactedText) {
15
- this.redactedText = options.redactedText;
16
- }
17
- if (options === null || options === void 0 ? void 0 : options.excludeSelectors) {
18
- this.excludeSelectors = [...this.excludeSelectors, ...options.excludeSelectors];
19
- }
20
- if (options === null || options === void 0 ? void 0 : options.userFields) {
21
- this.setFieldsToRedact(options.userFields);
22
- }
23
- }
24
- /**
25
- * Set specific fields to be redacted
26
- * @param fields Array of CSS selectors for fields to redact
27
- */
28
- setFieldsToRedact(fields) {
29
- this.userSelectedFields.clear();
30
- fields.forEach(field => this.userSelectedFields.add(field));
31
- if (fields.length > 0) {
32
- logDebug(`Redaction: Active for ${fields.length} field(s):`, fields);
33
- // Debug: Check if elements exist
34
- fields.forEach(selector => {
35
- const elements = document.querySelectorAll(selector);
36
- logDebug(`Redaction: Found ${elements.length} element(s) for selector '${selector}'`);
37
- elements.forEach((el, index) => {
38
- logDebug(`Redaction: Element ${index} for '${selector}':`, el);
39
- });
40
- });
41
- }
42
- else {
43
- logDebug('Redaction: Disabled - no fields selected');
44
- }
45
- }
46
- /**
47
- * Check if redaction is currently active (has fields selected)
48
- */
49
- isActive() {
50
- return this.userSelectedFields.size > 0;
51
- }
52
- /**
53
- * Get the currently selected fields for redaction
54
- */
55
- getSelectedFields() {
56
- return Array.from(this.userSelectedFields);
57
- }
58
- /**
59
- * Process an event and redact sensitive data if needed
60
- */
61
- processEvent(event) {
62
- // Only process if we have fields selected for redaction
63
- if (this.userSelectedFields.size === 0) {
64
- return event;
65
- }
66
- // Clone the event to avoid modifying the original
67
- const processedEvent = JSON.parse(JSON.stringify(event));
68
- // Handle different event types
69
- if (processedEvent.type === 3) { // IncrementalSnapshot
70
- if (processedEvent.data.source === 5) { // Input event
71
- const shouldRedact = this.isFieldSelected(processedEvent.data);
72
- if (shouldRedact) {
73
- logDebug('Redaction: Processing input event for redaction');
74
- this.redactInputEvent(processedEvent.data);
75
- }
76
- }
77
- // Also check for other sources that might contain text changes
78
- else if (processedEvent.data.source === 0) { // DOM mutations
79
- this.redactDOMEvent(processedEvent.data);
80
- }
81
- // Handle other sources that might contain text
82
- else if (processedEvent.data.source === 2) { // Mouse/Touch interaction
83
- this.redactMouseEvent(processedEvent.data);
84
- }
85
- }
86
- else if (processedEvent.type === 2) { // FullSnapshot
87
- this.redactFullSnapshot(processedEvent.data);
88
- }
89
- return processedEvent;
90
- }
91
- /**
92
- * Redact sensitive data in input events
93
- */
94
- redactInputEvent(inputData) {
95
- // Check if this input event is from a field we want to redact
96
- if (!this.isFieldSelected(inputData)) {
97
- return;
98
- }
99
- logDebug('Redaction: Redacting input event with text:', inputData.text);
100
- // Redact all text-related properties that could contain input data
101
- const textProperties = ['text', 'value', 'content', 'data', 'input', 'textContent'];
102
- textProperties.forEach(prop => {
103
- if (inputData[prop] !== undefined && typeof inputData[prop] === 'string') {
104
- inputData[prop] = this.redactedText;
105
- logDebug(`Redaction: Redacted property '${prop}'`);
106
- }
107
- });
108
- // Also check for any other string properties that might contain input data
109
- Object.keys(inputData).forEach(key => {
110
- if (typeof inputData[key] === 'string' && inputData[key].length > 0) {
111
- inputData[key] = this.redactedText;
112
- logDebug(`Redaction: Redacted additional property '${key}'`);
113
- }
114
- });
115
- // Handle nested objects that might contain text data
116
- if (inputData.attributes && typeof inputData.attributes === 'object') {
117
- if (inputData.attributes.value && typeof inputData.attributes.value === 'string') {
118
- inputData.attributes.value = this.redactedText;
119
- logDebug('Redaction: Redacted nested value attribute');
120
- }
121
- }
122
- logDebug('Redaction: Input event redaction complete');
123
- }
124
- /**
125
- * Redact sensitive data in DOM mutation events
126
- */
127
- redactDOMEvent(domData) {
128
- // Check for text changes in DOM mutations
129
- if (domData.texts && Array.isArray(domData.texts)) {
130
- domData.texts.forEach((textChange) => {
131
- if (textChange.text && typeof textChange.text === 'string' &&
132
- this.shouldRedactDOMChange(textChange)) {
133
- textChange.text = this.redactedText;
134
- }
135
- });
136
- }
137
- // Also check for attribute changes that might contain input data
138
- if (domData.attributes && Array.isArray(domData.attributes)) {
139
- domData.attributes.forEach((attrChange) => {
140
- if (attrChange.attributes && attrChange.attributes.value &&
141
- typeof attrChange.attributes.value === 'string' &&
142
- this.shouldRedactDOMChange(attrChange)) {
143
- attrChange.attributes.value = this.redactedText;
144
- }
145
- });
146
- }
147
- // Check for any other properties that might contain text data
148
- if (domData.adds && Array.isArray(domData.adds)) {
149
- domData.adds.forEach((add) => {
150
- if (add.node && add.node.textContent && typeof add.node.textContent === 'string' &&
151
- this.shouldRedactDOMChange(add)) {
152
- add.node.textContent = this.redactedText;
153
- }
154
- });
155
- }
156
- }
157
- /**
158
- * Check if a DOM change should be redacted based on its ID
159
- */
160
- shouldRedactDOMChange(changeData) {
161
- if (!isBrowser)
162
- return false;
163
- try {
164
- // Check if this change has an ID that we can use to find the element
165
- const elementId = changeData.id;
166
- if (elementId !== undefined) {
167
- // Try to find the element by data-rrweb-id attribute
168
- let element = document.querySelector(`[data-rrweb-id="${elementId}"]`);
169
- if (element) {
170
- return this.shouldRedactElement(element);
171
- }
172
- }
173
- // Also check for nodeId which is another way rrweb identifies elements
174
- const nodeId = changeData.nodeId;
175
- if (nodeId !== undefined) {
176
- const element = document.querySelector(`[data-rrweb-id="${nodeId}"]`);
177
- if (element) {
178
- return this.shouldRedactElement(element);
179
- }
180
- }
181
- return false;
182
- }
183
- catch (e) {
184
- logWarn('Error checking if DOM change should be redacted:', e);
185
- return false;
186
- }
187
- }
188
- /**
189
- * Redact sensitive data in mouse/touch interaction events
190
- */
191
- redactMouseEvent(mouseData) {
192
- // Mouse events typically don't contain text data, but check for any text properties
193
- if (mouseData.text && typeof mouseData.text === 'string' &&
194
- this.isFieldSelected(mouseData)) {
195
- mouseData.text = this.redactedText;
196
- }
197
- }
198
- /**
199
- * Redact sensitive data in full snapshot events
200
- */
201
- redactFullSnapshot(snapshotData) {
202
- if (snapshotData.node && snapshotData.node.type === 2) { // Element node
203
- this.redactNode(snapshotData.node);
204
- }
205
- }
206
- /**
207
- * Recursively redact sensitive data in DOM nodes
208
- */
209
- redactNode(node) {
210
- if (!node)
211
- return;
212
- // Check if this node should be redacted
213
- if (node.type === 2 && node.tagName &&
214
- (node.tagName.toLowerCase() === 'input' || node.tagName.toLowerCase() === 'textarea')) {
215
- // Check if this input/textarea should be redacted
216
- if (this.shouldRedactNode(node)) {
217
- // Redact value attribute
218
- if (node.attributes && node.attributes.value) {
219
- node.attributes.value = this.redactedText;
220
- }
221
- // Redact text content
222
- if (node.textContent) {
223
- node.textContent = this.redactedText;
224
- }
225
- }
226
- }
227
- // Recursively process child nodes
228
- if (node.childNodes && Array.isArray(node.childNodes)) {
229
- node.childNodes.forEach((childNode) => {
230
- this.redactNode(childNode);
231
- });
232
- }
233
- }
234
- /**
235
- * Check if a node should be redacted based on its attributes
236
- */
237
- shouldRedactNode(node) {
238
- if (!node.attributes)
239
- return false;
240
- // Check if any of our selectors would match this node
241
- for (const selector of this.userSelectedFields) {
242
- if (this.selectorMatchesNode(selector, node)) {
243
- return true;
244
- }
245
- }
246
- return false;
247
- }
248
- /**
249
- * Check if a CSS selector would match a node based on its attributes
250
- */
251
- selectorMatchesNode(selector, node) {
252
- if (!node.attributes)
253
- return false;
254
- // Create a temporary element to test the selector
255
- try {
256
- const tempElement = document.createElement(node.tagName || 'div');
257
- // Copy attributes from the node to the temp element
258
- if (node.attributes) {
259
- Object.keys(node.attributes).forEach(key => {
260
- tempElement.setAttribute(key, node.attributes[key]);
261
- });
262
- }
263
- // Test if the selector matches this element
264
- return tempElement.matches(selector);
265
- }
266
- catch (e) {
267
- // If matches() is not supported or fails, fall back to basic attribute checking
268
- return this.basicSelectorMatch(selector, node);
269
- }
270
- }
271
- /**
272
- * Basic selector matching for environments where matches() is not available
273
- */
274
- basicSelectorMatch(selector, node) {
275
- if (!node.attributes)
276
- return false;
277
- // Handle simple selectors like 'input[type="password"]'
278
- if (selector.includes('input[type=')) {
279
- const typeMatch = selector.match(/input\[type="([^"]+)"\]/);
280
- if (typeMatch && node.tagName === 'input' && node.attributes.type === typeMatch[1]) {
281
- return true;
282
- }
283
- }
284
- // Handle ID selectors like '#email'
285
- if (selector.startsWith('#')) {
286
- const id = selector.substring(1);
287
- return node.attributes.id === id;
288
- }
289
- // Handle class selectors like '.sensitive-field'
290
- if (selector.startsWith('.')) {
291
- const className = selector.substring(1);
292
- return node.attributes.class && node.attributes.class.includes(className);
293
- }
294
- // Handle tag selectors like 'input'
295
- if (!selector.includes('[') && !selector.includes('.')) {
296
- return node.tagName && node.tagName.toLowerCase() === selector.toLowerCase();
297
- }
298
- return false;
299
- }
300
- /**
301
- * Check if an event is from a field that should be redacted
302
- */
303
- isFieldSelected(eventData) {
304
- if (!isBrowser)
305
- return false;
306
- try {
307
- // For input events (source 5), we need to determine if this is a sensitive field
308
- if (eventData.source === 5) { // Input event
309
- const elementId = eventData.id;
310
- if (elementId !== undefined) {
311
- // Try to find the element by data-rrweb-id attribute
312
- let element = document.querySelector(`[data-rrweb-id="${elementId}"]`);
313
- if (element) {
314
- return this.shouldRedactElement(element);
315
- }
316
- // Fallback: Try to find by nodeId if available
317
- if (eventData.nodeId !== undefined) {
318
- element = document.querySelector(`[data-rrweb-id="${eventData.nodeId}"]`);
319
- if (element) {
320
- return this.shouldRedactElement(element);
321
- }
322
- }
323
- // More aggressive approach: Check all elements that match our selectors
324
- // and see if any of them are currently focused or have the same ID
325
- for (const selector of this.userSelectedFields) {
326
- const matchingElements = document.querySelectorAll(selector);
327
- if (matchingElements.length > 0) {
328
- // Check if any of these elements are currently focused
329
- for (const el of matchingElements) {
330
- if (el === document.activeElement) {
331
- logDebug('Redaction: Found focused element matching selector:', selector);
332
- return true;
333
- }
334
- }
335
- }
336
- }
337
- // If we still can't find it, try a more direct approach
338
- // Look for any input element that might be the active one
339
- const activeElement = document.activeElement;
340
- if (activeElement && this.shouldRedactElement(activeElement)) {
341
- logDebug('Redaction: Active element should be redacted');
342
- return true;
343
- }
344
- return false;
345
- }
346
- }
347
- // For other event types, try to find the element
348
- const elementId = eventData.id;
349
- if (elementId !== undefined) {
350
- // First try to find by data-rrweb-id attribute
351
- let element = document.querySelector(`[data-rrweb-id="${elementId}"]`);
352
- if (element) {
353
- return this.shouldRedactElement(element);
354
- }
355
- }
356
- // Also check for nodeId which is another way rrweb identifies elements
357
- const nodeId = eventData.nodeId;
358
- if (nodeId !== undefined) {
359
- const element = document.querySelector(`[data-rrweb-id="${nodeId}"]`);
360
- if (element) {
361
- return this.shouldRedactElement(element);
362
- }
363
- }
364
- // For DOM mutations, check if the target element should be redacted
365
- if (eventData.target && eventData.target.id) {
366
- const element = document.querySelector(`[data-rrweb-id="${eventData.target.id}"]`);
367
- if (element) {
368
- return this.shouldRedactElement(element);
369
- }
370
- }
371
- return false;
372
- }
373
- catch (e) {
374
- logWarn('Error checking if field should be redacted:', e);
375
- return false;
376
- }
377
- }
378
- /**
379
- * Check if an element should be redacted based on user-selected fields
380
- */
381
- shouldRedactElement(element) {
382
- // Check if element is excluded from redaction
383
- for (const excludeSelector of this.excludeSelectors) {
384
- if (element.matches(excludeSelector) || element.closest(excludeSelector)) {
385
- return false;
386
- }
387
- }
388
- // Check if element matches any of the user-selected fields
389
- for (const selector of this.userSelectedFields) {
390
- if (element.matches(selector)) {
391
- return true;
392
- }
393
- }
394
- return false;
395
- }
396
- /**
397
- * Get the original value of a redacted element (for debugging)
398
- */
399
- getOriginalValue(element) {
400
- if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {
401
- return element.value;
402
- }
403
- return undefined;
404
- }
405
- /**
406
- * Check if an element is currently being redacted
407
- */
408
- isElementRedacted(element) {
409
- return this.shouldRedactElement(element);
410
- }
411
- }
412
- // Export a default instance
413
- export const redactionManager = new RedactionManager();
414
- // Export the class for custom instances
415
- export default RedactionManager;
416
- //# sourceMappingURL=redact.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"redact.js","sourceRoot":"","sources":["../src/redact.ts"],"names":[],"mappings":"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"}