@cxpinsight/react-native 0.3.0 → 0.4.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 (47) hide show
  1. package/CHANGELOG.md +90 -0
  2. package/README.md +3 -0
  3. package/lib/CXPinsight.d.ts.map +1 -1
  4. package/lib/CXPinsight.js +42 -3
  5. package/lib/CXPinsight.js.map +1 -1
  6. package/lib/CXPinsightProvider.d.ts.map +1 -1
  7. package/lib/CXPinsightProvider.js +5 -1
  8. package/lib/CXPinsightProvider.js.map +1 -1
  9. package/lib/core/autoTapCapture.d.ts +15 -0
  10. package/lib/core/autoTapCapture.d.ts.map +1 -0
  11. package/lib/core/autoTapCapture.js +242 -0
  12. package/lib/core/autoTapCapture.js.map +1 -0
  13. package/lib/core/networkCapture.d.ts +7 -1
  14. package/lib/core/networkCapture.d.ts.map +1 -1
  15. package/lib/core/networkCapture.js +13 -1
  16. package/lib/core/networkCapture.js.map +1 -1
  17. package/lib/core/triggerEngine.js +3 -3
  18. package/lib/core/triggerEngine.js.map +1 -1
  19. package/lib/instrumented/Pressable.js +4 -0
  20. package/lib/instrumented/Pressable.js.map +1 -1
  21. package/lib/instrumented/ScrollView.js +4 -0
  22. package/lib/instrumented/ScrollView.js.map +1 -1
  23. package/lib/instrumented/TextInput.js +4 -0
  24. package/lib/instrumented/TextInput.js.map +1 -1
  25. package/lib/instrumented/TouchableOpacity.js +4 -0
  26. package/lib/instrumented/TouchableOpacity.js.map +1 -1
  27. package/lib/setup/index.d.ts +0 -1
  28. package/lib/setup/index.d.ts.map +1 -1
  29. package/lib/setup/index.js +4 -6
  30. package/lib/setup/index.js.map +1 -1
  31. package/lib/survey/expressionEval.d.ts +13 -9
  32. package/lib/survey/expressionEval.d.ts.map +1 -1
  33. package/lib/survey/expressionEval.js +16 -289
  34. package/lib/survey/expressionEval.js.map +1 -1
  35. package/lib/survey/interpolate.d.ts.map +1 -1
  36. package/lib/survey/interpolate.js +9 -27
  37. package/lib/survey/interpolate.js.map +1 -1
  38. package/lib/survey/validate.js +10 -0
  39. package/lib/survey/validate.js.map +1 -1
  40. package/lib/types.d.ts +1 -0
  41. package/lib/types.d.ts.map +1 -1
  42. package/lib/types.js.map +1 -1
  43. package/package.json +5 -2
  44. package/lib/setup/TouchPatcher.d.ts +0 -28
  45. package/lib/setup/TouchPatcher.d.ts.map +0 -1
  46. package/lib/setup/TouchPatcher.js +0 -188
  47. package/lib/setup/TouchPatcher.js.map +0 -1
@@ -1,188 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.setTouchPatcherDebug = setTouchPatcherDebug;
7
- exports.startObserving = startObserving;
8
- exports.stopObserving = stopObserving;
9
- exports.isObserving = isObserving;
10
- exports.patchCreateElement = patchCreateElement;
11
- exports.unpatchCreateElement = unpatchCreateElement;
12
- const react_1 = __importDefault(require("react"));
13
- const react_native_1 = require("react-native");
14
- const ElementIdentifier_1 = require("./ElementIdentifier");
15
- let tapListener = null;
16
- // Gated so the SDK does not write into customers' production logs.
17
- let debugMode = false;
18
- function setTouchPatcherDebug(on) { debugMode = on; }
19
- let patched = false;
20
- // Store originals so we can unpatch
21
- const originals = new Map();
22
- /**
23
- * Start observing all touches. Call when setup mode activates.
24
- */
25
- function startObserving(listener) {
26
- if (patched)
27
- return;
28
- tapListener = listener;
29
- patchComponent(react_native_1.TouchableOpacity, 'TouchableOpacity', 'button');
30
- patchComponent(react_native_1.TouchableHighlight, 'TouchableHighlight', 'button');
31
- patchComponent(react_native_1.TouchableWithoutFeedback, 'TouchableWithoutFeedback', 'button');
32
- patchComponent(react_native_1.Pressable, 'Pressable', 'button');
33
- patchComponent(react_native_1.Button, 'Button', 'button');
34
- patchComponent(react_native_1.TextInput, 'TextInput', 'text_input');
35
- patched = true;
36
- if (debugMode)
37
- console.log('[CXPinsight:TouchPatcher] Started observing touches');
38
- }
39
- /**
40
- * Stop observing. Call when setup mode ends.
41
- */
42
- function stopObserving() {
43
- if (!patched)
44
- return;
45
- for (const [component, original] of originals.entries()) {
46
- if (original.type === 'render') {
47
- component.render = original.fn;
48
- }
49
- }
50
- originals.clear();
51
- tapListener = null;
52
- patched = false;
53
- if (debugMode)
54
- console.log('[CXPinsight:TouchPatcher] Stopped observing touches');
55
- }
56
- function isObserving() {
57
- return patched;
58
- }
59
- function patchComponent(Component, componentName, elementType) {
60
- if (!Component)
61
- return;
62
- // For function components (Pressable, etc.), we need to wrap differently
63
- // than class components (TouchableOpacity, etc.)
64
- // Strategy: wrap the component itself using React.createElement interception
65
- // This works for both class and function components
66
- const originalCreateElement = react_1.default.createElement;
67
- // We track which components to intercept
68
- if (!originals.has(Component)) {
69
- originals.set(Component, { type: 'component', name: componentName });
70
- }
71
- }
72
- /**
73
- * Alternative approach: Use a global createElement wrapper.
74
- * This intercepts ALL React element creation and wraps touch handlers.
75
- *
76
- * Called once when setup starts, removed when setup ends.
77
- */
78
- let originalCreateElement = null;
79
- function patchCreateElement() {
80
- if (originalCreateElement)
81
- return; // Already patched
82
- originalCreateElement = react_1.default.createElement;
83
- const touchComponents = new Set([
84
- react_native_1.TouchableOpacity,
85
- react_native_1.TouchableHighlight,
86
- react_native_1.TouchableWithoutFeedback,
87
- react_native_1.Pressable,
88
- react_native_1.Button,
89
- react_native_1.TextInput,
90
- ]);
91
- // Also match by displayName/name for cases where imports differ
92
- const touchNames = new Set([
93
- 'TouchableOpacity',
94
- 'TouchableHighlight',
95
- 'TouchableWithoutFeedback',
96
- 'Pressable',
97
- 'Button',
98
- 'TextInput',
99
- 'ForwardRef(Pressable)',
100
- ]);
101
- react_1.default.createElement = function (type, props, ...children) {
102
- // Only intercept touch components
103
- const isTouch = touchComponents.has(type) ||
104
- touchNames.has(type?.displayName) ||
105
- touchNames.has(type?.name) ||
106
- touchNames.has(type?.render?.displayName) ||
107
- touchNames.has(type?.render?.name);
108
- if (isTouch && props && tapListener) {
109
- const wrappedProps = wrapTouchProps(props, type, children);
110
- return originalCreateElement.call(react_1.default, type, wrappedProps, ...children);
111
- }
112
- return originalCreateElement.call(react_1.default, type, props, ...children);
113
- };
114
- }
115
- function unpatchCreateElement() {
116
- if (originalCreateElement) {
117
- react_1.default.createElement = originalCreateElement;
118
- originalCreateElement = null;
119
- }
120
- }
121
- function wrapTouchProps(props, componentType, children) {
122
- const wrapped = { ...props };
123
- const componentName = componentType?.displayName || componentType?.name ||
124
- componentType?.render?.displayName || componentType?.render?.name || 'Unknown';
125
- // Extract element info from props
126
- const elementInfo = {
127
- testID: props.testID || undefined,
128
- accessibilityLabel: props.accessibilityLabel || undefined,
129
- nativeID: props.nativeID || undefined,
130
- accessibilityRole: props.accessibilityRole || undefined,
131
- elementType: (0, ElementIdentifier_1.inferElementType)(props.accessibilityRole, componentName),
132
- text: extractTextFromChildren(children) || props.title || props.placeholder || props.accessibilityLabel || '',
133
- interactive: true,
134
- };
135
- // Wrap onPress
136
- if (props.onPress) {
137
- const originalOnPress = props.onPress;
138
- wrapped.onPress = (...args) => {
139
- tapListener?.({ ...elementInfo, text: elementInfo.text || 'Tapped' });
140
- return originalOnPress(...args);
141
- };
142
- }
143
- // Wrap onLongPress
144
- if (props.onLongPress) {
145
- const originalOnLongPress = props.onLongPress;
146
- wrapped.onLongPress = (...args) => {
147
- tapListener?.({ ...elementInfo, elementType: elementInfo.elementType, text: elementInfo.text || 'Long Pressed' });
148
- return originalOnLongPress(...args);
149
- };
150
- }
151
- // Wrap onFocus (for TextInput)
152
- if (props.onFocus) {
153
- const originalOnFocus = props.onFocus;
154
- wrapped.onFocus = (...args) => {
155
- tapListener?.({ ...elementInfo, elementType: 'text_input', text: elementInfo.text || props.placeholder || 'Input focused' });
156
- return originalOnFocus(...args);
157
- };
158
- }
159
- // For elements without explicit handlers but that are touchable,
160
- // add a wrapper that still captures the interaction
161
- if (!props.onPress && !props.onLongPress && componentName !== 'TextInput') {
162
- // Don't add handlers where there were none — this could change behavior
163
- // Just skip these elements
164
- }
165
- return wrapped;
166
- }
167
- function extractTextFromChildren(children) {
168
- for (const child of children) {
169
- if (typeof child === 'string')
170
- return child.slice(0, 80);
171
- if (typeof child === 'number')
172
- return String(child);
173
- if (child && typeof child === 'object') {
174
- // Check for nested Text components
175
- if (child.props?.children && typeof child.props.children === 'string') {
176
- return child.props.children.slice(0, 80);
177
- }
178
- // Recurse one level
179
- if (Array.isArray(child.props?.children)) {
180
- const text = extractTextFromChildren(child.props.children);
181
- if (text)
182
- return text;
183
- }
184
- }
185
- }
186
- return '';
187
- }
188
- //# sourceMappingURL=TouchPatcher.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TouchPatcher.js","sourceRoot":"","sources":["../../src/setup/TouchPatcher.ts"],"names":[],"mappings":"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"}