@testing-library/react-native 12.1.3 → 12.2.1

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 (194) hide show
  1. package/.eslintcache +1 -1
  2. package/.eslintignore +1 -0
  3. package/build/fireEvent.js +2 -5
  4. package/build/fireEvent.js.map +1 -1
  5. package/build/helpers/component-tree.d.ts +11 -5
  6. package/build/helpers/component-tree.js +5 -1
  7. package/build/helpers/component-tree.js.map +1 -1
  8. package/build/helpers/deprecation.js +1 -1
  9. package/build/helpers/deprecation.js.map +1 -1
  10. package/build/helpers/findAll.d.ts +2 -1
  11. package/build/helpers/findAll.js +2 -1
  12. package/build/helpers/findAll.js.map +1 -1
  13. package/build/helpers/host-component-names.d.ts +12 -0
  14. package/build/helpers/host-component-names.js +18 -0
  15. package/build/helpers/host-component-names.js.map +1 -1
  16. package/build/helpers/matchers/matchLabelText.js +1 -1
  17. package/build/helpers/matchers/matchLabelText.js.map +1 -1
  18. package/build/pure.d.ts +2 -0
  19. package/build/pure.js +7 -0
  20. package/build/pure.js.map +1 -1
  21. package/build/queries/a11yState.js +1 -1
  22. package/build/queries/a11yState.js.map +1 -1
  23. package/build/queries/a11yValue.js +1 -1
  24. package/build/queries/a11yValue.js.map +1 -1
  25. package/build/queries/displayValue.js +5 -6
  26. package/build/queries/displayValue.js.map +1 -1
  27. package/build/queries/hintText.js +1 -1
  28. package/build/queries/hintText.js.map +1 -1
  29. package/build/queries/labelText.js +1 -1
  30. package/build/queries/labelText.js.map +1 -1
  31. package/build/queries/placeholderText.js +3 -4
  32. package/build/queries/placeholderText.js.map +1 -1
  33. package/build/queries/role.js +1 -1
  34. package/build/queries/role.js.map +1 -1
  35. package/build/queries/testId.js +3 -3
  36. package/build/queries/testId.js.map +1 -1
  37. package/build/queries/text.js +1 -2
  38. package/build/queries/text.js.map +1 -1
  39. package/build/render.js.map +1 -1
  40. package/build/user-event/clear.d.ts +3 -0
  41. package/build/user-event/clear.js +41 -0
  42. package/build/user-event/clear.js.map +1 -0
  43. package/build/user-event/event-builder/common.d.ts +48 -6
  44. package/build/user-event/event-builder/common.js +37 -20
  45. package/build/user-event/event-builder/common.js.map +1 -1
  46. package/build/user-event/event-builder/index.d.ts +94 -0
  47. package/build/user-event/event-builder/index.js +3 -1
  48. package/build/user-event/event-builder/index.js.map +1 -1
  49. package/build/user-event/event-builder/text-input.d.ts +91 -0
  50. package/build/user-event/event-builder/text-input.js +117 -0
  51. package/build/user-event/event-builder/text-input.js.map +1 -0
  52. package/build/user-event/index.d.ts +5 -2
  53. package/build/user-event/index.js +8 -1
  54. package/build/user-event/index.js.map +1 -1
  55. package/build/user-event/press/index.d.ts +1 -1
  56. package/build/user-event/press/index.js +6 -0
  57. package/build/user-event/press/index.js.map +1 -1
  58. package/build/user-event/press/press.d.ts +3 -3
  59. package/build/user-event/press/press.js +54 -64
  60. package/build/user-event/press/press.js.map +1 -1
  61. package/build/user-event/setup/setup.d.ts +45 -3
  62. package/build/user-event/setup/setup.js +17 -2
  63. package/build/user-event/setup/setup.js.map +1 -1
  64. package/build/user-event/type/index.d.ts +1 -1
  65. package/build/user-event/type/index.js +6 -0
  66. package/build/user-event/type/index.js.map +1 -1
  67. package/build/user-event/type/parseKeys.d.ts +1 -0
  68. package/build/user-event/type/parseKeys.js +40 -0
  69. package/build/user-event/type/parseKeys.js.map +1 -0
  70. package/build/user-event/type/type.d.ts +7 -2
  71. package/build/user-event/type/type.js +70 -8
  72. package/build/user-event/type/type.js.map +1 -1
  73. package/build/user-event/utils/content-size.d.ts +15 -0
  74. package/build/user-event/utils/content-size.js +26 -0
  75. package/build/user-event/utils/content-size.js.map +1 -0
  76. package/build/user-event/utils/{events.d.ts → dispatch-event.d.ts} +2 -2
  77. package/build/user-event/utils/dispatch-event.js +36 -0
  78. package/build/user-event/utils/dispatch-event.js.map +1 -0
  79. package/build/user-event/utils/host-components.d.ts +2 -0
  80. package/build/user-event/utils/host-components.js +11 -0
  81. package/build/user-event/utils/host-components.js.map +1 -0
  82. package/build/user-event/utils/index.d.ts +5 -1
  83. package/build/user-event/utils/index.js +48 -4
  84. package/build/user-event/utils/index.js.map +1 -1
  85. package/build/user-event/utils/text-range.d.ts +4 -0
  86. package/build/user-event/utils/text-range.js +2 -0
  87. package/build/user-event/utils/text-range.js.map +1 -0
  88. package/build/user-event/utils/warn-about-real-timers.d.ts +1 -0
  89. package/build/user-event/utils/warn-about-real-timers.js +20 -0
  90. package/build/user-event/utils/warn-about-real-timers.js.map +1 -0
  91. package/examples/basic/.expo/README.md +15 -0
  92. package/examples/basic/.expo/packager-info.json +4 -0
  93. package/examples/basic/.expo/settings.json +10 -0
  94. package/examples/basic/__tests__/App.test.tsx +30 -12
  95. package/examples/basic/package.json +7 -7
  96. package/examples/basic/yarn.lock +7499 -0
  97. package/examples/react-navigation/README.md +2 -0
  98. package/examples/react-navigation/package.json +5 -5
  99. package/examples/react-navigation/yarn.lock +5018 -0
  100. package/examples/redux/README.md +5 -0
  101. package/examples/redux/package.json +7 -7
  102. package/examples/redux/yarn.lock +4819 -0
  103. package/experiments-app/.expo/packager-info.json +2 -2
  104. package/experiments-app/package.json +7 -9
  105. package/experiments-app/src/MainScreen.tsx +1 -0
  106. package/experiments-app/src/experiments.ts +20 -2
  107. package/experiments-app/src/screens/FlatListEvents.tsx +57 -0
  108. package/experiments-app/src/screens/ScrollViewEvents.tsx +65 -0
  109. package/experiments-app/src/screens/SectionListEvents.tsx +91 -0
  110. package/experiments-app/src/screens/TextInputEventPropagation.tsx +5 -17
  111. package/experiments-app/src/screens/TextInputEvents.tsx +13 -15
  112. package/experiments-app/src/utils/helpers.ts +13 -3
  113. package/experiments-app/yarn.lock +901 -1105
  114. package/experiments-rtl/.babelrc +8 -0
  115. package/experiments-rtl/.eslintrc.json +3 -0
  116. package/experiments-rtl/.gitignore +35 -0
  117. package/experiments-rtl/README.md +34 -0
  118. package/experiments-rtl/jest-setup.js +1 -0
  119. package/experiments-rtl/jest.config.js +4 -0
  120. package/experiments-rtl/next.config.js +4 -0
  121. package/experiments-rtl/package.json +38 -0
  122. package/experiments-rtl/postcss.config.js +6 -0
  123. package/experiments-rtl/public/next.svg +1 -0
  124. package/experiments-rtl/public/vercel.svg +1 -0
  125. package/experiments-rtl/src/app/__tests__/click.test.tsx +31 -0
  126. package/experiments-rtl/src/app/__tests__/managed-text-input.test.tsx +51 -0
  127. package/experiments-rtl/src/app/globals.css +27 -0
  128. package/experiments-rtl/src/app/layout.tsx +22 -0
  129. package/experiments-rtl/src/app/page.tsx +113 -0
  130. package/experiments-rtl/tailwind.config.ts +20 -0
  131. package/experiments-rtl/tsconfig.json +28 -0
  132. package/experiments-rtl/yarn.lock +5418 -0
  133. package/package.json +4 -2
  134. package/src/__tests__/act.test.tsx +4 -0
  135. package/src/fireEvent.ts +1 -5
  136. package/src/helpers/component-tree.ts +14 -9
  137. package/src/helpers/deprecation.ts +1 -1
  138. package/src/helpers/findAll.ts +6 -4
  139. package/src/helpers/host-component-names.tsx +21 -0
  140. package/src/helpers/matchers/matchLabelText.ts +0 -1
  141. package/src/pure.ts +2 -0
  142. package/src/queries/a11yState.ts +2 -6
  143. package/src/queries/a11yValue.ts +2 -6
  144. package/src/queries/displayValue.ts +7 -14
  145. package/src/queries/hintText.ts +2 -7
  146. package/src/queries/labelText.ts +1 -3
  147. package/src/queries/placeholderText.ts +6 -13
  148. package/src/queries/role.ts +1 -2
  149. package/src/queries/testId.ts +5 -10
  150. package/src/queries/text.ts +3 -6
  151. package/src/render.tsx +1 -1
  152. package/src/user-event/__tests__/__snapshots__/clear.test.tsx.snap +269 -0
  153. package/src/user-event/__tests__/clear.test.tsx +217 -0
  154. package/src/user-event/clear.ts +59 -0
  155. package/src/user-event/event-builder/common.ts +35 -19
  156. package/src/user-event/event-builder/index.ts +2 -0
  157. package/src/user-event/event-builder/text-input.ts +86 -0
  158. package/src/user-event/index.ts +7 -3
  159. package/src/user-event/press/__tests__/longPress.real-timers.test.tsx +4 -2
  160. package/src/user-event/press/__tests__/press.real-timers.test.tsx +4 -2
  161. package/src/user-event/press/__tests__/press.test.tsx +40 -5
  162. package/src/user-event/press/index.ts +1 -1
  163. package/src/user-event/press/press.ts +93 -64
  164. package/src/user-event/setup/setup.ts +54 -5
  165. package/src/user-event/type/__tests__/__snapshots__/type-managed.test.tsx.snap +339 -0
  166. package/src/user-event/type/__tests__/__snapshots__/type.test.tsx.snap +644 -2
  167. package/src/user-event/type/__tests__/parseKeys.test.ts +23 -0
  168. package/src/user-event/type/__tests__/type-managed.test.tsx +120 -0
  169. package/src/user-event/type/__tests__/type.test.tsx +299 -27
  170. package/src/user-event/type/index.ts +1 -1
  171. package/src/user-event/type/parseKeys.ts +41 -0
  172. package/src/user-event/type/type.ts +128 -10
  173. package/src/user-event/utils/__tests__/dispatch-event.test.tsx +41 -0
  174. package/src/user-event/utils/__tests__/wait.test.ts +0 -1
  175. package/src/user-event/utils/content-size.ts +25 -0
  176. package/src/user-event/utils/dispatch-event.ts +38 -0
  177. package/src/user-event/utils/host-components.ts +6 -0
  178. package/src/user-event/utils/index.ts +5 -1
  179. package/src/user-event/utils/text-range.ts +4 -0
  180. package/src/user-event/{press/utils/warnAboutRealTimers.ts → utils/warn-about-real-timers.ts} +8 -1
  181. package/website/docs/API.md +19 -25
  182. package/website/docs/Queries.md +64 -59
  183. package/website/docs/UserEvent.md +134 -9
  184. package/website/sidebars.js +1 -1
  185. package/build/helpers/filterNodeByType.d.ts +0 -3
  186. package/build/helpers/filterNodeByType.js +0 -9
  187. package/build/helpers/filterNodeByType.js.map +0 -1
  188. package/build/user-event/press/utils/warnAboutRealTimers.d.ts +0 -1
  189. package/build/user-event/press/utils/warnAboutRealTimers.js +0 -14
  190. package/build/user-event/press/utils/warnAboutRealTimers.js.map +0 -1
  191. package/build/user-event/utils/events.js +0 -44
  192. package/build/user-event/utils/events.js.map +0 -1
  193. package/src/helpers/filterNodeByType.ts +0 -7
  194. package/src/user-event/utils/events.ts +0 -54
@@ -0,0 +1,91 @@
1
+ import { ContentSize } from '../utils/content-size';
2
+ import { TextRange } from '../utils/text-range';
3
+ export declare const TextInputEventBuilder: {
4
+ /**
5
+ * Experimental values:
6
+ * - iOS: `{"eventCount": 4, "target": 75, "text": "Test"}`
7
+ * - Android: `{"eventCount": 6, "target": 53, "text": "Tes"}`
8
+ */
9
+ change: (text: string) => {
10
+ nativeEvent: {
11
+ text: string;
12
+ target: number;
13
+ eventCount: number;
14
+ };
15
+ };
16
+ /**
17
+ * Experimental values:
18
+ * - iOS: `{"eventCount": 3, "key": "a", "target": 75}`
19
+ * - Android: `{"key": "a"}`
20
+ */
21
+ keyPress: (key: string) => {
22
+ nativeEvent: {
23
+ key: string;
24
+ };
25
+ };
26
+ /**
27
+ * Experimental values:
28
+ * - iOS: `{"eventCount": 4, "target": 75, "text": "Test"}`
29
+ * - Android: `{"target": 53, "text": "Test"}`
30
+ */
31
+ submitEditing: (text: string) => {
32
+ nativeEvent: {
33
+ text: string;
34
+ target: number;
35
+ };
36
+ };
37
+ /**
38
+ * Experimental values:
39
+ * - iOS: `{"eventCount": 4, "target": 75, "text": "Test"}`
40
+ * - Android: `{"target": 53, "text": "Test"}`
41
+ */
42
+ endEditing: (text: string) => {
43
+ nativeEvent: {
44
+ text: string;
45
+ target: number;
46
+ };
47
+ };
48
+ /**
49
+ * Experimental values:
50
+ * - iOS: `{"selection": {"end": 4, "start": 4}, "target": 75}`
51
+ * - Android: `{"selection": {"end": 4, "start": 4}}`
52
+ */
53
+ selectionChange: ({ start, end }: TextRange) => {
54
+ nativeEvent: {
55
+ selection: {
56
+ start: number;
57
+ end: number;
58
+ };
59
+ };
60
+ };
61
+ /**
62
+ * Experimental values:
63
+ * - iOS: `{"eventCount": 2, "previousText": "Te", "range": {"end": 2, "start": 2}, "target": 75, "text": "s"}`
64
+ * - Android: `{"previousText": "Te", "range": {"end": 2, "start": 0}, "target": 53, "text": "Tes"}`
65
+ */
66
+ textInput: (text: string, previousText: string) => {
67
+ nativeEvent: {
68
+ text: string;
69
+ previousText: string;
70
+ range: {
71
+ start: number;
72
+ end: number;
73
+ };
74
+ target: number;
75
+ };
76
+ };
77
+ /**
78
+ * Experimental values:
79
+ * - iOS: `{"contentSize": {"height": 21.666666666666668, "width": 11.666666666666666}, "target": 75}`
80
+ * - Android: `{"contentSize": {"height": 61.45454406738281, "width": 352.7272644042969}, "target": 53}`
81
+ */
82
+ contentSizeChange: ({ width, height }: ContentSize) => {
83
+ nativeEvent: {
84
+ contentSize: {
85
+ width: number;
86
+ height: number;
87
+ };
88
+ target: number;
89
+ };
90
+ };
91
+ };
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.TextInputEventBuilder = void 0;
7
+ const TextInputEventBuilder = {
8
+ /**
9
+ * Experimental values:
10
+ * - iOS: `{"eventCount": 4, "target": 75, "text": "Test"}`
11
+ * - Android: `{"eventCount": 6, "target": 53, "text": "Tes"}`
12
+ */
13
+ change: text => {
14
+ return {
15
+ nativeEvent: {
16
+ text,
17
+ target: 0,
18
+ eventCount: 0
19
+ }
20
+ };
21
+ },
22
+ /**
23
+ * Experimental values:
24
+ * - iOS: `{"eventCount": 3, "key": "a", "target": 75}`
25
+ * - Android: `{"key": "a"}`
26
+ */
27
+ keyPress: key => {
28
+ return {
29
+ nativeEvent: {
30
+ key
31
+ }
32
+ };
33
+ },
34
+ /**
35
+ * Experimental values:
36
+ * - iOS: `{"eventCount": 4, "target": 75, "text": "Test"}`
37
+ * - Android: `{"target": 53, "text": "Test"}`
38
+ */
39
+ submitEditing: text => {
40
+ return {
41
+ nativeEvent: {
42
+ text,
43
+ target: 0
44
+ }
45
+ };
46
+ },
47
+ /**
48
+ * Experimental values:
49
+ * - iOS: `{"eventCount": 4, "target": 75, "text": "Test"}`
50
+ * - Android: `{"target": 53, "text": "Test"}`
51
+ */
52
+ endEditing: text => {
53
+ return {
54
+ nativeEvent: {
55
+ text,
56
+ target: 0
57
+ }
58
+ };
59
+ },
60
+ /**
61
+ * Experimental values:
62
+ * - iOS: `{"selection": {"end": 4, "start": 4}, "target": 75}`
63
+ * - Android: `{"selection": {"end": 4, "start": 4}}`
64
+ */
65
+ selectionChange: ({
66
+ start,
67
+ end
68
+ }) => {
69
+ return {
70
+ nativeEvent: {
71
+ selection: {
72
+ start,
73
+ end
74
+ }
75
+ }
76
+ };
77
+ },
78
+ /**
79
+ * Experimental values:
80
+ * - iOS: `{"eventCount": 2, "previousText": "Te", "range": {"end": 2, "start": 2}, "target": 75, "text": "s"}`
81
+ * - Android: `{"previousText": "Te", "range": {"end": 2, "start": 0}, "target": 53, "text": "Tes"}`
82
+ */
83
+ textInput: (text, previousText) => {
84
+ return {
85
+ nativeEvent: {
86
+ text,
87
+ previousText,
88
+ range: {
89
+ start: text.length,
90
+ end: text.length
91
+ },
92
+ target: 0
93
+ }
94
+ };
95
+ },
96
+ /**
97
+ * Experimental values:
98
+ * - iOS: `{"contentSize": {"height": 21.666666666666668, "width": 11.666666666666666}, "target": 75}`
99
+ * - Android: `{"contentSize": {"height": 61.45454406738281, "width": 352.7272644042969}, "target": 53}`
100
+ */
101
+ contentSizeChange: ({
102
+ width,
103
+ height
104
+ }) => {
105
+ return {
106
+ nativeEvent: {
107
+ contentSize: {
108
+ width,
109
+ height
110
+ },
111
+ target: 0
112
+ }
113
+ };
114
+ }
115
+ };
116
+ exports.TextInputEventBuilder = TextInputEventBuilder;
117
+ //# sourceMappingURL=text-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-input.js","names":["TextInputEventBuilder","change","text","nativeEvent","target","eventCount","keyPress","key","submitEditing","endEditing","selectionChange","start","end","selection","textInput","previousText","range","length","contentSizeChange","width","height","contentSize","exports"],"sources":["../../../src/user-event/event-builder/text-input.ts"],"sourcesContent":["import { ContentSize } from '../utils/content-size';\nimport { TextRange } from '../utils/text-range';\n\nexport const TextInputEventBuilder = {\n /**\n * Experimental values:\n * - iOS: `{\"eventCount\": 4, \"target\": 75, \"text\": \"Test\"}`\n * - Android: `{\"eventCount\": 6, \"target\": 53, \"text\": \"Tes\"}`\n */\n change: (text: string) => {\n return {\n nativeEvent: { text, target: 0, eventCount: 0 },\n };\n },\n\n /**\n * Experimental values:\n * - iOS: `{\"eventCount\": 3, \"key\": \"a\", \"target\": 75}`\n * - Android: `{\"key\": \"a\"}`\n */\n keyPress: (key: string) => {\n return {\n nativeEvent: { key },\n };\n },\n\n /**\n * Experimental values:\n * - iOS: `{\"eventCount\": 4, \"target\": 75, \"text\": \"Test\"}`\n * - Android: `{\"target\": 53, \"text\": \"Test\"}`\n */\n submitEditing: (text: string) => {\n return {\n nativeEvent: { text, target: 0 },\n };\n },\n\n /**\n * Experimental values:\n * - iOS: `{\"eventCount\": 4, \"target\": 75, \"text\": \"Test\"}`\n * - Android: `{\"target\": 53, \"text\": \"Test\"}`\n */\n endEditing: (text: string) => {\n return {\n nativeEvent: { text, target: 0 },\n };\n },\n\n /**\n * Experimental values:\n * - iOS: `{\"selection\": {\"end\": 4, \"start\": 4}, \"target\": 75}`\n * - Android: `{\"selection\": {\"end\": 4, \"start\": 4}}`\n */\n selectionChange: ({ start, end }: TextRange) => {\n return {\n nativeEvent: { selection: { start, end } },\n };\n },\n\n /**\n * Experimental values:\n * - iOS: `{\"eventCount\": 2, \"previousText\": \"Te\", \"range\": {\"end\": 2, \"start\": 2}, \"target\": 75, \"text\": \"s\"}`\n * - Android: `{\"previousText\": \"Te\", \"range\": {\"end\": 2, \"start\": 0}, \"target\": 53, \"text\": \"Tes\"}`\n */\n textInput: (text: string, previousText: string) => {\n return {\n nativeEvent: {\n text,\n previousText,\n range: { start: text.length, end: text.length },\n target: 0,\n },\n };\n },\n\n /**\n * Experimental values:\n * - iOS: `{\"contentSize\": {\"height\": 21.666666666666668, \"width\": 11.666666666666666}, \"target\": 75}`\n * - Android: `{\"contentSize\": {\"height\": 61.45454406738281, \"width\": 352.7272644042969}, \"target\": 53}`\n */\n contentSizeChange: ({ width, height }: ContentSize) => {\n return {\n nativeEvent: { contentSize: { width, height }, target: 0 },\n };\n },\n};\n"],"mappings":";;;;;;AAGO,MAAMA,qBAAqB,GAAG;EACnC;AACF;AACA;AACA;AACA;EACEC,MAAM,EAAGC,IAAY,IAAK;IACxB,OAAO;MACLC,WAAW,EAAE;QAAED,IAAI;QAAEE,MAAM,EAAE,CAAC;QAAEC,UAAU,EAAE;MAAE;IAChD,CAAC;EACH,CAAC;EAED;AACF;AACA;AACA;AACA;EACEC,QAAQ,EAAGC,GAAW,IAAK;IACzB,OAAO;MACLJ,WAAW,EAAE;QAAEI;MAAI;IACrB,CAAC;EACH,CAAC;EAED;AACF;AACA;AACA;AACA;EACEC,aAAa,EAAGN,IAAY,IAAK;IAC/B,OAAO;MACLC,WAAW,EAAE;QAAED,IAAI;QAAEE,MAAM,EAAE;MAAE;IACjC,CAAC;EACH,CAAC;EAED;AACF;AACA;AACA;AACA;EACEK,UAAU,EAAGP,IAAY,IAAK;IAC5B,OAAO;MACLC,WAAW,EAAE;QAAED,IAAI;QAAEE,MAAM,EAAE;MAAE;IACjC,CAAC;EACH,CAAC;EAED;AACF;AACA;AACA;AACA;EACEM,eAAe,EAAEA,CAAC;IAAEC,KAAK;IAAEC;EAAe,CAAC,KAAK;IAC9C,OAAO;MACLT,WAAW,EAAE;QAAEU,SAAS,EAAE;UAAEF,KAAK;UAAEC;QAAI;MAAE;IAC3C,CAAC;EACH,CAAC;EAED;AACF;AACA;AACA;AACA;EACEE,SAAS,EAAEA,CAACZ,IAAY,EAAEa,YAAoB,KAAK;IACjD,OAAO;MACLZ,WAAW,EAAE;QACXD,IAAI;QACJa,YAAY;QACZC,KAAK,EAAE;UAAEL,KAAK,EAAET,IAAI,CAACe,MAAM;UAAEL,GAAG,EAAEV,IAAI,CAACe;QAAO,CAAC;QAC/Cb,MAAM,EAAE;MACV;IACF,CAAC;EACH,CAAC;EAED;AACF;AACA;AACA;AACA;EACEc,iBAAiB,EAAEA,CAAC;IAAEC,KAAK;IAAEC;EAAoB,CAAC,KAAK;IACrD,OAAO;MACLjB,WAAW,EAAE;QAAEkB,WAAW,EAAE;UAAEF,KAAK;UAAEC;QAAO,CAAC;QAAEhB,MAAM,EAAE;MAAE;IAC3D,CAAC;EACH;AACF,CAAC;AAACkB,OAAA,CAAAtB,qBAAA,GAAAA,qBAAA"}
@@ -1,9 +1,12 @@
1
1
  import { ReactTestInstance } from 'react-test-renderer';
2
2
  import { setup } from './setup';
3
- import { PressOptions } from './press/press';
3
+ import { PressOptions } from './press';
4
+ import { TypeOptions } from './type';
5
+ export { UserEventConfig } from './setup';
4
6
  export declare const userEvent: {
5
7
  setup: typeof setup;
6
8
  press: (element: ReactTestInstance) => Promise<void>;
7
9
  longPress: (element: ReactTestInstance, options?: PressOptions) => Promise<void>;
8
- type: (element: ReactTestInstance, text: string) => Promise<void>;
10
+ type: (element: ReactTestInstance, text: string, options?: TypeOptions) => Promise<void>;
11
+ clear: (element: ReactTestInstance) => Promise<void>;
9
12
  };
@@ -3,6 +3,12 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ Object.defineProperty(exports, "UserEventConfig", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _setup.UserEventConfig;
10
+ }
11
+ });
6
12
  exports.userEvent = void 0;
7
13
  var _setup = require("./setup");
8
14
  const userEvent = {
@@ -10,7 +16,8 @@ const userEvent = {
10
16
  // Direct access for User Event v13 compatibility
11
17
  press: element => (0, _setup.setup)().press(element),
12
18
  longPress: (element, options) => (0, _setup.setup)().longPress(element, options),
13
- type: (element, text) => (0, _setup.setup)().type(element, text)
19
+ type: (element, text, options) => (0, _setup.setup)().type(element, text, options),
20
+ clear: element => (0, _setup.setup)().clear(element)
14
21
  };
15
22
  exports.userEvent = userEvent;
16
23
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_setup","require","userEvent","setup","press","element","longPress","options","type","text","exports"],"sources":["../../src/user-event/index.ts"],"sourcesContent":["import { ReactTestInstance } from 'react-test-renderer';\nimport { setup } from './setup';\nimport { PressOptions } from './press/press';\n\nexport const userEvent = {\n setup,\n\n // Direct access for User Event v13 compatibility\n press: (element: ReactTestInstance) => setup().press(element),\n longPress: (element: ReactTestInstance, options?: PressOptions) =>\n setup().longPress(element, options),\n type: (element: ReactTestInstance, text: string) =>\n setup().type(element, text),\n};\n"],"mappings":";;;;;;AACA,IAAAA,MAAA,GAAAC,OAAA;AAGO,MAAMC,SAAS,GAAG;EACvBC,KAAK,EAALA,YAAK;EAEL;EACAC,KAAK,EAAGC,OAA0B,IAAK,IAAAF,YAAK,EAAC,CAAC,CAACC,KAAK,CAACC,OAAO,CAAC;EAC7DC,SAAS,EAAEA,CAACD,OAA0B,EAAEE,OAAsB,KAC5D,IAAAJ,YAAK,EAAC,CAAC,CAACG,SAAS,CAACD,OAAO,EAAEE,OAAO,CAAC;EACrCC,IAAI,EAAEA,CAACH,OAA0B,EAAEI,IAAY,KAC7C,IAAAN,YAAK,EAAC,CAAC,CAACK,IAAI,CAACH,OAAO,EAAEI,IAAI;AAC9B,CAAC;AAACC,OAAA,CAAAR,SAAA,GAAAA,SAAA"}
1
+ {"version":3,"file":"index.js","names":["_setup","require","userEvent","setup","press","element","longPress","options","type","text","clear","exports"],"sources":["../../src/user-event/index.ts"],"sourcesContent":["import { ReactTestInstance } from 'react-test-renderer';\nimport { setup } from './setup';\nimport { PressOptions } from './press';\nimport { TypeOptions } from './type';\n\nexport { UserEventConfig } from './setup';\n\nexport const userEvent = {\n setup,\n\n // Direct access for User Event v13 compatibility\n press: (element: ReactTestInstance) => setup().press(element),\n longPress: (element: ReactTestInstance, options?: PressOptions) =>\n setup().longPress(element, options),\n type: (element: ReactTestInstance, text: string, options?: TypeOptions) =>\n setup().type(element, text, options),\n clear: (element: ReactTestInstance) => setup().clear(element),\n};\n"],"mappings":";;;;;;;;;;;;AACA,IAAAA,MAAA,GAAAC,OAAA;AAMO,MAAMC,SAAS,GAAG;EACvBC,KAAK,EAALA,YAAK;EAEL;EACAC,KAAK,EAAGC,OAA0B,IAAK,IAAAF,YAAK,EAAC,CAAC,CAACC,KAAK,CAACC,OAAO,CAAC;EAC7DC,SAAS,EAAEA,CAACD,OAA0B,EAAEE,OAAsB,KAC5D,IAAAJ,YAAK,EAAC,CAAC,CAACG,SAAS,CAACD,OAAO,EAAEE,OAAO,CAAC;EACrCC,IAAI,EAAEA,CAACH,OAA0B,EAAEI,IAAY,EAAEF,OAAqB,KACpE,IAAAJ,YAAK,EAAC,CAAC,CAACK,IAAI,CAACH,OAAO,EAAEI,IAAI,EAAEF,OAAO,CAAC;EACtCG,KAAK,EAAGL,OAA0B,IAAK,IAAAF,YAAK,EAAC,CAAC,CAACO,KAAK,CAACL,OAAO;AAC9D,CAAC;AAACM,OAAA,CAAAT,SAAA,GAAAA,SAAA"}
@@ -1 +1 @@
1
- export { press, longPress } from './press';
1
+ export { PressOptions, press, longPress } from './press';
@@ -3,6 +3,12 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ Object.defineProperty(exports, "PressOptions", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _press.PressOptions;
10
+ }
11
+ });
6
12
  Object.defineProperty(exports, "longPress", {
7
13
  enumerable: true,
8
14
  get: function () {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_press","require"],"sources":["../../../src/user-event/press/index.ts"],"sourcesContent":["export { press, longPress } from './press';\n"],"mappings":";;;;;;;;;;;;;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA"}
1
+ {"version":3,"file":"index.js","names":["_press","require"],"sources":["../../../src/user-event/press/index.ts"],"sourcesContent":["export { PressOptions, press, longPress } from './press';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA"}
@@ -1,7 +1,7 @@
1
1
  import { ReactTestInstance } from 'react-test-renderer';
2
2
  import { UserEventInstance } from '../setup';
3
- export type PressOptions = {
4
- duration: number;
5
- };
3
+ export interface PressOptions {
4
+ duration?: number;
5
+ }
6
6
  export declare function press(this: UserEventInstance, element: ReactTestInstance): Promise<void>;
7
7
  export declare function longPress(this: UserEventInstance, element: ReactTestInstance, options?: PressOptions): Promise<void>;
@@ -5,37 +5,37 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.longPress = longPress;
7
7
  exports.press = press;
8
- var _eventBuilder = require("../event-builder");
9
- var _utils = require("../utils");
10
8
  var _act = _interopRequireDefault(require("../../act"));
11
9
  var _componentTree = require("../../helpers/component-tree");
12
- var _filterNodeByType = require("../../helpers/filterNodeByType");
13
10
  var _pointerEvents = require("../../helpers/pointer-events");
14
11
  var _hostComponentNames = require("../../helpers/host-component-names");
15
- var _timers = require("../../helpers/timers");
12
+ var _eventBuilder = require("../event-builder");
13
+ var _utils = require("../utils");
16
14
  var _constants = require("./constants");
17
- var _warnAboutRealTimers = require("./utils/warnAboutRealTimers");
18
15
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
16
  async function press(element) {
20
- await basePress(this.config, element);
17
+ await basePress(this.config, element, {
18
+ type: 'press',
19
+ duration: 0
20
+ });
21
21
  }
22
- async function longPress(element, options = {
23
- duration: 500
24
- }) {
25
- await basePress(this.config, element, options);
22
+ async function longPress(element, options) {
23
+ await basePress(this.config, element, {
24
+ type: 'longPress',
25
+ duration: options?.duration ?? 500
26
+ });
26
27
  }
27
- const basePress = async (config, element, options = {
28
- duration: 0
29
- }) => {
30
- // Text and TextInput components are mocked in React Native preset so the mock
31
- // doesn't implement the pressability class
32
- // Thus we need to call the props directly on the host component
33
- if (isEnabledHostText(element) || isEnabledTextInput(element)) {
34
- await triggerMockPressEvent(config, element, options);
28
+ const basePress = async (config, element, options) => {
29
+ if (isPressableText(element)) {
30
+ await emitTextPressEvents(config, element, options);
31
+ return;
32
+ }
33
+ if ((0, _utils.isEditableTextInput)(element) && (0, _pointerEvents.isPointerEventEnabled)(element)) {
34
+ await emitTextInputPressEvents(config, element, options);
35
35
  return;
36
36
  }
37
37
  if (isEnabledTouchResponder(element)) {
38
- await triggerPressEvent(config, element, options);
38
+ await emitPressablePressEvents(config, element, options);
39
39
  return;
40
40
  }
41
41
  const hostParentElement = (0, _componentTree.getHostParent)(element);
@@ -44,28 +44,17 @@ const basePress = async (config, element, options = {
44
44
  }
45
45
  await basePress(config, hostParentElement, options);
46
46
  };
47
- const triggerPressEvent = async (config, element, options = {
48
- duration: 0
49
- }) => {
50
- const areFakeTimersEnabled = (0, _timers.jestFakeTimersAreEnabled)();
51
- if (!areFakeTimersEnabled) {
52
- (0, _warnAboutRealTimers.warnAboutRealTimers)();
53
- }
47
+ const emitPressablePressEvents = async (config, element, options) => {
48
+ (0, _utils.warnAboutRealTimersIfNeeded)();
54
49
  await (0, _utils.wait)(config);
55
50
  await (0, _act.default)(async () => {
56
- element.props.onResponderGrant({
57
- ..._eventBuilder.EventBuilder.Common.touch(),
58
- dispatchConfig: {
59
- registrationName: 'onResponderGrant'
60
- }
61
- });
51
+ (0, _utils.dispatchEvent)(element, 'responderGrant', _eventBuilder.EventBuilder.Common.responderGrant());
62
52
  await (0, _utils.wait)(config, options.duration);
63
- element.props.onResponderRelease({
64
- ..._eventBuilder.EventBuilder.Common.touch(),
65
- dispatchConfig: {
66
- registrationName: 'onResponderRelease'
67
- }
68
- });
53
+ (0, _utils.dispatchEvent)(element, 'responderRelease', _eventBuilder.EventBuilder.Common.responderRelease());
54
+
55
+ // React Native will wait for minimal delay of DEFAULT_MIN_PRESS_DURATION
56
+ // before emitting the `pressOut` event. We need to wait here, so that
57
+ // `press()` function does not return before that.
69
58
  if (_constants.DEFAULT_MIN_PRESS_DURATION - options.duration > 0) {
70
59
  await (0, _utils.wait)(config, _constants.DEFAULT_MIN_PRESS_DURATION - options.duration);
71
60
  }
@@ -74,33 +63,34 @@ const triggerPressEvent = async (config, element, options = {
74
63
  const isEnabledTouchResponder = element => {
75
64
  return (0, _pointerEvents.isPointerEventEnabled)(element) && element.props.onStartShouldSetResponder?.();
76
65
  };
77
- const isEnabledHostText = element => {
78
- return (0, _filterNodeByType.filterNodeByType)(element, (0, _hostComponentNames.getHostComponentNames)().text) && (0, _pointerEvents.isPointerEventEnabled)(element) && !element.props.disabled && element.props.onPress;
79
- };
80
- const isEnabledTextInput = element => {
81
- return (0, _filterNodeByType.filterNodeByType)(element, (0, _hostComponentNames.getHostComponentNames)().textInput) && (0, _pointerEvents.isPointerEventEnabled)(element) && element.props.editable !== false;
66
+ const isPressableText = element => {
67
+ const hasPressEventHandler = Boolean(element.props.onPress || element.props.onLongPress || element.props.onPressIn || element.props.onPressOut);
68
+ return (0, _hostComponentNames.isHostText)(element) && (0, _pointerEvents.isPointerEventEnabled)(element) && !element.props.disabled && hasPressEventHandler;
82
69
  };
83
- const triggerMockPressEvent = async (config, element, options = {
84
- duration: 0
85
- }) => {
86
- const {
87
- onPressIn,
88
- onPress,
89
- onPressOut
90
- } = element.props;
70
+
71
+ /**
72
+ * Dispatches a press event sequence for Text.
73
+ */
74
+ async function emitTextPressEvents(config, element, options) {
91
75
  await (0, _utils.wait)(config);
92
- if (onPressIn) {
93
- onPressIn(_eventBuilder.EventBuilder.Common.touch());
94
- }
95
- if (onPress) {
96
- onPress(_eventBuilder.EventBuilder.Common.touch());
97
- }
76
+ (0, _utils.dispatchEvent)(element, 'pressIn', _eventBuilder.EventBuilder.Common.touch());
77
+
78
+ // Emit either `press` or `longPress`.
79
+ (0, _utils.dispatchEvent)(element, options.type, _eventBuilder.EventBuilder.Common.touch());
98
80
  await (0, _utils.wait)(config, options.duration);
99
- if (onPressOut) {
100
- if (_constants.DEFAULT_MIN_PRESS_DURATION - options.duration > 0) {
101
- await (0, _utils.wait)(config, _constants.DEFAULT_MIN_PRESS_DURATION - options.duration);
102
- }
103
- onPressOut(_eventBuilder.EventBuilder.Common.touch());
104
- }
105
- };
81
+ (0, _utils.dispatchEvent)(element, 'pressOut', _eventBuilder.EventBuilder.Common.touch());
82
+ }
83
+
84
+ /**
85
+ * Dispatches a press event sequence for TextInput.
86
+ */
87
+ async function emitTextInputPressEvents(config, element, options) {
88
+ await (0, _utils.wait)(config);
89
+ (0, _utils.dispatchEvent)(element, 'pressIn', _eventBuilder.EventBuilder.Common.touch());
90
+
91
+ // Note: TextInput does not have `onPress`/`onLongPress` props.
92
+
93
+ await (0, _utils.wait)(config, options.duration);
94
+ (0, _utils.dispatchEvent)(element, 'pressOut', _eventBuilder.EventBuilder.Common.touch());
95
+ }
106
96
  //# sourceMappingURL=press.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"press.js","names":["_eventBuilder","require","_utils","_act","_interopRequireDefault","_componentTree","_filterNodeByType","_pointerEvents","_hostComponentNames","_timers","_constants","_warnAboutRealTimers","obj","__esModule","default","press","element","basePress","config","longPress","options","duration","isEnabledHostText","isEnabledTextInput","triggerMockPressEvent","isEnabledTouchResponder","triggerPressEvent","hostParentElement","getHostParent","areFakeTimersEnabled","jestFakeTimersAreEnabled","warnAboutRealTimers","wait","act","props","onResponderGrant","EventBuilder","Common","touch","dispatchConfig","registrationName","onResponderRelease","DEFAULT_MIN_PRESS_DURATION","isPointerEventEnabled","onStartShouldSetResponder","filterNodeByType","getHostComponentNames","text","disabled","onPress","textInput","editable","onPressIn","onPressOut"],"sources":["../../../src/user-event/press/press.ts"],"sourcesContent":["import { ReactTestInstance } from 'react-test-renderer';\nimport { EventBuilder } from '../event-builder';\nimport { UserEventInstance } from '../setup';\nimport { wait } from '../utils';\nimport act from '../../act';\nimport { getHostParent } from '../../helpers/component-tree';\nimport { filterNodeByType } from '../../helpers/filterNodeByType';\nimport { isPointerEventEnabled } from '../../helpers/pointer-events';\nimport { getHostComponentNames } from '../../helpers/host-component-names';\nimport { jestFakeTimersAreEnabled } from '../../helpers/timers';\nimport { DEFAULT_MIN_PRESS_DURATION } from './constants';\nimport { warnAboutRealTimers } from './utils/warnAboutRealTimers';\n\nexport type PressOptions = {\n duration: number;\n};\n\nexport async function press(\n this: UserEventInstance,\n element: ReactTestInstance\n): Promise<void> {\n await basePress(this.config, element);\n}\n\nexport async function longPress(\n this: UserEventInstance,\n element: ReactTestInstance,\n options: PressOptions = { duration: 500 }\n): Promise<void> {\n await basePress(this.config, element, options);\n}\n\nconst basePress = async (\n config: UserEventInstance['config'],\n element: ReactTestInstance,\n options: PressOptions = { duration: 0 }\n): Promise<void> => {\n // Text and TextInput components are mocked in React Native preset so the mock\n // doesn't implement the pressability class\n // Thus we need to call the props directly on the host component\n if (isEnabledHostText(element) || isEnabledTextInput(element)) {\n await triggerMockPressEvent(config, element, options);\n return;\n }\n\n if (isEnabledTouchResponder(element)) {\n await triggerPressEvent(config, element, options);\n return;\n }\n\n const hostParentElement = getHostParent(element);\n if (!hostParentElement) {\n return;\n }\n\n await basePress(config, hostParentElement, options);\n};\n\nconst triggerPressEvent = async (\n config: UserEventInstance['config'],\n element: ReactTestInstance,\n options: PressOptions = { duration: 0 }\n) => {\n const areFakeTimersEnabled = jestFakeTimersAreEnabled();\n if (!areFakeTimersEnabled) {\n warnAboutRealTimers();\n }\n\n await wait(config);\n\n await act(async () => {\n element.props.onResponderGrant({\n ...EventBuilder.Common.touch(),\n dispatchConfig: { registrationName: 'onResponderGrant' },\n });\n\n await wait(config, options.duration);\n\n element.props.onResponderRelease({\n ...EventBuilder.Common.touch(),\n dispatchConfig: { registrationName: 'onResponderRelease' },\n });\n\n if (DEFAULT_MIN_PRESS_DURATION - options.duration > 0) {\n await wait(config, DEFAULT_MIN_PRESS_DURATION - options.duration);\n }\n });\n};\n\nconst isEnabledTouchResponder = (element: ReactTestInstance) => {\n return (\n isPointerEventEnabled(element) &&\n element.props.onStartShouldSetResponder?.()\n );\n};\n\nconst isEnabledHostText = (element: ReactTestInstance) => {\n return (\n filterNodeByType(element, getHostComponentNames().text) &&\n isPointerEventEnabled(element) &&\n !element.props.disabled &&\n element.props.onPress\n );\n};\n\nconst isEnabledTextInput = (element: ReactTestInstance) => {\n return (\n filterNodeByType(element, getHostComponentNames().textInput) &&\n isPointerEventEnabled(element) &&\n element.props.editable !== false\n );\n};\n\nconst triggerMockPressEvent = async (\n config: UserEventInstance['config'],\n element: ReactTestInstance,\n options: PressOptions = { duration: 0 }\n) => {\n const { onPressIn, onPress, onPressOut } = element.props;\n await wait(config);\n if (onPressIn) {\n onPressIn(EventBuilder.Common.touch());\n }\n if (onPress) {\n onPress(EventBuilder.Common.touch());\n }\n await wait(config, options.duration);\n if (onPressOut) {\n if (DEFAULT_MIN_PRESS_DURATION - options.duration > 0) {\n await wait(config, DEFAULT_MIN_PRESS_DURATION - options.duration);\n }\n onPressOut(EventBuilder.Common.touch());\n }\n};\n"],"mappings":";;;;;;;AACA,IAAAA,aAAA,GAAAC,OAAA;AAEA,IAAAC,MAAA,GAAAD,OAAA;AACA,IAAAE,IAAA,GAAAC,sBAAA,CAAAH,OAAA;AACA,IAAAI,cAAA,GAAAJ,OAAA;AACA,IAAAK,iBAAA,GAAAL,OAAA;AACA,IAAAM,cAAA,GAAAN,OAAA;AACA,IAAAO,mBAAA,GAAAP,OAAA;AACA,IAAAQ,OAAA,GAAAR,OAAA;AACA,IAAAS,UAAA,GAAAT,OAAA;AACA,IAAAU,oBAAA,GAAAV,OAAA;AAAkE,SAAAG,uBAAAQ,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAM3D,eAAeG,KAAKA,CAEzBC,OAA0B,EACX;EACf,MAAMC,SAAS,CAAC,IAAI,CAACC,MAAM,EAAEF,OAAO,CAAC;AACvC;AAEO,eAAeG,SAASA,CAE7BH,OAA0B,EAC1BI,OAAqB,GAAG;EAAEC,QAAQ,EAAE;AAAI,CAAC,EAC1B;EACf,MAAMJ,SAAS,CAAC,IAAI,CAACC,MAAM,EAAEF,OAAO,EAAEI,OAAO,CAAC;AAChD;AAEA,MAAMH,SAAS,GAAG,MAAAA,CAChBC,MAAmC,EACnCF,OAA0B,EAC1BI,OAAqB,GAAG;EAAEC,QAAQ,EAAE;AAAE,CAAC,KACrB;EAClB;EACA;EACA;EACA,IAAIC,iBAAiB,CAACN,OAAO,CAAC,IAAIO,kBAAkB,CAACP,OAAO,CAAC,EAAE;IAC7D,MAAMQ,qBAAqB,CAACN,MAAM,EAAEF,OAAO,EAAEI,OAAO,CAAC;IACrD;EACF;EAEA,IAAIK,uBAAuB,CAACT,OAAO,CAAC,EAAE;IACpC,MAAMU,iBAAiB,CAACR,MAAM,EAAEF,OAAO,EAAEI,OAAO,CAAC;IACjD;EACF;EAEA,MAAMO,iBAAiB,GAAG,IAAAC,4BAAa,EAACZ,OAAO,CAAC;EAChD,IAAI,CAACW,iBAAiB,EAAE;IACtB;EACF;EAEA,MAAMV,SAAS,CAACC,MAAM,EAAES,iBAAiB,EAAEP,OAAO,CAAC;AACrD,CAAC;AAED,MAAMM,iBAAiB,GAAG,MAAAA,CACxBR,MAAmC,EACnCF,OAA0B,EAC1BI,OAAqB,GAAG;EAAEC,QAAQ,EAAE;AAAE,CAAC,KACpC;EACH,MAAMQ,oBAAoB,GAAG,IAAAC,gCAAwB,EAAC,CAAC;EACvD,IAAI,CAACD,oBAAoB,EAAE;IACzB,IAAAE,wCAAmB,EAAC,CAAC;EACvB;EAEA,MAAM,IAAAC,WAAI,EAACd,MAAM,CAAC;EAElB,MAAM,IAAAe,YAAG,EAAC,YAAY;IACpBjB,OAAO,CAACkB,KAAK,CAACC,gBAAgB,CAAC;MAC7B,GAAGC,0BAAY,CAACC,MAAM,CAACC,KAAK,CAAC,CAAC;MAC9BC,cAAc,EAAE;QAAEC,gBAAgB,EAAE;MAAmB;IACzD,CAAC,CAAC;IAEF,MAAM,IAAAR,WAAI,EAACd,MAAM,EAAEE,OAAO,CAACC,QAAQ,CAAC;IAEpCL,OAAO,CAACkB,KAAK,CAACO,kBAAkB,CAAC;MAC/B,GAAGL,0BAAY,CAACC,MAAM,CAACC,KAAK,CAAC,CAAC;MAC9BC,cAAc,EAAE;QAAEC,gBAAgB,EAAE;MAAqB;IAC3D,CAAC,CAAC;IAEF,IAAIE,qCAA0B,GAAGtB,OAAO,CAACC,QAAQ,GAAG,CAAC,EAAE;MACrD,MAAM,IAAAW,WAAI,EAACd,MAAM,EAAEwB,qCAA0B,GAAGtB,OAAO,CAACC,QAAQ,CAAC;IACnE;EACF,CAAC,CAAC;AACJ,CAAC;AAED,MAAMI,uBAAuB,GAAIT,OAA0B,IAAK;EAC9D,OACE,IAAA2B,oCAAqB,EAAC3B,OAAO,CAAC,IAC9BA,OAAO,CAACkB,KAAK,CAACU,yBAAyB,GAAG,CAAC;AAE/C,CAAC;AAED,MAAMtB,iBAAiB,GAAIN,OAA0B,IAAK;EACxD,OACE,IAAA6B,kCAAgB,EAAC7B,OAAO,EAAE,IAAA8B,yCAAqB,EAAC,CAAC,CAACC,IAAI,CAAC,IACvD,IAAAJ,oCAAqB,EAAC3B,OAAO,CAAC,IAC9B,CAACA,OAAO,CAACkB,KAAK,CAACc,QAAQ,IACvBhC,OAAO,CAACkB,KAAK,CAACe,OAAO;AAEzB,CAAC;AAED,MAAM1B,kBAAkB,GAAIP,OAA0B,IAAK;EACzD,OACE,IAAA6B,kCAAgB,EAAC7B,OAAO,EAAE,IAAA8B,yCAAqB,EAAC,CAAC,CAACI,SAAS,CAAC,IAC5D,IAAAP,oCAAqB,EAAC3B,OAAO,CAAC,IAC9BA,OAAO,CAACkB,KAAK,CAACiB,QAAQ,KAAK,KAAK;AAEpC,CAAC;AAED,MAAM3B,qBAAqB,GAAG,MAAAA,CAC5BN,MAAmC,EACnCF,OAA0B,EAC1BI,OAAqB,GAAG;EAAEC,QAAQ,EAAE;AAAE,CAAC,KACpC;EACH,MAAM;IAAE+B,SAAS;IAAEH,OAAO;IAAEI;EAAW,CAAC,GAAGrC,OAAO,CAACkB,KAAK;EACxD,MAAM,IAAAF,WAAI,EAACd,MAAM,CAAC;EAClB,IAAIkC,SAAS,EAAE;IACbA,SAAS,CAAChB,0BAAY,CAACC,MAAM,CAACC,KAAK,CAAC,CAAC,CAAC;EACxC;EACA,IAAIW,OAAO,EAAE;IACXA,OAAO,CAACb,0BAAY,CAACC,MAAM,CAACC,KAAK,CAAC,CAAC,CAAC;EACtC;EACA,MAAM,IAAAN,WAAI,EAACd,MAAM,EAAEE,OAAO,CAACC,QAAQ,CAAC;EACpC,IAAIgC,UAAU,EAAE;IACd,IAAIX,qCAA0B,GAAGtB,OAAO,CAACC,QAAQ,GAAG,CAAC,EAAE;MACrD,MAAM,IAAAW,WAAI,EAACd,MAAM,EAAEwB,qCAA0B,GAAGtB,OAAO,CAACC,QAAQ,CAAC;IACnE;IACAgC,UAAU,CAACjB,0BAAY,CAACC,MAAM,CAACC,KAAK,CAAC,CAAC,CAAC;EACzC;AACF,CAAC"}
1
+ {"version":3,"file":"press.js","names":["_act","_interopRequireDefault","require","_componentTree","_pointerEvents","_hostComponentNames","_eventBuilder","_utils","_constants","obj","__esModule","default","press","element","basePress","config","type","duration","longPress","options","isPressableText","emitTextPressEvents","isEditableTextInput","isPointerEventEnabled","emitTextInputPressEvents","isEnabledTouchResponder","emitPressablePressEvents","hostParentElement","getHostParent","warnAboutRealTimersIfNeeded","wait","act","dispatchEvent","EventBuilder","Common","responderGrant","responderRelease","DEFAULT_MIN_PRESS_DURATION","props","onStartShouldSetResponder","hasPressEventHandler","Boolean","onPress","onLongPress","onPressIn","onPressOut","isHostText","disabled","touch"],"sources":["../../../src/user-event/press/press.ts"],"sourcesContent":["import { ReactTestInstance } from 'react-test-renderer';\nimport act from '../../act';\nimport { getHostParent } from '../../helpers/component-tree';\nimport { isPointerEventEnabled } from '../../helpers/pointer-events';\nimport { isHostText } from '../../helpers/host-component-names';\nimport { EventBuilder } from '../event-builder';\nimport { UserEventConfig, UserEventInstance } from '../setup';\nimport {\n dispatchEvent,\n isEditableTextInput,\n wait,\n warnAboutRealTimersIfNeeded,\n} from '../utils';\nimport { DEFAULT_MIN_PRESS_DURATION } from './constants';\n\nexport interface PressOptions {\n duration?: number;\n}\n\nexport async function press(\n this: UserEventInstance,\n element: ReactTestInstance\n): Promise<void> {\n await basePress(this.config, element, {\n type: 'press',\n duration: 0,\n });\n}\n\nexport async function longPress(\n this: UserEventInstance,\n element: ReactTestInstance,\n options?: PressOptions\n): Promise<void> {\n await basePress(this.config, element, {\n type: 'longPress',\n duration: options?.duration ?? 500,\n });\n}\n\ninterface BasePressOptions {\n type: 'press' | 'longPress';\n duration: number;\n}\n\nconst basePress = async (\n config: UserEventConfig,\n element: ReactTestInstance,\n options: BasePressOptions\n): Promise<void> => {\n if (isPressableText(element)) {\n await emitTextPressEvents(config, element, options);\n return;\n }\n\n if (isEditableTextInput(element) && isPointerEventEnabled(element)) {\n await emitTextInputPressEvents(config, element, options);\n return;\n }\n\n if (isEnabledTouchResponder(element)) {\n await emitPressablePressEvents(config, element, options);\n return;\n }\n\n const hostParentElement = getHostParent(element);\n if (!hostParentElement) {\n return;\n }\n\n await basePress(config, hostParentElement, options);\n};\n\nconst emitPressablePressEvents = async (\n config: UserEventConfig,\n element: ReactTestInstance,\n options: BasePressOptions\n) => {\n warnAboutRealTimersIfNeeded();\n\n await wait(config);\n\n await act(async () => {\n dispatchEvent(\n element,\n 'responderGrant',\n EventBuilder.Common.responderGrant()\n );\n\n await wait(config, options.duration);\n\n dispatchEvent(\n element,\n 'responderRelease',\n EventBuilder.Common.responderRelease()\n );\n\n // React Native will wait for minimal delay of DEFAULT_MIN_PRESS_DURATION\n // before emitting the `pressOut` event. We need to wait here, so that\n // `press()` function does not return before that.\n if (DEFAULT_MIN_PRESS_DURATION - options.duration > 0) {\n await wait(config, DEFAULT_MIN_PRESS_DURATION - options.duration);\n }\n });\n};\n\nconst isEnabledTouchResponder = (element: ReactTestInstance) => {\n return (\n isPointerEventEnabled(element) &&\n element.props.onStartShouldSetResponder?.()\n );\n};\n\nconst isPressableText = (element: ReactTestInstance) => {\n const hasPressEventHandler = Boolean(\n element.props.onPress ||\n element.props.onLongPress ||\n element.props.onPressIn ||\n element.props.onPressOut\n );\n\n return (\n isHostText(element) &&\n isPointerEventEnabled(element) &&\n !element.props.disabled &&\n hasPressEventHandler\n );\n};\n\n/**\n * Dispatches a press event sequence for Text.\n */\nasync function emitTextPressEvents(\n config: UserEventConfig,\n element: ReactTestInstance,\n options: BasePressOptions\n) {\n await wait(config);\n dispatchEvent(element, 'pressIn', EventBuilder.Common.touch());\n\n // Emit either `press` or `longPress`.\n dispatchEvent(element, options.type, EventBuilder.Common.touch());\n\n await wait(config, options.duration);\n dispatchEvent(element, 'pressOut', EventBuilder.Common.touch());\n}\n\n/**\n * Dispatches a press event sequence for TextInput.\n */\nasync function emitTextInputPressEvents(\n config: UserEventConfig,\n element: ReactTestInstance,\n options: BasePressOptions\n) {\n await wait(config);\n dispatchEvent(element, 'pressIn', EventBuilder.Common.touch());\n\n // Note: TextInput does not have `onPress`/`onLongPress` props.\n\n await wait(config, options.duration);\n dispatchEvent(element, 'pressOut', EventBuilder.Common.touch());\n}\n"],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { ReactTestInstance } from 'react-test-renderer';
2
- import { PressOptions } from '../press/press';
2
+ import { PressOptions } from '../press';
3
+ import { TypeOptions } from '../type';
3
4
  export interface UserEventSetupOptions {
4
5
  /**
5
6
  * Between some subsequent inputs like typing a series of characters
@@ -24,16 +25,57 @@ export interface UserEventSetupOptions {
24
25
  * Creates a new instance of user event instance with the given options.
25
26
  *
26
27
  * @param options
27
- * @returns
28
+ * @returns UserEvent instance
28
29
  */
29
30
  export declare function setup(options?: UserEventSetupOptions): UserEventInstance;
31
+ /**
32
+ * Options affecting all user event interactions.
33
+ *
34
+ * @param delay between some subsequent inputs like typing a series of characters
35
+ * @param advanceTimers function to be called to advance fake timers
36
+ */
30
37
  export interface UserEventConfig {
31
38
  delay: number;
32
39
  advanceTimers: (delay: number) => Promise<void> | void;
33
40
  }
41
+ /**
42
+ * UserEvent instance used to invoke user interaction functions.
43
+ */
34
44
  export interface UserEventInstance {
35
45
  config: UserEventConfig;
36
46
  press: (element: ReactTestInstance) => Promise<void>;
37
47
  longPress: (element: ReactTestInstance, options?: PressOptions) => Promise<void>;
38
- type: (element: ReactTestInstance, text: string) => Promise<void>;
48
+ /**
49
+ * Simulate user pressing on a given `TextInput` element and typing given text.
50
+ *
51
+ * This method will trigger the events for each character of the text:
52
+ * `keyPress`, `change`, `changeText`, `endEditing`, etc.
53
+ *
54
+ * It will also trigger events connected with entering and leaving the text
55
+ * input.
56
+ *
57
+ * The exact events sent depend on the props of the TextInput (`editable`,
58
+ * `multiline`, value, defaultValue, etc) and passed options.
59
+ *
60
+ * @param element TextInput element to type on
61
+ * @param text Text to type
62
+ * @param options Options affecting typing behavior:
63
+ * - `skipPress` - if true, `pressIn` and `pressOut` events will not be
64
+ * triggered.
65
+ * - `submitEditing` - if true, `submitEditing` event will be triggered after
66
+ * typing the text.
67
+ */
68
+ type: (element: ReactTestInstance, text: string, options?: TypeOptions) => Promise<void>;
69
+ /**
70
+ * Simulate user clearing the text of a given `TextInput` element.
71
+ *
72
+ * This method will simulate:
73
+ * 1. entering TextInput
74
+ * 2. selecting all text
75
+ * 3. pressing backspace to delete all text
76
+ * 4. leaving TextInput
77
+ *
78
+ * @param element TextInput element to clear
79
+ */
80
+ clear: (element: ReactTestInstance) => Promise<void>;
39
81
  }
@@ -7,6 +7,7 @@ exports.setup = setup;
7
7
  var _timers = require("../../helpers/timers");
8
8
  var _press = require("../press");
9
9
  var _type = require("../type");
10
+ var _clear = require("../clear");
10
11
  /**
11
12
  * This functions allow wait to work correctly under both real and fake Jest timers.
12
13
  */
@@ -26,19 +27,32 @@ const defaultOptions = {
26
27
  * Creates a new instance of user event instance with the given options.
27
28
  *
28
29
  * @param options
29
- * @returns
30
+ * @returns UserEvent instance
30
31
  */
31
32
  function setup(options) {
32
33
  const config = createConfig(options);
33
34
  const instance = createInstance(config);
34
35
  return instance;
35
36
  }
37
+
38
+ /**
39
+ * Options affecting all user event interactions.
40
+ *
41
+ * @param delay between some subsequent inputs like typing a series of characters
42
+ * @param advanceTimers function to be called to advance fake timers
43
+ */
44
+
36
45
  function createConfig(options) {
37
46
  return {
38
47
  ...defaultOptions,
39
48
  ...options
40
49
  };
41
50
  }
51
+
52
+ /**
53
+ * UserEvent instance used to invoke user interaction functions.
54
+ */
55
+
42
56
  function createInstance(config) {
43
57
  const instance = {
44
58
  config
@@ -48,7 +62,8 @@ function createInstance(config) {
48
62
  const api = {
49
63
  press: _press.press.bind(instance),
50
64
  longPress: _press.longPress.bind(instance),
51
- type: _type.type.bind(instance)
65
+ type: _type.type.bind(instance),
66
+ clear: _clear.clear.bind(instance)
52
67
  };
53
68
  Object.assign(instance, api);
54
69
  return instance;