@testing-library/react-native 13.2.2 → 13.3.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 (43) hide show
  1. package/build/fire-event.d.ts +7 -0
  2. package/build/fire-event.js +20 -0
  3. package/build/fire-event.js.map +1 -1
  4. package/build/pure.d.ts +5 -3
  5. package/build/pure.js +21 -1
  6. package/build/pure.js.map +1 -1
  7. package/build/render-act.d.ts +1 -0
  8. package/build/render-act.js +13 -0
  9. package/build/render-act.js.map +1 -1
  10. package/build/render-async.d.ts +104 -0
  11. package/build/render-async.js +104 -0
  12. package/build/render-async.js.map +1 -0
  13. package/build/render-hook.d.ts +7 -1
  14. package/build/render-hook.js +44 -11
  15. package/build/render-hook.js.map +1 -1
  16. package/build/render.d.ts +8 -2
  17. package/build/render.js +24 -11
  18. package/build/render.js.map +1 -1
  19. package/build/screen.js +4 -1
  20. package/build/screen.js.map +1 -1
  21. package/build/test-utils/console.d.ts +1 -0
  22. package/build/test-utils/console.js +17 -0
  23. package/build/test-utils/console.js.map +1 -0
  24. package/build/tsconfig.release.tsbuildinfo +1 -1
  25. package/build/user-event/clear.js +4 -4
  26. package/build/user-event/clear.js.map +1 -1
  27. package/build/user-event/paste.js +8 -8
  28. package/build/user-event/paste.js.map +1 -1
  29. package/build/user-event/press/press.js +6 -6
  30. package/build/user-event/press/press.js.map +1 -1
  31. package/build/user-event/scroll/scroll-to.js +7 -7
  32. package/build/user-event/scroll/scroll-to.js.map +1 -1
  33. package/build/user-event/type/type.js +11 -11
  34. package/build/user-event/type/type.js.map +1 -1
  35. package/build/user-event/utils/dispatch-event.d.ts +1 -1
  36. package/build/user-event/utils/dispatch-event.js +3 -3
  37. package/build/user-event/utils/dispatch-event.js.map +1 -1
  38. package/build/wait-for.js +3 -1
  39. package/build/wait-for.js.map +1 -1
  40. package/package.json +1 -1
  41. package/build/test-utils/index.d.ts +0 -1
  42. package/build/test-utils/index.js +0 -17
  43. package/build/test-utils/index.js.map +0 -1
@@ -13,4 +13,11 @@ declare namespace fireEvent {
13
13
  var changeText: (element: ReactTestInstance, ...data: unknown[]) => undefined;
14
14
  var scroll: (element: ReactTestInstance, ...data: unknown[]) => undefined;
15
15
  }
16
+ declare function fireEventAsync(element: ReactTestInstance, eventName: EventName, ...data: unknown[]): Promise<undefined>;
17
+ declare namespace fireEventAsync {
18
+ var press: (element: ReactTestInstance, ...data: unknown[]) => Promise<undefined>;
19
+ var changeText: (element: ReactTestInstance, ...data: unknown[]) => Promise<undefined>;
20
+ var scroll: (element: ReactTestInstance, ...data: unknown[]) => Promise<undefined>;
21
+ }
22
+ export { fireEventAsync };
16
23
  export default fireEvent;
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
+ exports.fireEventAsync = fireEventAsync;
7
8
  exports.isEventEnabled = isEventEnabled;
8
9
  exports.isTouchResponder = isTouchResponder;
9
10
  var _act = _interopRequireDefault(require("./act"));
@@ -84,6 +85,25 @@ function fireEvent(element, eventName, ...data) {
84
85
  fireEvent.press = (element, ...data) => fireEvent(element, 'press', ...data);
85
86
  fireEvent.changeText = (element, ...data) => fireEvent(element, 'changeText', ...data);
86
87
  fireEvent.scroll = (element, ...data) => fireEvent(element, 'scroll', ...data);
88
+ async function fireEventAsync(element, eventName, ...data) {
89
+ if (!(0, _componentTree.isElementMounted)(element)) {
90
+ return;
91
+ }
92
+ setNativeStateIfNeeded(element, eventName, data[0]);
93
+ const handler = findEventHandler(element, eventName);
94
+ if (!handler) {
95
+ return;
96
+ }
97
+ let returnValue;
98
+ // eslint-disable-next-line require-await
99
+ await (0, _act.default)(async () => {
100
+ returnValue = handler(...data);
101
+ });
102
+ return returnValue;
103
+ }
104
+ fireEventAsync.press = async (element, ...data) => await fireEventAsync(element, 'press', ...data);
105
+ fireEventAsync.changeText = async (element, ...data) => await fireEventAsync(element, 'changeText', ...data);
106
+ fireEventAsync.scroll = async (element, ...data) => await fireEventAsync(element, 'scroll', ...data);
87
107
  var _default = exports.default = fireEvent;
88
108
  const scrollEventNames = new Set(['scroll', 'scrollBeginDrag', 'scrollEndDrag', 'momentumScrollBegin', 'momentumScrollEnd']);
89
109
  function setNativeStateIfNeeded(element, eventName, value) {
@@ -1 +1 @@
1
- {"version":3,"file":"fire-event.js","names":["_act","_interopRequireDefault","require","_eventHandler","_componentTree","_hostComponentNames","_pointerEvents","_textInput","_nativeState","e","__esModule","default","isTouchResponder","element","isHostElement","Boolean","props","onStartShouldSetResponder","isHostTextInput","eventsAffectedByPointerEventsProp","Set","textInputEventsIgnoringEditableProp","isEventEnabled","eventName","nearestTouchResponder","isEditableTextInput","has","isPointerEventEnabled","touchStart","touchMove","onMoveShouldSetResponder","undefined","findEventHandler","touchResponder","handler","getEventHandler","loose","parent","fireEvent","data","isElementMounted","setNativeStateIfNeeded","returnValue","act","press","changeText","scroll","_default","exports","scrollEventNames","value","nativeState","valueForElement","set","isHostScrollView","contentOffset","tryGetContentOffset","contentOffsetForElement","event","nativeEvent","x","y","Number","isFinite"],"sources":["../src/fire-event.ts"],"sourcesContent":["import type {\n PressableProps,\n ScrollViewProps,\n TextInputProps,\n TextProps,\n ViewProps,\n} from 'react-native';\nimport type { ReactTestInstance } from 'react-test-renderer';\n\nimport act from './act';\nimport { getEventHandler } from './event-handler';\nimport { isElementMounted, isHostElement } from './helpers/component-tree';\nimport { isHostScrollView, isHostTextInput } from './helpers/host-component-names';\nimport { isPointerEventEnabled } from './helpers/pointer-events';\nimport { isEditableTextInput } from './helpers/text-input';\nimport { nativeState } from './native-state';\nimport type { Point, StringWithAutocomplete } from './types';\n\ntype EventHandler = (...args: unknown[]) => unknown;\n\nexport function isTouchResponder(element: ReactTestInstance) {\n if (!isHostElement(element)) {\n return false;\n }\n\n return Boolean(element.props.onStartShouldSetResponder) || isHostTextInput(element);\n}\n\n/**\n * List of events affected by `pointerEvents` prop.\n *\n * Note: `fireEvent` is accepting both `press` and `onPress` for event names,\n * so we need cover both forms.\n */\nconst eventsAffectedByPointerEventsProp = new Set(['press', 'onPress']);\n\n/**\n * List of `TextInput` events not affected by `editable` prop.\n *\n * Note: `fireEvent` is accepting both `press` and `onPress` for event names,\n * so we need cover both forms.\n */\nconst textInputEventsIgnoringEditableProp = new Set([\n 'contentSizeChange',\n 'onContentSizeChange',\n 'layout',\n 'onLayout',\n 'scroll',\n 'onScroll',\n]);\n\nexport function isEventEnabled(\n element: ReactTestInstance,\n eventName: string,\n nearestTouchResponder?: ReactTestInstance,\n) {\n if (nearestTouchResponder != null && isHostTextInput(nearestTouchResponder)) {\n return (\n isEditableTextInput(nearestTouchResponder) ||\n textInputEventsIgnoringEditableProp.has(eventName)\n );\n }\n\n if (eventsAffectedByPointerEventsProp.has(eventName) && !isPointerEventEnabled(element)) {\n return false;\n }\n\n const touchStart = nearestTouchResponder?.props.onStartShouldSetResponder?.();\n const touchMove = nearestTouchResponder?.props.onMoveShouldSetResponder?.();\n if (touchStart || touchMove) {\n return true;\n }\n\n return touchStart === undefined && touchMove === undefined;\n}\n\nfunction findEventHandler(\n element: ReactTestInstance,\n eventName: string,\n nearestTouchResponder?: ReactTestInstance,\n): EventHandler | null {\n const touchResponder = isTouchResponder(element) ? element : nearestTouchResponder;\n\n const handler = getEventHandler(element, eventName, { loose: true });\n if (handler && isEventEnabled(element, eventName, touchResponder)) {\n return handler;\n }\n\n if (element.parent === null) {\n return null;\n }\n\n return findEventHandler(element.parent, eventName, touchResponder);\n}\n\n// String union type of keys of T that start with on, stripped of 'on'\ntype EventNameExtractor<T> = keyof {\n [K in keyof T as K extends `on${infer Rest}` ? Uncapitalize<Rest> : never]: T[K];\n};\n\ntype EventName = StringWithAutocomplete<\n | EventNameExtractor<ViewProps>\n | EventNameExtractor<TextProps>\n | EventNameExtractor<TextInputProps>\n | EventNameExtractor<PressableProps>\n | EventNameExtractor<ScrollViewProps>\n>;\n\nfunction fireEvent(element: ReactTestInstance, eventName: EventName, ...data: unknown[]) {\n if (!isElementMounted(element)) {\n return;\n }\n\n setNativeStateIfNeeded(element, eventName, data[0]);\n\n const handler = findEventHandler(element, eventName);\n if (!handler) {\n return;\n }\n\n let returnValue;\n void act(() => {\n returnValue = handler(...data);\n });\n\n return returnValue;\n}\n\nfireEvent.press = (element: ReactTestInstance, ...data: unknown[]) =>\n fireEvent(element, 'press', ...data);\n\nfireEvent.changeText = (element: ReactTestInstance, ...data: unknown[]) =>\n fireEvent(element, 'changeText', ...data);\n\nfireEvent.scroll = (element: ReactTestInstance, ...data: unknown[]) =>\n fireEvent(element, 'scroll', ...data);\n\nexport default fireEvent;\n\nconst scrollEventNames = new Set([\n 'scroll',\n 'scrollBeginDrag',\n 'scrollEndDrag',\n 'momentumScrollBegin',\n 'momentumScrollEnd',\n]);\n\nfunction setNativeStateIfNeeded(element: ReactTestInstance, eventName: string, value: unknown) {\n if (eventName === 'changeText' && typeof value === 'string' && isEditableTextInput(element)) {\n nativeState.valueForElement.set(element, value);\n }\n\n if (scrollEventNames.has(eventName) && isHostScrollView(element)) {\n const contentOffset = tryGetContentOffset(value);\n if (contentOffset) {\n nativeState.contentOffsetForElement.set(element, contentOffset);\n }\n }\n}\n\nfunction tryGetContentOffset(event: unknown): Point | null {\n try {\n // @ts-expect-error: try to extract contentOffset from the event value\n const contentOffset = event?.nativeEvent?.contentOffset;\n const x = contentOffset?.x;\n const y = contentOffset?.y;\n if (typeof x === 'number' || typeof y === 'number') {\n return {\n x: Number.isFinite(x) ? x : 0,\n y: Number.isFinite(y) ? y : 0,\n };\n }\n } catch {\n // Do nothing\n }\n\n return null;\n}\n"],"mappings":";;;;;;;;AASA,IAAAA,IAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,aAAA,GAAAD,OAAA;AACA,IAAAE,cAAA,GAAAF,OAAA;AACA,IAAAG,mBAAA,GAAAH,OAAA;AACA,IAAAI,cAAA,GAAAJ,OAAA;AACA,IAAAK,UAAA,GAAAL,OAAA;AACA,IAAAM,YAAA,GAAAN,OAAA;AAA6C,SAAAD,uBAAAQ,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAKtC,SAASG,gBAAgBA,CAACC,OAA0B,EAAE;EAC3D,IAAI,CAAC,IAAAC,4BAAa,EAACD,OAAO,CAAC,EAAE;IAC3B,OAAO,KAAK;EACd;EAEA,OAAOE,OAAO,CAACF,OAAO,CAACG,KAAK,CAACC,yBAAyB,CAAC,IAAI,IAAAC,mCAAe,EAACL,OAAO,CAAC;AACrF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMM,iCAAiC,GAAG,IAAIC,GAAG,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;;AAEvE;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,mCAAmC,GAAG,IAAID,GAAG,CAAC,CAClD,mBAAmB,EACnB,qBAAqB,EACrB,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,UAAU,CACX,CAAC;AAEK,SAASE,cAAcA,CAC5BT,OAA0B,EAC1BU,SAAiB,EACjBC,qBAAyC,EACzC;EACA,IAAIA,qBAAqB,IAAI,IAAI,IAAI,IAAAN,mCAAe,EAACM,qBAAqB,CAAC,EAAE;IAC3E,OACE,IAAAC,8BAAmB,EAACD,qBAAqB,CAAC,IAC1CH,mCAAmC,CAACK,GAAG,CAACH,SAAS,CAAC;EAEtD;EAEA,IAAIJ,iCAAiC,CAACO,GAAG,CAACH,SAAS,CAAC,IAAI,CAAC,IAAAI,oCAAqB,EAACd,OAAO,CAAC,EAAE;IACvF,OAAO,KAAK;EACd;EAEA,MAAMe,UAAU,GAAGJ,qBAAqB,EAAER,KAAK,CAACC,yBAAyB,GAAG,CAAC;EAC7E,MAAMY,SAAS,GAAGL,qBAAqB,EAAER,KAAK,CAACc,wBAAwB,GAAG,CAAC;EAC3E,IAAIF,UAAU,IAAIC,SAAS,EAAE;IAC3B,OAAO,IAAI;EACb;EAEA,OAAOD,UAAU,KAAKG,SAAS,IAAIF,SAAS,KAAKE,SAAS;AAC5D;AAEA,SAASC,gBAAgBA,CACvBnB,OAA0B,EAC1BU,SAAiB,EACjBC,qBAAyC,EACpB;EACrB,MAAMS,cAAc,GAAGrB,gBAAgB,CAACC,OAAO,CAAC,GAAGA,OAAO,GAAGW,qBAAqB;EAElF,MAAMU,OAAO,GAAG,IAAAC,6BAAe,EAACtB,OAAO,EAAEU,SAAS,EAAE;IAAEa,KAAK,EAAE;EAAK,CAAC,CAAC;EACpE,IAAIF,OAAO,IAAIZ,cAAc,CAACT,OAAO,EAAEU,SAAS,EAAEU,cAAc,CAAC,EAAE;IACjE,OAAOC,OAAO;EAChB;EAEA,IAAIrB,OAAO,CAACwB,MAAM,KAAK,IAAI,EAAE;IAC3B,OAAO,IAAI;EACb;EAEA,OAAOL,gBAAgB,CAACnB,OAAO,CAACwB,MAAM,EAAEd,SAAS,EAAEU,cAAc,CAAC;AACpE;;AAEA;;AAaA,SAASK,SAASA,CAACzB,OAA0B,EAAEU,SAAoB,EAAE,GAAGgB,IAAe,EAAE;EACvF,IAAI,CAAC,IAAAC,+BAAgB,EAAC3B,OAAO,CAAC,EAAE;IAC9B;EACF;EAEA4B,sBAAsB,CAAC5B,OAAO,EAAEU,SAAS,EAAEgB,IAAI,CAAC,CAAC,CAAC,CAAC;EAEnD,MAAML,OAAO,GAAGF,gBAAgB,CAACnB,OAAO,EAAEU,SAAS,CAAC;EACpD,IAAI,CAACW,OAAO,EAAE;IACZ;EACF;EAEA,IAAIQ,WAAW;EACf,KAAK,IAAAC,YAAG,EAAC,MAAM;IACbD,WAAW,GAAGR,OAAO,CAAC,GAAGK,IAAI,CAAC;EAChC,CAAC,CAAC;EAEF,OAAOG,WAAW;AACpB;AAEAJ,SAAS,CAACM,KAAK,GAAG,CAAC/B,OAA0B,EAAE,GAAG0B,IAAe,KAC/DD,SAAS,CAACzB,OAAO,EAAE,OAAO,EAAE,GAAG0B,IAAI,CAAC;AAEtCD,SAAS,CAACO,UAAU,GAAG,CAAChC,OAA0B,EAAE,GAAG0B,IAAe,KACpED,SAAS,CAACzB,OAAO,EAAE,YAAY,EAAE,GAAG0B,IAAI,CAAC;AAE3CD,SAAS,CAACQ,MAAM,GAAG,CAACjC,OAA0B,EAAE,GAAG0B,IAAe,KAChED,SAAS,CAACzB,OAAO,EAAE,QAAQ,EAAE,GAAG0B,IAAI,CAAC;AAAC,IAAAQ,QAAA,GAAAC,OAAA,CAAArC,OAAA,GAEzB2B,SAAS;AAExB,MAAMW,gBAAgB,GAAG,IAAI7B,GAAG,CAAC,CAC/B,QAAQ,EACR,iBAAiB,EACjB,eAAe,EACf,qBAAqB,EACrB,mBAAmB,CACpB,CAAC;AAEF,SAASqB,sBAAsBA,CAAC5B,OAA0B,EAAEU,SAAiB,EAAE2B,KAAc,EAAE;EAC7F,IAAI3B,SAAS,KAAK,YAAY,IAAI,OAAO2B,KAAK,KAAK,QAAQ,IAAI,IAAAzB,8BAAmB,EAACZ,OAAO,CAAC,EAAE;IAC3FsC,wBAAW,CAACC,eAAe,CAACC,GAAG,CAACxC,OAAO,EAAEqC,KAAK,CAAC;EACjD;EAEA,IAAID,gBAAgB,CAACvB,GAAG,CAACH,SAAS,CAAC,IAAI,IAAA+B,oCAAgB,EAACzC,OAAO,CAAC,EAAE;IAChE,MAAM0C,aAAa,GAAGC,mBAAmB,CAACN,KAAK,CAAC;IAChD,IAAIK,aAAa,EAAE;MACjBJ,wBAAW,CAACM,uBAAuB,CAACJ,GAAG,CAACxC,OAAO,EAAE0C,aAAa,CAAC;IACjE;EACF;AACF;AAEA,SAASC,mBAAmBA,CAACE,KAAc,EAAgB;EACzD,IAAI;IACF;IACA,MAAMH,aAAa,GAAGG,KAAK,EAAEC,WAAW,EAAEJ,aAAa;IACvD,MAAMK,CAAC,GAAGL,aAAa,EAAEK,CAAC;IAC1B,MAAMC,CAAC,GAAGN,aAAa,EAAEM,CAAC;IAC1B,IAAI,OAAOD,CAAC,KAAK,QAAQ,IAAI,OAAOC,CAAC,KAAK,QAAQ,EAAE;MAClD,OAAO;QACLD,CAAC,EAAEE,MAAM,CAACC,QAAQ,CAACH,CAAC,CAAC,GAAGA,CAAC,GAAG,CAAC;QAC7BC,CAAC,EAAEC,MAAM,CAACC,QAAQ,CAACF,CAAC,CAAC,GAAGA,CAAC,GAAG;MAC9B,CAAC;IACH;EACF,CAAC,CAAC,MAAM;IACN;EAAA;EAGF,OAAO,IAAI;AACb","ignoreList":[]}
1
+ {"version":3,"file":"fire-event.js","names":["_act","_interopRequireDefault","require","_eventHandler","_componentTree","_hostComponentNames","_pointerEvents","_textInput","_nativeState","e","__esModule","default","isTouchResponder","element","isHostElement","Boolean","props","onStartShouldSetResponder","isHostTextInput","eventsAffectedByPointerEventsProp","Set","textInputEventsIgnoringEditableProp","isEventEnabled","eventName","nearestTouchResponder","isEditableTextInput","has","isPointerEventEnabled","touchStart","touchMove","onMoveShouldSetResponder","undefined","findEventHandler","touchResponder","handler","getEventHandler","loose","parent","fireEvent","data","isElementMounted","setNativeStateIfNeeded","returnValue","act","press","changeText","scroll","fireEventAsync","_default","exports","scrollEventNames","value","nativeState","valueForElement","set","isHostScrollView","contentOffset","tryGetContentOffset","contentOffsetForElement","event","nativeEvent","x","y","Number","isFinite"],"sources":["../src/fire-event.ts"],"sourcesContent":["import type {\n PressableProps,\n ScrollViewProps,\n TextInputProps,\n TextProps,\n ViewProps,\n} from 'react-native';\nimport type { ReactTestInstance } from 'react-test-renderer';\n\nimport act from './act';\nimport { getEventHandler } from './event-handler';\nimport { isElementMounted, isHostElement } from './helpers/component-tree';\nimport { isHostScrollView, isHostTextInput } from './helpers/host-component-names';\nimport { isPointerEventEnabled } from './helpers/pointer-events';\nimport { isEditableTextInput } from './helpers/text-input';\nimport { nativeState } from './native-state';\nimport type { Point, StringWithAutocomplete } from './types';\n\ntype EventHandler = (...args: unknown[]) => unknown;\n\nexport function isTouchResponder(element: ReactTestInstance) {\n if (!isHostElement(element)) {\n return false;\n }\n\n return Boolean(element.props.onStartShouldSetResponder) || isHostTextInput(element);\n}\n\n/**\n * List of events affected by `pointerEvents` prop.\n *\n * Note: `fireEvent` is accepting both `press` and `onPress` for event names,\n * so we need cover both forms.\n */\nconst eventsAffectedByPointerEventsProp = new Set(['press', 'onPress']);\n\n/**\n * List of `TextInput` events not affected by `editable` prop.\n *\n * Note: `fireEvent` is accepting both `press` and `onPress` for event names,\n * so we need cover both forms.\n */\nconst textInputEventsIgnoringEditableProp = new Set([\n 'contentSizeChange',\n 'onContentSizeChange',\n 'layout',\n 'onLayout',\n 'scroll',\n 'onScroll',\n]);\n\nexport function isEventEnabled(\n element: ReactTestInstance,\n eventName: string,\n nearestTouchResponder?: ReactTestInstance,\n) {\n if (nearestTouchResponder != null && isHostTextInput(nearestTouchResponder)) {\n return (\n isEditableTextInput(nearestTouchResponder) ||\n textInputEventsIgnoringEditableProp.has(eventName)\n );\n }\n\n if (eventsAffectedByPointerEventsProp.has(eventName) && !isPointerEventEnabled(element)) {\n return false;\n }\n\n const touchStart = nearestTouchResponder?.props.onStartShouldSetResponder?.();\n const touchMove = nearestTouchResponder?.props.onMoveShouldSetResponder?.();\n if (touchStart || touchMove) {\n return true;\n }\n\n return touchStart === undefined && touchMove === undefined;\n}\n\nfunction findEventHandler(\n element: ReactTestInstance,\n eventName: string,\n nearestTouchResponder?: ReactTestInstance,\n): EventHandler | null {\n const touchResponder = isTouchResponder(element) ? element : nearestTouchResponder;\n\n const handler = getEventHandler(element, eventName, { loose: true });\n if (handler && isEventEnabled(element, eventName, touchResponder)) {\n return handler;\n }\n\n if (element.parent === null) {\n return null;\n }\n\n return findEventHandler(element.parent, eventName, touchResponder);\n}\n\n// String union type of keys of T that start with on, stripped of 'on'\ntype EventNameExtractor<T> = keyof {\n [K in keyof T as K extends `on${infer Rest}` ? Uncapitalize<Rest> : never]: T[K];\n};\n\ntype EventName = StringWithAutocomplete<\n | EventNameExtractor<ViewProps>\n | EventNameExtractor<TextProps>\n | EventNameExtractor<TextInputProps>\n | EventNameExtractor<PressableProps>\n | EventNameExtractor<ScrollViewProps>\n>;\n\nfunction fireEvent(element: ReactTestInstance, eventName: EventName, ...data: unknown[]) {\n if (!isElementMounted(element)) {\n return;\n }\n\n setNativeStateIfNeeded(element, eventName, data[0]);\n\n const handler = findEventHandler(element, eventName);\n if (!handler) {\n return;\n }\n\n let returnValue;\n void act(() => {\n returnValue = handler(...data);\n });\n\n return returnValue;\n}\n\nfireEvent.press = (element: ReactTestInstance, ...data: unknown[]) =>\n fireEvent(element, 'press', ...data);\n\nfireEvent.changeText = (element: ReactTestInstance, ...data: unknown[]) =>\n fireEvent(element, 'changeText', ...data);\n\nfireEvent.scroll = (element: ReactTestInstance, ...data: unknown[]) =>\n fireEvent(element, 'scroll', ...data);\n\nasync function fireEventAsync(\n element: ReactTestInstance,\n eventName: EventName,\n ...data: unknown[]\n) {\n if (!isElementMounted(element)) {\n return;\n }\n\n setNativeStateIfNeeded(element, eventName, data[0]);\n\n const handler = findEventHandler(element, eventName);\n if (!handler) {\n return;\n }\n\n let returnValue;\n // eslint-disable-next-line require-await\n await act(async () => {\n returnValue = handler(...data);\n });\n\n return returnValue;\n}\n\nfireEventAsync.press = async (element: ReactTestInstance, ...data: unknown[]) =>\n await fireEventAsync(element, 'press', ...data);\n\nfireEventAsync.changeText = async (element: ReactTestInstance, ...data: unknown[]) =>\n await fireEventAsync(element, 'changeText', ...data);\n\nfireEventAsync.scroll = async (element: ReactTestInstance, ...data: unknown[]) =>\n await fireEventAsync(element, 'scroll', ...data);\n\nexport { fireEventAsync };\nexport default fireEvent;\n\nconst scrollEventNames = new Set([\n 'scroll',\n 'scrollBeginDrag',\n 'scrollEndDrag',\n 'momentumScrollBegin',\n 'momentumScrollEnd',\n]);\n\nfunction setNativeStateIfNeeded(element: ReactTestInstance, eventName: string, value: unknown) {\n if (eventName === 'changeText' && typeof value === 'string' && isEditableTextInput(element)) {\n nativeState.valueForElement.set(element, value);\n }\n\n if (scrollEventNames.has(eventName) && isHostScrollView(element)) {\n const contentOffset = tryGetContentOffset(value);\n if (contentOffset) {\n nativeState.contentOffsetForElement.set(element, contentOffset);\n }\n }\n}\n\nfunction tryGetContentOffset(event: unknown): Point | null {\n try {\n // @ts-expect-error: try to extract contentOffset from the event value\n const contentOffset = event?.nativeEvent?.contentOffset;\n const x = contentOffset?.x;\n const y = contentOffset?.y;\n if (typeof x === 'number' || typeof y === 'number') {\n return {\n x: Number.isFinite(x) ? x : 0,\n y: Number.isFinite(y) ? y : 0,\n };\n }\n } catch {\n // Do nothing\n }\n\n return null;\n}\n"],"mappings":"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","ignoreList":[]}
package/build/pure.d.ts CHANGED
@@ -1,17 +1,19 @@
1
1
  export { default as act } from './act';
2
2
  export { default as cleanup } from './cleanup';
3
- export { default as fireEvent } from './fire-event';
3
+ export { default as fireEvent, fireEventAsync } from './fire-event';
4
4
  export { default as render } from './render';
5
+ export { default as renderAsync } from './render-async';
5
6
  export { default as waitFor } from './wait-for';
6
7
  export { default as waitForElementToBeRemoved } from './wait-for-element-to-be-removed';
7
8
  export { within, getQueriesForElement } from './within';
8
9
  export { configure, resetToDefaults } from './config';
9
10
  export { isHiddenFromAccessibility, isInaccessible } from './helpers/accessibility';
10
11
  export { getDefaultNormalizer } from './matches';
11
- export { renderHook } from './render-hook';
12
+ export { renderHook, renderHookAsync } from './render-hook';
12
13
  export { screen } from './screen';
13
14
  export { userEvent } from './user-event';
14
15
  export type { RenderOptions, RenderResult, RenderResult as RenderAPI, DebugFunction, } from './render';
15
- export type { RenderHookOptions, RenderHookResult } from './render-hook';
16
+ export type { RenderAsyncOptions, RenderAsyncResult } from './render-async';
17
+ export type { RenderHookOptions, RenderHookResult, RenderHookAsyncResult } from './render-hook';
16
18
  export type { Config } from './config';
17
19
  export type { UserEventConfig } from './user-event';
package/build/pure.js CHANGED
@@ -27,6 +27,12 @@ Object.defineProperty(exports, "fireEvent", {
27
27
  return _fireEvent.default;
28
28
  }
29
29
  });
30
+ Object.defineProperty(exports, "fireEventAsync", {
31
+ enumerable: true,
32
+ get: function () {
33
+ return _fireEvent.fireEventAsync;
34
+ }
35
+ });
30
36
  Object.defineProperty(exports, "getDefaultNormalizer", {
31
37
  enumerable: true,
32
38
  get: function () {
@@ -57,12 +63,24 @@ Object.defineProperty(exports, "render", {
57
63
  return _render.default;
58
64
  }
59
65
  });
66
+ Object.defineProperty(exports, "renderAsync", {
67
+ enumerable: true,
68
+ get: function () {
69
+ return _renderAsync.default;
70
+ }
71
+ });
60
72
  Object.defineProperty(exports, "renderHook", {
61
73
  enumerable: true,
62
74
  get: function () {
63
75
  return _renderHook.renderHook;
64
76
  }
65
77
  });
78
+ Object.defineProperty(exports, "renderHookAsync", {
79
+ enumerable: true,
80
+ get: function () {
81
+ return _renderHook.renderHookAsync;
82
+ }
83
+ });
66
84
  Object.defineProperty(exports, "resetToDefaults", {
67
85
  enumerable: true,
68
86
  get: function () {
@@ -101,8 +119,9 @@ Object.defineProperty(exports, "within", {
101
119
  });
102
120
  var _act = _interopRequireDefault(require("./act"));
103
121
  var _cleanup = _interopRequireDefault(require("./cleanup"));
104
- var _fireEvent = _interopRequireDefault(require("./fire-event"));
122
+ var _fireEvent = _interopRequireWildcard(require("./fire-event"));
105
123
  var _render = _interopRequireDefault(require("./render"));
124
+ var _renderAsync = _interopRequireDefault(require("./render-async"));
106
125
  var _waitFor = _interopRequireDefault(require("./wait-for"));
107
126
  var _waitForElementToBeRemoved = _interopRequireDefault(require("./wait-for-element-to-be-removed"));
108
127
  var _within = require("./within");
@@ -112,5 +131,6 @@ var _matches = require("./matches");
112
131
  var _renderHook = require("./render-hook");
113
132
  var _screen = require("./screen");
114
133
  var _userEvent = require("./user-event");
134
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
115
135
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
116
136
  //# sourceMappingURL=pure.js.map
package/build/pure.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"pure.js","names":["_act","_interopRequireDefault","require","_cleanup","_fireEvent","_render","_waitFor","_waitForElementToBeRemoved","_within","_config","_accessibility","_matches","_renderHook","_screen","_userEvent","e","__esModule","default"],"sources":["../src/pure.ts"],"sourcesContent":["export { default as act } from './act';\nexport { default as cleanup } from './cleanup';\nexport { default as fireEvent } from './fire-event';\nexport { default as render } from './render';\nexport { default as waitFor } from './wait-for';\nexport { default as waitForElementToBeRemoved } from './wait-for-element-to-be-removed';\nexport { within, getQueriesForElement } from './within';\n\nexport { configure, resetToDefaults } from './config';\nexport { isHiddenFromAccessibility, isInaccessible } from './helpers/accessibility';\nexport { getDefaultNormalizer } from './matches';\nexport { renderHook } from './render-hook';\nexport { screen } from './screen';\nexport { userEvent } from './user-event';\n\nexport type {\n RenderOptions,\n RenderResult,\n RenderResult as RenderAPI,\n DebugFunction,\n} from './render';\nexport type { RenderHookOptions, RenderHookResult } from './render-hook';\nexport type { Config } from './config';\nexport type { UserEventConfig } from './user-event';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,IAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,QAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,UAAA,GAAAH,sBAAA,CAAAC,OAAA;AACA,IAAAG,OAAA,GAAAJ,sBAAA,CAAAC,OAAA;AACA,IAAAI,QAAA,GAAAL,sBAAA,CAAAC,OAAA;AACA,IAAAK,0BAAA,GAAAN,sBAAA,CAAAC,OAAA;AACA,IAAAM,OAAA,GAAAN,OAAA;AAEA,IAAAO,OAAA,GAAAP,OAAA;AACA,IAAAQ,cAAA,GAAAR,OAAA;AACA,IAAAS,QAAA,GAAAT,OAAA;AACA,IAAAU,WAAA,GAAAV,OAAA;AACA,IAAAW,OAAA,GAAAX,OAAA;AACA,IAAAY,UAAA,GAAAZ,OAAA;AAAyC,SAAAD,uBAAAc,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA","ignoreList":[]}
1
+ {"version":3,"file":"pure.js","names":["_act","_interopRequireDefault","require","_cleanup","_fireEvent","_interopRequireWildcard","_render","_renderAsync","_waitFor","_waitForElementToBeRemoved","_within","_config","_accessibility","_matches","_renderHook","_screen","_userEvent","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor"],"sources":["../src/pure.ts"],"sourcesContent":["export { default as act } from './act';\nexport { default as cleanup } from './cleanup';\nexport { default as fireEvent, fireEventAsync } from './fire-event';\nexport { default as render } from './render';\nexport { default as renderAsync } from './render-async';\nexport { default as waitFor } from './wait-for';\nexport { default as waitForElementToBeRemoved } from './wait-for-element-to-be-removed';\nexport { within, getQueriesForElement } from './within';\n\nexport { configure, resetToDefaults } from './config';\nexport { isHiddenFromAccessibility, isInaccessible } from './helpers/accessibility';\nexport { getDefaultNormalizer } from './matches';\nexport { renderHook, renderHookAsync } from './render-hook';\nexport { screen } from './screen';\nexport { userEvent } from './user-event';\n\nexport type {\n RenderOptions,\n RenderResult,\n RenderResult as RenderAPI,\n DebugFunction,\n} from './render';\nexport type { RenderAsyncOptions, RenderAsyncResult } from './render-async';\nexport type { RenderHookOptions, RenderHookResult, RenderHookAsyncResult } from './render-hook';\nexport type { Config } from './config';\nexport type { UserEventConfig } from './user-event';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,IAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,QAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,UAAA,GAAAC,uBAAA,CAAAH,OAAA;AACA,IAAAI,OAAA,GAAAL,sBAAA,CAAAC,OAAA;AACA,IAAAK,YAAA,GAAAN,sBAAA,CAAAC,OAAA;AACA,IAAAM,QAAA,GAAAP,sBAAA,CAAAC,OAAA;AACA,IAAAO,0BAAA,GAAAR,sBAAA,CAAAC,OAAA;AACA,IAAAQ,OAAA,GAAAR,OAAA;AAEA,IAAAS,OAAA,GAAAT,OAAA;AACA,IAAAU,cAAA,GAAAV,OAAA;AACA,IAAAW,QAAA,GAAAX,OAAA;AACA,IAAAY,WAAA,GAAAZ,OAAA;AACA,IAAAa,OAAA,GAAAb,OAAA;AACA,IAAAc,UAAA,GAAAd,OAAA;AAAyC,SAAAG,wBAAAY,CAAA,EAAAC,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAd,uBAAA,YAAAA,CAAAY,CAAA,EAAAC,CAAA,SAAAA,CAAA,IAAAD,CAAA,IAAAA,CAAA,CAAAK,UAAA,SAAAL,CAAA,MAAAM,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAC,OAAA,EAAAV,CAAA,iBAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,SAAAQ,CAAA,MAAAF,CAAA,GAAAL,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAG,CAAA,CAAAK,GAAA,CAAAX,CAAA,UAAAM,CAAA,CAAAM,GAAA,CAAAZ,CAAA,GAAAM,CAAA,CAAAO,GAAA,CAAAb,CAAA,EAAAQ,CAAA,gBAAAP,CAAA,IAAAD,CAAA,gBAAAC,CAAA,OAAAa,cAAA,CAAAC,IAAA,CAAAf,CAAA,EAAAC,CAAA,OAAAM,CAAA,IAAAD,CAAA,GAAAU,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAAE,wBAAA,CAAAlB,CAAA,EAAAC,CAAA,OAAAM,CAAA,CAAAK,GAAA,IAAAL,CAAA,CAAAM,GAAA,IAAAP,CAAA,CAAAE,CAAA,EAAAP,CAAA,EAAAM,CAAA,IAAAC,CAAA,CAAAP,CAAA,IAAAD,CAAA,CAAAC,CAAA,WAAAO,CAAA,KAAAR,CAAA,EAAAC,CAAA;AAAA,SAAAjB,uBAAAgB,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAK,UAAA,GAAAL,CAAA,KAAAU,OAAA,EAAAV,CAAA","ignoreList":[]}
@@ -1,2 +1,3 @@
1
1
  import type { ReactTestRenderer, TestRendererOptions } from 'react-test-renderer';
2
2
  export declare function renderWithAct(component: React.ReactElement, options?: Partial<TestRendererOptions>): ReactTestRenderer;
3
+ export declare function renderWithAsyncAct(component: React.ReactElement, options?: Partial<TestRendererOptions>): Promise<ReactTestRenderer>;
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.renderWithAct = renderWithAct;
7
+ exports.renderWithAsyncAct = renderWithAsyncAct;
7
8
  var _reactTestRenderer = _interopRequireDefault(require("react-test-renderer"));
8
9
  var _act = _interopRequireDefault(require("./act"));
9
10
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
@@ -19,4 +20,16 @@ function renderWithAct(component, options) {
19
20
  // @ts-expect-error: `act` is synchronous, so `renderer` is already initialized here
20
21
  return renderer;
21
22
  }
23
+ async function renderWithAsyncAct(component, options) {
24
+ let renderer;
25
+
26
+ // eslint-disable-next-line require-await
27
+ await (0, _act.default)(async () => {
28
+ // @ts-expect-error `TestRenderer.create` is not typed correctly
29
+ renderer = _reactTestRenderer.default.create(component, options);
30
+ });
31
+
32
+ // @ts-expect-error: `renderer` is already initialized here
33
+ return renderer;
34
+ }
22
35
  //# sourceMappingURL=render-act.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"render-act.js","names":["_reactTestRenderer","_interopRequireDefault","require","_act","e","__esModule","default","renderWithAct","component","options","renderer","act","TestRenderer","create"],"sources":["../src/render-act.ts"],"sourcesContent":["import type { ReactTestRenderer, TestRendererOptions } from 'react-test-renderer';\nimport TestRenderer from 'react-test-renderer';\n\nimport act from './act';\n\nexport function renderWithAct(\n component: React.ReactElement,\n options?: Partial<TestRendererOptions>,\n): ReactTestRenderer {\n let renderer: ReactTestRenderer;\n\n // This will be called synchronously.\n void act(() => {\n // @ts-expect-error `TestRenderer.create` is not typed correctly\n renderer = TestRenderer.create(component, options);\n });\n\n // @ts-expect-error: `act` is synchronous, so `renderer` is already initialized here\n return renderer;\n}\n"],"mappings":";;;;;;AACA,IAAAA,kBAAA,GAAAC,sBAAA,CAAAC,OAAA;AAEA,IAAAC,IAAA,GAAAF,sBAAA,CAAAC,OAAA;AAAwB,SAAAD,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAEjB,SAASG,aAAaA,CAC3BC,SAA6B,EAC7BC,OAAsC,EACnB;EACnB,IAAIC,QAA2B;;EAE/B;EACA,KAAK,IAAAC,YAAG,EAAC,MAAM;IACb;IACAD,QAAQ,GAAGE,0BAAY,CAACC,MAAM,CAACL,SAAS,EAAEC,OAAO,CAAC;EACpD,CAAC,CAAC;;EAEF;EACA,OAAOC,QAAQ;AACjB","ignoreList":[]}
1
+ {"version":3,"file":"render-act.js","names":["_reactTestRenderer","_interopRequireDefault","require","_act","e","__esModule","default","renderWithAct","component","options","renderer","act","TestRenderer","create","renderWithAsyncAct"],"sources":["../src/render-act.ts"],"sourcesContent":["import type { ReactTestRenderer, TestRendererOptions } from 'react-test-renderer';\nimport TestRenderer from 'react-test-renderer';\n\nimport act from './act';\n\nexport function renderWithAct(\n component: React.ReactElement,\n options?: Partial<TestRendererOptions>,\n): ReactTestRenderer {\n let renderer: ReactTestRenderer;\n\n // This will be called synchronously.\n void act(() => {\n // @ts-expect-error `TestRenderer.create` is not typed correctly\n renderer = TestRenderer.create(component, options);\n });\n\n // @ts-expect-error: `act` is synchronous, so `renderer` is already initialized here\n return renderer;\n}\n\nexport async function renderWithAsyncAct(\n component: React.ReactElement,\n options?: Partial<TestRendererOptions>,\n): Promise<ReactTestRenderer> {\n let renderer: ReactTestRenderer;\n\n // eslint-disable-next-line require-await\n await act(async () => {\n // @ts-expect-error `TestRenderer.create` is not typed correctly\n renderer = TestRenderer.create(component, options);\n });\n\n // @ts-expect-error: `renderer` is already initialized here\n return renderer;\n}\n"],"mappings":";;;;;;;AACA,IAAAA,kBAAA,GAAAC,sBAAA,CAAAC,OAAA;AAEA,IAAAC,IAAA,GAAAF,sBAAA,CAAAC,OAAA;AAAwB,SAAAD,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAEjB,SAASG,aAAaA,CAC3BC,SAA6B,EAC7BC,OAAsC,EACnB;EACnB,IAAIC,QAA2B;;EAE/B;EACA,KAAK,IAAAC,YAAG,EAAC,MAAM;IACb;IACAD,QAAQ,GAAGE,0BAAY,CAACC,MAAM,CAACL,SAAS,EAAEC,OAAO,CAAC;EACpD,CAAC,CAAC;;EAEF;EACA,OAAOC,QAAQ;AACjB;AAEO,eAAeI,kBAAkBA,CACtCN,SAA6B,EAC7BC,OAAsC,EACV;EAC5B,IAAIC,QAA2B;;EAE/B;EACA,MAAM,IAAAC,YAAG,EAAC,YAAY;IACpB;IACAD,QAAQ,GAAGE,0BAAY,CAACC,MAAM,CAACL,SAAS,EAAEC,OAAO,CAAC;EACpD,CAAC,CAAC;;EAEF;EACA,OAAOC,QAAQ;AACjB","ignoreList":[]}
@@ -0,0 +1,104 @@
1
+ import * as React from 'react';
2
+ import type { ReactTestInstance } from 'react-test-renderer';
3
+ import type { DebugOptions } from './helpers/debug';
4
+ export interface RenderAsyncOptions {
5
+ /**
6
+ * Pass a React Component as the wrapper option to have it rendered around the inner element. This is most useful for creating
7
+ * reusable custom render functions for common data providers.
8
+ */
9
+ wrapper?: React.ComponentType<any>;
10
+ /**
11
+ * Set to `false` to disable concurrent rendering.
12
+ * Otherwise `render` will default to concurrent rendering.
13
+ */
14
+ concurrentRoot?: boolean;
15
+ createNodeMock?: (element: React.ReactElement) => unknown;
16
+ }
17
+ export type RenderAsyncResult = ReturnType<typeof renderAsync>;
18
+ /**
19
+ * Renders test component deeply using React Test Renderer and exposes helpers
20
+ * to assert on the output.
21
+ */
22
+ export default function renderAsync<T>(component: React.ReactElement<T>, options?: RenderAsyncOptions): Promise<{
23
+ rerender: (_component: React.ReactElement) => never;
24
+ rerenderAsync: (component: React.ReactElement) => Promise<void>;
25
+ update: (_component: React.ReactElement) => never;
26
+ updateAsync: (component: React.ReactElement) => Promise<void>;
27
+ unmount: () => never;
28
+ unmountAsync: () => Promise<void>;
29
+ toJSON: () => null | import("react-test-renderer").ReactTestRendererJSON | import("react-test-renderer").ReactTestRendererJSON[];
30
+ debug: DebugFunction;
31
+ root: ReactTestInstance;
32
+ UNSAFE_root: ReactTestInstance;
33
+ UNSAFE_getByProps: (props: {
34
+ [x: string]: unknown;
35
+ }) => ReactTestInstance;
36
+ UNSAFE_getAllByProps: (props: {
37
+ [x: string]: unknown;
38
+ }) => Array<ReactTestInstance>;
39
+ UNSAFE_queryByProps: (props: {
40
+ [x: string]: unknown;
41
+ }) => ReactTestInstance | null;
42
+ UNSAFE_queryAllByProps: (props: {
43
+ [x: string]: unknown;
44
+ }) => Array<ReactTestInstance>;
45
+ UNSAFE_getByType: <P>(type: React.ComponentType<P>) => ReactTestInstance;
46
+ UNSAFE_getAllByType: <P>(type: React.ComponentType<P>) => Array<ReactTestInstance>;
47
+ UNSAFE_queryByType: <P>(type: React.ComponentType<P>) => ReactTestInstance | null;
48
+ UNSAFE_queryAllByType: <P>(type: React.ComponentType<P>) => Array<ReactTestInstance>;
49
+ getByRole: import("./queries/make-queries").GetByQuery<import("./queries/role").ByRoleMatcher, import("./queries/role").ByRoleOptions>;
50
+ getAllByRole: import("./queries/make-queries").GetAllByQuery<import("./queries/role").ByRoleMatcher, import("./queries/role").ByRoleOptions>;
51
+ queryByRole: import("./queries/make-queries").QueryByQuery<import("./queries/role").ByRoleMatcher, import("./queries/role").ByRoleOptions>;
52
+ queryAllByRole: import("./queries/make-queries").QueryAllByQuery<import("./queries/role").ByRoleMatcher, import("./queries/role").ByRoleOptions>;
53
+ findByRole: import("./queries/make-queries").FindByQuery<import("./queries/role").ByRoleMatcher, import("./queries/role").ByRoleOptions>;
54
+ findAllByRole: import("./queries/make-queries").FindAllByQuery<import("./queries/role").ByRoleMatcher, import("./queries/role").ByRoleOptions>;
55
+ getByHintText: import("./queries/make-queries").GetByQuery<import("./matches").TextMatch, import("./queries/options").CommonQueryOptions & import("./matches").TextMatchOptions>;
56
+ getAllByHintText: import("./queries/make-queries").GetAllByQuery<import("./matches").TextMatch, import("./queries/options").CommonQueryOptions & import("./matches").TextMatchOptions>;
57
+ queryByHintText: import("./queries/make-queries").QueryByQuery<import("./matches").TextMatch, import("./queries/options").CommonQueryOptions & import("./matches").TextMatchOptions>;
58
+ queryAllByHintText: import("./queries/make-queries").QueryAllByQuery<import("./matches").TextMatch, import("./queries/options").CommonQueryOptions & import("./matches").TextMatchOptions>;
59
+ findByHintText: import("./queries/make-queries").FindByQuery<import("./matches").TextMatch, import("./queries/options").CommonQueryOptions & import("./matches").TextMatchOptions>;
60
+ findAllByHintText: import("./queries/make-queries").FindAllByQuery<import("./matches").TextMatch, import("./queries/options").CommonQueryOptions & import("./matches").TextMatchOptions>;
61
+ getByA11yHint: import("./queries/make-queries").GetByQuery<import("./matches").TextMatch, import("./queries/options").CommonQueryOptions & import("./matches").TextMatchOptions>;
62
+ getAllByA11yHint: import("./queries/make-queries").GetAllByQuery<import("./matches").TextMatch, import("./queries/options").CommonQueryOptions & import("./matches").TextMatchOptions>;
63
+ queryByA11yHint: import("./queries/make-queries").QueryByQuery<import("./matches").TextMatch, import("./queries/options").CommonQueryOptions & import("./matches").TextMatchOptions>;
64
+ queryAllByA11yHint: import("./queries/make-queries").QueryAllByQuery<import("./matches").TextMatch, import("./queries/options").CommonQueryOptions & import("./matches").TextMatchOptions>;
65
+ findByA11yHint: import("./queries/make-queries").FindByQuery<import("./matches").TextMatch, import("./queries/options").CommonQueryOptions & import("./matches").TextMatchOptions>;
66
+ findAllByA11yHint: import("./queries/make-queries").FindAllByQuery<import("./matches").TextMatch, import("./queries/options").CommonQueryOptions & import("./matches").TextMatchOptions>;
67
+ getByAccessibilityHint: import("./queries/make-queries").GetByQuery<import("./matches").TextMatch, import("./queries/options").CommonQueryOptions & import("./matches").TextMatchOptions>;
68
+ getAllByAccessibilityHint: import("./queries/make-queries").GetAllByQuery<import("./matches").TextMatch, import("./queries/options").CommonQueryOptions & import("./matches").TextMatchOptions>;
69
+ queryByAccessibilityHint: import("./queries/make-queries").QueryByQuery<import("./matches").TextMatch, import("./queries/options").CommonQueryOptions & import("./matches").TextMatchOptions>;
70
+ queryAllByAccessibilityHint: import("./queries/make-queries").QueryAllByQuery<import("./matches").TextMatch, import("./queries/options").CommonQueryOptions & import("./matches").TextMatchOptions>;
71
+ findByAccessibilityHint: import("./queries/make-queries").FindByQuery<import("./matches").TextMatch, import("./queries/options").CommonQueryOptions & import("./matches").TextMatchOptions>;
72
+ findAllByAccessibilityHint: import("./queries/make-queries").FindAllByQuery<import("./matches").TextMatch, import("./queries/options").CommonQueryOptions & import("./matches").TextMatchOptions>;
73
+ getByLabelText: import("./queries/make-queries").GetByQuery<import("./matches").TextMatch, import("./queries/options").CommonQueryOptions & import("./matches").TextMatchOptions>;
74
+ getAllByLabelText: import("./queries/make-queries").GetAllByQuery<import("./matches").TextMatch, import("./queries/options").CommonQueryOptions & import("./matches").TextMatchOptions>;
75
+ queryByLabelText: import("./queries/make-queries").QueryByQuery<import("./matches").TextMatch, import("./queries/options").CommonQueryOptions & import("./matches").TextMatchOptions>;
76
+ queryAllByLabelText: import("./queries/make-queries").QueryAllByQuery<import("./matches").TextMatch, import("./queries/options").CommonQueryOptions & import("./matches").TextMatchOptions>;
77
+ findByLabelText: import("./queries/make-queries").FindByQuery<import("./matches").TextMatch, import("./queries/options").CommonQueryOptions & import("./matches").TextMatchOptions>;
78
+ findAllByLabelText: import("./queries/make-queries").FindAllByQuery<import("./matches").TextMatch, import("./queries/options").CommonQueryOptions & import("./matches").TextMatchOptions>;
79
+ getByPlaceholderText: import("./queries/make-queries").GetByQuery<import("./matches").TextMatch, import("./queries/options").CommonQueryOptions & import("./matches").TextMatchOptions>;
80
+ getAllByPlaceholderText: import("./queries/make-queries").GetAllByQuery<import("./matches").TextMatch, import("./queries/options").CommonQueryOptions & import("./matches").TextMatchOptions>;
81
+ queryByPlaceholderText: import("./queries/make-queries").QueryByQuery<import("./matches").TextMatch, import("./queries/options").CommonQueryOptions & import("./matches").TextMatchOptions>;
82
+ queryAllByPlaceholderText: import("./queries/make-queries").QueryAllByQuery<import("./matches").TextMatch, import("./queries/options").CommonQueryOptions & import("./matches").TextMatchOptions>;
83
+ findByPlaceholderText: import("./queries/make-queries").FindByQuery<import("./matches").TextMatch, import("./queries/options").CommonQueryOptions & import("./matches").TextMatchOptions>;
84
+ findAllByPlaceholderText: import("./queries/make-queries").FindAllByQuery<import("./matches").TextMatch, import("./queries/options").CommonQueryOptions & import("./matches").TextMatchOptions>;
85
+ getByDisplayValue: import("./queries/make-queries").GetByQuery<import("./matches").TextMatch, import("./queries/options").CommonQueryOptions & import("./matches").TextMatchOptions>;
86
+ getAllByDisplayValue: import("./queries/make-queries").GetAllByQuery<import("./matches").TextMatch, import("./queries/options").CommonQueryOptions & import("./matches").TextMatchOptions>;
87
+ queryByDisplayValue: import("./queries/make-queries").QueryByQuery<import("./matches").TextMatch, import("./queries/options").CommonQueryOptions & import("./matches").TextMatchOptions>;
88
+ queryAllByDisplayValue: import("./queries/make-queries").QueryAllByQuery<import("./matches").TextMatch, import("./queries/options").CommonQueryOptions & import("./matches").TextMatchOptions>;
89
+ findByDisplayValue: import("./queries/make-queries").FindByQuery<import("./matches").TextMatch, import("./queries/options").CommonQueryOptions & import("./matches").TextMatchOptions>;
90
+ findAllByDisplayValue: import("./queries/make-queries").FindAllByQuery<import("./matches").TextMatch, import("./queries/options").CommonQueryOptions & import("./matches").TextMatchOptions>;
91
+ getByTestId: import("./queries/make-queries").GetByQuery<import("./matches").TextMatch, import("./queries/options").CommonQueryOptions & import("./matches").TextMatchOptions>;
92
+ getAllByTestId: import("./queries/make-queries").GetAllByQuery<import("./matches").TextMatch, import("./queries/options").CommonQueryOptions & import("./matches").TextMatchOptions>;
93
+ queryByTestId: import("./queries/make-queries").QueryByQuery<import("./matches").TextMatch, import("./queries/options").CommonQueryOptions & import("./matches").TextMatchOptions>;
94
+ queryAllByTestId: import("./queries/make-queries").QueryAllByQuery<import("./matches").TextMatch, import("./queries/options").CommonQueryOptions & import("./matches").TextMatchOptions>;
95
+ findByTestId: import("./queries/make-queries").FindByQuery<import("./matches").TextMatch, import("./queries/options").CommonQueryOptions & import("./matches").TextMatchOptions>;
96
+ findAllByTestId: import("./queries/make-queries").FindAllByQuery<import("./matches").TextMatch, import("./queries/options").CommonQueryOptions & import("./matches").TextMatchOptions>;
97
+ getByText: import("./queries/make-queries").GetByQuery<import("./matches").TextMatch, import("./queries/options").CommonQueryOptions & import("./matches").TextMatchOptions>;
98
+ getAllByText: import("./queries/make-queries").GetAllByQuery<import("./matches").TextMatch, import("./queries/options").CommonQueryOptions & import("./matches").TextMatchOptions>;
99
+ queryByText: import("./queries/make-queries").QueryByQuery<import("./matches").TextMatch, import("./queries/options").CommonQueryOptions & import("./matches").TextMatchOptions>;
100
+ queryAllByText: import("./queries/make-queries").QueryAllByQuery<import("./matches").TextMatch, import("./queries/options").CommonQueryOptions & import("./matches").TextMatchOptions>;
101
+ findByText: import("./queries/make-queries").FindByQuery<import("./matches").TextMatch, import("./queries/options").CommonQueryOptions & import("./matches").TextMatchOptions>;
102
+ findAllByText: import("./queries/make-queries").FindAllByQuery<import("./matches").TextMatch, import("./queries/options").CommonQueryOptions & import("./matches").TextMatchOptions>;
103
+ }>;
104
+ export type DebugFunction = (options?: DebugOptions) => void;
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = renderAsync;
7
+ var React = _interopRequireWildcard(require("react"));
8
+ var _act = _interopRequireDefault(require("./act"));
9
+ var _cleanup = require("./cleanup");
10
+ var _config = require("./config");
11
+ var _componentTree = require("./helpers/component-tree");
12
+ var _debug = require("./helpers/debug");
13
+ var _errors = require("./helpers/errors");
14
+ var _renderAct = require("./render-act");
15
+ var _screen = require("./screen");
16
+ var _within = require("./within");
17
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
18
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
19
+ /**
20
+ * Renders test component deeply using React Test Renderer and exposes helpers
21
+ * to assert on the output.
22
+ */
23
+ async function renderAsync(component, options = {}) {
24
+ const {
25
+ wrapper: Wrapper,
26
+ concurrentRoot,
27
+ ...rest
28
+ } = options || {};
29
+ const testRendererOptions = {
30
+ ...rest,
31
+ // @ts-expect-error incomplete typing on RTR package
32
+ unstable_isConcurrent: concurrentRoot ?? (0, _config.getConfig)().concurrentRoot
33
+ };
34
+ const wrap = element => Wrapper ? /*#__PURE__*/React.createElement(Wrapper, null, element) : element;
35
+ const renderer = await (0, _renderAct.renderWithAsyncAct)(wrap(component), testRendererOptions);
36
+ return buildRenderResult(renderer, wrap);
37
+ }
38
+ function buildRenderResult(renderer, wrap) {
39
+ const instance = renderer.root;
40
+ const rerender = _component => {
41
+ throw new _errors.ErrorWithStack('"rerender(...)" is not supported when using "renderAsync" use "await rerenderAsync(...)" instead', rerender);
42
+ };
43
+ const rerenderAsync = async component => {
44
+ // eslint-disable-next-line require-await
45
+ await (0, _act.default)(async () => {
46
+ renderer.update(wrap(component));
47
+ });
48
+ };
49
+ const unmount = () => {
50
+ throw new _errors.ErrorWithStack('"unmount()" is not supported when using "renderAsync" use "await unmountAsync()" instead', unmount);
51
+ };
52
+ const unmountAsync = async () => {
53
+ // eslint-disable-next-line require-await
54
+ await (0, _act.default)(async () => {
55
+ renderer.unmount();
56
+ });
57
+ };
58
+ (0, _cleanup.addToCleanupQueue)(unmountAsync);
59
+ const result = {
60
+ ...(0, _within.getQueriesForElement)(instance),
61
+ rerender,
62
+ rerenderAsync,
63
+ update: rerender,
64
+ // alias for `rerender`
65
+ updateAsync: rerenderAsync,
66
+ // alias for `rerenderAsync`
67
+ unmount,
68
+ unmountAsync,
69
+ toJSON: renderer.toJSON,
70
+ debug: makeDebug(renderer),
71
+ get root() {
72
+ return (0, _componentTree.getHostSelves)(instance)[0];
73
+ },
74
+ UNSAFE_root: instance
75
+ };
76
+
77
+ // Add as non-enumerable property, so that it's safe to enumerate
78
+ // `render` result, e.g. using destructuring rest syntax.
79
+ Object.defineProperty(result, 'container', {
80
+ enumerable: false,
81
+ get() {
82
+ throw new Error("'container' property has been renamed to 'UNSAFE_root'.\n\n" + "Consider using 'root' property which returns root host element.");
83
+ }
84
+ });
85
+ (0, _screen.setRenderResult)(result);
86
+ return result;
87
+ }
88
+ function makeDebug(renderer) {
89
+ function debugImpl(options) {
90
+ const {
91
+ defaultDebugOptions
92
+ } = (0, _config.getConfig)();
93
+ const debugOptions = {
94
+ ...defaultDebugOptions,
95
+ ...options
96
+ };
97
+ const json = renderer.toJSON();
98
+ if (json) {
99
+ return (0, _debug.debug)(json, debugOptions);
100
+ }
101
+ }
102
+ return debugImpl;
103
+ }
104
+ //# sourceMappingURL=render-async.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-async.js","names":["React","_interopRequireWildcard","require","_act","_interopRequireDefault","_cleanup","_config","_componentTree","_debug","_errors","_renderAct","_screen","_within","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","renderAsync","component","options","wrapper","Wrapper","concurrentRoot","rest","testRendererOptions","unstable_isConcurrent","getConfig","wrap","element","createElement","renderer","renderWithAsyncAct","buildRenderResult","instance","root","rerender","_component","ErrorWithStack","rerenderAsync","act","update","unmount","unmountAsync","addToCleanupQueue","result","getQueriesForElement","updateAsync","toJSON","debug","makeDebug","getHostSelves","UNSAFE_root","enumerable","Error","setRenderResult","debugImpl","defaultDebugOptions","debugOptions","json"],"sources":["../src/render-async.tsx"],"sourcesContent":["import * as React from 'react';\nimport type {\n ReactTestInstance,\n ReactTestRenderer,\n TestRendererOptions,\n} from 'react-test-renderer';\n\nimport act from './act';\nimport { addToCleanupQueue } from './cleanup';\nimport { getConfig } from './config';\nimport { getHostSelves } from './helpers/component-tree';\nimport type { DebugOptions } from './helpers/debug';\nimport { debug } from './helpers/debug';\nimport { ErrorWithStack } from './helpers/errors';\nimport { renderWithAsyncAct } from './render-act';\nimport { setRenderResult } from './screen';\nimport { getQueriesForElement } from './within';\n\nexport interface RenderAsyncOptions {\n /**\n * Pass a React Component as the wrapper option to have it rendered around the inner element. This is most useful for creating\n * reusable custom render functions for common data providers.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n wrapper?: React.ComponentType<any>;\n\n /**\n * Set to `false` to disable concurrent rendering.\n * Otherwise `render` will default to concurrent rendering.\n */\n // TODO: should we assume concurrentRoot is true for react suspense?\n concurrentRoot?: boolean;\n\n createNodeMock?: (element: React.ReactElement) => unknown;\n}\n\nexport type RenderAsyncResult = ReturnType<typeof renderAsync>;\n\n/**\n * Renders test component deeply using React Test Renderer and exposes helpers\n * to assert on the output.\n */\nexport default async function renderAsync<T>(\n component: React.ReactElement<T>,\n options: RenderAsyncOptions = {},\n) {\n const { wrapper: Wrapper, concurrentRoot, ...rest } = options || {};\n\n const testRendererOptions: TestRendererOptions = {\n ...rest,\n // @ts-expect-error incomplete typing on RTR package\n unstable_isConcurrent: concurrentRoot ?? getConfig().concurrentRoot,\n };\n\n const wrap = (element: React.ReactElement) => (Wrapper ? <Wrapper>{element}</Wrapper> : element);\n const renderer = await renderWithAsyncAct(wrap(component), testRendererOptions);\n return buildRenderResult(renderer, wrap);\n}\n\nfunction buildRenderResult(\n renderer: ReactTestRenderer,\n wrap: (element: React.ReactElement) => React.JSX.Element,\n) {\n const instance = renderer.root;\n\n const rerender = (_component: React.ReactElement) => {\n throw new ErrorWithStack(\n '\"rerender(...)\" is not supported when using \"renderAsync\" use \"await rerenderAsync(...)\" instead',\n rerender,\n );\n };\n const rerenderAsync = async (component: React.ReactElement) => {\n // eslint-disable-next-line require-await\n await act(async () => {\n renderer.update(wrap(component));\n });\n };\n\n const unmount = () => {\n throw new ErrorWithStack(\n '\"unmount()\" is not supported when using \"renderAsync\" use \"await unmountAsync()\" instead',\n unmount,\n );\n };\n const unmountAsync = async () => {\n // eslint-disable-next-line require-await\n await act(async () => {\n renderer.unmount();\n });\n };\n\n addToCleanupQueue(unmountAsync);\n\n const result = {\n ...getQueriesForElement(instance),\n rerender,\n rerenderAsync,\n update: rerender, // alias for `rerender`\n updateAsync: rerenderAsync, // alias for `rerenderAsync`\n unmount,\n unmountAsync,\n toJSON: renderer.toJSON,\n debug: makeDebug(renderer),\n get root(): ReactTestInstance {\n return getHostSelves(instance)[0];\n },\n UNSAFE_root: instance,\n };\n\n // Add as non-enumerable property, so that it's safe to enumerate\n // `render` result, e.g. using destructuring rest syntax.\n Object.defineProperty(result, 'container', {\n enumerable: false,\n get() {\n throw new Error(\n \"'container' property has been renamed to 'UNSAFE_root'.\\n\\n\" +\n \"Consider using 'root' property which returns root host element.\",\n );\n },\n });\n\n setRenderResult(result);\n\n return result;\n}\n\nexport type DebugFunction = (options?: DebugOptions) => void;\n\nfunction makeDebug(renderer: ReactTestRenderer): DebugFunction {\n function debugImpl(options?: DebugOptions) {\n const { defaultDebugOptions } = getConfig();\n const debugOptions = { ...defaultDebugOptions, ...options };\n const json = renderer.toJSON();\n if (json) {\n return debug(json, debugOptions);\n }\n }\n return debugImpl;\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,9 +1,14 @@
1
1
  import * as React from 'react';
2
2
  export type RenderHookResult<Result, Props> = {
3
+ result: React.RefObject<Result>;
3
4
  rerender: (props: Props) => void;
4
- result: React.MutableRefObject<Result>;
5
5
  unmount: () => void;
6
6
  };
7
+ export type RenderHookAsyncResult<Result, Props> = {
8
+ result: React.RefObject<Result>;
9
+ rerenderAsync: (props: Props) => Promise<void>;
10
+ unmountAsync: () => Promise<void>;
11
+ };
7
12
  export type RenderHookOptions<Props> = {
8
13
  /**
9
14
  * The initial props to pass to the hook.
@@ -21,3 +26,4 @@ export type RenderHookOptions<Props> = {
21
26
  concurrentRoot?: boolean;
22
27
  };
23
28
  export declare function renderHook<Result, Props>(hookToRender: (props: Props) => Result, options?: RenderHookOptions<Props>): RenderHookResult<Result, Props>;
29
+ export declare function renderHookAsync<Result, Props>(hookToRender: (props: Props) => Result, options?: RenderHookOptions<Props>): Promise<RenderHookAsyncResult<Result, Props>>;
@@ -4,14 +4,46 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.renderHook = renderHook;
7
+ exports.renderHookAsync = renderHookAsync;
7
8
  var React = _interopRequireWildcard(require("react"));
8
- var _render = require("./render");
9
+ var _render = _interopRequireDefault(require("./render"));
10
+ var _renderAsync = _interopRequireDefault(require("./render-async"));
11
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
9
12
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
10
13
  function renderHook(hookToRender, options) {
14
+ const result = /*#__PURE__*/React.createRef();
15
+ function HookContainer({
16
+ hookProps
17
+ }) {
18
+ const renderResult = hookToRender(hookProps);
19
+ React.useEffect(() => {
20
+ result.current = renderResult;
21
+ });
22
+ return null;
23
+ }
11
24
  const {
12
25
  initialProps,
13
26
  ...renderOptions
14
27
  } = options ?? {};
28
+ const {
29
+ rerender: rerenderComponent,
30
+ unmount
31
+ } = (0, _render.default)(
32
+ /*#__PURE__*/
33
+ // @ts-expect-error since option can be undefined, initialProps can be undefined when it should'nt
34
+ React.createElement(HookContainer, {
35
+ hookProps: initialProps
36
+ }), renderOptions);
37
+ return {
38
+ // Result should already be set after the first render effects are run.
39
+ result: result,
40
+ rerender: hookProps => rerenderComponent(/*#__PURE__*/React.createElement(HookContainer, {
41
+ hookProps: hookProps
42
+ })),
43
+ unmount
44
+ };
45
+ }
46
+ async function renderHookAsync(hookToRender, options) {
15
47
  const result = /*#__PURE__*/React.createRef();
16
48
  function TestComponent({
17
49
  hookProps
@@ -23,24 +55,25 @@ function renderHook(hookToRender, options) {
23
55
  return null;
24
56
  }
25
57
  const {
26
- rerender: componentRerender,
27
- unmount
28
- } = (0, _render.renderInternal)(
58
+ initialProps,
59
+ ...renderOptions
60
+ } = options ?? {};
61
+ const {
62
+ rerenderAsync: rerenderComponentAsync,
63
+ unmountAsync
64
+ } = await (0, _renderAsync.default)(
29
65
  /*#__PURE__*/
30
66
  // @ts-expect-error since option can be undefined, initialProps can be undefined when it should'nt
31
67
  React.createElement(TestComponent, {
32
68
  hookProps: initialProps
33
69
  }), renderOptions);
34
- function rerender(hookProps) {
35
- return componentRerender(/*#__PURE__*/React.createElement(TestComponent, {
36
- hookProps: hookProps
37
- }));
38
- }
39
70
  return {
40
71
  // Result should already be set after the first render effects are run.
41
72
  result: result,
42
- rerender,
43
- unmount
73
+ rerenderAsync: hookProps => rerenderComponentAsync(/*#__PURE__*/React.createElement(TestComponent, {
74
+ hookProps: hookProps
75
+ })),
76
+ unmountAsync
44
77
  };
45
78
  }
46
79
  //# sourceMappingURL=render-hook.js.map