@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.
- package/CHANGELOG.md +90 -0
- package/README.md +3 -0
- package/lib/CXPinsight.d.ts.map +1 -1
- package/lib/CXPinsight.js +42 -3
- package/lib/CXPinsight.js.map +1 -1
- package/lib/CXPinsightProvider.d.ts.map +1 -1
- package/lib/CXPinsightProvider.js +5 -1
- package/lib/CXPinsightProvider.js.map +1 -1
- package/lib/core/autoTapCapture.d.ts +15 -0
- package/lib/core/autoTapCapture.d.ts.map +1 -0
- package/lib/core/autoTapCapture.js +242 -0
- package/lib/core/autoTapCapture.js.map +1 -0
- package/lib/core/networkCapture.d.ts +7 -1
- package/lib/core/networkCapture.d.ts.map +1 -1
- package/lib/core/networkCapture.js +13 -1
- package/lib/core/networkCapture.js.map +1 -1
- package/lib/core/triggerEngine.js +3 -3
- package/lib/core/triggerEngine.js.map +1 -1
- package/lib/instrumented/Pressable.js +4 -0
- package/lib/instrumented/Pressable.js.map +1 -1
- package/lib/instrumented/ScrollView.js +4 -0
- package/lib/instrumented/ScrollView.js.map +1 -1
- package/lib/instrumented/TextInput.js +4 -0
- package/lib/instrumented/TextInput.js.map +1 -1
- package/lib/instrumented/TouchableOpacity.js +4 -0
- package/lib/instrumented/TouchableOpacity.js.map +1 -1
- package/lib/setup/index.d.ts +0 -1
- package/lib/setup/index.d.ts.map +1 -1
- package/lib/setup/index.js +4 -6
- package/lib/setup/index.js.map +1 -1
- package/lib/survey/expressionEval.d.ts +13 -9
- package/lib/survey/expressionEval.d.ts.map +1 -1
- package/lib/survey/expressionEval.js +16 -289
- package/lib/survey/expressionEval.js.map +1 -1
- package/lib/survey/interpolate.d.ts.map +1 -1
- package/lib/survey/interpolate.js +9 -27
- package/lib/survey/interpolate.js.map +1 -1
- package/lib/survey/validate.js +10 -0
- package/lib/survey/validate.js.map +1 -1
- package/lib/types.d.ts +1 -0
- package/lib/types.d.ts.map +1 -1
- package/lib/types.js.map +1 -1
- package/package.json +5 -2
- package/lib/setup/TouchPatcher.d.ts +0 -28
- package/lib/setup/TouchPatcher.d.ts.map +0 -1
- package/lib/setup/TouchPatcher.js +0 -188
- 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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"}
|