@testing-library/react-native 14.0.0-alpha.6 → 14.0.0-beta.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 (214) hide show
  1. package/README.md +30 -30
  2. package/build/config.js +10 -4
  3. package/build/config.js.map +1 -1
  4. package/build/event-builder/base.d.ts +7 -0
  5. package/build/{user-event/event-builder → event-builder}/base.js +1 -1
  6. package/build/event-builder/base.js.map +1 -0
  7. package/build/event-builder/common.d.ts +152 -0
  8. package/build/event-builder/common.js +80 -0
  9. package/build/event-builder/common.js.map +1 -0
  10. package/build/event-builder/index.d.ts +3 -0
  11. package/build/event-builder/index.js +39 -0
  12. package/build/event-builder/index.js.map +1 -0
  13. package/build/event-builder/scroll.d.ts +56 -0
  14. package/build/event-builder/scroll.js +51 -0
  15. package/build/event-builder/scroll.js.map +1 -0
  16. package/build/event-builder/text.d.ts +162 -0
  17. package/build/event-builder/text.js +113 -0
  18. package/build/event-builder/text.js.map +1 -0
  19. package/build/event-handler.d.ts +0 -1
  20. package/build/event-handler.js +0 -1
  21. package/build/event-handler.js.map +1 -1
  22. package/build/fire-event.d.ts +6 -7
  23. package/build/fire-event.js +47 -28
  24. package/build/fire-event.js.map +1 -1
  25. package/build/helpers/accessibility.d.ts +18 -15
  26. package/build/helpers/accessibility.js +64 -47
  27. package/build/helpers/accessibility.js.map +1 -1
  28. package/build/helpers/component-tree.d.ts +9 -9
  29. package/build/helpers/component-tree.js +17 -17
  30. package/build/helpers/component-tree.js.map +1 -1
  31. package/build/helpers/errors.d.ts +1 -3
  32. package/build/helpers/errors.js +3 -36
  33. package/build/helpers/errors.js.map +1 -1
  34. package/build/helpers/find-all.d.ts +2 -2
  35. package/build/helpers/find-all.js +1 -1
  36. package/build/helpers/find-all.js.map +1 -1
  37. package/build/helpers/format-element.d.ts +5 -5
  38. package/build/helpers/format-element.js +9 -9
  39. package/build/helpers/format-element.js.map +1 -1
  40. package/build/helpers/host-component-names.d.ts +13 -13
  41. package/build/helpers/host-component-names.js +18 -18
  42. package/build/helpers/host-component-names.js.map +1 -1
  43. package/build/helpers/matchers/match-accessibility-state.d.ts +2 -2
  44. package/build/helpers/matchers/match-accessibility-state.js +6 -6
  45. package/build/helpers/matchers/match-accessibility-state.js.map +1 -1
  46. package/build/helpers/matchers/match-accessibility-value.d.ts +2 -2
  47. package/build/helpers/matchers/match-accessibility-value.js +2 -2
  48. package/build/helpers/matchers/match-accessibility-value.js.map +1 -1
  49. package/build/helpers/matchers/match-label-text.d.ts +2 -2
  50. package/build/helpers/matchers/match-label-text.js +2 -2
  51. package/build/helpers/matchers/match-label-text.js.map +1 -1
  52. package/build/helpers/matchers/match-text-content.d.ts +5 -5
  53. package/build/helpers/matchers/match-text-content.js +5 -5
  54. package/build/helpers/matchers/match-text-content.js.map +1 -1
  55. package/build/helpers/pointer-events.d.ts +2 -2
  56. package/build/helpers/pointer-events.js +4 -4
  57. package/build/helpers/pointer-events.js.map +1 -1
  58. package/build/helpers/text-content.d.ts +2 -2
  59. package/build/helpers/text-content.js +5 -5
  60. package/build/helpers/text-content.js.map +1 -1
  61. package/build/helpers/text-input.d.ts +3 -3
  62. package/build/helpers/text-input.js +6 -6
  63. package/build/helpers/text-input.js.map +1 -1
  64. package/build/helpers/validate-options.d.ts +9 -0
  65. package/build/helpers/validate-options.js +32 -0
  66. package/build/helpers/validate-options.js.map +1 -0
  67. package/build/matchers/to-be-busy.d.ts +2 -2
  68. package/build/matchers/to-be-busy.js +5 -5
  69. package/build/matchers/to-be-busy.js.map +1 -1
  70. package/build/matchers/to-be-checked.d.ts +2 -2
  71. package/build/matchers/to-be-checked.js +9 -9
  72. package/build/matchers/to-be-checked.js.map +1 -1
  73. package/build/matchers/to-be-disabled.d.ts +3 -3
  74. package/build/matchers/to-be-disabled.js +10 -10
  75. package/build/matchers/to-be-disabled.js.map +1 -1
  76. package/build/matchers/to-be-empty-element.d.ts +2 -2
  77. package/build/matchers/to-be-empty-element.js +4 -4
  78. package/build/matchers/to-be-empty-element.js.map +1 -1
  79. package/build/matchers/to-be-expanded.d.ts +3 -3
  80. package/build/matchers/to-be-expanded.js +10 -10
  81. package/build/matchers/to-be-expanded.js.map +1 -1
  82. package/build/matchers/to-be-on-the-screen.d.ts +2 -2
  83. package/build/matchers/to-be-on-the-screen.js +7 -7
  84. package/build/matchers/to-be-on-the-screen.js.map +1 -1
  85. package/build/matchers/to-be-partially-checked.d.ts +2 -2
  86. package/build/matchers/to-be-partially-checked.js +8 -8
  87. package/build/matchers/to-be-partially-checked.js.map +1 -1
  88. package/build/matchers/to-be-selected.d.ts +2 -2
  89. package/build/matchers/to-be-selected.js +4 -4
  90. package/build/matchers/to-be-selected.js.map +1 -1
  91. package/build/matchers/to-be-visible.d.ts +2 -2
  92. package/build/matchers/to-be-visible.js +12 -12
  93. package/build/matchers/to-be-visible.js.map +1 -1
  94. package/build/matchers/to-contain-element.d.ts +2 -2
  95. package/build/matchers/to-contain-element.js +6 -6
  96. package/build/matchers/to-contain-element.js.map +1 -1
  97. package/build/matchers/to-have-accessibility-value.d.ts +2 -2
  98. package/build/matchers/to-have-accessibility-value.js +6 -6
  99. package/build/matchers/to-have-accessibility-value.js.map +1 -1
  100. package/build/matchers/to-have-accessible-name.d.ts +2 -2
  101. package/build/matchers/to-have-accessible-name.js +5 -10
  102. package/build/matchers/to-have-accessible-name.js.map +1 -1
  103. package/build/matchers/to-have-display-value.d.ts +2 -2
  104. package/build/matchers/to-have-display-value.js +6 -6
  105. package/build/matchers/to-have-display-value.js.map +1 -1
  106. package/build/matchers/to-have-prop.d.ts +2 -2
  107. package/build/matchers/to-have-prop.js +6 -6
  108. package/build/matchers/to-have-prop.js.map +1 -1
  109. package/build/matchers/to-have-style.d.ts +2 -2
  110. package/build/matchers/to-have-style.js +5 -5
  111. package/build/matchers/to-have-style.js.map +1 -1
  112. package/build/matchers/to-have-text-content.d.ts +2 -2
  113. package/build/matchers/to-have-text-content.js +4 -4
  114. package/build/matchers/to-have-text-content.js.map +1 -1
  115. package/build/matchers/types.d.ts +20 -20
  116. package/build/matchers/types.js.map +1 -1
  117. package/build/matchers/utils.d.ts +4 -4
  118. package/build/matchers/utils.js +6 -6
  119. package/build/matchers/utils.js.map +1 -1
  120. package/build/native-state.d.ts +3 -3
  121. package/build/native-state.js +2 -2
  122. package/build/native-state.js.map +1 -1
  123. package/build/queries/display-value.d.ts +2 -2
  124. package/build/queries/display-value.js +12 -12
  125. package/build/queries/display-value.js.map +1 -1
  126. package/build/queries/hint-text.d.ts +2 -2
  127. package/build/queries/hint-text.js +11 -11
  128. package/build/queries/hint-text.js.map +1 -1
  129. package/build/queries/label-text.d.ts +2 -2
  130. package/build/queries/label-text.js +9 -9
  131. package/build/queries/label-text.js.map +1 -1
  132. package/build/queries/make-queries.d.ts +8 -8
  133. package/build/queries/make-queries.js +11 -11
  134. package/build/queries/make-queries.js.map +1 -1
  135. package/build/queries/placeholder-text.d.ts +2 -2
  136. package/build/queries/placeholder-text.js +11 -11
  137. package/build/queries/placeholder-text.js.map +1 -1
  138. package/build/queries/role.d.ts +2 -2
  139. package/build/queries/role.js +17 -27
  140. package/build/queries/role.js.map +1 -1
  141. package/build/queries/test-id.d.ts +2 -2
  142. package/build/queries/test-id.js +11 -11
  143. package/build/queries/test-id.js.map +1 -1
  144. package/build/queries/text.d.ts +2 -2
  145. package/build/queries/text.js +9 -9
  146. package/build/queries/text.js.map +1 -1
  147. package/build/render-hook.js +7 -1
  148. package/build/render-hook.js.map +1 -1
  149. package/build/render.d.ts +4 -5
  150. package/build/render.js +22 -6
  151. package/build/render.js.map +1 -1
  152. package/build/screen.js.map +1 -1
  153. package/build/test-utils/react-version-gates.d.ts +1 -0
  154. package/build/test-utils/react-version-gates.js +28 -0
  155. package/build/test-utils/react-version-gates.js.map +1 -0
  156. package/build/test-utils/timers.d.ts +2 -0
  157. package/build/test-utils/timers.js +20 -0
  158. package/build/test-utils/timers.js.map +1 -0
  159. package/build/types.d.ts +7 -0
  160. package/build/types.js.map +1 -1
  161. package/build/user-event/clear.d.ts +2 -2
  162. package/build/user-event/clear.js +13 -13
  163. package/build/user-event/clear.js.map +1 -1
  164. package/build/user-event/index.d.ts +7 -7
  165. package/build/user-event/index.js +6 -6
  166. package/build/user-event/index.js.map +1 -1
  167. package/build/user-event/paste.d.ts +2 -2
  168. package/build/user-event/paste.js +18 -18
  169. package/build/user-event/paste.js.map +1 -1
  170. package/build/user-event/press/press.d.ts +3 -3
  171. package/build/user-event/press/press.js +35 -35
  172. package/build/user-event/press/press.js.map +1 -1
  173. package/build/user-event/scroll/scroll-to.d.ts +2 -2
  174. package/build/user-event/scroll/scroll-to.js +20 -20
  175. package/build/user-event/scroll/scroll-to.js.map +1 -1
  176. package/build/user-event/setup/setup.d.ts +11 -11
  177. package/build/user-event/setup/setup.js +17 -3
  178. package/build/user-event/setup/setup.js.map +1 -1
  179. package/build/user-event/type/type.d.ts +3 -3
  180. package/build/user-event/type/type.js +27 -28
  181. package/build/user-event/type/type.js.map +1 -1
  182. package/build/user-event/utils/dispatch-event.d.ts +3 -3
  183. package/build/user-event/utils/dispatch-event.js +4 -4
  184. package/build/user-event/utils/dispatch-event.js.map +1 -1
  185. package/build/user-event/utils/index.d.ts +0 -1
  186. package/build/user-event/utils/index.js +0 -11
  187. package/build/user-event/utils/index.js.map +1 -1
  188. package/build/wait-for.js +8 -13
  189. package/build/wait-for.js.map +1 -1
  190. package/build/within.d.ts +3 -3
  191. package/build/within.js +10 -10
  192. package/build/within.js.map +1 -1
  193. package/package.json +38 -27
  194. package/build/react-versions.d.ts +0 -1
  195. package/build/react-versions.js +0 -14
  196. package/build/react-versions.js.map +0 -1
  197. package/build/tsconfig.release.tsbuildinfo +0 -1
  198. package/build/user-event/event-builder/base.d.ts +0 -3
  199. package/build/user-event/event-builder/base.js.map +0 -1
  200. package/build/user-event/event-builder/common.d.ts +0 -150
  201. package/build/user-event/event-builder/common.js +0 -77
  202. package/build/user-event/event-builder/common.js.map +0 -1
  203. package/build/user-event/event-builder/index.d.ts +0 -306
  204. package/build/user-event/event-builder/index.js +0 -15
  205. package/build/user-event/event-builder/index.js.map +0 -1
  206. package/build/user-event/event-builder/scroll-view.d.ts +0 -57
  207. package/build/user-event/event-builder/scroll-view.js +0 -53
  208. package/build/user-event/event-builder/scroll-view.js.map +0 -1
  209. package/build/user-event/event-builder/text-input.d.ts +0 -159
  210. package/build/user-event/event-builder/text-input.js +0 -105
  211. package/build/user-event/event-builder/text-input.js.map +0 -1
  212. package/build/user-event/utils/text-range.d.ts +0 -4
  213. package/build/user-event/utils/text-range.js +0 -6
  214. package/build/user-event/utils/text-range.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"scroll-to.js","names":["_jestMatcherUtils","require","_errors","_hostComponentNames","_object","_nativeState","_eventBuilder","_utils","_utils2","scrollTo","element","options","isHostScrollView","ErrorWithStack","type","ensureScrollViewDirection","dispatchEvent","contentSize","width","height","initialOffset","nativeState","contentOffsetForElement","get","x","y","dragSteps","createScrollSteps","linearInterpolator","emitDragScrollEvents","config","momentumStart","at","momentumSteps","momentumY","momentumX","inertialInterpolator","emitMomentumScrollEvents","finalOffset","set","scrollSteps","scrollOptions","length","wait","EventBuilder","ScrollView","scroll","i","lastStep","isVerticalScrollView","props","horizontal","hasHorizontalScrollOptions","undefined","stringify","pick","hasVerticalScrollOptions"],"sources":["../../../src/user-event/scroll/scroll-to.ts"],"sourcesContent":["import { stringify } from 'jest-matcher-utils';\nimport type { HostElement } from 'test-renderer';\n\nimport { ErrorWithStack } from '../../helpers/errors';\nimport { isHostScrollView } from '../../helpers/host-component-names';\nimport { pick } from '../../helpers/object';\nimport { nativeState } from '../../native-state';\nimport type { Point, Size } from '../../types';\nimport { EventBuilder } from '../event-builder';\nimport type { UserEventConfig, UserEventInstance } from '../setup';\nimport { dispatchEvent, wait } from '../utils';\nimport { createScrollSteps, inertialInterpolator, linearInterpolator } from './utils';\n\ninterface CommonScrollToOptions {\n contentSize?: Size;\n layoutMeasurement?: Size;\n}\n\nexport interface VerticalScrollToOptions extends CommonScrollToOptions {\n y: number;\n momentumY?: number;\n\n // Vertical scroll should not contain horizontal scroll part.\n x?: never;\n momentumX?: never;\n}\n\nexport interface HorizontalScrollToOptions extends CommonScrollToOptions {\n x: number;\n momentumX?: number;\n\n // Horizontal scroll should not contain vertical scroll part.\n y?: never;\n momentumY?: never;\n}\n\nexport type ScrollToOptions = VerticalScrollToOptions | HorizontalScrollToOptions;\n\nexport async function scrollTo(\n this: UserEventInstance,\n element: HostElement,\n options: ScrollToOptions,\n): Promise<void> {\n if (!isHostScrollView(element)) {\n throw new ErrorWithStack(\n `scrollTo() works only with host \"ScrollView\" elements. Passed element has type \"${element.type}\".`,\n scrollTo,\n );\n }\n\n ensureScrollViewDirection(element, options);\n\n await dispatchEvent(\n element,\n 'contentSizeChange',\n options.contentSize?.width ?? 0,\n options.contentSize?.height ?? 0,\n );\n\n const initialOffset = nativeState.contentOffsetForElement.get(element) ?? { x: 0, y: 0 };\n const dragSteps = createScrollSteps(\n { y: options.y, x: options.x },\n initialOffset,\n linearInterpolator,\n );\n await emitDragScrollEvents(this.config, element, dragSteps, options);\n\n const momentumStart = dragSteps.at(-1) ?? initialOffset;\n const momentumSteps = createScrollSteps(\n { y: options.momentumY, x: options.momentumX },\n momentumStart,\n inertialInterpolator,\n );\n await emitMomentumScrollEvents(this.config, element, momentumSteps, options);\n\n const finalOffset = momentumSteps.at(-1) ?? dragSteps.at(-1) ?? initialOffset;\n nativeState.contentOffsetForElement.set(element, finalOffset);\n}\n\nasync function emitDragScrollEvents(\n config: UserEventConfig,\n element: HostElement,\n scrollSteps: Point[],\n scrollOptions: ScrollToOptions,\n) {\n if (scrollSteps.length === 0) {\n return;\n }\n\n await wait(config);\n await dispatchEvent(\n element,\n 'scrollBeginDrag',\n EventBuilder.ScrollView.scroll(scrollSteps[0], scrollOptions),\n );\n\n // Note: experimentally, in case of drag scroll the last scroll step\n // will not trigger `scroll` event.\n // See: https://github.com/callstack/react-native-testing-library/wiki/ScrollView-Events\n for (let i = 1; i < scrollSteps.length - 1; i += 1) {\n await wait(config);\n await dispatchEvent(\n element,\n 'scroll',\n EventBuilder.ScrollView.scroll(scrollSteps[i], scrollOptions),\n );\n }\n\n await wait(config);\n const lastStep = scrollSteps.at(-1);\n await dispatchEvent(\n element,\n 'scrollEndDrag',\n EventBuilder.ScrollView.scroll(lastStep, scrollOptions),\n );\n}\n\nasync function emitMomentumScrollEvents(\n config: UserEventConfig,\n element: HostElement,\n scrollSteps: Point[],\n scrollOptions: ScrollToOptions,\n) {\n if (scrollSteps.length === 0) {\n return;\n }\n\n await wait(config);\n await dispatchEvent(\n element,\n 'momentumScrollBegin',\n EventBuilder.ScrollView.scroll(scrollSteps[0], scrollOptions),\n );\n\n // Note: experimentally, in case of momentum scroll the last scroll step\n // will trigger `scroll` event.\n // See: https://github.com/callstack/react-native-testing-library/wiki/ScrollView-Events\n for (let i = 1; i < scrollSteps.length; i += 1) {\n await wait(config);\n await dispatchEvent(\n element,\n 'scroll',\n EventBuilder.ScrollView.scroll(scrollSteps[i], scrollOptions),\n );\n }\n\n await wait(config);\n const lastStep = scrollSteps.at(-1);\n await dispatchEvent(\n element,\n 'momentumScrollEnd',\n EventBuilder.ScrollView.scroll(lastStep, scrollOptions),\n );\n}\n\nfunction ensureScrollViewDirection(element: HostElement, options: ScrollToOptions) {\n const isVerticalScrollView = element.props.horizontal !== true;\n\n const hasHorizontalScrollOptions = options.x !== undefined || options.momentumX !== undefined;\n if (isVerticalScrollView && hasHorizontalScrollOptions) {\n throw new ErrorWithStack(\n `scrollTo() expected only vertical scroll options: \"y\" and \"momentumY\" for vertical \"ScrollView\" element but received ${stringify(\n pick(options, ['x', 'momentumX']),\n )}`,\n scrollTo,\n );\n }\n\n const hasVerticalScrollOptions = options.y !== undefined || options.momentumY !== undefined;\n if (!isVerticalScrollView && hasVerticalScrollOptions) {\n throw new ErrorWithStack(\n `scrollTo() expected only horizontal scroll options: \"x\" and \"momentumX\" for horizontal \"ScrollView\" element but received ${stringify(\n pick(options, ['y', 'momentumY']),\n )}`,\n scrollTo,\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"scroll-to.js","names":["_jestMatcherUtils","require","_eventBuilder","_errors","_hostComponentNames","_object","_nativeState","_utils","_utils2","scrollTo","instance","options","isHostScrollView","ErrorWithStack","type","ensureScrollViewDirection","dispatchEvent","contentSize","width","height","initialOffset","nativeState","contentOffsetForInstance","get","x","y","dragSteps","createScrollSteps","linearInterpolator","emitDragScrollEvents","config","momentumStart","at","momentumSteps","momentumY","momentumX","inertialInterpolator","emitMomentumScrollEvents","finalOffset","set","scrollSteps","scrollOptions","length","wait","buildScrollEvent","i","lastStep","isVerticalScrollView","props","horizontal","hasHorizontalScrollOptions","undefined","stringify","pick","hasVerticalScrollOptions"],"sources":["../../../src/user-event/scroll/scroll-to.ts"],"sourcesContent":["import { stringify } from 'jest-matcher-utils';\nimport type { TestInstance } from 'test-renderer';\n\nimport { buildScrollEvent } from '../../event-builder';\nimport { ErrorWithStack } from '../../helpers/errors';\nimport { isHostScrollView } from '../../helpers/host-component-names';\nimport { pick } from '../../helpers/object';\nimport { nativeState } from '../../native-state';\nimport type { Point, Size } from '../../types';\nimport type { UserEventConfig, UserEventInstance } from '../setup';\nimport { dispatchEvent, wait } from '../utils';\nimport { createScrollSteps, inertialInterpolator, linearInterpolator } from './utils';\n\ninterface CommonScrollToOptions {\n contentSize?: Size;\n layoutMeasurement?: Size;\n}\n\nexport interface VerticalScrollToOptions extends CommonScrollToOptions {\n y: number;\n momentumY?: number;\n\n // Vertical scroll should not contain horizontal scroll part.\n x?: never;\n momentumX?: never;\n}\n\nexport interface HorizontalScrollToOptions extends CommonScrollToOptions {\n x: number;\n momentumX?: number;\n\n // Horizontal scroll should not contain vertical scroll part.\n y?: never;\n momentumY?: never;\n}\n\nexport type ScrollToOptions = VerticalScrollToOptions | HorizontalScrollToOptions;\n\nexport async function scrollTo(\n this: UserEventInstance,\n instance: TestInstance,\n options: ScrollToOptions,\n): Promise<void> {\n if (!isHostScrollView(instance)) {\n throw new ErrorWithStack(\n `scrollTo() works only with host \"ScrollView\" instances. Passed instance has type \"${instance.type}\".`,\n scrollTo,\n );\n }\n\n ensureScrollViewDirection(instance, options);\n\n await dispatchEvent(\n instance,\n 'contentSizeChange',\n options.contentSize?.width ?? 0,\n options.contentSize?.height ?? 0,\n );\n\n const initialOffset = nativeState.contentOffsetForInstance.get(instance) ?? { x: 0, y: 0 };\n const dragSteps = createScrollSteps(\n { y: options.y, x: options.x },\n initialOffset,\n linearInterpolator,\n );\n await emitDragScrollEvents(this.config, instance, dragSteps, options);\n\n const momentumStart = dragSteps.at(-1) ?? initialOffset;\n const momentumSteps = createScrollSteps(\n { y: options.momentumY, x: options.momentumX },\n momentumStart,\n inertialInterpolator,\n );\n await emitMomentumScrollEvents(this.config, instance, momentumSteps, options);\n\n const finalOffset = momentumSteps.at(-1) ?? dragSteps.at(-1) ?? initialOffset;\n nativeState.contentOffsetForInstance.set(instance, finalOffset);\n}\n\nasync function emitDragScrollEvents(\n config: UserEventConfig,\n instance: TestInstance,\n scrollSteps: Point[],\n scrollOptions: ScrollToOptions,\n) {\n if (scrollSteps.length === 0) {\n return;\n }\n\n await wait(config);\n await dispatchEvent(instance, 'scrollBeginDrag', buildScrollEvent(scrollSteps[0], scrollOptions));\n\n // Note: experimentally, in case of drag scroll the last scroll step\n // will not trigger `scroll` event.\n // See: https://github.com/callstack/react-native-testing-library/wiki/ScrollView-Events\n for (let i = 1; i < scrollSteps.length - 1; i += 1) {\n await wait(config);\n await dispatchEvent(instance, 'scroll', buildScrollEvent(scrollSteps[i], scrollOptions));\n }\n\n await wait(config);\n const lastStep = scrollSteps.at(-1);\n await dispatchEvent(instance, 'scrollEndDrag', buildScrollEvent(lastStep, scrollOptions));\n}\n\nasync function emitMomentumScrollEvents(\n config: UserEventConfig,\n instance: TestInstance,\n scrollSteps: Point[],\n scrollOptions: ScrollToOptions,\n) {\n if (scrollSteps.length === 0) {\n return;\n }\n\n await wait(config);\n await dispatchEvent(\n instance,\n 'momentumScrollBegin',\n buildScrollEvent(scrollSteps[0], scrollOptions),\n );\n\n // Note: experimentally, in case of momentum scroll the last scroll step\n // will trigger `scroll` event.\n // See: https://github.com/callstack/react-native-testing-library/wiki/ScrollView-Events\n for (let i = 1; i < scrollSteps.length; i += 1) {\n await wait(config);\n await dispatchEvent(instance, 'scroll', buildScrollEvent(scrollSteps[i], scrollOptions));\n }\n\n await wait(config);\n const lastStep = scrollSteps.at(-1);\n await dispatchEvent(instance, 'momentumScrollEnd', buildScrollEvent(lastStep, scrollOptions));\n}\n\nfunction ensureScrollViewDirection(instance: TestInstance, options: ScrollToOptions) {\n const isVerticalScrollView = instance.props.horizontal !== true;\n\n const hasHorizontalScrollOptions = options.x !== undefined || options.momentumX !== undefined;\n if (isVerticalScrollView && hasHorizontalScrollOptions) {\n throw new ErrorWithStack(\n `scrollTo() expected only vertical scroll options: \"y\" and \"momentumY\" for vertical \"ScrollView\" element but received ${stringify(\n pick(options, ['x', 'momentumX']),\n )}`,\n scrollTo,\n );\n }\n\n const hasVerticalScrollOptions = options.y !== undefined || options.momentumY !== undefined;\n if (!isVerticalScrollView && hasVerticalScrollOptions) {\n throw new ErrorWithStack(\n `scrollTo() expected only horizontal scroll options: \"x\" and \"momentumX\" for horizontal \"ScrollView\" element but received ${stringify(\n pick(options, ['y', 'momentumY']),\n )}`,\n scrollTo,\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,4 +1,4 @@
1
- import type { HostElement } from 'test-renderer';
1
+ import type { TestInstance } from 'test-renderer';
2
2
  import type { PressOptions } from '../press';
3
3
  import type { ScrollToOptions } from '../scroll';
4
4
  import type { TypeOptions } from '../type';
@@ -44,8 +44,8 @@ export interface UserEventConfig {
44
44
  */
45
45
  export interface UserEventInstance {
46
46
  config: UserEventConfig;
47
- press: (element: HostElement) => Promise<void>;
48
- longPress: (element: HostElement, options?: PressOptions) => Promise<void>;
47
+ press: (instance: TestInstance) => Promise<void>;
48
+ longPress: (instance: TestInstance, options?: PressOptions) => Promise<void>;
49
49
  /**
50
50
  * Simulate user pressing on a given `TextInput` element and typing given text.
51
51
  *
@@ -58,7 +58,7 @@ export interface UserEventInstance {
58
58
  * The exact events sent depend on the props of the TextInput (`editable`,
59
59
  * `multiline`, etc) and passed options.
60
60
  *
61
- * @param element TextInput element to type on
61
+ * @param instance TextInput instance to type on
62
62
  * @param text Text to type
63
63
  * @param options Options affecting typing behavior:
64
64
  * - `skipPress` - if true, `pressIn` and `pressOut` events will not be
@@ -66,7 +66,7 @@ export interface UserEventInstance {
66
66
  * - `submitEditing` - if true, `submitEditing` event will be triggered after
67
67
  * typing the text.
68
68
  */
69
- type: (element: HostElement, text: string, options?: TypeOptions) => Promise<void>;
69
+ type: (instance: TestInstance, text: string, options?: TypeOptions) => Promise<void>;
70
70
  /**
71
71
  * Simulate user clearing the text of a given `TextInput` element.
72
72
  *
@@ -76,9 +76,9 @@ export interface UserEventInstance {
76
76
  * 3. pressing backspace to delete all text
77
77
  * 4. leaving TextInput
78
78
  *
79
- * @param element TextInput element to clear
79
+ * @param instance TextInput instance to clear
80
80
  */
81
- clear: (element: HostElement) => Promise<void>;
81
+ clear: (instance: TestInstance) => Promise<void>;
82
82
  /**
83
83
  * Simulate user pasting the text to a given `TextInput` element.
84
84
  *
@@ -88,14 +88,14 @@ export interface UserEventInstance {
88
88
  * 3. paste the text
89
89
  * 4. leaving TextInput
90
90
  *
91
- * @param element TextInput element to paste to
91
+ * @param instance TextInput instance to paste to
92
92
  */
93
- paste: (element: HostElement, text: string) => Promise<void>;
93
+ paste: (instance: TestInstance, text: string) => Promise<void>;
94
94
  /**
95
95
  * Simlate user scorlling a ScrollView element.
96
96
  *
97
- * @param element ScrollView element
97
+ * @param instance ScrollView instance
98
98
  * @returns
99
99
  */
100
- scrollTo: (element: HostElement, options: ScrollToOptions) => Promise<void>;
100
+ scrollTo: (instance: TestInstance, options: ScrollToOptions) => Promise<void>;
101
101
  }
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.setup = setup;
7
7
  var _timers = require("../../helpers/timers");
8
+ var _validateOptions = require("../../helpers/validate-options");
8
9
  var _wrapAsync = require("../../helpers/wrap-async");
9
10
  var _clear = require("../clear");
10
11
  var _paste = require("../paste");
@@ -34,7 +35,7 @@ const defaultOptions = {
34
35
  * @returns UserEvent instance
35
36
  */
36
37
  function setup(options) {
37
- const config = createConfig(options);
38
+ const config = createConfig(options, setup);
38
39
  const instance = createInstance(config);
39
40
  return instance;
40
41
  }
@@ -46,10 +47,23 @@ function setup(options) {
46
47
  * @param advanceTimers function to be called to advance fake timers
47
48
  */
48
49
 
49
- function createConfig(options) {
50
+ function createConfig(options = {},
51
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
52
+ callsite) {
53
+ const {
54
+ delay,
55
+ advanceTimers,
56
+ ...rest
57
+ } = options;
58
+ (0, _validateOptions.validateOptions)('userEvent.setup', rest, callsite);
50
59
  return {
51
60
  ...defaultOptions,
52
- ...options
61
+ ...(delay !== undefined && {
62
+ delay
63
+ }),
64
+ ...(advanceTimers !== undefined && {
65
+ advanceTimers
66
+ })
53
67
  };
54
68
  }
55
69
 
@@ -1 +1 @@
1
- {"version":3,"file":"setup.js","names":["_timers","require","_wrapAsync","_clear","_paste","_press","_scroll","_type","_utils","universalJestAdvanceTimersBy","ms","jestFakeTimersAreEnabled","jest","advanceTimersByTime","Promise","resolve","defaultOptions","delay","advanceTimers","setup","options","config","createConfig","instance","createInstance","api","press","wrapAndBindImpl","longPress","type","clear","paste","scrollTo","Object","assign","impl","method","args","wrapAsync","apply","then","result","wait","defineProperty","get","name"],"sources":["../../../src/user-event/setup/setup.ts"],"sourcesContent":["import type { HostElement } from 'test-renderer';\n\nimport { jestFakeTimersAreEnabled } from '../../helpers/timers';\nimport { wrapAsync } from '../../helpers/wrap-async';\nimport { clear } from '../clear';\nimport { paste } from '../paste';\nimport type { PressOptions } from '../press';\nimport { longPress, press } from '../press';\nimport type { ScrollToOptions } from '../scroll';\nimport { scrollTo } from '../scroll';\nimport type { TypeOptions } from '../type';\nimport { type } from '../type';\nimport { wait } from '../utils';\n\nexport interface UserEventSetupOptions {\n /**\n * Between some subsequent inputs like typing a series of characters\n * the code execution is delayed per `setTimeout` for (at least) `delay` seconds.\n * This moves the next changes at least to next macro task\n * and allows other (asynchronous) code to run between events.\n *\n * `null` prevents `setTimeout` from being called.\n *\n * @default 0\n */\n delay?: number;\n\n /**\n * Function to be called to advance fake timers. Setting it is necessary for\n * fake timers to work.\n *\n * @example jest.advanceTimersByTime\n */\n advanceTimers?: (delay: number) => Promise<void> | void;\n}\n\n/**\n * This functions allow wait to work correctly under both real and fake Jest timers.\n */\nfunction universalJestAdvanceTimersBy(ms: number) {\n if (jestFakeTimersAreEnabled()) {\n return jest.advanceTimersByTime(ms);\n } else {\n return Promise.resolve();\n }\n}\n\nconst defaultOptions: Required<UserEventSetupOptions> = {\n delay: 0,\n advanceTimers: universalJestAdvanceTimersBy,\n};\n\n/**\n * Creates a new instance of user event instance with the given options.\n *\n * @param options\n * @returns UserEvent instance\n */\nexport function setup(options?: UserEventSetupOptions) {\n const config = createConfig(options);\n const instance = createInstance(config);\n return instance;\n}\n\n/**\n * Options affecting all user event interactions.\n *\n * @param delay between some subsequent inputs like typing a series of characters\n * @param advanceTimers function to be called to advance fake timers\n */\nexport interface UserEventConfig {\n delay: number;\n advanceTimers: (delay: number) => Promise<void> | void;\n}\n\nfunction createConfig(options?: UserEventSetupOptions): UserEventConfig {\n return {\n ...defaultOptions,\n ...options,\n };\n}\n\n/**\n * UserEvent instance used to invoke user interaction functions.\n */\nexport interface UserEventInstance {\n config: UserEventConfig;\n\n press: (element: HostElement) => Promise<void>;\n longPress: (element: HostElement, options?: PressOptions) => Promise<void>;\n\n /**\n * Simulate user pressing on a given `TextInput` element and typing given text.\n *\n * This method will trigger the events for each character of the text:\n * `keyPress`, `change`, `changeText`, `endEditing`, etc.\n *\n * It will also trigger events connected with entering and leaving the text\n * input.\n *\n * The exact events sent depend on the props of the TextInput (`editable`,\n * `multiline`, etc) and passed options.\n *\n * @param element TextInput element to type on\n * @param text Text to type\n * @param options Options affecting typing behavior:\n * - `skipPress` - if true, `pressIn` and `pressOut` events will not be\n * triggered.\n * - `submitEditing` - if true, `submitEditing` event will be triggered after\n * typing the text.\n */\n type: (element: HostElement, text: string, options?: TypeOptions) => Promise<void>;\n\n /**\n * Simulate user clearing the text of a given `TextInput` element.\n *\n * This method will simulate:\n * 1. entering TextInput\n * 2. selecting all text\n * 3. pressing backspace to delete all text\n * 4. leaving TextInput\n *\n * @param element TextInput element to clear\n */\n clear: (element: HostElement) => Promise<void>;\n\n /**\n * Simulate user pasting the text to a given `TextInput` element.\n *\n * This method will simulate:\n * 1. entering TextInput\n * 2. selecting all text\n * 3. paste the text\n * 4. leaving TextInput\n *\n * @param element TextInput element to paste to\n */\n paste: (element: HostElement, text: string) => Promise<void>;\n\n /**\n * Simlate user scorlling a ScrollView element.\n *\n * @param element ScrollView element\n * @returns\n */\n scrollTo: (element: HostElement, options: ScrollToOptions) => Promise<void>;\n}\n\nfunction createInstance(config: UserEventConfig): UserEventInstance {\n const instance = {\n config,\n } as UserEventInstance;\n\n // Bind interactions to given User Event instance.\n const api = {\n press: wrapAndBindImpl(instance, press),\n longPress: wrapAndBindImpl(instance, longPress),\n type: wrapAndBindImpl(instance, type),\n clear: wrapAndBindImpl(instance, clear),\n paste: wrapAndBindImpl(instance, paste),\n scrollTo: wrapAndBindImpl(instance, scrollTo),\n };\n\n Object.assign(instance, api);\n return instance;\n}\n\n/**\n * Wraps user interaction with `wrapAsync` (temporarily disable `act` environment while\n * calling & resolving the async callback, then flush the microtask queue)\n *\n * This implementation is sourced from `testing-library/user-event`\n * @see https://github.com/testing-library/user-event/blob/7a305dee9ab833d6f338d567fc2e862b4838b76a/src/setup/setup.ts#L121\n */\nfunction wrapAndBindImpl<\n Args extends never[],\n Impl extends (this: UserEventInstance, ...args: Args) => Promise<unknown>,\n>(instance: UserEventInstance, impl: Impl) {\n function method(...args: Args) {\n return wrapAsync(() =>\n // eslint-disable-next-line promise/prefer-await-to-then\n impl.apply(instance, args).then(async (result) => {\n await wait(instance.config);\n return result;\n }),\n );\n }\n\n // Copy implementation name to the returned function\n Object.defineProperty(method, 'name', { get: () => impl.name });\n\n return method as Impl;\n}\n"],"mappings":";;;;;;AAEA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,UAAA,GAAAD,OAAA;AACA,IAAAE,MAAA,GAAAF,OAAA;AACA,IAAAG,MAAA,GAAAH,OAAA;AAEA,IAAAI,MAAA,GAAAJ,OAAA;AAEA,IAAAK,OAAA,GAAAL,OAAA;AAEA,IAAAM,KAAA,GAAAN,OAAA;AACA,IAAAO,MAAA,GAAAP,OAAA;AAwBA;AACA;AACA;AACA,SAASQ,4BAA4BA,CAACC,EAAU,EAAE;EAChD,IAAI,IAAAC,gCAAwB,EAAC,CAAC,EAAE;IAC9B,OAAOC,IAAI,CAACC,mBAAmB,CAACH,EAAE,CAAC;EACrC,CAAC,MAAM;IACL,OAAOI,OAAO,CAACC,OAAO,CAAC,CAAC;EAC1B;AACF;AAEA,MAAMC,cAA+C,GAAG;EACtDC,KAAK,EAAE,CAAC;EACRC,aAAa,EAAET;AACjB,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACO,SAASU,KAAKA,CAACC,OAA+B,EAAE;EACrD,MAAMC,MAAM,GAAGC,YAAY,CAACF,OAAO,CAAC;EACpC,MAAMG,QAAQ,GAAGC,cAAc,CAACH,MAAM,CAAC;EACvC,OAAOE,QAAQ;AACjB;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAMA,SAASD,YAAYA,CAACF,OAA+B,EAAmB;EACtE,OAAO;IACL,GAAGJ,cAAc;IACjB,GAAGI;EACL,CAAC;AACH;;AAEA;AACA;AACA;;AAgEA,SAASI,cAAcA,CAACH,MAAuB,EAAqB;EAClE,MAAME,QAAQ,GAAG;IACfF;EACF,CAAsB;;EAEtB;EACA,MAAMI,GAAG,GAAG;IACVC,KAAK,EAAEC,eAAe,CAACJ,QAAQ,EAAEG,YAAK,CAAC;IACvCE,SAAS,EAAED,eAAe,CAACJ,QAAQ,EAAEK,gBAAS,CAAC;IAC/CC,IAAI,EAAEF,eAAe,CAACJ,QAAQ,EAAEM,UAAI,CAAC;IACrCC,KAAK,EAAEH,eAAe,CAACJ,QAAQ,EAAEO,YAAK,CAAC;IACvCC,KAAK,EAAEJ,eAAe,CAACJ,QAAQ,EAAEQ,YAAK,CAAC;IACvCC,QAAQ,EAAEL,eAAe,CAACJ,QAAQ,EAAES,gBAAQ;EAC9C,CAAC;EAEDC,MAAM,CAACC,MAAM,CAACX,QAAQ,EAAEE,GAAG,CAAC;EAC5B,OAAOF,QAAQ;AACjB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASI,eAAeA,CAGtBJ,QAA2B,EAAEY,IAAU,EAAE;EACzC,SAASC,MAAMA,CAAC,GAAGC,IAAU,EAAE;IAC7B,OAAO,IAAAC,oBAAS,EAAC;IACf;IACAH,IAAI,CAACI,KAAK,CAAChB,QAAQ,EAAEc,IAAI,CAAC,CAACG,IAAI,CAAC,MAAOC,MAAM,IAAK;MAChD,MAAM,IAAAC,WAAI,EAACnB,QAAQ,CAACF,MAAM,CAAC;MAC3B,OAAOoB,MAAM;IACf,CAAC,CACH,CAAC;EACH;;EAEA;EACAR,MAAM,CAACU,cAAc,CAACP,MAAM,EAAE,MAAM,EAAE;IAAEQ,GAAG,EAAEA,CAAA,KAAMT,IAAI,CAACU;EAAK,CAAC,CAAC;EAE/D,OAAOT,MAAM;AACf","ignoreList":[]}
1
+ {"version":3,"file":"setup.js","names":["_timers","require","_validateOptions","_wrapAsync","_clear","_paste","_press","_scroll","_type","_utils","universalJestAdvanceTimersBy","ms","jestFakeTimersAreEnabled","jest","advanceTimersByTime","Promise","resolve","defaultOptions","delay","advanceTimers","setup","options","config","createConfig","instance","createInstance","callsite","rest","validateOptions","undefined","api","press","wrapAndBindImpl","longPress","type","clear","paste","scrollTo","Object","assign","impl","method","args","wrapAsync","apply","then","result","wait","defineProperty","get","name"],"sources":["../../../src/user-event/setup/setup.ts"],"sourcesContent":["import type { TestInstance } from 'test-renderer';\n\nimport { jestFakeTimersAreEnabled } from '../../helpers/timers';\nimport { validateOptions } from '../../helpers/validate-options';\nimport { wrapAsync } from '../../helpers/wrap-async';\nimport { clear } from '../clear';\nimport { paste } from '../paste';\nimport type { PressOptions } from '../press';\nimport { longPress, press } from '../press';\nimport type { ScrollToOptions } from '../scroll';\nimport { scrollTo } from '../scroll';\nimport type { TypeOptions } from '../type';\nimport { type } from '../type';\nimport { wait } from '../utils';\n\nexport interface UserEventSetupOptions {\n /**\n * Between some subsequent inputs like typing a series of characters\n * the code execution is delayed per `setTimeout` for (at least) `delay` seconds.\n * This moves the next changes at least to next macro task\n * and allows other (asynchronous) code to run between events.\n *\n * `null` prevents `setTimeout` from being called.\n *\n * @default 0\n */\n delay?: number;\n\n /**\n * Function to be called to advance fake timers. Setting it is necessary for\n * fake timers to work.\n *\n * @example jest.advanceTimersByTime\n */\n advanceTimers?: (delay: number) => Promise<void> | void;\n}\n\n/**\n * This functions allow wait to work correctly under both real and fake Jest timers.\n */\nfunction universalJestAdvanceTimersBy(ms: number) {\n if (jestFakeTimersAreEnabled()) {\n return jest.advanceTimersByTime(ms);\n } else {\n return Promise.resolve();\n }\n}\n\nconst defaultOptions: Required<UserEventSetupOptions> = {\n delay: 0,\n advanceTimers: universalJestAdvanceTimersBy,\n};\n\n/**\n * Creates a new instance of user event instance with the given options.\n *\n * @param options\n * @returns UserEvent instance\n */\nexport function setup(options?: UserEventSetupOptions) {\n const config = createConfig(options, setup);\n const instance = createInstance(config);\n return instance;\n}\n\n/**\n * Options affecting all user event interactions.\n *\n * @param delay between some subsequent inputs like typing a series of characters\n * @param advanceTimers function to be called to advance fake timers\n */\nexport interface UserEventConfig {\n delay: number;\n advanceTimers: (delay: number) => Promise<void> | void;\n}\n\nfunction createConfig(\n options: UserEventSetupOptions = {},\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n callsite: Function,\n): UserEventConfig {\n const { delay, advanceTimers, ...rest } = options;\n validateOptions('userEvent.setup', rest, callsite);\n\n return {\n ...defaultOptions,\n ...(delay !== undefined && { delay }),\n ...(advanceTimers !== undefined && { advanceTimers }),\n };\n}\n\n/**\n * UserEvent instance used to invoke user interaction functions.\n */\nexport interface UserEventInstance {\n config: UserEventConfig;\n\n press: (instance: TestInstance) => Promise<void>;\n longPress: (instance: TestInstance, options?: PressOptions) => Promise<void>;\n\n /**\n * Simulate user pressing on a given `TextInput` element and typing given text.\n *\n * This method will trigger the events for each character of the text:\n * `keyPress`, `change`, `changeText`, `endEditing`, etc.\n *\n * It will also trigger events connected with entering and leaving the text\n * input.\n *\n * The exact events sent depend on the props of the TextInput (`editable`,\n * `multiline`, etc) and passed options.\n *\n * @param instance TextInput instance to type on\n * @param text Text to type\n * @param options Options affecting typing behavior:\n * - `skipPress` - if true, `pressIn` and `pressOut` events will not be\n * triggered.\n * - `submitEditing` - if true, `submitEditing` event will be triggered after\n * typing the text.\n */\n type: (instance: TestInstance, text: string, options?: TypeOptions) => Promise<void>;\n\n /**\n * Simulate user clearing the text of a given `TextInput` element.\n *\n * This method will simulate:\n * 1. entering TextInput\n * 2. selecting all text\n * 3. pressing backspace to delete all text\n * 4. leaving TextInput\n *\n * @param instance TextInput instance to clear\n */\n clear: (instance: TestInstance) => Promise<void>;\n\n /**\n * Simulate user pasting the text to a given `TextInput` element.\n *\n * This method will simulate:\n * 1. entering TextInput\n * 2. selecting all text\n * 3. paste the text\n * 4. leaving TextInput\n *\n * @param instance TextInput instance to paste to\n */\n paste: (instance: TestInstance, text: string) => Promise<void>;\n\n /**\n * Simlate user scorlling a ScrollView element.\n *\n * @param instance ScrollView instance\n * @returns\n */\n scrollTo: (instance: TestInstance, options: ScrollToOptions) => Promise<void>;\n}\n\nfunction createInstance(config: UserEventConfig): UserEventInstance {\n const instance = {\n config,\n } as UserEventInstance;\n\n // Bind interactions to given User Event instance.\n const api = {\n press: wrapAndBindImpl(instance, press),\n longPress: wrapAndBindImpl(instance, longPress),\n type: wrapAndBindImpl(instance, type),\n clear: wrapAndBindImpl(instance, clear),\n paste: wrapAndBindImpl(instance, paste),\n scrollTo: wrapAndBindImpl(instance, scrollTo),\n };\n\n Object.assign(instance, api);\n return instance;\n}\n\n/**\n * Wraps user interaction with `wrapAsync` (temporarily disable `act` environment while\n * calling & resolving the async callback, then flush the microtask queue)\n *\n * This implementation is sourced from `testing-library/user-event`\n * @see https://github.com/testing-library/user-event/blob/7a305dee9ab833d6f338d567fc2e862b4838b76a/src/setup/setup.ts#L121\n */\nfunction wrapAndBindImpl<\n Args extends never[],\n Impl extends (this: UserEventInstance, ...args: Args) => Promise<unknown>,\n>(instance: UserEventInstance, impl: Impl) {\n function method(...args: Args) {\n return wrapAsync(() =>\n // eslint-disable-next-line promise/prefer-await-to-then\n impl.apply(instance, args).then(async (result) => {\n await wait(instance.config);\n return result;\n }),\n );\n }\n\n // Copy implementation name to the returned function\n Object.defineProperty(method, 'name', { get: () => impl.name });\n\n return method as Impl;\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,16 +1,16 @@
1
- import type { HostElement } from 'test-renderer';
1
+ import type { TestInstance } from 'test-renderer';
2
2
  import type { UserEventConfig, UserEventInstance } from '../setup';
3
3
  export interface TypeOptions {
4
4
  skipPress?: boolean;
5
5
  submitEditing?: boolean;
6
6
  skipBlur?: boolean;
7
7
  }
8
- export declare function type(this: UserEventInstance, element: HostElement, text: string, options?: TypeOptions): Promise<void>;
8
+ export declare function type(this: UserEventInstance, instance: TestInstance, text: string, options?: TypeOptions): Promise<void>;
9
9
  type EmitTypingEventsContext = {
10
10
  config: UserEventConfig;
11
11
  key: string;
12
12
  text: string;
13
13
  isAccepted?: boolean;
14
14
  };
15
- export declare function emitTypingEvents(element: HostElement, { config, key, text, isAccepted }: EmitTypingEventsContext): Promise<void>;
15
+ export declare function emitTypingEvents(instance: TestInstance, { config, key, text, isAccepted }: EmitTypingEventsContext): Promise<void>;
16
16
  export {};
@@ -5,64 +5,63 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.emitTypingEvents = emitTypingEvents;
7
7
  exports.type = type;
8
+ var _eventBuilder = require("../../event-builder");
8
9
  var _errors = require("../../helpers/errors");
9
10
  var _hostComponentNames = require("../../helpers/host-component-names");
10
11
  var _pointerEvents = require("../../helpers/pointer-events");
11
12
  var _textInput = require("../../helpers/text-input");
12
13
  var _nativeState = require("../../native-state");
13
- var _eventBuilder = require("../event-builder");
14
14
  var _utils = require("../utils");
15
15
  var _parseKeys = require("./parse-keys");
16
- async function type(element, text, options) {
17
- if (!(0, _hostComponentNames.isHostTextInput)(element)) {
18
- throw new _errors.ErrorWithStack(`type() works only with host "TextInput" elements. Passed element has type "${element.type}".`, type);
16
+ async function type(instance, text, options) {
17
+ if (!(0, _hostComponentNames.isHostTextInput)(instance)) {
18
+ throw new _errors.ErrorWithStack(`type() works only with host "TextInput" instances. Passed instance has type "${instance.type}".`, type);
19
19
  }
20
20
 
21
- // Skip events if the element is disabled
22
- if (!(0, _textInput.isEditableTextInput)(element) || !(0, _pointerEvents.isPointerEventEnabled)(element)) {
21
+ // Skip events if the instance is disabled
22
+ if (!(0, _textInput.isEditableTextInput)(instance) || !(0, _pointerEvents.isPointerEventEnabled)(instance)) {
23
23
  return;
24
24
  }
25
25
  const keys = (0, _parseKeys.parseKeys)(text);
26
26
  if (!options?.skipPress) {
27
- await (0, _utils.dispatchEvent)(element, 'pressIn', _eventBuilder.EventBuilder.Common.touch());
27
+ await (0, _utils.dispatchEvent)(instance, 'pressIn', (0, _eventBuilder.buildTouchEvent)());
28
28
  }
29
- await (0, _utils.dispatchEvent)(element, 'focus', _eventBuilder.EventBuilder.Common.focus());
29
+ await (0, _utils.dispatchEvent)(instance, 'focus', (0, _eventBuilder.buildFocusEvent)());
30
30
  if (!options?.skipPress) {
31
31
  await (0, _utils.wait)(this.config);
32
- await (0, _utils.dispatchEvent)(element, 'pressOut', _eventBuilder.EventBuilder.Common.touch());
32
+ await (0, _utils.dispatchEvent)(instance, 'pressOut', (0, _eventBuilder.buildTouchEvent)());
33
33
  }
34
- let currentText = (0, _textInput.getTextInputValue)(element);
35
34
  for (const key of keys) {
36
- const previousText = (0, _textInput.getTextInputValue)(element);
35
+ const previousText = (0, _textInput.getTextInputValue)(instance);
37
36
  const proposedText = applyKey(previousText, key);
38
- const isAccepted = isTextChangeAccepted(element, proposedText);
39
- currentText = isAccepted ? proposedText : previousText;
40
- await emitTypingEvents(element, {
37
+ const isAccepted = isTextChangeAccepted(instance, proposedText);
38
+ const currentText = isAccepted ? proposedText : previousText;
39
+ await emitTypingEvents(instance, {
41
40
  config: this.config,
42
41
  key,
43
42
  text: currentText,
44
43
  isAccepted
45
44
  });
46
45
  }
47
- const finalText = (0, _textInput.getTextInputValue)(element);
46
+ const finalText = (0, _textInput.getTextInputValue)(instance);
48
47
  await (0, _utils.wait)(this.config);
49
48
  if (options?.submitEditing) {
50
- await (0, _utils.dispatchEvent)(element, 'submitEditing', _eventBuilder.EventBuilder.TextInput.submitEditing(finalText));
49
+ await (0, _utils.dispatchEvent)(instance, 'submitEditing', (0, _eventBuilder.buildSubmitEditingEvent)(finalText));
51
50
  }
52
51
  if (!options?.skipBlur) {
53
- await (0, _utils.dispatchEvent)(element, 'endEditing', _eventBuilder.EventBuilder.TextInput.endEditing(finalText));
54
- await (0, _utils.dispatchEvent)(element, 'blur', _eventBuilder.EventBuilder.Common.blur());
52
+ await (0, _utils.dispatchEvent)(instance, 'endEditing', (0, _eventBuilder.buildEndEditingEvent)(finalText));
53
+ await (0, _utils.dispatchEvent)(instance, 'blur', (0, _eventBuilder.buildBlurEvent)());
55
54
  }
56
55
  }
57
- async function emitTypingEvents(element, {
56
+ async function emitTypingEvents(instance, {
58
57
  config,
59
58
  key,
60
59
  text,
61
60
  isAccepted
62
61
  }) {
63
- const isMultiline = element.props.multiline === true;
62
+ const isMultiline = instance.props.multiline === true;
64
63
  await (0, _utils.wait)(config);
65
- await (0, _utils.dispatchEvent)(element, 'keyPress', _eventBuilder.EventBuilder.TextInput.keyPress(key));
64
+ await (0, _utils.dispatchEvent)(instance, 'keyPress', (0, _eventBuilder.buildKeyPressEvent)(key));
66
65
 
67
66
  // Platform difference (based on experiments):
68
67
  // - iOS and RN Web: TextInput emits only `keyPress` event when max length has been reached
@@ -70,20 +69,20 @@ async function emitTypingEvents(element, {
70
69
  if (isAccepted === false) {
71
70
  return;
72
71
  }
73
- _nativeState.nativeState.valueForElement.set(element, text);
74
- await (0, _utils.dispatchEvent)(element, 'change', _eventBuilder.EventBuilder.TextInput.change(text));
75
- await (0, _utils.dispatchEvent)(element, 'changeText', text);
72
+ _nativeState.nativeState.valueForInstance.set(instance, text);
73
+ await (0, _utils.dispatchEvent)(instance, 'change', (0, _eventBuilder.buildTextChangeEvent)(text));
74
+ await (0, _utils.dispatchEvent)(instance, 'changeText', text);
76
75
  const selectionRange = {
77
76
  start: text.length,
78
77
  end: text.length
79
78
  };
80
- await (0, _utils.dispatchEvent)(element, 'selectionChange', _eventBuilder.EventBuilder.TextInput.selectionChange(selectionRange));
79
+ await (0, _utils.dispatchEvent)(instance, 'selectionChange', (0, _eventBuilder.buildTextSelectionChangeEvent)(selectionRange));
81
80
 
82
81
  // According to the docs only multiline TextInput emits contentSizeChange event
83
82
  // @see: https://reactnative.dev/docs/textinput#oncontentsizechange
84
83
  if (isMultiline) {
85
84
  const contentSize = (0, _utils.getTextContentSize)(text);
86
- await (0, _utils.dispatchEvent)(element, 'contentSizeChange', _eventBuilder.EventBuilder.TextInput.contentSizeChange(contentSize));
85
+ await (0, _utils.dispatchEvent)(instance, 'contentSizeChange', (0, _eventBuilder.buildContentSizeChangeEvent)(contentSize));
87
86
  }
88
87
  }
89
88
  function applyKey(text, key) {
@@ -95,8 +94,8 @@ function applyKey(text, key) {
95
94
  }
96
95
  return text + key;
97
96
  }
98
- function isTextChangeAccepted(element, text) {
99
- const maxLength = element.props.maxLength;
97
+ function isTextChangeAccepted(instance, text) {
98
+ const maxLength = instance.props.maxLength;
100
99
  return maxLength === undefined || text.length <= maxLength;
101
100
  }
102
101
  //# sourceMappingURL=type.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"type.js","names":["_errors","require","_hostComponentNames","_pointerEvents","_textInput","_nativeState","_eventBuilder","_utils","_parseKeys","type","element","text","options","isHostTextInput","ErrorWithStack","isEditableTextInput","isPointerEventEnabled","keys","parseKeys","skipPress","dispatchEvent","EventBuilder","Common","touch","focus","wait","config","currentText","getTextInputValue","key","previousText","proposedText","applyKey","isAccepted","isTextChangeAccepted","emitTypingEvents","finalText","submitEditing","TextInput","skipBlur","endEditing","blur","isMultiline","props","multiline","keyPress","nativeState","valueForElement","set","change","selectionRange","start","length","end","selectionChange","contentSize","getTextContentSize","contentSizeChange","slice","maxLength","undefined"],"sources":["../../../src/user-event/type/type.ts"],"sourcesContent":["import type { HostElement } from 'test-renderer';\n\nimport { ErrorWithStack } from '../../helpers/errors';\nimport { isHostTextInput } from '../../helpers/host-component-names';\nimport { isPointerEventEnabled } from '../../helpers/pointer-events';\nimport { getTextInputValue, isEditableTextInput } from '../../helpers/text-input';\nimport { nativeState } from '../../native-state';\nimport { EventBuilder } from '../event-builder';\nimport type { UserEventConfig, UserEventInstance } from '../setup';\nimport { dispatchEvent, getTextContentSize, wait } from '../utils';\nimport { parseKeys } from './parse-keys';\n\nexport interface TypeOptions {\n skipPress?: boolean;\n submitEditing?: boolean;\n skipBlur?: boolean;\n}\n\nexport async function type(\n this: UserEventInstance,\n element: HostElement,\n text: string,\n options?: TypeOptions,\n): Promise<void> {\n if (!isHostTextInput(element)) {\n throw new ErrorWithStack(\n `type() works only with host \"TextInput\" elements. Passed element has type \"${element.type}\".`,\n type,\n );\n }\n\n // Skip events if the element is disabled\n if (!isEditableTextInput(element) || !isPointerEventEnabled(element)) {\n return;\n }\n\n const keys = parseKeys(text);\n\n if (!options?.skipPress) {\n await dispatchEvent(element, 'pressIn', EventBuilder.Common.touch());\n }\n\n await dispatchEvent(element, 'focus', EventBuilder.Common.focus());\n\n if (!options?.skipPress) {\n await wait(this.config);\n await dispatchEvent(element, 'pressOut', EventBuilder.Common.touch());\n }\n\n let currentText = getTextInputValue(element);\n for (const key of keys) {\n const previousText = getTextInputValue(element);\n const proposedText = applyKey(previousText, key);\n const isAccepted = isTextChangeAccepted(element, proposedText);\n currentText = isAccepted ? proposedText : previousText;\n\n await emitTypingEvents(element, {\n config: this.config,\n key,\n text: currentText,\n isAccepted,\n });\n }\n\n const finalText = getTextInputValue(element);\n await wait(this.config);\n\n if (options?.submitEditing) {\n await dispatchEvent(element, 'submitEditing', EventBuilder.TextInput.submitEditing(finalText));\n }\n\n if (!options?.skipBlur) {\n await dispatchEvent(element, 'endEditing', EventBuilder.TextInput.endEditing(finalText));\n await dispatchEvent(element, 'blur', EventBuilder.Common.blur());\n }\n}\n\ntype EmitTypingEventsContext = {\n config: UserEventConfig;\n key: string;\n text: string;\n isAccepted?: boolean;\n};\n\nexport async function emitTypingEvents(\n element: HostElement,\n { config, key, text, isAccepted }: EmitTypingEventsContext,\n) {\n const isMultiline = element.props.multiline === true;\n\n await wait(config);\n await dispatchEvent(element, 'keyPress', EventBuilder.TextInput.keyPress(key));\n\n // Platform difference (based on experiments):\n // - iOS and RN Web: TextInput emits only `keyPress` event when max length has been reached\n // - Android: TextInputs does not emit any events\n if (isAccepted === false) {\n return;\n }\n\n nativeState.valueForElement.set(element, text);\n await dispatchEvent(element, 'change', EventBuilder.TextInput.change(text));\n await dispatchEvent(element, 'changeText', text);\n\n const selectionRange = {\n start: text.length,\n end: text.length,\n };\n await dispatchEvent(\n element,\n 'selectionChange',\n EventBuilder.TextInput.selectionChange(selectionRange),\n );\n\n // According to the docs only multiline TextInput emits contentSizeChange event\n // @see: https://reactnative.dev/docs/textinput#oncontentsizechange\n if (isMultiline) {\n const contentSize = getTextContentSize(text);\n await dispatchEvent(\n element,\n 'contentSizeChange',\n EventBuilder.TextInput.contentSizeChange(contentSize),\n );\n }\n}\n\nfunction applyKey(text: string, key: string) {\n if (key === 'Enter') {\n return `${text}\\n`;\n }\n\n if (key === 'Backspace') {\n return text.slice(0, -1);\n }\n\n return text + key;\n}\n\nfunction isTextChangeAccepted(element: HostElement, text: string) {\n const maxLength = element.props.maxLength;\n return maxLength === undefined || text.length <= maxLength;\n}\n"],"mappings":";;;;;;;AAEA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,mBAAA,GAAAD,OAAA;AACA,IAAAE,cAAA,GAAAF,OAAA;AACA,IAAAG,UAAA,GAAAH,OAAA;AACA,IAAAI,YAAA,GAAAJ,OAAA;AACA,IAAAK,aAAA,GAAAL,OAAA;AAEA,IAAAM,MAAA,GAAAN,OAAA;AACA,IAAAO,UAAA,GAAAP,OAAA;AAQO,eAAeQ,IAAIA,CAExBC,OAAoB,EACpBC,IAAY,EACZC,OAAqB,EACN;EACf,IAAI,CAAC,IAAAC,mCAAe,EAACH,OAAO,CAAC,EAAE;IAC7B,MAAM,IAAII,sBAAc,CACtB,8EAA8EJ,OAAO,CAACD,IAAI,IAAI,EAC9FA,IACF,CAAC;EACH;;EAEA;EACA,IAAI,CAAC,IAAAM,8BAAmB,EAACL,OAAO,CAAC,IAAI,CAAC,IAAAM,oCAAqB,EAACN,OAAO,CAAC,EAAE;IACpE;EACF;EAEA,MAAMO,IAAI,GAAG,IAAAC,oBAAS,EAACP,IAAI,CAAC;EAE5B,IAAI,CAACC,OAAO,EAAEO,SAAS,EAAE;IACvB,MAAM,IAAAC,oBAAa,EAACV,OAAO,EAAE,SAAS,EAAEW,0BAAY,CAACC,MAAM,CAACC,KAAK,CAAC,CAAC,CAAC;EACtE;EAEA,MAAM,IAAAH,oBAAa,EAACV,OAAO,EAAE,OAAO,EAAEW,0BAAY,CAACC,MAAM,CAACE,KAAK,CAAC,CAAC,CAAC;EAElE,IAAI,CAACZ,OAAO,EAAEO,SAAS,EAAE;IACvB,MAAM,IAAAM,WAAI,EAAC,IAAI,CAACC,MAAM,CAAC;IACvB,MAAM,IAAAN,oBAAa,EAACV,OAAO,EAAE,UAAU,EAAEW,0BAAY,CAACC,MAAM,CAACC,KAAK,CAAC,CAAC,CAAC;EACvE;EAEA,IAAII,WAAW,GAAG,IAAAC,4BAAiB,EAAClB,OAAO,CAAC;EAC5C,KAAK,MAAMmB,GAAG,IAAIZ,IAAI,EAAE;IACtB,MAAMa,YAAY,GAAG,IAAAF,4BAAiB,EAAClB,OAAO,CAAC;IAC/C,MAAMqB,YAAY,GAAGC,QAAQ,CAACF,YAAY,EAAED,GAAG,CAAC;IAChD,MAAMI,UAAU,GAAGC,oBAAoB,CAACxB,OAAO,EAAEqB,YAAY,CAAC;IAC9DJ,WAAW,GAAGM,UAAU,GAAGF,YAAY,GAAGD,YAAY;IAEtD,MAAMK,gBAAgB,CAACzB,OAAO,EAAE;MAC9BgB,MAAM,EAAE,IAAI,CAACA,MAAM;MACnBG,GAAG;MACHlB,IAAI,EAAEgB,WAAW;MACjBM;IACF,CAAC,CAAC;EACJ;EAEA,MAAMG,SAAS,GAAG,IAAAR,4BAAiB,EAAClB,OAAO,CAAC;EAC5C,MAAM,IAAAe,WAAI,EAAC,IAAI,CAACC,MAAM,CAAC;EAEvB,IAAId,OAAO,EAAEyB,aAAa,EAAE;IAC1B,MAAM,IAAAjB,oBAAa,EAACV,OAAO,EAAE,eAAe,EAAEW,0BAAY,CAACiB,SAAS,CAACD,aAAa,CAACD,SAAS,CAAC,CAAC;EAChG;EAEA,IAAI,CAACxB,OAAO,EAAE2B,QAAQ,EAAE;IACtB,MAAM,IAAAnB,oBAAa,EAACV,OAAO,EAAE,YAAY,EAAEW,0BAAY,CAACiB,SAAS,CAACE,UAAU,CAACJ,SAAS,CAAC,CAAC;IACxF,MAAM,IAAAhB,oBAAa,EAACV,OAAO,EAAE,MAAM,EAAEW,0BAAY,CAACC,MAAM,CAACmB,IAAI,CAAC,CAAC,CAAC;EAClE;AACF;AASO,eAAeN,gBAAgBA,CACpCzB,OAAoB,EACpB;EAAEgB,MAAM;EAAEG,GAAG;EAAElB,IAAI;EAAEsB;AAAoC,CAAC,EAC1D;EACA,MAAMS,WAAW,GAAGhC,OAAO,CAACiC,KAAK,CAACC,SAAS,KAAK,IAAI;EAEpD,MAAM,IAAAnB,WAAI,EAACC,MAAM,CAAC;EAClB,MAAM,IAAAN,oBAAa,EAACV,OAAO,EAAE,UAAU,EAAEW,0BAAY,CAACiB,SAAS,CAACO,QAAQ,CAAChB,GAAG,CAAC,CAAC;;EAE9E;EACA;EACA;EACA,IAAII,UAAU,KAAK,KAAK,EAAE;IACxB;EACF;EAEAa,wBAAW,CAACC,eAAe,CAACC,GAAG,CAACtC,OAAO,EAAEC,IAAI,CAAC;EAC9C,MAAM,IAAAS,oBAAa,EAACV,OAAO,EAAE,QAAQ,EAAEW,0BAAY,CAACiB,SAAS,CAACW,MAAM,CAACtC,IAAI,CAAC,CAAC;EAC3E,MAAM,IAAAS,oBAAa,EAACV,OAAO,EAAE,YAAY,EAAEC,IAAI,CAAC;EAEhD,MAAMuC,cAAc,GAAG;IACrBC,KAAK,EAAExC,IAAI,CAACyC,MAAM;IAClBC,GAAG,EAAE1C,IAAI,CAACyC;EACZ,CAAC;EACD,MAAM,IAAAhC,oBAAa,EACjBV,OAAO,EACP,iBAAiB,EACjBW,0BAAY,CAACiB,SAAS,CAACgB,eAAe,CAACJ,cAAc,CACvD,CAAC;;EAED;EACA;EACA,IAAIR,WAAW,EAAE;IACf,MAAMa,WAAW,GAAG,IAAAC,yBAAkB,EAAC7C,IAAI,CAAC;IAC5C,MAAM,IAAAS,oBAAa,EACjBV,OAAO,EACP,mBAAmB,EACnBW,0BAAY,CAACiB,SAAS,CAACmB,iBAAiB,CAACF,WAAW,CACtD,CAAC;EACH;AACF;AAEA,SAASvB,QAAQA,CAACrB,IAAY,EAAEkB,GAAW,EAAE;EAC3C,IAAIA,GAAG,KAAK,OAAO,EAAE;IACnB,OAAO,GAAGlB,IAAI,IAAI;EACpB;EAEA,IAAIkB,GAAG,KAAK,WAAW,EAAE;IACvB,OAAOlB,IAAI,CAAC+C,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;EAC1B;EAEA,OAAO/C,IAAI,GAAGkB,GAAG;AACnB;AAEA,SAASK,oBAAoBA,CAACxB,OAAoB,EAAEC,IAAY,EAAE;EAChE,MAAMgD,SAAS,GAAGjD,OAAO,CAACiC,KAAK,CAACgB,SAAS;EACzC,OAAOA,SAAS,KAAKC,SAAS,IAAIjD,IAAI,CAACyC,MAAM,IAAIO,SAAS;AAC5D","ignoreList":[]}
1
+ {"version":3,"file":"type.js","names":["_eventBuilder","require","_errors","_hostComponentNames","_pointerEvents","_textInput","_nativeState","_utils","_parseKeys","type","instance","text","options","isHostTextInput","ErrorWithStack","isEditableTextInput","isPointerEventEnabled","keys","parseKeys","skipPress","dispatchEvent","buildTouchEvent","buildFocusEvent","wait","config","key","previousText","getTextInputValue","proposedText","applyKey","isAccepted","isTextChangeAccepted","currentText","emitTypingEvents","finalText","submitEditing","buildSubmitEditingEvent","skipBlur","buildEndEditingEvent","buildBlurEvent","isMultiline","props","multiline","buildKeyPressEvent","nativeState","valueForInstance","set","buildTextChangeEvent","selectionRange","start","length","end","buildTextSelectionChangeEvent","contentSize","getTextContentSize","buildContentSizeChangeEvent","slice","maxLength","undefined"],"sources":["../../../src/user-event/type/type.ts"],"sourcesContent":["import type { TestInstance } from 'test-renderer';\n\nimport {\n buildBlurEvent,\n buildContentSizeChangeEvent,\n buildEndEditingEvent,\n buildFocusEvent,\n buildKeyPressEvent,\n buildSubmitEditingEvent,\n buildTextChangeEvent,\n buildTextSelectionChangeEvent,\n buildTouchEvent,\n} from '../../event-builder';\nimport { ErrorWithStack } from '../../helpers/errors';\nimport { isHostTextInput } from '../../helpers/host-component-names';\nimport { isPointerEventEnabled } from '../../helpers/pointer-events';\nimport { getTextInputValue, isEditableTextInput } from '../../helpers/text-input';\nimport { nativeState } from '../../native-state';\nimport type { UserEventConfig, UserEventInstance } from '../setup';\nimport { dispatchEvent, getTextContentSize, wait } from '../utils';\nimport { parseKeys } from './parse-keys';\n\nexport interface TypeOptions {\n skipPress?: boolean;\n submitEditing?: boolean;\n skipBlur?: boolean;\n}\n\nexport async function type(\n this: UserEventInstance,\n instance: TestInstance,\n text: string,\n options?: TypeOptions,\n): Promise<void> {\n if (!isHostTextInput(instance)) {\n throw new ErrorWithStack(\n `type() works only with host \"TextInput\" instances. Passed instance has type \"${instance.type}\".`,\n type,\n );\n }\n\n // Skip events if the instance is disabled\n if (!isEditableTextInput(instance) || !isPointerEventEnabled(instance)) {\n return;\n }\n\n const keys = parseKeys(text);\n\n if (!options?.skipPress) {\n await dispatchEvent(instance, 'pressIn', buildTouchEvent());\n }\n\n await dispatchEvent(instance, 'focus', buildFocusEvent());\n\n if (!options?.skipPress) {\n await wait(this.config);\n await dispatchEvent(instance, 'pressOut', buildTouchEvent());\n }\n\n for (const key of keys) {\n const previousText = getTextInputValue(instance);\n const proposedText = applyKey(previousText, key);\n const isAccepted = isTextChangeAccepted(instance, proposedText);\n const currentText = isAccepted ? proposedText : previousText;\n\n await emitTypingEvents(instance, {\n config: this.config,\n key,\n text: currentText,\n isAccepted,\n });\n }\n\n const finalText = getTextInputValue(instance);\n await wait(this.config);\n\n if (options?.submitEditing) {\n await dispatchEvent(instance, 'submitEditing', buildSubmitEditingEvent(finalText));\n }\n\n if (!options?.skipBlur) {\n await dispatchEvent(instance, 'endEditing', buildEndEditingEvent(finalText));\n await dispatchEvent(instance, 'blur', buildBlurEvent());\n }\n}\n\ntype EmitTypingEventsContext = {\n config: UserEventConfig;\n key: string;\n text: string;\n isAccepted?: boolean;\n};\n\nexport async function emitTypingEvents(\n instance: TestInstance,\n { config, key, text, isAccepted }: EmitTypingEventsContext,\n) {\n const isMultiline = instance.props.multiline === true;\n\n await wait(config);\n await dispatchEvent(instance, 'keyPress', buildKeyPressEvent(key));\n\n // Platform difference (based on experiments):\n // - iOS and RN Web: TextInput emits only `keyPress` event when max length has been reached\n // - Android: TextInputs does not emit any events\n if (isAccepted === false) {\n return;\n }\n\n nativeState.valueForInstance.set(instance, text);\n await dispatchEvent(instance, 'change', buildTextChangeEvent(text));\n await dispatchEvent(instance, 'changeText', text);\n\n const selectionRange = {\n start: text.length,\n end: text.length,\n };\n await dispatchEvent(instance, 'selectionChange', buildTextSelectionChangeEvent(selectionRange));\n\n // According to the docs only multiline TextInput emits contentSizeChange event\n // @see: https://reactnative.dev/docs/textinput#oncontentsizechange\n if (isMultiline) {\n const contentSize = getTextContentSize(text);\n await dispatchEvent(instance, 'contentSizeChange', buildContentSizeChangeEvent(contentSize));\n }\n}\n\nfunction applyKey(text: string, key: string) {\n if (key === 'Enter') {\n return `${text}\\n`;\n }\n\n if (key === 'Backspace') {\n return text.slice(0, -1);\n }\n\n return text + key;\n}\n\nfunction isTextChangeAccepted(instance: TestInstance, text: string) {\n const maxLength = instance.props.maxLength;\n return maxLength === undefined || text.length <= maxLength;\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,9 +1,9 @@
1
- import type { HostElement } from 'test-renderer';
1
+ import type { TestInstance } from 'test-renderer';
2
2
  /**
3
3
  * Basic dispatch event function used by User Event module.
4
4
  *
5
- * @param element element trigger event on
5
+ * @param instance instance to trigger event on
6
6
  * @param eventName name of the event
7
7
  * @param event event payload(s)
8
8
  */
9
- export declare function dispatchEvent(element: HostElement, eventName: string, ...event: unknown[]): Promise<void>;
9
+ export declare function dispatchEvent(instance: TestInstance, eventName: string, ...event: unknown[]): Promise<void>;
@@ -10,15 +10,15 @@ var _componentTree = require("../../helpers/component-tree");
10
10
  /**
11
11
  * Basic dispatch event function used by User Event module.
12
12
  *
13
- * @param element element trigger event on
13
+ * @param instance instance to trigger event on
14
14
  * @param eventName name of the event
15
15
  * @param event event payload(s)
16
16
  */
17
- async function dispatchEvent(element, eventName, ...event) {
18
- if (!(0, _componentTree.isElementMounted)(element)) {
17
+ async function dispatchEvent(instance, eventName, ...event) {
18
+ if (!(0, _componentTree.isInstanceMounted)(instance)) {
19
19
  return;
20
20
  }
21
- const handler = (0, _eventHandler.getEventHandlerFromProps)(element.props, eventName);
21
+ const handler = (0, _eventHandler.getEventHandlerFromProps)(instance.props, eventName);
22
22
  if (!handler) {
23
23
  return;
24
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"dispatch-event.js","names":["_act","require","_eventHandler","_componentTree","dispatchEvent","element","eventName","event","isElementMounted","handler","getEventHandlerFromProps","props","act"],"sources":["../../../src/user-event/utils/dispatch-event.ts"],"sourcesContent":["import type { HostElement } from 'test-renderer';\n\nimport { act } from '../../act';\nimport { getEventHandlerFromProps } from '../../event-handler';\nimport { isElementMounted } from '../../helpers/component-tree';\n\n/**\n * Basic dispatch event function used by User Event module.\n *\n * @param element element trigger event on\n * @param eventName name of the event\n * @param event event payload(s)\n */\nexport async function dispatchEvent(element: HostElement, eventName: string, ...event: unknown[]) {\n if (!isElementMounted(element)) {\n return;\n }\n\n const handler = getEventHandlerFromProps(element.props, eventName);\n if (!handler) {\n return;\n }\n\n await act(() => {\n handler(...event);\n });\n}\n"],"mappings":";;;;;;AAEA,IAAAA,IAAA,GAAAC,OAAA;AACA,IAAAC,aAAA,GAAAD,OAAA;AACA,IAAAE,cAAA,GAAAF,OAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,eAAeG,aAAaA,CAACC,OAAoB,EAAEC,SAAiB,EAAE,GAAGC,KAAgB,EAAE;EAChG,IAAI,CAAC,IAAAC,+BAAgB,EAACH,OAAO,CAAC,EAAE;IAC9B;EACF;EAEA,MAAMI,OAAO,GAAG,IAAAC,sCAAwB,EAACL,OAAO,CAACM,KAAK,EAAEL,SAAS,CAAC;EAClE,IAAI,CAACG,OAAO,EAAE;IACZ;EACF;EAEA,MAAM,IAAAG,QAAG,EAAC,MAAM;IACdH,OAAO,CAAC,GAAGF,KAAK,CAAC;EACnB,CAAC,CAAC;AACJ","ignoreList":[]}
1
+ {"version":3,"file":"dispatch-event.js","names":["_act","require","_eventHandler","_componentTree","dispatchEvent","instance","eventName","event","isInstanceMounted","handler","getEventHandlerFromProps","props","act"],"sources":["../../../src/user-event/utils/dispatch-event.ts"],"sourcesContent":["import type { TestInstance } from 'test-renderer';\n\nimport { act } from '../../act';\nimport { getEventHandlerFromProps } from '../../event-handler';\nimport { isInstanceMounted } from '../../helpers/component-tree';\n\n/**\n * Basic dispatch event function used by User Event module.\n *\n * @param instance instance to trigger event on\n * @param eventName name of the event\n * @param event event payload(s)\n */\nexport async function dispatchEvent(\n instance: TestInstance,\n eventName: string,\n ...event: unknown[]\n) {\n if (!isInstanceMounted(instance)) {\n return;\n }\n\n const handler = getEventHandlerFromProps(instance.props, eventName);\n if (!handler) {\n return;\n }\n\n await act(() => {\n handler(...event);\n });\n}\n"],"mappings":";;;;;;AAEA,IAAAA,IAAA,GAAAC,OAAA;AACA,IAAAC,aAAA,GAAAD,OAAA;AACA,IAAAE,cAAA,GAAAF,OAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,eAAeG,aAAaA,CACjCC,QAAsB,EACtBC,SAAiB,EACjB,GAAGC,KAAgB,EACnB;EACA,IAAI,CAAC,IAAAC,gCAAiB,EAACH,QAAQ,CAAC,EAAE;IAChC;EACF;EAEA,MAAMI,OAAO,GAAG,IAAAC,sCAAwB,EAACL,QAAQ,CAACM,KAAK,EAAEL,SAAS,CAAC;EACnE,IAAI,CAACG,OAAO,EAAE;IACZ;EACF;EAEA,MAAM,IAAAG,QAAG,EAAC,MAAM;IACdH,OAAO,CAAC,GAAGF,KAAK,CAAC;EACnB,CAAC,CAAC;AACJ","ignoreList":[]}
@@ -1,4 +1,3 @@
1
1
  export * from './content-size';
2
2
  export * from './dispatch-event';
3
- export * from './text-range';
4
3
  export * from './wait';
@@ -25,17 +25,6 @@ Object.keys(_dispatchEvent).forEach(function (key) {
25
25
  }
26
26
  });
27
27
  });
28
- var _textRange = require("./text-range");
29
- Object.keys(_textRange).forEach(function (key) {
30
- if (key === "default" || key === "__esModule") return;
31
- if (key in exports && exports[key] === _textRange[key]) return;
32
- Object.defineProperty(exports, key, {
33
- enumerable: true,
34
- get: function () {
35
- return _textRange[key];
36
- }
37
- });
38
- });
39
28
  var _wait = require("./wait");
40
29
  Object.keys(_wait).forEach(function (key) {
41
30
  if (key === "default" || key === "__esModule") return;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_contentSize","require","Object","keys","forEach","key","exports","defineProperty","enumerable","get","_dispatchEvent","_textRange","_wait"],"sources":["../../../src/user-event/utils/index.ts"],"sourcesContent":["export * from './content-size';\nexport * from './dispatch-event';\nexport * from './text-range';\nexport * from './wait';\n"],"mappings":";;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAH,YAAA,EAAAI,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAL,YAAA,CAAAK,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAT,YAAA,CAAAK,GAAA;IAAA;EAAA;AAAA;AACA,IAAAK,cAAA,GAAAT,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAO,cAAA,EAAAN,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAK,cAAA,CAAAL,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAC,cAAA,CAAAL,GAAA;IAAA;EAAA;AAAA;AACA,IAAAM,UAAA,GAAAV,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAQ,UAAA,EAAAP,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAM,UAAA,CAAAN,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAE,UAAA,CAAAN,GAAA;IAAA;EAAA;AAAA;AACA,IAAAO,KAAA,GAAAX,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAS,KAAA,EAAAR,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAO,KAAA,CAAAP,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAG,KAAA,CAAAP,GAAA;IAAA;EAAA;AAAA","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["_contentSize","require","Object","keys","forEach","key","exports","defineProperty","enumerable","get","_dispatchEvent","_wait"],"sources":["../../../src/user-event/utils/index.ts"],"sourcesContent":["export * from './content-size';\nexport * from './dispatch-event';\nexport * from './wait';\n"],"mappings":";;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAH,YAAA,EAAAI,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAL,YAAA,CAAAK,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAT,YAAA,CAAAK,GAAA;IAAA;EAAA;AAAA;AACA,IAAAK,cAAA,GAAAT,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAO,cAAA,EAAAN,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAK,cAAA,CAAAL,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAC,cAAA,CAAAL,GAAA;IAAA;EAAA;AAAA;AACA,IAAAM,KAAA,GAAAV,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAQ,KAAA,EAAAP,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAM,KAAA,CAAAN,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAE,KAAA,CAAAN,GAAA;IAAA;EAAA;AAAA","ignoreList":[]}
package/build/wait-for.js CHANGED
@@ -40,9 +40,7 @@ function waitForInternal(expectation, {
40
40
  while (!finished) {
41
41
  if (!(0, _timers.jestFakeTimersAreEnabled)()) {
42
42
  const error = new Error(`Changed from using fake timers to real timers while using waitFor. This is not allowed and will result in very strange behavior. Please ensure you're awaiting all async things your test is doing before changing to real timers. For more info, please go to https://github.com/testing-library/dom-testing-library/issues/830`);
43
- if (stackTraceError) {
44
- (0, _errors.copyStackTrace)(error, stackTraceError);
45
- }
43
+ (0, _errors.copyStackTraceIfNeeded)(error, stackTraceError);
46
44
  reject(error);
47
45
  return;
48
46
  }
@@ -96,16 +94,17 @@ function waitForInternal(expectation, {
96
94
  function checkRealTimersCallback() {
97
95
  if ((0, _timers.jestFakeTimersAreEnabled)()) {
98
96
  const error = new Error(`Changed from using real timers to fake timers while using waitFor. This is not allowed and will result in very strange behavior. Please ensure you're awaiting all async things your test is doing before changing to fake timers. For more info, please go to https://github.com/testing-library/dom-testing-library/issues/830`);
99
- if (stackTraceError) {
100
- (0, _errors.copyStackTrace)(error, stackTraceError);
101
- }
97
+ (0, _errors.copyStackTraceIfNeeded)(error, stackTraceError);
102
98
  return reject(error);
103
99
  } else {
104
100
  return checkExpectation();
105
101
  }
106
102
  }
107
103
  function checkExpectation() {
108
- if (promiseStatus === 'pending') return;
104
+ /* istanbul ignore next */
105
+ if (promiseStatus === 'pending') {
106
+ return;
107
+ }
109
108
  try {
110
109
  const result = expectation();
111
110
 
@@ -146,14 +145,10 @@ function waitForInternal(expectation, {
146
145
  } else {
147
146
  error = new Error(String(lastError));
148
147
  }
149
- if (stackTraceError) {
150
- (0, _errors.copyStackTrace)(error, stackTraceError);
151
- }
148
+ (0, _errors.copyStackTraceIfNeeded)(error, stackTraceError);
152
149
  } else {
153
150
  error = new Error('Timed out in waitFor.');
154
- if (stackTraceError) {
155
- (0, _errors.copyStackTrace)(error, stackTraceError);
156
- }
151
+ (0, _errors.copyStackTraceIfNeeded)(error, stackTraceError);
157
152
  }
158
153
  if (typeof onTimeout === 'function') {
159
154
  const result = onTimeout(error);
@@ -1 +1 @@
1
- {"version":3,"file":"wait-for.js","names":["_act","require","_config","_flushMicroTasks","_errors","_timers","_wrapAsync","DEFAULT_INTERVAL","waitForInternal","expectation","timeout","getConfig","asyncUtilTimeout","interval","stackTraceError","onTimeout","TypeError","Promise","resolve","reject","lastError","intervalId","finished","promiseStatus","overallTimeoutTimer","fakeTimersType","getJestFakeTimersType","checkExpectation","fakeTimeRemaining","jestFakeTimersAreEnabled","error","Error","copyStackTrace","handleTimeout","act","jest","advanceTimersByTimeAsync","advanceTimersByTime","flushMicroTasks","setTimeout","setInterval","checkRealTimersCallback","onDone","done","clearTimeout","clearInterval","type","result","then","promiseResult","resolvedValue","rejectedValue","String","waitFor","options","ErrorWithStack","optionsWithStackTrace","wrapAsync"],"sources":["../src/wait-for.ts"],"sourcesContent":["/* globals jest */\nimport { act } from './act';\nimport { getConfig } from './config';\nimport { flushMicroTasks } from './flush-micro-tasks';\nimport { copyStackTrace, ErrorWithStack } from './helpers/errors';\nimport {\n clearTimeout,\n getJestFakeTimersType,\n jestFakeTimersAreEnabled,\n setTimeout,\n} from './helpers/timers';\nimport { wrapAsync } from './helpers/wrap-async';\n\nconst DEFAULT_INTERVAL = 50;\n\nexport type WaitForOptions = {\n timeout?: number;\n interval?: number;\n stackTraceError?: ErrorWithStack;\n onTimeout?: (error: Error) => Error;\n};\n\nfunction waitForInternal<T>(\n expectation: () => T,\n {\n timeout = getConfig().asyncUtilTimeout,\n interval = DEFAULT_INTERVAL,\n stackTraceError,\n onTimeout,\n }: WaitForOptions,\n): Promise<T> {\n if (typeof expectation !== 'function') {\n throw new TypeError('Received `expectation` arg must be a function');\n }\n\n // eslint-disable-next-line no-async-promise-executor\n return new Promise(async (resolve, reject) => {\n let lastError: unknown, intervalId: ReturnType<typeof setTimeout>;\n let finished = false;\n let promiseStatus = 'idle';\n\n let overallTimeoutTimer: NodeJS.Timeout | null = null;\n\n const fakeTimersType = getJestFakeTimersType();\n\n if (fakeTimersType) {\n checkExpectation();\n // this is a dangerous rule to disable because it could lead to an\n // infinite loop. However, eslint isn't smart enough to know that we're\n // setting finished inside `onDone` which will be called when we're done\n // waiting or when we've timed out.\n let fakeTimeRemaining = timeout;\n while (!finished) {\n if (!jestFakeTimersAreEnabled()) {\n const error = new Error(\n `Changed from using fake timers to real timers while using waitFor. This is not allowed and will result in very strange behavior. Please ensure you're awaiting all async things your test is doing before changing to real timers. For more info, please go to https://github.com/testing-library/dom-testing-library/issues/830`,\n );\n if (stackTraceError) {\n copyStackTrace(error, stackTraceError);\n }\n reject(error);\n return;\n }\n\n // when fake timers are used we want to simulate the interval time passing\n if (fakeTimeRemaining <= 0) {\n handleTimeout();\n return;\n } else {\n fakeTimeRemaining -= interval;\n }\n\n // we *could* (maybe should?) use `advanceTimersToNextTimer` but it's\n // possible that could make this loop go on forever if someone is using\n // third party code that's setting up recursive timers so rapidly that\n // the user's timer's don't get a chance to resolve. So we'll advance\n // by an interval instead. (We have a test for this case).\n await act(() =>\n fakeTimersType === 'modern'\n ? jest.advanceTimersByTimeAsync(interval)\n : jest.advanceTimersByTime(interval),\n );\n\n // It's really important that checkExpectation is run *before* we flush\n // in-flight promises. To be honest, I'm not sure why, and I can't quite\n // think of a way to reproduce the problem in a test, but I spent\n // an entire day banging my head against a wall on this.\n checkExpectation();\n\n // In this rare case, we *need* to wait for in-flight promises\n // to resolve before continuing. We don't need to take advantage\n // of parallelization so we're fine.\n // https://stackoverflow.com/a/59243586/971592\n await flushMicroTasks();\n }\n } else {\n overallTimeoutTimer = setTimeout(handleTimeout, timeout);\n intervalId = setInterval(checkRealTimersCallback, interval);\n checkExpectation();\n }\n\n function onDone(done: { type: 'result'; result: T } | { type: 'error'; error: unknown }) {\n finished = true;\n if (overallTimeoutTimer) {\n clearTimeout(overallTimeoutTimer);\n }\n\n if (!fakeTimersType) {\n clearInterval(intervalId);\n }\n\n if (done.type === 'error') {\n reject(done.error);\n } else {\n resolve(done.result);\n }\n }\n\n function checkRealTimersCallback() {\n if (jestFakeTimersAreEnabled()) {\n const error = new Error(\n `Changed from using real timers to fake timers while using waitFor. This is not allowed and will result in very strange behavior. Please ensure you're awaiting all async things your test is doing before changing to fake timers. For more info, please go to https://github.com/testing-library/dom-testing-library/issues/830`,\n );\n if (stackTraceError) {\n copyStackTrace(error, stackTraceError);\n }\n return reject(error);\n } else {\n return checkExpectation();\n }\n }\n\n function checkExpectation() {\n if (promiseStatus === 'pending') return;\n try {\n const result = expectation();\n\n // @ts-expect-error result can be a promise\n if (typeof result?.then === 'function') {\n const promiseResult: Promise<T> = result as unknown as Promise<T>;\n promiseStatus = 'pending';\n // eslint-disable-next-line promise/catch-or-return, promise/prefer-await-to-then\n promiseResult.then(\n (resolvedValue) => {\n promiseStatus = 'resolved';\n onDone({ type: 'result', result: resolvedValue });\n return;\n },\n (rejectedValue) => {\n promiseStatus = 'rejected';\n lastError = rejectedValue;\n return;\n },\n );\n } else {\n onDone({ type: 'result', result: result });\n }\n // If `callback` throws, wait for the next mutation, interval, or timeout.\n } catch (error) {\n // Save the most recent callback error to reject the promise with it in the event of a timeout\n lastError = error;\n }\n }\n\n function handleTimeout() {\n let error: Error;\n if (lastError) {\n if (lastError instanceof Error) {\n error = lastError;\n } else {\n error = new Error(String(lastError));\n }\n\n if (stackTraceError) {\n copyStackTrace(error, stackTraceError);\n }\n } else {\n error = new Error('Timed out in waitFor.');\n if (stackTraceError) {\n copyStackTrace(error, stackTraceError);\n }\n }\n if (typeof onTimeout === 'function') {\n const result = onTimeout(error);\n if (result) {\n error = result;\n }\n }\n onDone({ type: 'error', error });\n }\n });\n}\n\nexport function waitFor<T>(expectation: () => T, options?: WaitForOptions): Promise<T> {\n // Being able to display a useful stack trace requires generating it before doing anything async\n const stackTraceError = new ErrorWithStack('STACK_TRACE_ERROR', waitFor);\n const optionsWithStackTrace = { stackTraceError, ...options };\n\n return wrapAsync(() => waitForInternal(expectation, optionsWithStackTrace));\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"wait-for.js","names":["_act","require","_config","_flushMicroTasks","_errors","_timers","_wrapAsync","DEFAULT_INTERVAL","waitForInternal","expectation","timeout","getConfig","asyncUtilTimeout","interval","stackTraceError","onTimeout","TypeError","Promise","resolve","reject","lastError","intervalId","finished","promiseStatus","overallTimeoutTimer","fakeTimersType","getJestFakeTimersType","checkExpectation","fakeTimeRemaining","jestFakeTimersAreEnabled","error","Error","copyStackTraceIfNeeded","handleTimeout","act","jest","advanceTimersByTimeAsync","advanceTimersByTime","flushMicroTasks","setTimeout","setInterval","checkRealTimersCallback","onDone","done","clearTimeout","clearInterval","type","result","then","promiseResult","resolvedValue","rejectedValue","String","waitFor","options","ErrorWithStack","optionsWithStackTrace","wrapAsync"],"sources":["../src/wait-for.ts"],"sourcesContent":["/* globals jest */\nimport { act } from './act';\nimport { getConfig } from './config';\nimport { flushMicroTasks } from './flush-micro-tasks';\nimport { copyStackTraceIfNeeded, ErrorWithStack } from './helpers/errors';\nimport {\n clearTimeout,\n getJestFakeTimersType,\n jestFakeTimersAreEnabled,\n setTimeout,\n} from './helpers/timers';\nimport { wrapAsync } from './helpers/wrap-async';\n\nconst DEFAULT_INTERVAL = 50;\n\nexport type WaitForOptions = {\n timeout?: number;\n interval?: number;\n stackTraceError?: ErrorWithStack;\n onTimeout?: (error: Error) => Error;\n};\n\nfunction waitForInternal<T>(\n expectation: () => T,\n {\n timeout = getConfig().asyncUtilTimeout,\n interval = DEFAULT_INTERVAL,\n stackTraceError,\n onTimeout,\n }: WaitForOptions,\n): Promise<T> {\n if (typeof expectation !== 'function') {\n throw new TypeError('Received `expectation` arg must be a function');\n }\n\n // eslint-disable-next-line no-async-promise-executor\n return new Promise(async (resolve, reject) => {\n let lastError: unknown, intervalId: ReturnType<typeof setTimeout>;\n let finished = false;\n let promiseStatus = 'idle';\n\n let overallTimeoutTimer: NodeJS.Timeout | null = null;\n\n const fakeTimersType = getJestFakeTimersType();\n\n if (fakeTimersType) {\n checkExpectation();\n // this is a dangerous rule to disable because it could lead to an\n // infinite loop. However, eslint isn't smart enough to know that we're\n // setting finished inside `onDone` which will be called when we're done\n // waiting or when we've timed out.\n let fakeTimeRemaining = timeout;\n while (!finished) {\n if (!jestFakeTimersAreEnabled()) {\n const error = new Error(\n `Changed from using fake timers to real timers while using waitFor. This is not allowed and will result in very strange behavior. Please ensure you're awaiting all async things your test is doing before changing to real timers. For more info, please go to https://github.com/testing-library/dom-testing-library/issues/830`,\n );\n copyStackTraceIfNeeded(error, stackTraceError);\n reject(error);\n return;\n }\n\n // when fake timers are used we want to simulate the interval time passing\n if (fakeTimeRemaining <= 0) {\n handleTimeout();\n return;\n } else {\n fakeTimeRemaining -= interval;\n }\n\n // we *could* (maybe should?) use `advanceTimersToNextTimer` but it's\n // possible that could make this loop go on forever if someone is using\n // third party code that's setting up recursive timers so rapidly that\n // the user's timer's don't get a chance to resolve. So we'll advance\n // by an interval instead. (We have a test for this case).\n await act(() =>\n fakeTimersType === 'modern'\n ? jest.advanceTimersByTimeAsync(interval)\n : jest.advanceTimersByTime(interval),\n );\n\n // It's really important that checkExpectation is run *before* we flush\n // in-flight promises. To be honest, I'm not sure why, and I can't quite\n // think of a way to reproduce the problem in a test, but I spent\n // an entire day banging my head against a wall on this.\n checkExpectation();\n\n // In this rare case, we *need* to wait for in-flight promises\n // to resolve before continuing. We don't need to take advantage\n // of parallelization so we're fine.\n // https://stackoverflow.com/a/59243586/971592\n await flushMicroTasks();\n }\n } else {\n overallTimeoutTimer = setTimeout(handleTimeout, timeout);\n intervalId = setInterval(checkRealTimersCallback, interval);\n checkExpectation();\n }\n\n function onDone(done: { type: 'result'; result: T } | { type: 'error'; error: unknown }) {\n finished = true;\n if (overallTimeoutTimer) {\n clearTimeout(overallTimeoutTimer);\n }\n\n if (!fakeTimersType) {\n clearInterval(intervalId);\n }\n\n if (done.type === 'error') {\n reject(done.error);\n } else {\n resolve(done.result);\n }\n }\n\n function checkRealTimersCallback() {\n if (jestFakeTimersAreEnabled()) {\n const error = new Error(\n `Changed from using real timers to fake timers while using waitFor. This is not allowed and will result in very strange behavior. Please ensure you're awaiting all async things your test is doing before changing to fake timers. For more info, please go to https://github.com/testing-library/dom-testing-library/issues/830`,\n );\n copyStackTraceIfNeeded(error, stackTraceError);\n return reject(error);\n } else {\n return checkExpectation();\n }\n }\n\n function checkExpectation() {\n /* istanbul ignore next */\n if (promiseStatus === 'pending') {\n return;\n }\n\n try {\n const result = expectation();\n\n // @ts-expect-error result can be a promise\n if (typeof result?.then === 'function') {\n const promiseResult: Promise<T> = result as unknown as Promise<T>;\n promiseStatus = 'pending';\n // eslint-disable-next-line promise/catch-or-return, promise/prefer-await-to-then\n promiseResult.then(\n (resolvedValue) => {\n promiseStatus = 'resolved';\n onDone({ type: 'result', result: resolvedValue });\n return;\n },\n (rejectedValue) => {\n promiseStatus = 'rejected';\n lastError = rejectedValue;\n return;\n },\n );\n } else {\n onDone({ type: 'result', result: result });\n }\n // If `callback` throws, wait for the next mutation, interval, or timeout.\n } catch (error) {\n // Save the most recent callback error to reject the promise with it in the event of a timeout\n lastError = error;\n }\n }\n\n function handleTimeout() {\n let error: Error;\n if (lastError) {\n if (lastError instanceof Error) {\n error = lastError;\n } else {\n error = new Error(String(lastError));\n }\n\n copyStackTraceIfNeeded(error, stackTraceError);\n } else {\n error = new Error('Timed out in waitFor.');\n copyStackTraceIfNeeded(error, stackTraceError);\n }\n if (typeof onTimeout === 'function') {\n const result = onTimeout(error);\n if (result) {\n error = result;\n }\n }\n onDone({ type: 'error', error });\n }\n });\n}\n\nexport function waitFor<T>(expectation: () => T, options?: WaitForOptions): Promise<T> {\n // Being able to display a useful stack trace requires generating it before doing anything async\n const stackTraceError = new ErrorWithStack('STACK_TRACE_ERROR', waitFor);\n const optionsWithStackTrace = { stackTraceError, ...options };\n\n return wrapAsync(() => waitForInternal(expectation, optionsWithStackTrace));\n}\n"],"mappings":"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","ignoreList":[]}