@testing-library/react-native 14.0.0-beta.0 → 14.0.0-rc.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/README.md +22 -33
- package/build/event-builder/base.js.map +1 -0
- package/build/event-builder/common.d.ts +152 -0
- package/build/event-builder/common.js +80 -0
- package/build/event-builder/common.js.map +1 -0
- package/build/event-builder/index.d.ts +3 -0
- package/build/event-builder/index.js +39 -0
- package/build/event-builder/index.js.map +1 -0
- package/build/event-builder/scroll.d.ts +56 -0
- package/build/event-builder/scroll.js +51 -0
- package/build/event-builder/scroll.js.map +1 -0
- package/build/event-builder/text.d.ts +162 -0
- package/build/event-builder/text.js +113 -0
- package/build/event-builder/text.js.map +1 -0
- package/build/fire-event.d.ts +6 -5
- package/build/fire-event.js +47 -23
- package/build/fire-event.js.map +1 -1
- package/build/helpers/accessibility.d.ts +18 -15
- package/build/helpers/accessibility.js +64 -47
- package/build/helpers/accessibility.js.map +1 -1
- package/build/helpers/component-tree.d.ts +9 -9
- package/build/helpers/component-tree.js +17 -17
- package/build/helpers/component-tree.js.map +1 -1
- package/build/helpers/find-all.d.ts +2 -2
- package/build/helpers/find-all.js +1 -1
- package/build/helpers/find-all.js.map +1 -1
- package/build/helpers/format-element.d.ts +5 -5
- package/build/helpers/format-element.js +9 -9
- package/build/helpers/format-element.js.map +1 -1
- package/build/helpers/host-component-names.d.ts +13 -13
- package/build/helpers/host-component-names.js +18 -18
- package/build/helpers/host-component-names.js.map +1 -1
- package/build/helpers/matchers/match-accessibility-state.d.ts +2 -2
- package/build/helpers/matchers/match-accessibility-state.js +6 -6
- package/build/helpers/matchers/match-accessibility-state.js.map +1 -1
- package/build/helpers/matchers/match-accessibility-value.d.ts +2 -2
- package/build/helpers/matchers/match-accessibility-value.js +2 -2
- package/build/helpers/matchers/match-accessibility-value.js.map +1 -1
- package/build/helpers/matchers/match-label-text.d.ts +2 -2
- package/build/helpers/matchers/match-label-text.js +2 -2
- package/build/helpers/matchers/match-label-text.js.map +1 -1
- package/build/helpers/matchers/match-text-content.d.ts +5 -5
- package/build/helpers/matchers/match-text-content.js +5 -5
- package/build/helpers/matchers/match-text-content.js.map +1 -1
- package/build/helpers/pointer-events.d.ts +2 -2
- package/build/helpers/pointer-events.js +4 -4
- package/build/helpers/pointer-events.js.map +1 -1
- package/build/helpers/text-content.d.ts +2 -2
- package/build/helpers/text-content.js +5 -5
- package/build/helpers/text-content.js.map +1 -1
- package/build/helpers/text-input.d.ts +3 -3
- package/build/helpers/text-input.js +6 -6
- package/build/helpers/text-input.js.map +1 -1
- package/build/matchers/to-be-busy.d.ts +2 -2
- package/build/matchers/to-be-busy.js +5 -5
- package/build/matchers/to-be-busy.js.map +1 -1
- package/build/matchers/to-be-checked.d.ts +2 -2
- package/build/matchers/to-be-checked.js +9 -9
- package/build/matchers/to-be-checked.js.map +1 -1
- package/build/matchers/to-be-disabled.d.ts +3 -3
- package/build/matchers/to-be-disabled.js +10 -10
- package/build/matchers/to-be-disabled.js.map +1 -1
- package/build/matchers/to-be-empty-element.d.ts +2 -2
- package/build/matchers/to-be-empty-element.js +4 -4
- package/build/matchers/to-be-empty-element.js.map +1 -1
- package/build/matchers/to-be-expanded.d.ts +3 -3
- package/build/matchers/to-be-expanded.js +10 -10
- package/build/matchers/to-be-expanded.js.map +1 -1
- package/build/matchers/to-be-on-the-screen.d.ts +2 -2
- package/build/matchers/to-be-on-the-screen.js +7 -7
- package/build/matchers/to-be-on-the-screen.js.map +1 -1
- package/build/matchers/to-be-partially-checked.d.ts +2 -2
- package/build/matchers/to-be-partially-checked.js +8 -8
- package/build/matchers/to-be-partially-checked.js.map +1 -1
- package/build/matchers/to-be-selected.d.ts +2 -2
- package/build/matchers/to-be-selected.js +4 -4
- package/build/matchers/to-be-selected.js.map +1 -1
- package/build/matchers/to-be-visible.d.ts +2 -2
- package/build/matchers/to-be-visible.js +12 -12
- package/build/matchers/to-be-visible.js.map +1 -1
- package/build/matchers/to-contain-element.d.ts +2 -2
- package/build/matchers/to-contain-element.js +6 -6
- package/build/matchers/to-contain-element.js.map +1 -1
- package/build/matchers/to-have-accessibility-value.d.ts +2 -2
- package/build/matchers/to-have-accessibility-value.js +6 -6
- package/build/matchers/to-have-accessibility-value.js.map +1 -1
- package/build/matchers/to-have-accessible-name.d.ts +2 -2
- package/build/matchers/to-have-accessible-name.js +5 -10
- package/build/matchers/to-have-accessible-name.js.map +1 -1
- package/build/matchers/to-have-display-value.d.ts +2 -2
- package/build/matchers/to-have-display-value.js +6 -6
- package/build/matchers/to-have-display-value.js.map +1 -1
- package/build/matchers/to-have-prop.d.ts +2 -2
- package/build/matchers/to-have-prop.js +6 -6
- package/build/matchers/to-have-prop.js.map +1 -1
- package/build/matchers/to-have-style.d.ts +2 -2
- package/build/matchers/to-have-style.js +5 -5
- package/build/matchers/to-have-style.js.map +1 -1
- package/build/matchers/to-have-text-content.d.ts +2 -2
- package/build/matchers/to-have-text-content.js +4 -4
- package/build/matchers/to-have-text-content.js.map +1 -1
- package/build/matchers/types.d.ts +20 -20
- package/build/matchers/types.js.map +1 -1
- package/build/matchers/utils.d.ts +4 -4
- package/build/matchers/utils.js +6 -6
- package/build/matchers/utils.js.map +1 -1
- package/build/native-state.d.ts +3 -3
- package/build/native-state.js +2 -2
- package/build/native-state.js.map +1 -1
- package/build/queries/display-value.d.ts +2 -2
- package/build/queries/display-value.js +12 -12
- package/build/queries/display-value.js.map +1 -1
- package/build/queries/hint-text.d.ts +2 -2
- package/build/queries/hint-text.js +11 -11
- package/build/queries/hint-text.js.map +1 -1
- package/build/queries/label-text.d.ts +2 -2
- package/build/queries/label-text.js +9 -9
- package/build/queries/label-text.js.map +1 -1
- package/build/queries/make-queries.d.ts +8 -8
- package/build/queries/make-queries.js +11 -11
- package/build/queries/make-queries.js.map +1 -1
- package/build/queries/placeholder-text.d.ts +2 -2
- package/build/queries/placeholder-text.js +11 -11
- package/build/queries/placeholder-text.js.map +1 -1
- package/build/queries/role.d.ts +2 -2
- package/build/queries/role.js +17 -27
- package/build/queries/role.js.map +1 -1
- package/build/queries/test-id.d.ts +2 -2
- package/build/queries/test-id.js +11 -11
- package/build/queries/test-id.js.map +1 -1
- package/build/queries/text.d.ts +2 -2
- package/build/queries/text.js +9 -9
- package/build/queries/text.js.map +1 -1
- package/build/render.d.ts +3 -4
- package/build/render.js +17 -3
- package/build/render.js.map +1 -1
- package/build/screen.js.map +1 -1
- package/build/test-utils/react-version-gates.d.ts +1 -0
- package/build/test-utils/react-version-gates.js +28 -0
- package/build/test-utils/react-version-gates.js.map +1 -0
- package/build/types.d.ts +7 -0
- package/build/types.js.map +1 -1
- package/build/user-event/clear.d.ts +2 -2
- package/build/user-event/clear.js +13 -13
- package/build/user-event/clear.js.map +1 -1
- package/build/user-event/index.d.ts +7 -7
- package/build/user-event/index.js +6 -6
- package/build/user-event/index.js.map +1 -1
- package/build/user-event/paste.d.ts +2 -2
- package/build/user-event/paste.js +18 -18
- package/build/user-event/paste.js.map +1 -1
- package/build/user-event/press/press.d.ts +3 -3
- package/build/user-event/press/press.js +35 -35
- package/build/user-event/press/press.js.map +1 -1
- package/build/user-event/scroll/scroll-to.d.ts +2 -2
- package/build/user-event/scroll/scroll-to.js +20 -20
- package/build/user-event/scroll/scroll-to.js.map +1 -1
- package/build/user-event/setup/setup.d.ts +11 -11
- package/build/user-event/setup/setup.js.map +1 -1
- package/build/user-event/type/type.d.ts +3 -3
- package/build/user-event/type/type.js +27 -28
- package/build/user-event/type/type.js.map +1 -1
- package/build/user-event/utils/dispatch-event.d.ts +3 -3
- package/build/user-event/utils/dispatch-event.js +4 -4
- package/build/user-event/utils/dispatch-event.js.map +1 -1
- package/build/user-event/utils/index.d.ts +0 -1
- package/build/user-event/utils/index.js +0 -11
- package/build/user-event/utils/index.js.map +1 -1
- package/build/within.d.ts +3 -3
- package/build/within.js +10 -10
- package/build/within.js.map +1 -1
- package/package.json +37 -27
- package/build/tsconfig.release.tsbuildinfo +0 -1
- package/build/user-event/event-builder/base.js.map +0 -1
- package/build/user-event/event-builder/common.d.ts +0 -155
- package/build/user-event/event-builder/common.js +0 -77
- package/build/user-event/event-builder/common.js.map +0 -1
- package/build/user-event/event-builder/index.d.ts +0 -318
- package/build/user-event/event-builder/index.js +0 -15
- package/build/user-event/event-builder/index.js.map +0 -1
- package/build/user-event/event-builder/scroll-view.d.ts +0 -58
- package/build/user-event/event-builder/scroll-view.js +0 -53
- package/build/user-event/event-builder/scroll-view.js.map +0 -1
- package/build/user-event/event-builder/text-input.d.ts +0 -165
- package/build/user-event/event-builder/text-input.js +0 -105
- package/build/user-event/event-builder/text-input.js.map +0 -1
- package/build/user-event/utils/text-range.d.ts +0 -4
- package/build/user-event/utils/text-range.js +0 -6
- package/build/user-event/utils/text-range.js.map +0 -1
- /package/build/{user-event/event-builder → event-builder}/base.d.ts +0 -0
- /package/build/{user-event/event-builder → event-builder}/base.js +0 -0
|
@@ -27,13 +27,13 @@ var _textContent = require("./text-content");
|
|
|
27
27
|
var _textInput = require("./text-input");
|
|
28
28
|
const accessibilityStateKeys = exports.accessibilityStateKeys = ['disabled', 'selected', 'checked', 'busy', 'expanded'];
|
|
29
29
|
const accessibilityValueKeys = exports.accessibilityValueKeys = ['min', 'max', 'now', 'text'];
|
|
30
|
-
function isHiddenFromAccessibility(
|
|
30
|
+
function isHiddenFromAccessibility(instance, {
|
|
31
31
|
cache
|
|
32
32
|
} = {}) {
|
|
33
|
-
if (
|
|
33
|
+
if (instance == null) {
|
|
34
34
|
return true;
|
|
35
35
|
}
|
|
36
|
-
let current =
|
|
36
|
+
let current = instance;
|
|
37
37
|
while (current) {
|
|
38
38
|
let isCurrentSubtreeInaccessible = cache?.get(current);
|
|
39
39
|
if (isCurrentSubtreeInaccessible === undefined) {
|
|
@@ -50,54 +50,49 @@ function isHiddenFromAccessibility(element, {
|
|
|
50
50
|
|
|
51
51
|
/** RTL-compatibility alias for `isHiddenFromAccessibility` */
|
|
52
52
|
const isInaccessible = exports.isInaccessible = isHiddenFromAccessibility;
|
|
53
|
-
function isSubtreeInaccessible(
|
|
54
|
-
// Null props can happen for React.Fragments
|
|
55
|
-
if (element.props == null) {
|
|
56
|
-
return false;
|
|
57
|
-
}
|
|
58
|
-
|
|
53
|
+
function isSubtreeInaccessible(instance) {
|
|
59
54
|
// See: https://reactnative.dev/docs/accessibility#aria-hidden
|
|
60
|
-
if (
|
|
55
|
+
if (instance.props['aria-hidden']) {
|
|
61
56
|
return true;
|
|
62
57
|
}
|
|
63
58
|
|
|
64
59
|
// iOS: accessibilityElementsHidden
|
|
65
60
|
// See: https://reactnative.dev/docs/accessibility#accessibilityelementshidden-ios
|
|
66
|
-
if (
|
|
61
|
+
if (instance.props.accessibilityElementsHidden) {
|
|
67
62
|
return true;
|
|
68
63
|
}
|
|
69
64
|
|
|
70
65
|
// Android: importantForAccessibility
|
|
71
66
|
// See: https://reactnative.dev/docs/accessibility#importantforaccessibility-android
|
|
72
|
-
if (
|
|
67
|
+
if (instance.props.importantForAccessibility === 'no-hide-descendants') {
|
|
73
68
|
return true;
|
|
74
69
|
}
|
|
75
70
|
|
|
76
71
|
// Note that `opacity: 0` is not treated as inaccessible on iOS
|
|
77
|
-
const flatStyle = _reactNative.StyleSheet.flatten(
|
|
72
|
+
const flatStyle = _reactNative.StyleSheet.flatten(instance.props.style) ?? {};
|
|
78
73
|
if (flatStyle.display === 'none') return true;
|
|
79
74
|
|
|
80
75
|
// iOS: accessibilityViewIsModal or aria-modal
|
|
81
76
|
// See: https://reactnative.dev/docs/accessibility#accessibilityviewismodal-ios
|
|
82
|
-
const hostSiblings = (0, _componentTree.
|
|
77
|
+
const hostSiblings = (0, _componentTree.getInstanceSiblings)(instance);
|
|
83
78
|
if (hostSiblings.some(sibling => computeAriaModal(sibling))) {
|
|
84
79
|
return true;
|
|
85
80
|
}
|
|
86
81
|
return false;
|
|
87
82
|
}
|
|
88
|
-
function isAccessibilityElement(
|
|
89
|
-
if (
|
|
83
|
+
function isAccessibilityElement(instance) {
|
|
84
|
+
if (instance == null) {
|
|
90
85
|
return false;
|
|
91
86
|
}
|
|
92
87
|
|
|
93
88
|
// https://github.com/facebook/react-native/blob/8dabed60f456e76a9e53273b601446f34de41fb5/packages/react-native/Libraries/Image/Image.ios.js#L172
|
|
94
|
-
if ((0, _hostComponentNames.isHostImage)(
|
|
89
|
+
if ((0, _hostComponentNames.isHostImage)(instance) && instance.props.alt !== undefined) {
|
|
95
90
|
return true;
|
|
96
91
|
}
|
|
97
|
-
if (
|
|
98
|
-
return
|
|
92
|
+
if (instance.props.accessible !== undefined) {
|
|
93
|
+
return instance.props.accessible;
|
|
99
94
|
}
|
|
100
|
-
return (0, _hostComponentNames.isHostText)(
|
|
95
|
+
return (0, _hostComponentNames.isHostText)(instance) || (0, _hostComponentNames.isHostTextInput)(instance) || (0, _hostComponentNames.isHostSwitch)(instance);
|
|
101
96
|
}
|
|
102
97
|
|
|
103
98
|
/**
|
|
@@ -110,15 +105,15 @@ function isAccessibilityElement(element) {
|
|
|
110
105
|
*
|
|
111
106
|
* In all other cases this functions returns `none`.
|
|
112
107
|
*
|
|
113
|
-
* @param
|
|
108
|
+
* @param instance
|
|
114
109
|
* @returns
|
|
115
110
|
*/
|
|
116
|
-
function getRole(
|
|
117
|
-
const explicitRole =
|
|
111
|
+
function getRole(instance) {
|
|
112
|
+
const explicitRole = instance.props.role ?? instance.props.accessibilityRole;
|
|
118
113
|
if (explicitRole) {
|
|
119
114
|
return normalizeRole(explicitRole);
|
|
120
115
|
}
|
|
121
|
-
if ((0, _hostComponentNames.isHostText)(
|
|
116
|
+
if ((0, _hostComponentNames.isHostText)(instance)) {
|
|
122
117
|
return 'text';
|
|
123
118
|
}
|
|
124
119
|
|
|
@@ -141,28 +136,28 @@ function normalizeRole(role) {
|
|
|
141
136
|
}
|
|
142
137
|
return role;
|
|
143
138
|
}
|
|
144
|
-
function computeAriaModal(
|
|
145
|
-
return
|
|
139
|
+
function computeAriaModal(instance) {
|
|
140
|
+
return instance.props['aria-modal'] ?? instance.props.accessibilityViewIsModal;
|
|
146
141
|
}
|
|
147
|
-
function computeAriaLabel(
|
|
148
|
-
const labelElementId =
|
|
142
|
+
function computeAriaLabel(instance) {
|
|
143
|
+
const labelElementId = instance.props['aria-labelledby'] ?? instance.props.accessibilityLabelledBy;
|
|
149
144
|
if (labelElementId) {
|
|
150
|
-
const container = (0, _componentTree.
|
|
151
|
-
const
|
|
145
|
+
const container = (0, _componentTree.getContainerInstance)(instance);
|
|
146
|
+
const labelInstance = (0, _findAll.findAll)(container, node => (0, _componentTree.isTestInstance)(node) && node.props.nativeID === labelElementId, {
|
|
152
147
|
includeHiddenElements: true
|
|
153
148
|
});
|
|
154
|
-
if (
|
|
155
|
-
return (0, _textContent.getTextContent)(
|
|
149
|
+
if (labelInstance.length > 0) {
|
|
150
|
+
return (0, _textContent.getTextContent)(labelInstance[0]);
|
|
156
151
|
}
|
|
157
152
|
}
|
|
158
|
-
const explicitLabel =
|
|
153
|
+
const explicitLabel = instance.props['aria-label'] ?? instance.props.accessibilityLabel;
|
|
159
154
|
if (explicitLabel) {
|
|
160
155
|
return explicitLabel;
|
|
161
156
|
}
|
|
162
157
|
|
|
163
158
|
//https://github.com/facebook/react-native/blob/8dabed60f456e76a9e53273b601446f34de41fb5/packages/react-native/Libraries/Image/Image.ios.js#L173
|
|
164
|
-
if ((0, _hostComponentNames.isHostImage)(
|
|
165
|
-
return
|
|
159
|
+
if ((0, _hostComponentNames.isHostImage)(instance) && instance.props.alt) {
|
|
160
|
+
return instance.props.alt;
|
|
166
161
|
}
|
|
167
162
|
return undefined;
|
|
168
163
|
}
|
|
@@ -175,14 +170,14 @@ function computeAriaBusy({
|
|
|
175
170
|
}
|
|
176
171
|
|
|
177
172
|
// See: https://github.com/callstack/react-native-testing-library/wiki/Accessibility:-State#checked-state
|
|
178
|
-
function computeAriaChecked(
|
|
173
|
+
function computeAriaChecked(instance) {
|
|
179
174
|
const {
|
|
180
175
|
props
|
|
181
|
-
} =
|
|
182
|
-
if ((0, _hostComponentNames.isHostSwitch)(
|
|
176
|
+
} = instance;
|
|
177
|
+
if ((0, _hostComponentNames.isHostSwitch)(instance)) {
|
|
183
178
|
return props.value;
|
|
184
179
|
}
|
|
185
|
-
const role = getRole(
|
|
180
|
+
const role = getRole(instance);
|
|
186
181
|
if (!rolesSupportingCheckedState[role]) {
|
|
187
182
|
return undefined;
|
|
188
183
|
}
|
|
@@ -190,14 +185,14 @@ function computeAriaChecked(element) {
|
|
|
190
185
|
}
|
|
191
186
|
|
|
192
187
|
// See: https://github.com/callstack/react-native-testing-library/wiki/Accessibility:-State#disabled-state
|
|
193
|
-
function computeAriaDisabled(
|
|
194
|
-
if ((0, _hostComponentNames.isHostTextInput)(
|
|
188
|
+
function computeAriaDisabled(instance) {
|
|
189
|
+
if ((0, _hostComponentNames.isHostTextInput)(instance) && !(0, _textInput.isEditableTextInput)(instance)) {
|
|
195
190
|
return true;
|
|
196
191
|
}
|
|
197
192
|
const {
|
|
198
193
|
props
|
|
199
|
-
} =
|
|
200
|
-
if ((0, _hostComponentNames.isHostText)(
|
|
194
|
+
} = instance;
|
|
195
|
+
if ((0, _hostComponentNames.isHostText)(instance) && props.disabled) {
|
|
201
196
|
return true;
|
|
202
197
|
}
|
|
203
198
|
return props['aria-disabled'] ?? props.accessibilityState?.disabled ?? false;
|
|
@@ -216,14 +211,14 @@ function computeAriaSelected({
|
|
|
216
211
|
}) {
|
|
217
212
|
return props['aria-selected'] ?? props.accessibilityState?.selected ?? false;
|
|
218
213
|
}
|
|
219
|
-
function computeAriaValue(
|
|
214
|
+
function computeAriaValue(instance) {
|
|
220
215
|
const {
|
|
221
216
|
accessibilityValue,
|
|
222
217
|
'aria-valuemax': ariaValueMax,
|
|
223
218
|
'aria-valuemin': ariaValueMin,
|
|
224
219
|
'aria-valuenow': ariaValueNow,
|
|
225
220
|
'aria-valuetext': ariaValueText
|
|
226
|
-
} =
|
|
221
|
+
} = instance.props;
|
|
227
222
|
return {
|
|
228
223
|
max: ariaValueMax ?? accessibilityValue?.max,
|
|
229
224
|
min: ariaValueMin ?? accessibilityValue?.min,
|
|
@@ -231,8 +226,30 @@ function computeAriaValue(element) {
|
|
|
231
226
|
text: ariaValueText ?? accessibilityValue?.text
|
|
232
227
|
};
|
|
233
228
|
}
|
|
234
|
-
function computeAccessibleName(
|
|
235
|
-
|
|
229
|
+
function computeAccessibleName(instance, options) {
|
|
230
|
+
const label = computeAriaLabel(instance);
|
|
231
|
+
if (label) {
|
|
232
|
+
return label;
|
|
233
|
+
}
|
|
234
|
+
if ((0, _hostComponentNames.isHostTextInput)(instance) && instance.props.placeholder && options?.root !== false) {
|
|
235
|
+
return instance.props.placeholder;
|
|
236
|
+
}
|
|
237
|
+
const parts = [];
|
|
238
|
+
for (const child of instance.children) {
|
|
239
|
+
if (typeof child === 'string') {
|
|
240
|
+
if (child) {
|
|
241
|
+
parts.push(child);
|
|
242
|
+
}
|
|
243
|
+
} else {
|
|
244
|
+
const childLabel = computeAccessibleName(child, {
|
|
245
|
+
root: false
|
|
246
|
+
});
|
|
247
|
+
if (childLabel) {
|
|
248
|
+
parts.push(childLabel);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
return parts.join(' ');
|
|
236
253
|
}
|
|
237
254
|
const rolesSupportingCheckedState = exports.rolesSupportingCheckedState = {
|
|
238
255
|
checkbox: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accessibility.js","names":["_reactNative","require","_componentTree","_findAll","_hostComponentNames","_textContent","_textInput","accessibilityStateKeys","exports","accessibilityValueKeys","isHiddenFromAccessibility","element","cache","current","isCurrentSubtreeInaccessible","get","undefined","isSubtreeInaccessible","set","parent","isInaccessible","props","accessibilityElementsHidden","importantForAccessibility","flatStyle","StyleSheet","flatten","style","display","hostSiblings","getHostSiblings","some","sibling","computeAriaModal","isAccessibilityElement","isHostImage","alt","accessible","isHostText","isHostTextInput","isHostSwitch","getRole","explicitRole","role","accessibilityRole","normalizeRole","accessibilityViewIsModal","computeAriaLabel","labelElementId","accessibilityLabelledBy","container","getContainerElement","labelElement","findAll","node","isHostElement","nativeID","includeHiddenElements","length","getTextContent","explicitLabel","accessibilityLabel","computeAriaBusy","accessibilityState","busy","computeAriaChecked","value","rolesSupportingCheckedState","checked","computeAriaDisabled","isEditableTextInput","disabled","computeAriaExpanded","expanded","computeAriaSelected","selected","computeAriaValue","accessibilityValue","ariaValueMax","ariaValueMin","ariaValueNow","ariaValueText","max","min","now","text","computeAccessibleName","checkbox","radio","switch"],"sources":["../../src/helpers/accessibility.ts"],"sourcesContent":["import type { AccessibilityRole, AccessibilityState, AccessibilityValue, Role } from 'react-native';\nimport { StyleSheet } from 'react-native';\nimport type { HostElement } from 'test-renderer';\n\nimport { getContainerElement, getHostSiblings, isHostElement } from './component-tree';\nimport { findAll } from './find-all';\nimport { isHostImage, isHostSwitch, isHostText, isHostTextInput } from './host-component-names';\nimport { getTextContent } from './text-content';\nimport { isEditableTextInput } from './text-input';\n\ntype IsInaccessibleOptions = {\n cache?: WeakMap<HostElement, boolean>;\n};\n\nexport const accessibilityStateKeys: (keyof AccessibilityState)[] = [\n 'disabled',\n 'selected',\n 'checked',\n 'busy',\n 'expanded',\n];\n\nexport const accessibilityValueKeys: (keyof AccessibilityValue)[] = ['min', 'max', 'now', 'text'];\n\nexport function isHiddenFromAccessibility(\n element: HostElement | null,\n { cache }: IsInaccessibleOptions = {},\n): boolean {\n if (element == null) {\n return true;\n }\n\n let current: HostElement | null = element;\n while (current) {\n let isCurrentSubtreeInaccessible = cache?.get(current);\n\n if (isCurrentSubtreeInaccessible === undefined) {\n isCurrentSubtreeInaccessible = isSubtreeInaccessible(current);\n cache?.set(current, isCurrentSubtreeInaccessible);\n }\n\n if (isCurrentSubtreeInaccessible) {\n return true;\n }\n\n current = current.parent;\n }\n\n return false;\n}\n\n/** RTL-compatibility alias for `isHiddenFromAccessibility` */\nexport const isInaccessible = isHiddenFromAccessibility;\n\nfunction isSubtreeInaccessible(element: HostElement): boolean {\n // Null props can happen for React.Fragments\n if (element.props == null) {\n return false;\n }\n\n // See: https://reactnative.dev/docs/accessibility#aria-hidden\n if (element.props['aria-hidden']) {\n return true;\n }\n\n // iOS: accessibilityElementsHidden\n // See: https://reactnative.dev/docs/accessibility#accessibilityelementshidden-ios\n if (element.props.accessibilityElementsHidden) {\n return true;\n }\n\n // Android: importantForAccessibility\n // See: https://reactnative.dev/docs/accessibility#importantforaccessibility-android\n if (element.props.importantForAccessibility === 'no-hide-descendants') {\n return true;\n }\n\n // Note that `opacity: 0` is not treated as inaccessible on iOS\n const flatStyle = StyleSheet.flatten(element.props.style) ?? {};\n if (flatStyle.display === 'none') return true;\n\n // iOS: accessibilityViewIsModal or aria-modal\n // See: https://reactnative.dev/docs/accessibility#accessibilityviewismodal-ios\n const hostSiblings = getHostSiblings(element);\n if (hostSiblings.some((sibling) => computeAriaModal(sibling))) {\n return true;\n }\n\n return false;\n}\n\nexport function isAccessibilityElement(element: HostElement | null): boolean {\n if (element == null) {\n return false;\n }\n\n // https://github.com/facebook/react-native/blob/8dabed60f456e76a9e53273b601446f34de41fb5/packages/react-native/Libraries/Image/Image.ios.js#L172\n if (isHostImage(element) && element.props.alt !== undefined) {\n return true;\n }\n\n if (element.props.accessible !== undefined) {\n return element.props.accessible;\n }\n\n return isHostText(element) || isHostTextInput(element) || isHostSwitch(element);\n}\n\n/**\n * Returns the accessibility role for given element. It will return explicit\n * role from either `role` or `accessibilityRole` props if set.\n *\n * If explicit role is not available, it would try to return default element\n * role:\n * - `text` for `Text` elements\n *\n * In all other cases this functions returns `none`.\n *\n * @param element\n * @returns\n */\nexport function getRole(element: HostElement): Role | AccessibilityRole {\n const explicitRole = element.props.role ?? element.props.accessibilityRole;\n if (explicitRole) {\n return normalizeRole(explicitRole);\n }\n\n if (isHostText(element)) {\n return 'text';\n }\n\n // Note: host Image elements report \"image\" role in screen reader only on Android, but not on iOS.\n // It's better to require explicit role for Image elements.\n\n return 'none';\n}\n\n/**\n * There are some duplications between (ARIA) `Role` and `AccessibilityRole` types.\n * Resolve them by using ARIA `Role` type where possible.\n *\n * @param role Role to normalize\n * @returns Normalized role\n */\nexport function normalizeRole(role: string): Role | AccessibilityRole {\n if (role === 'image') {\n return 'img';\n }\n\n return role as Role | AccessibilityRole;\n}\n\nexport function computeAriaModal(element: HostElement): boolean | undefined {\n return element.props['aria-modal'] ?? element.props.accessibilityViewIsModal;\n}\n\nexport function computeAriaLabel(element: HostElement): string | undefined {\n const labelElementId = element.props['aria-labelledby'] ?? element.props.accessibilityLabelledBy;\n if (labelElementId) {\n const container = getContainerElement(element);\n const labelElement = findAll(\n container,\n (node) => isHostElement(node) && node.props.nativeID === labelElementId,\n { includeHiddenElements: true },\n );\n if (labelElement.length > 0) {\n return getTextContent(labelElement[0]);\n }\n }\n\n const explicitLabel = element.props['aria-label'] ?? element.props.accessibilityLabel;\n if (explicitLabel) {\n return explicitLabel;\n }\n\n //https://github.com/facebook/react-native/blob/8dabed60f456e76a9e53273b601446f34de41fb5/packages/react-native/Libraries/Image/Image.ios.js#L173\n if (isHostImage(element) && element.props.alt) {\n return element.props.alt;\n }\n\n return undefined;\n}\n\n// See: https://github.com/callstack/react-native-testing-library/wiki/Accessibility:-State#busy-state\nexport function computeAriaBusy({ props }: HostElement): boolean {\n return props['aria-busy'] ?? props.accessibilityState?.busy ?? false;\n}\n\n// See: https://github.com/callstack/react-native-testing-library/wiki/Accessibility:-State#checked-state\nexport function computeAriaChecked(element: HostElement): AccessibilityState['checked'] {\n const { props } = element;\n\n if (isHostSwitch(element)) {\n return props.value;\n }\n\n const role = getRole(element);\n if (!rolesSupportingCheckedState[role]) {\n return undefined;\n }\n\n return props['aria-checked'] ?? props.accessibilityState?.checked;\n}\n\n// See: https://github.com/callstack/react-native-testing-library/wiki/Accessibility:-State#disabled-state\nexport function computeAriaDisabled(element: HostElement): boolean {\n if (isHostTextInput(element) && !isEditableTextInput(element)) {\n return true;\n }\n\n const { props } = element;\n\n if (isHostText(element) && props.disabled) {\n return true;\n }\n\n return props['aria-disabled'] ?? props.accessibilityState?.disabled ?? false;\n}\n\n// See: https://github.com/callstack/react-native-testing-library/wiki/Accessibility:-State#expanded-state\nexport function computeAriaExpanded({ props }: HostElement): boolean | undefined {\n return props['aria-expanded'] ?? props.accessibilityState?.expanded;\n}\n\n// See: https://github.com/callstack/react-native-testing-library/wiki/Accessibility:-State#selected-state\nexport function computeAriaSelected({ props }: HostElement): boolean {\n return props['aria-selected'] ?? props.accessibilityState?.selected ?? false;\n}\n\nexport function computeAriaValue(element: HostElement): AccessibilityValue {\n const {\n accessibilityValue,\n 'aria-valuemax': ariaValueMax,\n 'aria-valuemin': ariaValueMin,\n 'aria-valuenow': ariaValueNow,\n 'aria-valuetext': ariaValueText,\n } = element.props;\n\n return {\n max: ariaValueMax ?? accessibilityValue?.max,\n min: ariaValueMin ?? accessibilityValue?.min,\n now: ariaValueNow ?? accessibilityValue?.now,\n text: ariaValueText ?? accessibilityValue?.text,\n };\n}\n\nexport function computeAccessibleName(element: HostElement): string | undefined {\n return computeAriaLabel(element) ?? getTextContent(element);\n}\n\ntype RoleSupportMap = Partial<Record<Role | AccessibilityRole, true>>;\n\nexport const rolesSupportingCheckedState: RoleSupportMap = {\n checkbox: true,\n radio: true,\n switch: true,\n};\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"accessibility.js","names":["_reactNative","require","_componentTree","_findAll","_hostComponentNames","_textContent","_textInput","accessibilityStateKeys","exports","accessibilityValueKeys","isHiddenFromAccessibility","instance","cache","current","isCurrentSubtreeInaccessible","get","undefined","isSubtreeInaccessible","set","parent","isInaccessible","props","accessibilityElementsHidden","importantForAccessibility","flatStyle","StyleSheet","flatten","style","display","hostSiblings","getInstanceSiblings","some","sibling","computeAriaModal","isAccessibilityElement","isHostImage","alt","accessible","isHostText","isHostTextInput","isHostSwitch","getRole","explicitRole","role","accessibilityRole","normalizeRole","accessibilityViewIsModal","computeAriaLabel","labelElementId","accessibilityLabelledBy","container","getContainerInstance","labelInstance","findAll","node","isTestInstance","nativeID","includeHiddenElements","length","getTextContent","explicitLabel","accessibilityLabel","computeAriaBusy","accessibilityState","busy","computeAriaChecked","value","rolesSupportingCheckedState","checked","computeAriaDisabled","isEditableTextInput","disabled","computeAriaExpanded","expanded","computeAriaSelected","selected","computeAriaValue","accessibilityValue","ariaValueMax","ariaValueMin","ariaValueNow","ariaValueText","max","min","now","text","computeAccessibleName","options","label","placeholder","root","parts","child","children","push","childLabel","join","checkbox","radio","switch"],"sources":["../../src/helpers/accessibility.ts"],"sourcesContent":["import type { AccessibilityRole, AccessibilityState, AccessibilityValue, Role } from 'react-native';\nimport { StyleSheet } from 'react-native';\nimport type { TestInstance } from 'test-renderer';\n\nimport { getContainerInstance, getInstanceSiblings, isTestInstance } from './component-tree';\nimport { findAll } from './find-all';\nimport { isHostImage, isHostSwitch, isHostText, isHostTextInput } from './host-component-names';\nimport { getTextContent } from './text-content';\nimport { isEditableTextInput } from './text-input';\n\ntype IsInaccessibleOptions = {\n cache?: WeakMap<TestInstance, boolean>;\n};\n\nexport const accessibilityStateKeys: (keyof AccessibilityState)[] = [\n 'disabled',\n 'selected',\n 'checked',\n 'busy',\n 'expanded',\n];\n\nexport const accessibilityValueKeys: (keyof AccessibilityValue)[] = ['min', 'max', 'now', 'text'];\n\nexport function isHiddenFromAccessibility(\n instance: TestInstance | null,\n { cache }: IsInaccessibleOptions = {},\n): boolean {\n if (instance == null) {\n return true;\n }\n\n let current: TestInstance | null = instance;\n while (current) {\n let isCurrentSubtreeInaccessible = cache?.get(current);\n\n if (isCurrentSubtreeInaccessible === undefined) {\n isCurrentSubtreeInaccessible = isSubtreeInaccessible(current);\n cache?.set(current, isCurrentSubtreeInaccessible);\n }\n\n if (isCurrentSubtreeInaccessible) {\n return true;\n }\n\n current = current.parent;\n }\n\n return false;\n}\n\n/** RTL-compatibility alias for `isHiddenFromAccessibility` */\nexport const isInaccessible = isHiddenFromAccessibility;\n\nfunction isSubtreeInaccessible(instance: TestInstance): boolean {\n // See: https://reactnative.dev/docs/accessibility#aria-hidden\n if (instance.props['aria-hidden']) {\n return true;\n }\n\n // iOS: accessibilityElementsHidden\n // See: https://reactnative.dev/docs/accessibility#accessibilityelementshidden-ios\n if (instance.props.accessibilityElementsHidden) {\n return true;\n }\n\n // Android: importantForAccessibility\n // See: https://reactnative.dev/docs/accessibility#importantforaccessibility-android\n if (instance.props.importantForAccessibility === 'no-hide-descendants') {\n return true;\n }\n\n // Note that `opacity: 0` is not treated as inaccessible on iOS\n const flatStyle = StyleSheet.flatten(instance.props.style) ?? {};\n if (flatStyle.display === 'none') return true;\n\n // iOS: accessibilityViewIsModal or aria-modal\n // See: https://reactnative.dev/docs/accessibility#accessibilityviewismodal-ios\n const hostSiblings = getInstanceSiblings(instance);\n if (hostSiblings.some((sibling) => computeAriaModal(sibling))) {\n return true;\n }\n\n return false;\n}\n\nexport function isAccessibilityElement(instance: TestInstance | null): boolean {\n if (instance == null) {\n return false;\n }\n\n // https://github.com/facebook/react-native/blob/8dabed60f456e76a9e53273b601446f34de41fb5/packages/react-native/Libraries/Image/Image.ios.js#L172\n if (isHostImage(instance) && instance.props.alt !== undefined) {\n return true;\n }\n\n if (instance.props.accessible !== undefined) {\n return instance.props.accessible;\n }\n\n return isHostText(instance) || isHostTextInput(instance) || isHostSwitch(instance);\n}\n\n/**\n * Returns the accessibility role for given element. It will return explicit\n * role from either `role` or `accessibilityRole` props if set.\n *\n * If explicit role is not available, it would try to return default element\n * role:\n * - `text` for `Text` elements\n *\n * In all other cases this functions returns `none`.\n *\n * @param instance\n * @returns\n */\nexport function getRole(instance: TestInstance): Role | AccessibilityRole {\n const explicitRole = instance.props.role ?? instance.props.accessibilityRole;\n if (explicitRole) {\n return normalizeRole(explicitRole);\n }\n\n if (isHostText(instance)) {\n return 'text';\n }\n\n // Note: host Image elements report \"image\" role in screen reader only on Android, but not on iOS.\n // It's better to require explicit role for Image elements.\n\n return 'none';\n}\n\n/**\n * There are some duplications between (ARIA) `Role` and `AccessibilityRole` types.\n * Resolve them by using ARIA `Role` type where possible.\n *\n * @param role Role to normalize\n * @returns Normalized role\n */\nexport function normalizeRole(role: string): Role | AccessibilityRole {\n if (role === 'image') {\n return 'img';\n }\n\n return role as Role | AccessibilityRole;\n}\n\nexport function computeAriaModal(instance: TestInstance): boolean | undefined {\n return instance.props['aria-modal'] ?? instance.props.accessibilityViewIsModal;\n}\n\nexport function computeAriaLabel(instance: TestInstance): string | undefined {\n const labelElementId =\n instance.props['aria-labelledby'] ?? instance.props.accessibilityLabelledBy;\n if (labelElementId) {\n const container = getContainerInstance(instance);\n const labelInstance = findAll(\n container,\n (node) => isTestInstance(node) && node.props.nativeID === labelElementId,\n { includeHiddenElements: true },\n );\n if (labelInstance.length > 0) {\n return getTextContent(labelInstance[0]);\n }\n }\n\n const explicitLabel = instance.props['aria-label'] ?? instance.props.accessibilityLabel;\n if (explicitLabel) {\n return explicitLabel;\n }\n\n //https://github.com/facebook/react-native/blob/8dabed60f456e76a9e53273b601446f34de41fb5/packages/react-native/Libraries/Image/Image.ios.js#L173\n if (isHostImage(instance) && instance.props.alt) {\n return instance.props.alt;\n }\n\n return undefined;\n}\n\n// See: https://github.com/callstack/react-native-testing-library/wiki/Accessibility:-State#busy-state\nexport function computeAriaBusy({ props }: TestInstance): boolean {\n return props['aria-busy'] ?? props.accessibilityState?.busy ?? false;\n}\n\n// See: https://github.com/callstack/react-native-testing-library/wiki/Accessibility:-State#checked-state\nexport function computeAriaChecked(instance: TestInstance): AccessibilityState['checked'] {\n const { props } = instance;\n\n if (isHostSwitch(instance)) {\n return props.value;\n }\n\n const role = getRole(instance);\n if (!rolesSupportingCheckedState[role]) {\n return undefined;\n }\n\n return props['aria-checked'] ?? props.accessibilityState?.checked;\n}\n\n// See: https://github.com/callstack/react-native-testing-library/wiki/Accessibility:-State#disabled-state\nexport function computeAriaDisabled(instance: TestInstance): boolean {\n if (isHostTextInput(instance) && !isEditableTextInput(instance)) {\n return true;\n }\n\n const { props } = instance;\n\n if (isHostText(instance) && props.disabled) {\n return true;\n }\n\n return props['aria-disabled'] ?? props.accessibilityState?.disabled ?? false;\n}\n\n// See: https://github.com/callstack/react-native-testing-library/wiki/Accessibility:-State#expanded-state\nexport function computeAriaExpanded({ props }: TestInstance): boolean | undefined {\n return props['aria-expanded'] ?? props.accessibilityState?.expanded;\n}\n\n// See: https://github.com/callstack/react-native-testing-library/wiki/Accessibility:-State#selected-state\nexport function computeAriaSelected({ props }: TestInstance): boolean {\n return props['aria-selected'] ?? props.accessibilityState?.selected ?? false;\n}\n\nexport function computeAriaValue(instance: TestInstance): AccessibilityValue {\n const {\n accessibilityValue,\n 'aria-valuemax': ariaValueMax,\n 'aria-valuemin': ariaValueMin,\n 'aria-valuenow': ariaValueNow,\n 'aria-valuetext': ariaValueText,\n } = instance.props;\n\n return {\n max: ariaValueMax ?? accessibilityValue?.max,\n min: ariaValueMin ?? accessibilityValue?.min,\n now: ariaValueNow ?? accessibilityValue?.now,\n text: ariaValueText ?? accessibilityValue?.text,\n };\n}\n\ntype ComputeAccessibleNameOptions = {\n root?: boolean;\n};\n\nexport function computeAccessibleName(\n instance: TestInstance,\n options?: ComputeAccessibleNameOptions,\n): string | undefined {\n const label = computeAriaLabel(instance);\n if (label) {\n return label;\n }\n\n if (isHostTextInput(instance) && instance.props.placeholder && options?.root !== false) {\n return instance.props.placeholder;\n }\n\n const parts = [];\n for (const child of instance.children) {\n if (typeof child === 'string') {\n if (child) {\n parts.push(child);\n }\n } else {\n const childLabel = computeAccessibleName(child, { root: false });\n if (childLabel) {\n parts.push(childLabel);\n }\n }\n }\n\n return parts.join(' ');\n}\n\ntype RoleSupportMap = Partial<Record<Role | AccessibilityRole, true>>;\n\nexport const rolesSupportingCheckedState: RoleSupportMap = {\n checkbox: true,\n radio: true,\n switch: true,\n};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { TestInstance, TestNode } from 'test-renderer';
|
|
2
2
|
/**
|
|
3
3
|
* Checks if the given element is a host element.
|
|
4
|
-
* @param
|
|
4
|
+
* @param node The element to check.
|
|
5
5
|
*/
|
|
6
|
-
export declare function
|
|
7
|
-
export declare function
|
|
6
|
+
export declare function isTestInstance(node?: TestNode | null): node is TestInstance;
|
|
7
|
+
export declare function isInstanceMounted(instance: TestInstance): boolean;
|
|
8
8
|
/**
|
|
9
9
|
* Returns host siblings for given element.
|
|
10
|
-
* @param
|
|
10
|
+
* @param instance The element start traversing from.
|
|
11
11
|
*/
|
|
12
|
-
export declare function
|
|
12
|
+
export declare function getInstanceSiblings(instance: TestInstance): TestInstance[];
|
|
13
13
|
/**
|
|
14
|
-
* Returns the
|
|
14
|
+
* Returns the container element of the tree.
|
|
15
15
|
*
|
|
16
|
-
* @param
|
|
16
|
+
* @param instance The element start traversing from.
|
|
17
17
|
* @returns The container element of the tree.
|
|
18
18
|
*/
|
|
19
|
-
export declare function
|
|
19
|
+
export declare function getContainerInstance(instance: TestInstance): TestInstance;
|
|
@@ -3,43 +3,43 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.
|
|
7
|
-
exports.
|
|
8
|
-
exports.
|
|
9
|
-
exports.
|
|
6
|
+
exports.getContainerInstance = getContainerInstance;
|
|
7
|
+
exports.getInstanceSiblings = getInstanceSiblings;
|
|
8
|
+
exports.isInstanceMounted = isInstanceMounted;
|
|
9
|
+
exports.isTestInstance = isTestInstance;
|
|
10
10
|
var _screen = require("../screen");
|
|
11
11
|
/**
|
|
12
12
|
* Checks if the given element is a host element.
|
|
13
|
-
* @param
|
|
13
|
+
* @param node The element to check.
|
|
14
14
|
*/
|
|
15
|
-
function
|
|
16
|
-
return typeof
|
|
15
|
+
function isTestInstance(node) {
|
|
16
|
+
return typeof node !== 'string' && typeof node?.type === 'string';
|
|
17
17
|
}
|
|
18
|
-
function
|
|
19
|
-
return
|
|
18
|
+
function isInstanceMounted(instance) {
|
|
19
|
+
return getContainerInstance(instance) === _screen.screen.container;
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
/**
|
|
23
23
|
* Returns host siblings for given element.
|
|
24
|
-
* @param
|
|
24
|
+
* @param instance The element start traversing from.
|
|
25
25
|
*/
|
|
26
|
-
function
|
|
26
|
+
function getInstanceSiblings(instance) {
|
|
27
27
|
// Should not happen
|
|
28
|
-
const parent =
|
|
28
|
+
const parent = instance.parent;
|
|
29
29
|
if (!parent) {
|
|
30
30
|
return [];
|
|
31
31
|
}
|
|
32
|
-
return parent.children.filter(sibling => typeof sibling !== 'string' && sibling !==
|
|
32
|
+
return parent.children.filter(sibling => typeof sibling !== 'string' && sibling !== instance);
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
/**
|
|
36
|
-
* Returns the
|
|
36
|
+
* Returns the container element of the tree.
|
|
37
37
|
*
|
|
38
|
-
* @param
|
|
38
|
+
* @param instance The element start traversing from.
|
|
39
39
|
* @returns The container element of the tree.
|
|
40
40
|
*/
|
|
41
|
-
function
|
|
42
|
-
let current =
|
|
41
|
+
function getContainerInstance(instance) {
|
|
42
|
+
let current = instance;
|
|
43
43
|
while (current.parent) {
|
|
44
44
|
current = current.parent;
|
|
45
45
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component-tree.js","names":["_screen","require","
|
|
1
|
+
{"version":3,"file":"component-tree.js","names":["_screen","require","isTestInstance","node","type","isInstanceMounted","instance","getContainerInstance","screen","container","getInstanceSiblings","parent","children","filter","sibling","current"],"sources":["../../src/helpers/component-tree.ts"],"sourcesContent":["import type { TestInstance, TestNode } from 'test-renderer';\n\nimport { screen } from '../screen';\n\n/**\n * Checks if the given element is a host element.\n * @param node The element to check.\n */\nexport function isTestInstance(node?: TestNode | null): node is TestInstance {\n return typeof node !== 'string' && typeof node?.type === 'string';\n}\n\nexport function isInstanceMounted(instance: TestInstance) {\n return getContainerInstance(instance) === screen.container;\n}\n\n/**\n * Returns host siblings for given element.\n * @param instance The element start traversing from.\n */\nexport function getInstanceSiblings(instance: TestInstance): TestInstance[] {\n // Should not happen\n const parent = instance.parent;\n if (!parent) {\n return [];\n }\n\n return parent.children.filter(\n (sibling) => typeof sibling !== 'string' && sibling !== instance,\n ) as TestInstance[];\n}\n\n/**\n * Returns the container element of the tree.\n *\n * @param instance The element start traversing from.\n * @returns The container element of the tree.\n */\nexport function getContainerInstance(instance: TestInstance) {\n let current = instance;\n while (current.parent) {\n current = current.parent;\n }\n\n return current;\n}\n"],"mappings":";;;;;;;;;AAEA,IAAAA,OAAA,GAAAC,OAAA;AAEA;AACA;AACA;AACA;AACO,SAASC,cAAcA,CAACC,IAAsB,EAAwB;EAC3E,OAAO,OAAOA,IAAI,KAAK,QAAQ,IAAI,OAAOA,IAAI,EAAEC,IAAI,KAAK,QAAQ;AACnE;AAEO,SAASC,iBAAiBA,CAACC,QAAsB,EAAE;EACxD,OAAOC,oBAAoB,CAACD,QAAQ,CAAC,KAAKE,cAAM,CAACC,SAAS;AAC5D;;AAEA;AACA;AACA;AACA;AACO,SAASC,mBAAmBA,CAACJ,QAAsB,EAAkB;EAC1E;EACA,MAAMK,MAAM,GAAGL,QAAQ,CAACK,MAAM;EAC9B,IAAI,CAACA,MAAM,EAAE;IACX,OAAO,EAAE;EACX;EAEA,OAAOA,MAAM,CAACC,QAAQ,CAACC,MAAM,CAC1BC,OAAO,IAAK,OAAOA,OAAO,KAAK,QAAQ,IAAIA,OAAO,KAAKR,QAC1D,CAAC;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACO,SAASC,oBAAoBA,CAACD,QAAsB,EAAE;EAC3D,IAAIS,OAAO,GAAGT,QAAQ;EACtB,OAAOS,OAAO,CAACJ,MAAM,EAAE;IACrBI,OAAO,GAAGA,OAAO,CAACJ,MAAM;EAC1B;EAEA,OAAOI,OAAO;AAChB","ignoreList":[]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { TestInstance } from 'test-renderer';
|
|
2
2
|
interface FindAllOptions {
|
|
3
3
|
/** Match elements hidden from accessibility */
|
|
4
4
|
includeHiddenElements?: boolean;
|
|
@@ -6,5 +6,5 @@ interface FindAllOptions {
|
|
|
6
6
|
hidden?: boolean;
|
|
7
7
|
matchDeepestOnly?: boolean;
|
|
8
8
|
}
|
|
9
|
-
export declare function findAll(root:
|
|
9
|
+
export declare function findAll(root: TestInstance, predicate: (instance: TestInstance) => boolean, options?: FindAllOptions): TestInstance[];
|
|
10
10
|
export {};
|
|
@@ -18,7 +18,7 @@ function findAll(root, predicate, options = {}) {
|
|
|
18
18
|
return results;
|
|
19
19
|
}
|
|
20
20
|
const cache = new WeakMap();
|
|
21
|
-
return results.filter(
|
|
21
|
+
return results.filter(instance => !(0, _accessibility.isHiddenFromAccessibility)(instance, {
|
|
22
22
|
cache
|
|
23
23
|
}));
|
|
24
24
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"find-all.js","names":["_config","require","_accessibility","findAll","root","predicate","options","matchDeepestOnly","results","queryAll","includeHiddenElements","hidden","getConfig","defaultIncludeHiddenElements","cache","WeakMap","filter","
|
|
1
|
+
{"version":3,"file":"find-all.js","names":["_config","require","_accessibility","findAll","root","predicate","options","matchDeepestOnly","results","queryAll","includeHiddenElements","hidden","getConfig","defaultIncludeHiddenElements","cache","WeakMap","filter","instance","isHiddenFromAccessibility"],"sources":["../../src/helpers/find-all.ts"],"sourcesContent":["import type { TestInstance } from 'test-renderer';\n\nimport { getConfig } from '../config';\nimport { isHiddenFromAccessibility } from './accessibility';\n\ninterface FindAllOptions {\n /** Match elements hidden from accessibility */\n includeHiddenElements?: boolean;\n\n /** RTL-compatible alias to `includeHiddenElements` */\n hidden?: boolean;\n\n /* Exclude any ancestors of deepest matched elements even if they match the predicate */\n matchDeepestOnly?: boolean;\n}\n\nexport function findAll(\n root: TestInstance,\n predicate: (instance: TestInstance) => boolean,\n options: FindAllOptions = {},\n): TestInstance[] {\n const { matchDeepestOnly } = options;\n const results = root.queryAll(predicate, { matchDeepestOnly });\n\n const includeHiddenElements =\n options?.includeHiddenElements ?? options?.hidden ?? getConfig()?.defaultIncludeHiddenElements;\n\n if (includeHiddenElements) {\n return results;\n }\n\n const cache = new WeakMap<TestInstance>();\n return results.filter((instance) => !isHiddenFromAccessibility(instance, { cache }));\n}\n"],"mappings":";;;;;;AAEA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,cAAA,GAAAD,OAAA;AAaO,SAASE,OAAOA,CACrBC,IAAkB,EAClBC,SAA8C,EAC9CC,OAAuB,GAAG,CAAC,CAAC,EACZ;EAChB,MAAM;IAAEC;EAAiB,CAAC,GAAGD,OAAO;EACpC,MAAME,OAAO,GAAGJ,IAAI,CAACK,QAAQ,CAACJ,SAAS,EAAE;IAAEE;EAAiB,CAAC,CAAC;EAE9D,MAAMG,qBAAqB,GACzBJ,OAAO,EAAEI,qBAAqB,IAAIJ,OAAO,EAAEK,MAAM,IAAI,IAAAC,iBAAS,EAAC,CAAC,EAAEC,4BAA4B;EAEhG,IAAIH,qBAAqB,EAAE;IACzB,OAAOF,OAAO;EAChB;EAEA,MAAMM,KAAK,GAAG,IAAIC,OAAO,CAAe,CAAC;EACzC,OAAOP,OAAO,CAACQ,MAAM,CAAEC,QAAQ,IAAK,CAAC,IAAAC,wCAAyB,EAACD,QAAQ,EAAE;IAAEH;EAAM,CAAC,CAAC,CAAC;AACtF","ignoreList":[]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { JsonNode, TestInstance } from 'test-renderer';
|
|
2
2
|
import type { MapPropsFunction } from './map-props';
|
|
3
3
|
export type FormatElementOptions = {
|
|
4
4
|
/** Minimize used space. */
|
|
@@ -9,10 +9,10 @@ export type FormatElementOptions = {
|
|
|
9
9
|
mapProps?: MapPropsFunction | null;
|
|
10
10
|
};
|
|
11
11
|
/***
|
|
12
|
-
* Format given
|
|
12
|
+
* Format given instance as a pretty-printed string.
|
|
13
13
|
*
|
|
14
|
-
* @param
|
|
14
|
+
* @param instance Instance to format.
|
|
15
15
|
*/
|
|
16
|
-
export declare function formatElement(
|
|
17
|
-
export declare function formatElementList(
|
|
16
|
+
export declare function formatElement(instance: TestInstance | null, { compact, highlight, mapProps }?: FormatElementOptions): string;
|
|
17
|
+
export declare function formatElementList(instances: TestInstance[], options?: FormatElementOptions): string;
|
|
18
18
|
export declare function formatJson(json: JsonNode | JsonNode[], { compact, highlight, mapProps }?: FormatElementOptions): string;
|
|
@@ -10,28 +10,28 @@ var _prettyFormat = _interopRequireWildcard(require("pretty-format"));
|
|
|
10
10
|
var _mapProps = require("./map-props");
|
|
11
11
|
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
12
12
|
/***
|
|
13
|
-
* Format given
|
|
13
|
+
* Format given instance as a pretty-printed string.
|
|
14
14
|
*
|
|
15
|
-
* @param
|
|
15
|
+
* @param instance Instance to format.
|
|
16
16
|
*/
|
|
17
|
-
function formatElement(
|
|
17
|
+
function formatElement(instance, {
|
|
18
18
|
compact,
|
|
19
19
|
highlight = true,
|
|
20
20
|
mapProps = _mapProps.defaultMapProps
|
|
21
21
|
} = {}) {
|
|
22
|
-
if (
|
|
22
|
+
if (instance == null) {
|
|
23
23
|
return '(null)';
|
|
24
24
|
}
|
|
25
25
|
const {
|
|
26
26
|
children,
|
|
27
27
|
...props
|
|
28
|
-
} =
|
|
28
|
+
} = instance.props;
|
|
29
29
|
const childrenToDisplay = typeof children === 'string' ? [children] : undefined;
|
|
30
30
|
return (0, _prettyFormat.default)({
|
|
31
31
|
// This prop is needed persuade the prettyFormat that the element is
|
|
32
32
|
// a JsonNode instance, so it is formatted as JSX.
|
|
33
33
|
$$typeof: Symbol.for('react.test.json'),
|
|
34
|
-
type: `${
|
|
34
|
+
type: `${instance.type}`,
|
|
35
35
|
props: mapProps ? mapProps(props) : props,
|
|
36
36
|
children: childrenToDisplay
|
|
37
37
|
},
|
|
@@ -44,11 +44,11 @@ function formatElement(element, {
|
|
|
44
44
|
min: compact
|
|
45
45
|
});
|
|
46
46
|
}
|
|
47
|
-
function formatElementList(
|
|
48
|
-
if (
|
|
47
|
+
function formatElementList(instances, options) {
|
|
48
|
+
if (instances.length === 0) {
|
|
49
49
|
return '(no elements)';
|
|
50
50
|
}
|
|
51
|
-
return
|
|
51
|
+
return instances.map(instance => formatElement(instance, options)).join('\n');
|
|
52
52
|
}
|
|
53
53
|
function formatJson(json, {
|
|
54
54
|
compact,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format-element.js","names":["_prettyFormat","_interopRequireWildcard","require","_mapProps","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","formatElement","
|
|
1
|
+
{"version":3,"file":"format-element.js","names":["_prettyFormat","_interopRequireWildcard","require","_mapProps","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","formatElement","instance","compact","highlight","mapProps","defaultMapProps","children","props","childrenToDisplay","undefined","prettyFormat","$$typeof","Symbol","for","type","plugins","ReactTestComponent","ReactElement","printFunctionName","printBasicPrototype","min","formatElementList","instances","options","length","map","join","formatJson","json","getElementJsonPlugin","test","val","serialize","config","indentation","depth","refs","printer","newVal"],"sources":["../../src/helpers/format-element.ts"],"sourcesContent":["import type { NewPlugin } from 'pretty-format';\nimport prettyFormat, { plugins } from 'pretty-format';\nimport type { JsonNode, TestInstance } from 'test-renderer';\n\nimport type { MapPropsFunction } from './map-props';\nimport { defaultMapProps } from './map-props';\n\nexport type FormatElementOptions = {\n /** Minimize used space. */\n compact?: boolean;\n\n /** Highlight the output. */\n highlight?: boolean;\n\n /** Filter or map props to display. */\n mapProps?: MapPropsFunction | null;\n};\n\n/***\n * Format given instance as a pretty-printed string.\n *\n * @param instance Instance to format.\n */\nexport function formatElement(\n instance: TestInstance | null,\n { compact, highlight = true, mapProps = defaultMapProps }: FormatElementOptions = {},\n) {\n if (instance == null) {\n return '(null)';\n }\n\n const { children, ...props } = instance.props;\n const childrenToDisplay = typeof children === 'string' ? [children] : undefined;\n\n return prettyFormat(\n {\n // This prop is needed persuade the prettyFormat that the element is\n // a JsonNode instance, so it is formatted as JSX.\n $$typeof: Symbol.for('react.test.json'),\n type: `${instance.type}`,\n props: mapProps ? mapProps(props) : props,\n children: childrenToDisplay,\n },\n // See: https://www.npmjs.com/package/pretty-format#usage-with-options\n {\n plugins: [plugins.ReactTestComponent, plugins.ReactElement],\n printFunctionName: false,\n printBasicPrototype: false,\n highlight: highlight,\n min: compact,\n },\n );\n}\n\nexport function formatElementList(instances: TestInstance[], options?: FormatElementOptions) {\n if (instances.length === 0) {\n return '(no elements)';\n }\n\n return instances.map((instance) => formatElement(instance, options)).join('\\n');\n}\n\nexport function formatJson(\n json: JsonNode | JsonNode[],\n { compact, highlight = true, mapProps = defaultMapProps }: FormatElementOptions = {},\n) {\n return prettyFormat(json, {\n plugins: [getElementJsonPlugin(mapProps), plugins.ReactElement],\n highlight: highlight,\n printBasicPrototype: false,\n min: compact,\n });\n}\n\nfunction getElementJsonPlugin(mapProps?: MapPropsFunction | null): NewPlugin {\n return {\n test: (val) => plugins.ReactTestComponent.test(val),\n serialize: (val, config, indentation, depth, refs, printer) => {\n let newVal = val;\n if (mapProps && val.props) {\n newVal = { ...val, props: mapProps(val.props) };\n }\n return plugins.ReactTestComponent.serialize(\n newVal,\n config,\n indentation,\n depth,\n refs,\n printer,\n );\n },\n };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { TestInstance } from 'test-renderer';
|
|
2
2
|
export declare const HOST_TEXT_NAMES: string[];
|
|
3
3
|
/**
|
|
4
4
|
* Checks if the given element is a host Text element.
|
|
5
|
-
* @param
|
|
5
|
+
* @param instance The instance to check.
|
|
6
6
|
*/
|
|
7
|
-
export declare function isHostText(
|
|
7
|
+
export declare function isHostText(instance: TestInstance | null): boolean;
|
|
8
8
|
/**
|
|
9
9
|
* Checks if the given element is a host TextInput element.
|
|
10
|
-
* @param
|
|
10
|
+
* @param instance The instance to check.
|
|
11
11
|
*/
|
|
12
|
-
export declare function isHostTextInput(
|
|
12
|
+
export declare function isHostTextInput(instance: TestInstance | null): boolean;
|
|
13
13
|
/**
|
|
14
14
|
* Checks if the given element is a host Image element.
|
|
15
|
-
* @param
|
|
15
|
+
* @param instance The instance to check.
|
|
16
16
|
*/
|
|
17
|
-
export declare function isHostImage(
|
|
17
|
+
export declare function isHostImage(instance: TestInstance | null): boolean;
|
|
18
18
|
/**
|
|
19
19
|
* Checks if the given element is a host Switch element.
|
|
20
|
-
* @param
|
|
20
|
+
* @param instance The instance to check.
|
|
21
21
|
*/
|
|
22
|
-
export declare function isHostSwitch(
|
|
22
|
+
export declare function isHostSwitch(instance: TestInstance | null): boolean;
|
|
23
23
|
/**
|
|
24
24
|
* Checks if the given element is a host ScrollView element.
|
|
25
|
-
* @param
|
|
25
|
+
* @param instance The instance to check.
|
|
26
26
|
*/
|
|
27
|
-
export declare function isHostScrollView(
|
|
27
|
+
export declare function isHostScrollView(instance: TestInstance | null): boolean;
|
|
28
28
|
/**
|
|
29
29
|
* Checks if the given element is a host Modal element.
|
|
30
|
-
* @param
|
|
30
|
+
* @param instance The instance to check.
|
|
31
31
|
*/
|
|
32
|
-
export declare function isHostModal(
|
|
32
|
+
export declare function isHostModal(instance: TestInstance | null): boolean;
|