@testing-library/react-native 11.1.0 → 11.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/build/act.d.ts +8 -3
  2. package/build/act.js +73 -2
  3. package/build/act.js.map +1 -1
  4. package/build/config.d.ts +10 -0
  5. package/build/config.js +28 -0
  6. package/build/config.js.map +1 -0
  7. package/build/fireEvent.js +7 -11
  8. package/build/fireEvent.js.map +1 -1
  9. package/build/helpers/accessiblity.d.ts +2 -0
  10. package/build/helpers/accessiblity.js +60 -0
  11. package/build/helpers/accessiblity.js.map +1 -0
  12. package/build/helpers/component-tree.d.ts +44 -0
  13. package/build/helpers/component-tree.js +145 -0
  14. package/build/helpers/component-tree.js.map +1 -0
  15. package/build/helpers/stringValidation.d.ts +2 -0
  16. package/build/helpers/stringValidation.js +38 -0
  17. package/build/helpers/stringValidation.js.map +1 -0
  18. package/build/helpers/timers.js +1 -1
  19. package/build/helpers/timers.js.map +1 -1
  20. package/build/index.flow.js +28 -4
  21. package/build/index.js +27 -11
  22. package/build/index.js.map +1 -1
  23. package/build/pure.d.ts +4 -0
  24. package/build/pure.js +22 -0
  25. package/build/pure.js.map +1 -1
  26. package/build/queries/a11yState.d.ts +1 -1
  27. package/build/queries/a11yState.js.map +1 -1
  28. package/build/queries/displayValue.js +7 -15
  29. package/build/queries/displayValue.js.map +1 -1
  30. package/build/queries/placeholderText.js +6 -14
  31. package/build/queries/placeholderText.js.map +1 -1
  32. package/build/queries/role.d.ts +10 -6
  33. package/build/queries/role.js +13 -2
  34. package/build/queries/role.js.map +1 -1
  35. package/build/queries/text.js +28 -28
  36. package/build/queries/text.js.map +1 -1
  37. package/build/react-versions.d.ts +1 -0
  38. package/build/react-versions.js +19 -0
  39. package/build/react-versions.js.map +1 -0
  40. package/build/render.d.ts +20 -7
  41. package/build/render.js +37 -1
  42. package/build/render.js.map +1 -1
  43. package/build/waitFor.js +16 -12
  44. package/build/waitFor.js.map +1 -1
  45. package/build/within.d.ts +18 -6
  46. package/package.json +12 -11
  47. package/typings/index.flow.js +28 -4
package/build/act.d.ts CHANGED
@@ -1,3 +1,8 @@
1
- import { act } from 'react-test-renderer';
2
- declare const _default: typeof act;
3
- export default _default;
1
+ declare global {
2
+ var IS_REACT_ACT_ENVIRONMENT: boolean | undefined;
3
+ }
4
+ declare function setIsReactActEnvironment(isReactActEnvironment: boolean | undefined): void;
5
+ declare function getIsReactActEnvironment(): boolean | undefined;
6
+ declare const act: (callback: () => void) => void;
7
+ export default act;
8
+ export { setIsReactActEnvironment as setReactActEnvironment, getIsReactActEnvironment, };
package/build/act.js CHANGED
@@ -4,14 +4,85 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
+ exports.getIsReactActEnvironment = getIsReactActEnvironment;
8
+ exports.setReactActEnvironment = setIsReactActEnvironment;
7
9
 
8
10
  var _reactTestRenderer = require("react-test-renderer");
9
11
 
12
+ var _reactVersions = require("./react-versions");
13
+
14
+ // This file and the act() implementation is sourced from react-testing-library
15
+ // https://github.com/testing-library/react-testing-library/blob/c80809a956b0b9f3289c4a6fa8b5e8cc72d6ef6d/src/act-compat.js
10
16
  const actMock = callback => {
11
17
  callback();
12
- };
18
+ }; // See https://github.com/reactwg/react-18/discussions/102 for more context on global.IS_REACT_ACT_ENVIRONMENT
19
+
20
+
21
+ function setIsReactActEnvironment(isReactActEnvironment) {
22
+ globalThis.IS_REACT_ACT_ENVIRONMENT = isReactActEnvironment;
23
+ }
24
+
25
+ function getIsReactActEnvironment() {
26
+ return globalThis.IS_REACT_ACT_ENVIRONMENT;
27
+ }
28
+
29
+ function withGlobalActEnvironment(actImplementation) {
30
+ return callback => {
31
+ const previousActEnvironment = getIsReactActEnvironment();
32
+ setIsReactActEnvironment(true); // this code is riddled with eslint disabling comments because this doesn't use real promises but eslint thinks we do
13
33
 
14
- var _default = _reactTestRenderer.act || actMock;
34
+ try {
35
+ // The return value of `act` is always a thenable.
36
+ let callbackNeedsToBeAwaited = false;
37
+ const actResult = actImplementation(() => {
38
+ const result = callback();
39
+
40
+ if (result !== null && typeof result === 'object' && // @ts-expect-error this should be a promise or thenable
41
+ // eslint-disable-next-line promise/prefer-await-to-then
42
+ typeof result.then === 'function') {
43
+ callbackNeedsToBeAwaited = true;
44
+ }
45
+
46
+ return result;
47
+ });
48
+
49
+ if (callbackNeedsToBeAwaited) {
50
+ const thenable = actResult;
51
+ return {
52
+ then: (resolve, reject) => {
53
+ // eslint-disable-next-line
54
+ thenable.then( // eslint-disable-next-line promise/always-return
55
+ returnValue => {
56
+ setIsReactActEnvironment(previousActEnvironment);
57
+ resolve(returnValue);
58
+ }, error => {
59
+ setIsReactActEnvironment(previousActEnvironment);
60
+ reject(error);
61
+ });
62
+ }
63
+ };
64
+ } else {
65
+ setIsReactActEnvironment(previousActEnvironment);
66
+ return actResult;
67
+ }
68
+ } catch (error) {
69
+ // Can't be a `finally {}` block since we don't know if we have to immediately restore IS_REACT_ACT_ENVIRONMENT
70
+ // or if we have to await the callback first.
71
+ setIsReactActEnvironment(previousActEnvironment);
72
+ throw error;
73
+ }
74
+ };
75
+ }
76
+
77
+ const getAct = () => {
78
+ if (!_reactTestRenderer.act) {
79
+ return actMock;
80
+ }
81
+
82
+ return (0, _reactVersions.checkReactVersionAtLeast)(18, 0) ? withGlobalActEnvironment(_reactTestRenderer.act) : _reactTestRenderer.act;
83
+ };
15
84
 
85
+ const act = getAct();
86
+ var _default = act;
16
87
  exports.default = _default;
17
88
  //# sourceMappingURL=act.js.map
package/build/act.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"act.js","names":["actMock","callback","act"],"sources":["../src/act.ts"],"sourcesContent":["import { act } from 'react-test-renderer';\n\nconst actMock = (callback: () => void) => {\n callback();\n};\n\nexport default act || actMock;\n"],"mappings":";;;;;;;AAAA;;AAEA,MAAMA,OAAO,GAAIC,QAAD,IAA0B;EACxCA,QAAQ;AACT,CAFD;;eAIeC,sBAAA,IAAOF,O"}
1
+ {"version":3,"file":"act.js","names":["actMock","callback","setIsReactActEnvironment","isReactActEnvironment","globalThis","IS_REACT_ACT_ENVIRONMENT","getIsReactActEnvironment","withGlobalActEnvironment","actImplementation","previousActEnvironment","callbackNeedsToBeAwaited","actResult","result","then","thenable","resolve","reject","returnValue","error","getAct","reactTestRendererAct","checkReactVersionAtLeast","act"],"sources":["../src/act.ts"],"sourcesContent":["// This file and the act() implementation is sourced from react-testing-library\n// https://github.com/testing-library/react-testing-library/blob/c80809a956b0b9f3289c4a6fa8b5e8cc72d6ef6d/src/act-compat.js\nimport { act as reactTestRendererAct } from 'react-test-renderer';\nimport { checkReactVersionAtLeast } from './react-versions';\n\nconst actMock = (callback: () => void) => {\n callback();\n};\n\n// See https://github.com/reactwg/react-18/discussions/102 for more context on global.IS_REACT_ACT_ENVIRONMENT\ndeclare global {\n var IS_REACT_ACT_ENVIRONMENT: boolean | undefined;\n}\n\nfunction setIsReactActEnvironment(isReactActEnvironment: boolean | undefined) {\n globalThis.IS_REACT_ACT_ENVIRONMENT = isReactActEnvironment;\n}\n\nfunction getIsReactActEnvironment() {\n return globalThis.IS_REACT_ACT_ENVIRONMENT;\n}\n\ntype Act = typeof reactTestRendererAct;\n\nfunction withGlobalActEnvironment(actImplementation: Act) {\n return (callback: Parameters<Act>[0]) => {\n const previousActEnvironment = getIsReactActEnvironment();\n setIsReactActEnvironment(true);\n\n // this code is riddled with eslint disabling comments because this doesn't use real promises but eslint thinks we do\n try {\n // The return value of `act` is always a thenable.\n let callbackNeedsToBeAwaited = false;\n const actResult = actImplementation(() => {\n const result = callback();\n if (\n result !== null &&\n typeof result === 'object' &&\n // @ts-expect-error this should be a promise or thenable\n // eslint-disable-next-line promise/prefer-await-to-then\n typeof result.then === 'function'\n ) {\n callbackNeedsToBeAwaited = true;\n }\n return result;\n });\n if (callbackNeedsToBeAwaited) {\n const thenable = actResult;\n return {\n then: (\n resolve: (value: never) => never,\n reject: (value: never) => never\n ) => {\n // eslint-disable-next-line\n thenable.then(\n // eslint-disable-next-line promise/always-return\n (returnValue) => {\n setIsReactActEnvironment(previousActEnvironment);\n resolve(returnValue);\n },\n (error) => {\n setIsReactActEnvironment(previousActEnvironment);\n reject(error);\n }\n );\n },\n };\n } else {\n setIsReactActEnvironment(previousActEnvironment);\n return actResult;\n }\n } catch (error) {\n // Can't be a `finally {}` block since we don't know if we have to immediately restore IS_REACT_ACT_ENVIRONMENT\n // or if we have to await the callback first.\n setIsReactActEnvironment(previousActEnvironment);\n throw error;\n }\n };\n}\nconst getAct = () => {\n if (!reactTestRendererAct) {\n return actMock;\n }\n\n return checkReactVersionAtLeast(18, 0)\n ? withGlobalActEnvironment(reactTestRendererAct)\n : reactTestRendererAct;\n};\nconst act = getAct();\n\nexport default act;\nexport {\n setIsReactActEnvironment as setReactActEnvironment,\n getIsReactActEnvironment,\n};\n"],"mappings":";;;;;;;;;AAEA;;AACA;;AAHA;AACA;AAIA,MAAMA,OAAO,GAAIC,QAAD,IAA0B;EACxCA,QAAQ;AACT,CAFD,C,CAIA;;;AAKA,SAASC,wBAAT,CAAkCC,qBAAlC,EAA8E;EAC5EC,UAAU,CAACC,wBAAX,GAAsCF,qBAAtC;AACD;;AAED,SAASG,wBAAT,GAAoC;EAClC,OAAOF,UAAU,CAACC,wBAAlB;AACD;;AAID,SAASE,wBAAT,CAAkCC,iBAAlC,EAA0D;EACxD,OAAQP,QAAD,IAAkC;IACvC,MAAMQ,sBAAsB,GAAGH,wBAAwB,EAAvD;IACAJ,wBAAwB,CAAC,IAAD,CAAxB,CAFuC,CAIvC;;IACA,IAAI;MACF;MACA,IAAIQ,wBAAwB,GAAG,KAA/B;MACA,MAAMC,SAAS,GAAGH,iBAAiB,CAAC,MAAM;QACxC,MAAMI,MAAM,GAAGX,QAAQ,EAAvB;;QACA,IACEW,MAAM,KAAK,IAAX,IACA,OAAOA,MAAP,KAAkB,QADlB,IAEA;QACA;QACA,OAAOA,MAAM,CAACC,IAAd,KAAuB,UALzB,EAME;UACAH,wBAAwB,GAAG,IAA3B;QACD;;QACD,OAAOE,MAAP;MACD,CAZkC,CAAnC;;MAaA,IAAIF,wBAAJ,EAA8B;QAC5B,MAAMI,QAAQ,GAAGH,SAAjB;QACA,OAAO;UACLE,IAAI,EAAE,CACJE,OADI,EAEJC,MAFI,KAGD;YACH;YACAF,QAAQ,CAACD,IAAT,EACE;YACCI,WAAD,IAAiB;cACff,wBAAwB,CAACO,sBAAD,CAAxB;cACAM,OAAO,CAACE,WAAD,CAAP;YACD,CALH,EAMGC,KAAD,IAAW;cACThB,wBAAwB,CAACO,sBAAD,CAAxB;cACAO,MAAM,CAACE,KAAD,CAAN;YACD,CATH;UAWD;QAjBI,CAAP;MAmBD,CArBD,MAqBO;QACLhB,wBAAwB,CAACO,sBAAD,CAAxB;QACA,OAAOE,SAAP;MACD;IACF,CAzCD,CAyCE,OAAOO,KAAP,EAAc;MACd;MACA;MACAhB,wBAAwB,CAACO,sBAAD,CAAxB;MACA,MAAMS,KAAN;IACD;EACF,CApDD;AAqDD;;AACD,MAAMC,MAAM,GAAG,MAAM;EACnB,IAAI,CAACC,sBAAL,EAA2B;IACzB,OAAOpB,OAAP;EACD;;EAED,OAAO,IAAAqB,uCAAA,EAAyB,EAAzB,EAA6B,CAA7B,IACHd,wBAAwB,CAACa,sBAAD,CADrB,GAEHA,sBAFJ;AAGD,CARD;;AASA,MAAME,GAAG,GAAGH,MAAM,EAAlB;eAEeG,G"}
@@ -0,0 +1,10 @@
1
+ export declare type Config = {
2
+ /** Default timeout, in ms, for `waitFor` and `findBy*` queries. */
3
+ asyncUtilTimeout: number;
4
+ };
5
+ export declare function configure(options: Partial<Config>): void;
6
+ export declare function resetToDefaults(): void;
7
+ export declare function getConfig(): {
8
+ /** Default timeout, in ms, for `waitFor` and `findBy*` queries. */
9
+ asyncUtilTimeout: number;
10
+ };
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.configure = configure;
7
+ exports.getConfig = getConfig;
8
+ exports.resetToDefaults = resetToDefaults;
9
+ const defaultConfig = {
10
+ asyncUtilTimeout: 1000
11
+ };
12
+ let config = { ...defaultConfig
13
+ };
14
+
15
+ function configure(options) {
16
+ config = { ...config,
17
+ ...options
18
+ };
19
+ }
20
+
21
+ function resetToDefaults() {
22
+ config = defaultConfig;
23
+ }
24
+
25
+ function getConfig() {
26
+ return config;
27
+ }
28
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","names":["defaultConfig","asyncUtilTimeout","config","configure","options","resetToDefaults","getConfig"],"sources":["../src/config.ts"],"sourcesContent":["export type Config = {\n /** Default timeout, in ms, for `waitFor` and `findBy*` queries. */\n asyncUtilTimeout: number;\n};\n\nconst defaultConfig: Config = {\n asyncUtilTimeout: 1000,\n};\n\nlet config = {\n ...defaultConfig,\n};\n\nexport function configure(options: Partial<Config>) {\n config = {\n ...config,\n ...options,\n };\n}\n\nexport function resetToDefaults() {\n config = defaultConfig;\n}\n\nexport function getConfig() {\n return config;\n}\n"],"mappings":";;;;;;;;AAKA,MAAMA,aAAqB,GAAG;EAC5BC,gBAAgB,EAAE;AADU,CAA9B;AAIA,IAAIC,MAAM,GAAG,EACX,GAAGF;AADQ,CAAb;;AAIO,SAASG,SAAT,CAAmBC,OAAnB,EAA6C;EAClDF,MAAM,GAAG,EACP,GAAGA,MADI;IAEP,GAAGE;EAFI,CAAT;AAID;;AAEM,SAASC,eAAT,GAA2B;EAChCH,MAAM,GAAGF,aAAT;AACD;;AAEM,SAASM,SAAT,GAAqB;EAC1B,OAAOJ,MAAP;AACD"}
@@ -5,24 +5,20 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
 
8
+ var _reactNative = require("react-native");
9
+
8
10
  var _act = _interopRequireDefault(require("./act"));
9
11
 
12
+ var _componentTree = require("./helpers/component-tree");
13
+
10
14
  var _filterNodeByType = require("./helpers/filterNodeByType");
11
15
 
12
16
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
17
 
14
- const isHostElement = element => {
15
- return typeof element?.type === 'string';
16
- };
17
-
18
18
  const isTextInput = element => {
19
19
  if (!element) {
20
20
  return false;
21
- }
22
-
23
- const {
24
- TextInput
25
- } = require('react-native'); // We have to test if the element type is either the TextInput component
21
+ } // We have to test if the element type is either the TextInput component
26
22
  // (which would if it is a composite component) or the string
27
23
  // TextInput (which would be true if it is a host component)
28
24
  // All queries but the one by testID return composite component and event
@@ -30,11 +26,11 @@ const isTextInput = element => {
30
26
  // it would trigger the parent prop without the composite component check
31
27
 
32
28
 
33
- return (0, _filterNodeByType.filterNodeByType)(element, TextInput) || (0, _filterNodeByType.filterNodeByType)(element, 'TextInput');
29
+ return (0, _filterNodeByType.filterNodeByType)(element, _reactNative.TextInput) || (0, _filterNodeByType.filterNodeByType)(element, 'TextInput');
34
30
  };
35
31
 
36
32
  const isTouchResponder = element => {
37
- if (!isHostElement(element)) return false;
33
+ if (!(0, _componentTree.isHostElement)(element)) return false;
38
34
  return !!element?.props.onStartShouldSetResponder || isTextInput(element);
39
35
  };
40
36
 
@@ -1 +1 @@
1
- {"version":3,"file":"fireEvent.js","names":["isHostElement","element","type","isTextInput","TextInput","require","filterNodeByType","isTouchResponder","props","onStartShouldSetResponder","isPointerEventEnabled","isParent","parentCondition","pointerEvents","parent","isTouchEvent","eventName","isEventEnabled","touchResponder","editable","touchStart","touchMove","onMoveShouldSetResponder","undefined","findEventHandler","callsite","nearestTouchResponder","handler","getEventHandler","eventHandlerName","toEventHandlerName","invokeEvent","data","returnValue","act","charAt","toUpperCase","slice","pressHandler","changeTextHandler","scrollHandler","fireEvent","press","changeText","scroll"],"sources":["../src/fireEvent.ts"],"sourcesContent":["import { ReactTestInstance } from 'react-test-renderer';\nimport act from './act';\nimport { filterNodeByType } from './helpers/filterNodeByType';\n\ntype EventHandler = (...args: any) => unknown;\n\nconst isHostElement = (element?: ReactTestInstance) => {\n return typeof element?.type === 'string';\n};\n\nconst isTextInput = (element?: ReactTestInstance) => {\n if (!element) {\n return false;\n }\n\n const { TextInput } = require('react-native');\n // We have to test if the element type is either the TextInput component\n // (which would if it is a composite component) or the string\n // TextInput (which would be true if it is a host component)\n // All queries but the one by testID return composite component and event\n // if all queries returned host components, since fireEvent bubbles up\n // it would trigger the parent prop without the composite component check\n return (\n filterNodeByType(element, TextInput) ||\n filterNodeByType(element, 'TextInput')\n );\n};\n\nconst isTouchResponder = (element?: ReactTestInstance) => {\n if (!isHostElement(element)) return false;\n\n return !!element?.props.onStartShouldSetResponder || isTextInput(element);\n};\n\nconst isPointerEventEnabled = (\n element?: ReactTestInstance,\n isParent?: boolean\n): boolean => {\n const parentCondition = isParent\n ? element?.props.pointerEvents === 'box-only'\n : element?.props.pointerEvents === 'box-none';\n\n if (element?.props.pointerEvents === 'none' || parentCondition) {\n return false;\n }\n\n if (!element?.parent) return true;\n\n return isPointerEventEnabled(element.parent, true);\n};\n\nconst isTouchEvent = (eventName?: string) => {\n return eventName === 'press';\n};\n\nconst isEventEnabled = (\n element?: ReactTestInstance,\n touchResponder?: ReactTestInstance,\n eventName?: string\n) => {\n if (isTextInput(element)) return element?.props.editable !== false;\n if (!isPointerEventEnabled(element) && isTouchEvent(eventName)) return false;\n\n const touchStart = touchResponder?.props.onStartShouldSetResponder?.();\n const touchMove = touchResponder?.props.onMoveShouldSetResponder?.();\n\n if (touchStart || touchMove) return true;\n\n return touchStart === undefined && touchMove === undefined;\n};\n\nconst findEventHandler = (\n element: ReactTestInstance,\n eventName: string,\n callsite?: any,\n nearestTouchResponder?: ReactTestInstance\n): EventHandler | null => {\n const touchResponder = isTouchResponder(element)\n ? element\n : nearestTouchResponder;\n\n const handler = getEventHandler(element, eventName);\n if (handler && isEventEnabled(element, touchResponder, eventName))\n return handler;\n\n if (element.parent === null || element.parent.parent === null) {\n return null;\n }\n\n return findEventHandler(element.parent, eventName, callsite, touchResponder);\n};\n\nconst getEventHandler = (\n element: ReactTestInstance,\n eventName: string\n): EventHandler | undefined => {\n const eventHandlerName = toEventHandlerName(eventName);\n if (typeof element.props[eventHandlerName] === 'function') {\n return element.props[eventHandlerName];\n }\n\n if (typeof element.props[eventName] === 'function') {\n return element.props[eventName];\n }\n\n return undefined;\n};\n\nconst invokeEvent = (\n element: ReactTestInstance,\n eventName: string,\n callsite?: any,\n ...data: Array<any>\n) => {\n const handler = findEventHandler(element, eventName, callsite);\n\n if (!handler) {\n return;\n }\n\n let returnValue;\n\n act(() => {\n returnValue = handler(...data);\n });\n\n return returnValue;\n};\n\nconst toEventHandlerName = (eventName: string) =>\n `on${eventName.charAt(0).toUpperCase()}${eventName.slice(1)}`;\n\nconst pressHandler = (element: ReactTestInstance, ...data: Array<any>): void =>\n invokeEvent(element, 'press', pressHandler, ...data);\nconst changeTextHandler = (\n element: ReactTestInstance,\n ...data: Array<any>\n): void => invokeEvent(element, 'changeText', changeTextHandler, ...data);\nconst scrollHandler = (element: ReactTestInstance, ...data: Array<any>): void =>\n invokeEvent(element, 'scroll', scrollHandler, ...data);\n\nconst fireEvent = (\n element: ReactTestInstance,\n eventName: string,\n ...data: Array<any>\n): void => invokeEvent(element, eventName, fireEvent, ...data);\n\nfireEvent.press = pressHandler;\nfireEvent.changeText = changeTextHandler;\nfireEvent.scroll = scrollHandler;\n\nexport default fireEvent;\n"],"mappings":"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"}
1
+ {"version":3,"file":"fireEvent.js","names":["isTextInput","element","filterNodeByType","TextInput","isTouchResponder","isHostElement","props","onStartShouldSetResponder","isPointerEventEnabled","isParent","parentCondition","pointerEvents","parent","isTouchEvent","eventName","isEventEnabled","touchResponder","editable","touchStart","touchMove","onMoveShouldSetResponder","undefined","findEventHandler","callsite","nearestTouchResponder","handler","getEventHandler","eventHandlerName","toEventHandlerName","invokeEvent","data","returnValue","act","charAt","toUpperCase","slice","pressHandler","changeTextHandler","scrollHandler","fireEvent","press","changeText","scroll"],"sources":["../src/fireEvent.ts"],"sourcesContent":["import { ReactTestInstance } from 'react-test-renderer';\nimport { TextInput } from 'react-native';\nimport act from './act';\nimport { isHostElement } from './helpers/component-tree';\nimport { filterNodeByType } from './helpers/filterNodeByType';\n\ntype EventHandler = (...args: any) => unknown;\n\nconst isTextInput = (element?: ReactTestInstance) => {\n if (!element) {\n return false;\n }\n\n // We have to test if the element type is either the TextInput component\n // (which would if it is a composite component) or the string\n // TextInput (which would be true if it is a host component)\n // All queries but the one by testID return composite component and event\n // if all queries returned host components, since fireEvent bubbles up\n // it would trigger the parent prop without the composite component check\n return (\n filterNodeByType(element, TextInput) ||\n filterNodeByType(element, 'TextInput')\n );\n};\n\nconst isTouchResponder = (element?: ReactTestInstance) => {\n if (!isHostElement(element)) return false;\n\n return !!element?.props.onStartShouldSetResponder || isTextInput(element);\n};\n\nconst isPointerEventEnabled = (\n element?: ReactTestInstance,\n isParent?: boolean\n): boolean => {\n const parentCondition = isParent\n ? element?.props.pointerEvents === 'box-only'\n : element?.props.pointerEvents === 'box-none';\n\n if (element?.props.pointerEvents === 'none' || parentCondition) {\n return false;\n }\n\n if (!element?.parent) return true;\n\n return isPointerEventEnabled(element.parent, true);\n};\n\nconst isTouchEvent = (eventName?: string) => {\n return eventName === 'press';\n};\n\nconst isEventEnabled = (\n element?: ReactTestInstance,\n touchResponder?: ReactTestInstance,\n eventName?: string\n) => {\n if (isTextInput(element)) return element?.props.editable !== false;\n if (!isPointerEventEnabled(element) && isTouchEvent(eventName)) return false;\n\n const touchStart = touchResponder?.props.onStartShouldSetResponder?.();\n const touchMove = touchResponder?.props.onMoveShouldSetResponder?.();\n\n if (touchStart || touchMove) return true;\n\n return touchStart === undefined && touchMove === undefined;\n};\n\nconst findEventHandler = (\n element: ReactTestInstance,\n eventName: string,\n callsite?: any,\n nearestTouchResponder?: ReactTestInstance\n): EventHandler | null => {\n const touchResponder = isTouchResponder(element)\n ? element\n : nearestTouchResponder;\n\n const handler = getEventHandler(element, eventName);\n if (handler && isEventEnabled(element, touchResponder, eventName))\n return handler;\n\n if (element.parent === null || element.parent.parent === null) {\n return null;\n }\n\n return findEventHandler(element.parent, eventName, callsite, touchResponder);\n};\n\nconst getEventHandler = (\n element: ReactTestInstance,\n eventName: string\n): EventHandler | undefined => {\n const eventHandlerName = toEventHandlerName(eventName);\n if (typeof element.props[eventHandlerName] === 'function') {\n return element.props[eventHandlerName];\n }\n\n if (typeof element.props[eventName] === 'function') {\n return element.props[eventName];\n }\n\n return undefined;\n};\n\nconst invokeEvent = (\n element: ReactTestInstance,\n eventName: string,\n callsite?: any,\n ...data: Array<any>\n) => {\n const handler = findEventHandler(element, eventName, callsite);\n\n if (!handler) {\n return;\n }\n\n let returnValue;\n\n act(() => {\n returnValue = handler(...data);\n });\n\n return returnValue;\n};\n\nconst toEventHandlerName = (eventName: string) =>\n `on${eventName.charAt(0).toUpperCase()}${eventName.slice(1)}`;\n\nconst pressHandler = (element: ReactTestInstance, ...data: Array<any>): void =>\n invokeEvent(element, 'press', pressHandler, ...data);\nconst changeTextHandler = (\n element: ReactTestInstance,\n ...data: Array<any>\n): void => invokeEvent(element, 'changeText', changeTextHandler, ...data);\nconst scrollHandler = (element: ReactTestInstance, ...data: Array<any>): void =>\n invokeEvent(element, 'scroll', scrollHandler, ...data);\n\nconst fireEvent = (\n element: ReactTestInstance,\n eventName: string,\n ...data: Array<any>\n): void => invokeEvent(element, eventName, fireEvent, ...data);\n\nfireEvent.press = pressHandler;\nfireEvent.changeText = changeTextHandler;\nfireEvent.scroll = scrollHandler;\n\nexport default fireEvent;\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { ReactTestInstance } from 'react-test-renderer';
2
+ export declare function isInaccessible(element: ReactTestInstance | null): boolean;
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.isInaccessible = isInaccessible;
7
+
8
+ var _reactNative = require("react-native");
9
+
10
+ var _componentTree = require("./component-tree");
11
+
12
+ function isInaccessible(element) {
13
+ if (element == null) {
14
+ return true;
15
+ }
16
+
17
+ let current = element;
18
+
19
+ while (current) {
20
+ if (isSubtreeInaccessible(current)) {
21
+ return true;
22
+ }
23
+
24
+ current = current.parent;
25
+ }
26
+
27
+ return false;
28
+ }
29
+
30
+ function isSubtreeInaccessible(element) {
31
+ if (element == null) {
32
+ return true;
33
+ } // iOS: accessibilityElementsHidden
34
+ // See: https://reactnative.dev/docs/accessibility#accessibilityelementshidden-ios
35
+
36
+
37
+ if (element.props.accessibilityElementsHidden) {
38
+ return true;
39
+ } // Android: importantForAccessibility
40
+ // See: https://reactnative.dev/docs/accessibility#importantforaccessibility-android
41
+
42
+
43
+ if (element.props.importantForAccessibility === 'no-hide-descendants') {
44
+ return true;
45
+ } // Note that `opacity: 0` is not threated as inassessible on iOS
46
+
47
+
48
+ const flatStyle = _reactNative.StyleSheet.flatten(element.props.style) ?? {};
49
+ if (flatStyle.display === 'none') return true; // iOS: accessibilityViewIsModal
50
+ // See: https://reactnative.dev/docs/accessibility#accessibilityviewismodal-ios
51
+
52
+ const hostSiblings = (0, _componentTree.getHostSiblings)(element);
53
+
54
+ if (hostSiblings.some(sibling => sibling.props.accessibilityViewIsModal)) {
55
+ return true;
56
+ }
57
+
58
+ return false;
59
+ }
60
+ //# sourceMappingURL=accessiblity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accessiblity.js","names":["isInaccessible","element","current","isSubtreeInaccessible","parent","props","accessibilityElementsHidden","importantForAccessibility","flatStyle","StyleSheet","flatten","style","display","hostSiblings","getHostSiblings","some","sibling","accessibilityViewIsModal"],"sources":["../../src/helpers/accessiblity.ts"],"sourcesContent":["import { StyleSheet } from 'react-native';\nimport { ReactTestInstance } from 'react-test-renderer';\nimport { getHostSiblings } from './component-tree';\n\nexport function isInaccessible(element: ReactTestInstance | null): boolean {\n if (element == null) {\n return true;\n }\n\n let current: ReactTestInstance | null = element;\n while (current) {\n if (isSubtreeInaccessible(current)) {\n return true;\n }\n\n current = current.parent;\n }\n\n return false;\n}\n\nfunction isSubtreeInaccessible(element: ReactTestInstance | null): boolean {\n if (element == null) {\n return true;\n }\n\n // iOS: accessibilityElementsHidden\n // See: https://reactnative.dev/docs/accessibility#accessibilityelementshidden-ios\n if (element.props.accessibilityElementsHidden) {\n return true;\n }\n\n // Android: importantForAccessibility\n // See: https://reactnative.dev/docs/accessibility#importantforaccessibility-android\n if (element.props.importantForAccessibility === 'no-hide-descendants') {\n return true;\n }\n\n // Note that `opacity: 0` is not threated as inassessible on iOS\n const flatStyle = StyleSheet.flatten(element.props.style) ?? {};\n if (flatStyle.display === 'none') return true;\n\n // iOS: accessibilityViewIsModal\n // See: https://reactnative.dev/docs/accessibility#accessibilityviewismodal-ios\n const hostSiblings = getHostSiblings(element);\n if (hostSiblings.some((sibling) => sibling.props.accessibilityViewIsModal)) {\n return true;\n }\n\n return false;\n}\n"],"mappings":";;;;;;;AAAA;;AAEA;;AAEO,SAASA,cAAT,CAAwBC,OAAxB,EAAoE;EACzE,IAAIA,OAAO,IAAI,IAAf,EAAqB;IACnB,OAAO,IAAP;EACD;;EAED,IAAIC,OAAiC,GAAGD,OAAxC;;EACA,OAAOC,OAAP,EAAgB;IACd,IAAIC,qBAAqB,CAACD,OAAD,CAAzB,EAAoC;MAClC,OAAO,IAAP;IACD;;IAEDA,OAAO,GAAGA,OAAO,CAACE,MAAlB;EACD;;EAED,OAAO,KAAP;AACD;;AAED,SAASD,qBAAT,CAA+BF,OAA/B,EAA2E;EACzE,IAAIA,OAAO,IAAI,IAAf,EAAqB;IACnB,OAAO,IAAP;EACD,CAHwE,CAKzE;EACA;;;EACA,IAAIA,OAAO,CAACI,KAAR,CAAcC,2BAAlB,EAA+C;IAC7C,OAAO,IAAP;EACD,CATwE,CAWzE;EACA;;;EACA,IAAIL,OAAO,CAACI,KAAR,CAAcE,yBAAd,KAA4C,qBAAhD,EAAuE;IACrE,OAAO,IAAP;EACD,CAfwE,CAiBzE;;;EACA,MAAMC,SAAS,GAAGC,uBAAA,CAAWC,OAAX,CAAmBT,OAAO,CAACI,KAAR,CAAcM,KAAjC,KAA2C,EAA7D;EACA,IAAIH,SAAS,CAACI,OAAV,KAAsB,MAA1B,EAAkC,OAAO,IAAP,CAnBuC,CAqBzE;EACA;;EACA,MAAMC,YAAY,GAAG,IAAAC,8BAAA,EAAgBb,OAAhB,CAArB;;EACA,IAAIY,YAAY,CAACE,IAAb,CAAmBC,OAAD,IAAaA,OAAO,CAACX,KAAR,CAAcY,wBAA7C,CAAJ,EAA4E;IAC1E,OAAO,IAAP;EACD;;EAED,OAAO,KAAP;AACD"}
@@ -0,0 +1,44 @@
1
+ /// <reference types="react" />
2
+ import { ReactTestInstance } from 'react-test-renderer';
3
+ /**
4
+ * Checks if the given element is a host element.
5
+ * @param element The element to check.
6
+ */
7
+ export declare function isHostElement(element?: ReactTestInstance | null): boolean;
8
+ /**
9
+ * Returns first host ancestor for given element.
10
+ * @param element The element start traversing from.
11
+ */
12
+ export declare function getHostParent(element: ReactTestInstance | null): ReactTestInstance | null;
13
+ /**
14
+ * Returns host children for given element.
15
+ * @param element The element start traversing from.
16
+ */
17
+ export declare function getHostChildren(element: ReactTestInstance | null): ReactTestInstance[];
18
+ /**
19
+ * Return a single host element that represent the passed host or composite element.
20
+ *
21
+ * @param element The element start traversing from.
22
+ * @throws Error if the passed element is a composite element and has no host children or has more than one host child.
23
+ * @returns If the passed element is a host element, it will return itself, if the passed element is a composite
24
+ * element, it will return a single host descendant.
25
+ */
26
+ export declare function getHostSelf(element: ReactTestInstance | null): ReactTestInstance;
27
+ /**
28
+ * Return the array of host elements that represent the passed element.
29
+ *
30
+ * @param element The element start traversing from.
31
+ * @returns If the passed element is a host element, it will return an array containing only that element,
32
+ * if the passed element is a composite element, it will return an array containing its host children (zero, one or many).
33
+ */
34
+ export declare function getHostSelves(element: ReactTestInstance | null): ReactTestInstance[];
35
+ /**
36
+ * Returns host siblings for given element.
37
+ * @param element The element start traversing from.
38
+ */
39
+ export declare function getHostSiblings(element: ReactTestInstance | null): ReactTestInstance[];
40
+ export declare function getCompositeParentOfType(element: ReactTestInstance, type: React.ComponentType): ReactTestInstance | null;
41
+ /**
42
+ * Note: this function should be generally used for core React Native types like `View`, `Text`, `TextInput`, etc.
43
+ */
44
+ export declare function isHostElementForType(element: ReactTestInstance, type: React.ComponentType): boolean;
@@ -0,0 +1,145 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getCompositeParentOfType = getCompositeParentOfType;
7
+ exports.getHostChildren = getHostChildren;
8
+ exports.getHostParent = getHostParent;
9
+ exports.getHostSelf = getHostSelf;
10
+ exports.getHostSelves = getHostSelves;
11
+ exports.getHostSiblings = getHostSiblings;
12
+ exports.isHostElement = isHostElement;
13
+ exports.isHostElementForType = isHostElementForType;
14
+
15
+ /**
16
+ * Checks if the given element is a host element.
17
+ * @param element The element to check.
18
+ */
19
+ function isHostElement(element) {
20
+ return typeof element?.type === 'string';
21
+ }
22
+ /**
23
+ * Returns first host ancestor for given element.
24
+ * @param element The element start traversing from.
25
+ */
26
+
27
+
28
+ function getHostParent(element) {
29
+ if (element == null) {
30
+ return null;
31
+ }
32
+
33
+ let current = element.parent;
34
+
35
+ while (current) {
36
+ if (isHostElement(current)) {
37
+ return current;
38
+ }
39
+
40
+ current = current.parent;
41
+ }
42
+
43
+ return null;
44
+ }
45
+ /**
46
+ * Returns host children for given element.
47
+ * @param element The element start traversing from.
48
+ */
49
+
50
+
51
+ function getHostChildren(element) {
52
+ if (element == null) {
53
+ return [];
54
+ }
55
+
56
+ const hostChildren = [];
57
+ element.children.forEach(child => {
58
+ if (typeof child !== 'object') {
59
+ return;
60
+ }
61
+
62
+ if (isHostElement(child)) {
63
+ hostChildren.push(child);
64
+ } else {
65
+ hostChildren.push(...getHostChildren(child));
66
+ }
67
+ });
68
+ return hostChildren;
69
+ }
70
+ /**
71
+ * Return a single host element that represent the passed host or composite element.
72
+ *
73
+ * @param element The element start traversing from.
74
+ * @throws Error if the passed element is a composite element and has no host children or has more than one host child.
75
+ * @returns If the passed element is a host element, it will return itself, if the passed element is a composite
76
+ * element, it will return a single host descendant.
77
+ */
78
+
79
+
80
+ function getHostSelf(element) {
81
+ const hostSelves = getHostSelves(element);
82
+
83
+ if (hostSelves.length === 0) {
84
+ throw new Error(`Expected exactly one host element, but found none.`);
85
+ }
86
+
87
+ if (hostSelves.length > 1) {
88
+ throw new Error(`Expected exactly one host element, but found ${hostSelves.length}.`);
89
+ }
90
+
91
+ return hostSelves[0];
92
+ }
93
+ /**
94
+ * Return the array of host elements that represent the passed element.
95
+ *
96
+ * @param element The element start traversing from.
97
+ * @returns If the passed element is a host element, it will return an array containing only that element,
98
+ * if the passed element is a composite element, it will return an array containing its host children (zero, one or many).
99
+ */
100
+
101
+
102
+ function getHostSelves(element) {
103
+ return typeof element?.type === 'string' ? [element] : getHostChildren(element);
104
+ }
105
+ /**
106
+ * Returns host siblings for given element.
107
+ * @param element The element start traversing from.
108
+ */
109
+
110
+
111
+ function getHostSiblings(element) {
112
+ const hostParent = getHostParent(element);
113
+ const hostSelves = getHostSelves(element);
114
+ return getHostChildren(hostParent).filter(sibling => !hostSelves.includes(sibling));
115
+ }
116
+
117
+ function getCompositeParentOfType(element, type) {
118
+ let current = element.parent;
119
+
120
+ while (!isHostElement(current)) {
121
+ // We're at the root of the tree
122
+ if (!current) {
123
+ return null;
124
+ }
125
+
126
+ if (current.type === type) {
127
+ return current;
128
+ }
129
+
130
+ current = current.parent;
131
+ }
132
+
133
+ return null;
134
+ }
135
+ /**
136
+ * Note: this function should be generally used for core React Native types like `View`, `Text`, `TextInput`, etc.
137
+ */
138
+
139
+
140
+ function isHostElementForType(element, type) {
141
+ // Not a host element
142
+ if (!isHostElement(element)) return false;
143
+ return getCompositeParentOfType(element, type) !== null;
144
+ }
145
+ //# sourceMappingURL=component-tree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"component-tree.js","names":["isHostElement","element","type","getHostParent","current","parent","getHostChildren","hostChildren","children","forEach","child","push","getHostSelf","hostSelves","getHostSelves","length","Error","getHostSiblings","hostParent","filter","sibling","includes","getCompositeParentOfType","isHostElementForType"],"sources":["../../src/helpers/component-tree.ts"],"sourcesContent":["import { ReactTestInstance } from 'react-test-renderer';\n\n/**\n * Checks if the given element is a host element.\n * @param element The element to check.\n */\nexport function isHostElement(element?: ReactTestInstance | null): boolean {\n return typeof element?.type === 'string';\n}\n\n/**\n * Returns first host ancestor for given element.\n * @param element The element start traversing from.\n */\nexport function getHostParent(\n element: ReactTestInstance | null\n): ReactTestInstance | null {\n if (element == null) {\n return null;\n }\n\n let current = element.parent;\n while (current) {\n if (isHostElement(current)) {\n return current;\n }\n\n current = current.parent;\n }\n\n return null;\n}\n\n/**\n * Returns host children for given element.\n * @param element The element start traversing from.\n */\nexport function getHostChildren(\n element: ReactTestInstance | null\n): ReactTestInstance[] {\n if (element == null) {\n return [];\n }\n\n const hostChildren: ReactTestInstance[] = [];\n\n element.children.forEach((child) => {\n if (typeof child !== 'object') {\n return;\n }\n\n if (isHostElement(child)) {\n hostChildren.push(child);\n } else {\n hostChildren.push(...getHostChildren(child));\n }\n });\n\n return hostChildren;\n}\n\n/**\n * Return a single host element that represent the passed host or composite element.\n *\n * @param element The element start traversing from.\n * @throws Error if the passed element is a composite element and has no host children or has more than one host child.\n * @returns If the passed element is a host element, it will return itself, if the passed element is a composite\n * element, it will return a single host descendant.\n */\nexport function getHostSelf(\n element: ReactTestInstance | null\n): ReactTestInstance {\n const hostSelves = getHostSelves(element);\n\n if (hostSelves.length === 0) {\n throw new Error(`Expected exactly one host element, but found none.`);\n }\n\n if (hostSelves.length > 1) {\n throw new Error(\n `Expected exactly one host element, but found ${hostSelves.length}.`\n );\n }\n\n return hostSelves[0];\n}\n\n/**\n * Return the array of host elements that represent the passed element.\n *\n * @param element The element start traversing from.\n * @returns If the passed element is a host element, it will return an array containing only that element,\n * if the passed element is a composite element, it will return an array containing its host children (zero, one or many).\n */\nexport function getHostSelves(\n element: ReactTestInstance | null\n): ReactTestInstance[] {\n return typeof element?.type === 'string'\n ? [element]\n : getHostChildren(element);\n}\n\n/**\n * Returns host siblings for given element.\n * @param element The element start traversing from.\n */\nexport function getHostSiblings(\n element: ReactTestInstance | null\n): ReactTestInstance[] {\n const hostParent = getHostParent(element);\n const hostSelves = getHostSelves(element);\n return getHostChildren(hostParent).filter(\n (sibling) => !hostSelves.includes(sibling)\n );\n}\n\nexport function getCompositeParentOfType(\n element: ReactTestInstance,\n type: React.ComponentType\n) {\n let current = element.parent;\n\n while (!isHostElement(current)) {\n // We're at the root of the tree\n if (!current) {\n return null;\n }\n\n if (current.type === type) {\n return current;\n }\n current = current.parent;\n }\n\n return null;\n}\n\n/**\n * Note: this function should be generally used for core React Native types like `View`, `Text`, `TextInput`, etc.\n */\nexport function isHostElementForType(\n element: ReactTestInstance,\n type: React.ComponentType\n) {\n // Not a host element\n if (!isHostElement(element)) return false;\n\n return getCompositeParentOfType(element, type) !== null;\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { ReactTestRendererNode } from 'react-test-renderer';
2
+ export declare const validateStringsRenderedWithinText: (rendererJSON: ReactTestRendererNode | Array<ReactTestRendererNode> | null) => void;
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.validateStringsRenderedWithinText = void 0;
7
+
8
+ const validateStringsRenderedWithinText = rendererJSON => {
9
+ if (!rendererJSON) return;
10
+
11
+ if (Array.isArray(rendererJSON)) {
12
+ rendererJSON.forEach(validateStringsRenderedWithinTextForNode);
13
+ return;
14
+ }
15
+
16
+ return validateStringsRenderedWithinTextForNode(rendererJSON);
17
+ };
18
+
19
+ exports.validateStringsRenderedWithinText = validateStringsRenderedWithinText;
20
+
21
+ const validateStringsRenderedWithinTextForNode = node => {
22
+ if (typeof node === 'string') {
23
+ return;
24
+ }
25
+
26
+ if (node.type !== 'Text') {
27
+ node.children?.forEach(child => {
28
+ if (typeof child === 'string') {
29
+ throw new Error(`Invariant Violation: Text strings must be rendered within a <Text> component. Detected attempt to render "${child}" string within a <${node.type}> component.`);
30
+ }
31
+ });
32
+ }
33
+
34
+ if (node.children) {
35
+ node.children.forEach(validateStringsRenderedWithinTextForNode);
36
+ }
37
+ };
38
+ //# sourceMappingURL=stringValidation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stringValidation.js","names":["validateStringsRenderedWithinText","rendererJSON","Array","isArray","forEach","validateStringsRenderedWithinTextForNode","node","type","children","child","Error"],"sources":["../../src/helpers/stringValidation.ts"],"sourcesContent":["import { ReactTestRendererNode } from 'react-test-renderer';\n\nexport const validateStringsRenderedWithinText = (\n rendererJSON: ReactTestRendererNode | Array<ReactTestRendererNode> | null\n) => {\n if (!rendererJSON) return;\n\n if (Array.isArray(rendererJSON)) {\n rendererJSON.forEach(validateStringsRenderedWithinTextForNode);\n return;\n }\n\n return validateStringsRenderedWithinTextForNode(rendererJSON);\n};\n\nconst validateStringsRenderedWithinTextForNode = (\n node: ReactTestRendererNode\n) => {\n if (typeof node === 'string') {\n return;\n }\n\n if (node.type !== 'Text') {\n node.children?.forEach((child) => {\n if (typeof child === 'string') {\n throw new Error(\n `Invariant Violation: Text strings must be rendered within a <Text> component. Detected attempt to render \"${child}\" string within a <${node.type}> component.`\n );\n }\n });\n }\n\n if (node.children) {\n node.children.forEach(validateStringsRenderedWithinTextForNode);\n }\n};\n"],"mappings":";;;;;;;AAEO,MAAMA,iCAAiC,GAC5CC,YAD+C,IAE5C;EACH,IAAI,CAACA,YAAL,EAAmB;;EAEnB,IAAIC,KAAK,CAACC,OAAN,CAAcF,YAAd,CAAJ,EAAiC;IAC/BA,YAAY,CAACG,OAAb,CAAqBC,wCAArB;IACA;EACD;;EAED,OAAOA,wCAAwC,CAACJ,YAAD,CAA/C;AACD,CAXM;;;;AAaP,MAAMI,wCAAwC,GAC5CC,IAD+C,IAE5C;EACH,IAAI,OAAOA,IAAP,KAAgB,QAApB,EAA8B;IAC5B;EACD;;EAED,IAAIA,IAAI,CAACC,IAAL,KAAc,MAAlB,EAA0B;IACxBD,IAAI,CAACE,QAAL,EAAeJ,OAAf,CAAwBK,KAAD,IAAW;MAChC,IAAI,OAAOA,KAAP,KAAiB,QAArB,EAA+B;QAC7B,MAAM,IAAIC,KAAJ,CACH,6GAA4GD,KAAM,sBAAqBH,IAAI,CAACC,IAAK,cAD9I,CAAN;MAGD;IACF,CAND;EAOD;;EAED,IAAID,IAAI,CAACE,QAAT,EAAmB;IACjBF,IAAI,CAACE,QAAL,CAAcJ,OAAd,CAAsBC,wCAAtB;EACD;AACF,CApBD"}
@@ -31,7 +31,7 @@ function runWithRealTimers(callback) {
31
31
 
32
32
  function getJestFakeTimersType() {
33
33
  // istanbul ignore if
34
- if (typeof jest === 'undefined' || typeof globalObj.setTimeout === 'undefined') {
34
+ if (typeof jest === 'undefined' || typeof globalObj.setTimeout === 'undefined' || process.env.RNTL_SKIP_AUTO_DETECT_FAKE_TIMERS) {
35
35
  return null;
36
36
  }
37
37
 
@@ -1 +1 @@
1
- {"version":3,"file":"timers.js","names":["globalObj","window","global","runWithRealTimers","callback","fakeTimersType","getJestFakeTimersType","jest","useRealTimers","callbackReturnValue","fakeTimersConfig","getFakeTimersConfigFromType","useFakeTimers","setTimeout","_isMockFunction","clock","getRealSystemTime","type","legacyFakeTimers","jestFakeTimersAreEnabled","Boolean","setImmediatePolyfill","fn","bindTimeFunctions","clearTimeoutFn","clearTimeout","setImmediateFn","setImmediate","setTimeoutFn"],"sources":["../../src/helpers/timers.ts"],"sourcesContent":["// Most content of this file sourced directly from https://github.com/testing-library/dom-testing-library/blob/main/src/helpers.js\n/* globals jest */\nconst globalObj = typeof window === 'undefined' ? global : window;\n\ntype FakeTimersTypes = 'modern' | 'legacy';\n\n// Currently this fn only supports jest timers, but it could support other test runners in the future.\nfunction runWithRealTimers<T>(callback: () => T): T {\n const fakeTimersType = getJestFakeTimersType();\n if (fakeTimersType) {\n jest.useRealTimers();\n }\n\n const callbackReturnValue = callback();\n\n if (fakeTimersType) {\n const fakeTimersConfig = getFakeTimersConfigFromType(fakeTimersType);\n jest.useFakeTimers(fakeTimersConfig);\n }\n\n return callbackReturnValue;\n}\n\nfunction getJestFakeTimersType(): FakeTimersTypes | null {\n // istanbul ignore if\n if (\n typeof jest === 'undefined' ||\n typeof globalObj.setTimeout === 'undefined'\n ) {\n return null;\n }\n\n if (\n // @ts-expect-error jest mutates setTimeout\n typeof globalObj.setTimeout._isMockFunction !== 'undefined' &&\n // @ts-expect-error jest mutates setTimeout\n globalObj.setTimeout._isMockFunction\n ) {\n return 'legacy';\n }\n\n if (\n // @ts-expect-error jest mutates setTimeout\n typeof globalObj.setTimeout.clock !== 'undefined' &&\n typeof jest.getRealSystemTime !== 'undefined'\n ) {\n try {\n // jest.getRealSystemTime is only supported for Jest's `modern` fake timers and otherwise throws\n jest.getRealSystemTime();\n return 'modern';\n } catch {\n // not using Jest's modern fake timers\n }\n }\n\n return null;\n}\n\nfunction getFakeTimersConfigFromType(type: FakeTimersTypes) {\n return type === 'legacy'\n ? { legacyFakeTimers: true }\n : { legacyFakeTimers: false };\n}\n\nconst jestFakeTimersAreEnabled = (): boolean =>\n Boolean(getJestFakeTimersType());\n\n// we only run our tests in node, and setImmediate is supported in node.\nfunction setImmediatePolyfill(fn: Function) {\n return globalObj.setTimeout(fn, 0);\n}\n\ntype BindTimeFunctions = {\n clearTimeoutFn: typeof clearTimeout;\n setImmediateFn: typeof setImmediate;\n setTimeoutFn: typeof setTimeout;\n};\n\nfunction bindTimeFunctions(): BindTimeFunctions {\n return {\n clearTimeoutFn: globalObj.clearTimeout,\n setImmediateFn: globalObj.setImmediate || setImmediatePolyfill,\n setTimeoutFn: globalObj.setTimeout,\n };\n}\n\nconst { clearTimeoutFn, setImmediateFn, setTimeoutFn } = runWithRealTimers(\n bindTimeFunctions\n) as BindTimeFunctions;\n\nexport {\n runWithRealTimers,\n jestFakeTimersAreEnabled,\n clearTimeoutFn as clearTimeout,\n setImmediateFn as setImmediate,\n setTimeoutFn as setTimeout,\n};\n"],"mappings":";;;;;;;;AAAA;;AACA;AACA,MAAMA,SAAS,GAAG,OAAOC,MAAP,KAAkB,WAAlB,GAAgCC,MAAhC,GAAyCD,MAA3D;;AAIA;AACA,SAASE,iBAAT,CAA8BC,QAA9B,EAAoD;EAClD,MAAMC,cAAc,GAAGC,qBAAqB,EAA5C;;EACA,IAAID,cAAJ,EAAoB;IAClBE,IAAI,CAACC,aAAL;EACD;;EAED,MAAMC,mBAAmB,GAAGL,QAAQ,EAApC;;EAEA,IAAIC,cAAJ,EAAoB;IAClB,MAAMK,gBAAgB,GAAGC,2BAA2B,CAACN,cAAD,CAApD;IACAE,IAAI,CAACK,aAAL,CAAmBF,gBAAnB;EACD;;EAED,OAAOD,mBAAP;AACD;;AAED,SAASH,qBAAT,GAAyD;EACvD;EACA,IACE,OAAOC,IAAP,KAAgB,WAAhB,IACA,OAAOP,SAAS,CAACa,UAAjB,KAAgC,WAFlC,EAGE;IACA,OAAO,IAAP;EACD;;EAED,KACE;EACA,OAAOb,SAAS,CAACa,UAAV,CAAqBC,eAA5B,KAAgD,WAAhD,IACA;EACAd,SAAS,CAACa,UAAV,CAAqBC,eAJvB,EAKE;IACA,OAAO,QAAP;EACD;;EAED,KACE;EACA,OAAOd,SAAS,CAACa,UAAV,CAAqBE,KAA5B,KAAsC,WAAtC,IACA,OAAOR,IAAI,CAACS,iBAAZ,KAAkC,WAHpC,EAIE;IACA,IAAI;MACF;MACAT,IAAI,CAACS,iBAAL;MACA,OAAO,QAAP;IACD,CAJD,CAIE,MAAM,CACN;IACD;EACF;;EAED,OAAO,IAAP;AACD;;AAED,SAASL,2BAAT,CAAqCM,IAArC,EAA4D;EAC1D,OAAOA,IAAI,KAAK,QAAT,GACH;IAAEC,gBAAgB,EAAE;EAApB,CADG,GAEH;IAAEA,gBAAgB,EAAE;EAApB,CAFJ;AAGD;;AAED,MAAMC,wBAAwB,GAAG,MAC/BC,OAAO,CAACd,qBAAqB,EAAtB,CADT,C,CAGA;;;;;AACA,SAASe,oBAAT,CAA8BC,EAA9B,EAA4C;EAC1C,OAAOtB,SAAS,CAACa,UAAV,CAAqBS,EAArB,EAAyB,CAAzB,CAAP;AACD;;AAQD,SAASC,iBAAT,GAAgD;EAC9C,OAAO;IACLC,cAAc,EAAExB,SAAS,CAACyB,YADrB;IAELC,cAAc,EAAE1B,SAAS,CAAC2B,YAAV,IAA0BN,oBAFrC;IAGLO,YAAY,EAAE5B,SAAS,CAACa;EAHnB,CAAP;AAKD;;AAED,MAAM;EAAEW,cAAF;EAAkBE,cAAlB;EAAkCE;AAAlC,IAAmDzB,iBAAiB,CACxEoB,iBADwE,CAA1E"}
1
+ {"version":3,"file":"timers.js","names":["globalObj","window","global","runWithRealTimers","callback","fakeTimersType","getJestFakeTimersType","jest","useRealTimers","callbackReturnValue","fakeTimersConfig","getFakeTimersConfigFromType","useFakeTimers","setTimeout","process","env","RNTL_SKIP_AUTO_DETECT_FAKE_TIMERS","_isMockFunction","clock","getRealSystemTime","type","legacyFakeTimers","jestFakeTimersAreEnabled","Boolean","setImmediatePolyfill","fn","bindTimeFunctions","clearTimeoutFn","clearTimeout","setImmediateFn","setImmediate","setTimeoutFn"],"sources":["../../src/helpers/timers.ts"],"sourcesContent":["// Most content of this file sourced directly from https://github.com/testing-library/dom-testing-library/blob/main/src/helpers.js\n/* globals jest */\nconst globalObj = typeof window === 'undefined' ? global : window;\n\ntype FakeTimersTypes = 'modern' | 'legacy';\n\n// Currently this fn only supports jest timers, but it could support other test runners in the future.\nfunction runWithRealTimers<T>(callback: () => T): T {\n const fakeTimersType = getJestFakeTimersType();\n if (fakeTimersType) {\n jest.useRealTimers();\n }\n\n const callbackReturnValue = callback();\n\n if (fakeTimersType) {\n const fakeTimersConfig = getFakeTimersConfigFromType(fakeTimersType);\n jest.useFakeTimers(fakeTimersConfig);\n }\n\n return callbackReturnValue;\n}\n\nfunction getJestFakeTimersType(): FakeTimersTypes | null {\n // istanbul ignore if\n if (\n typeof jest === 'undefined' ||\n typeof globalObj.setTimeout === 'undefined' ||\n process.env.RNTL_SKIP_AUTO_DETECT_FAKE_TIMERS\n ) {\n return null;\n }\n\n if (\n // @ts-expect-error jest mutates setTimeout\n typeof globalObj.setTimeout._isMockFunction !== 'undefined' &&\n // @ts-expect-error jest mutates setTimeout\n globalObj.setTimeout._isMockFunction\n ) {\n return 'legacy';\n }\n\n if (\n // @ts-expect-error jest mutates setTimeout\n typeof globalObj.setTimeout.clock !== 'undefined' &&\n typeof jest.getRealSystemTime !== 'undefined'\n ) {\n try {\n // jest.getRealSystemTime is only supported for Jest's `modern` fake timers and otherwise throws\n jest.getRealSystemTime();\n return 'modern';\n } catch {\n // not using Jest's modern fake timers\n }\n }\n\n return null;\n}\n\nfunction getFakeTimersConfigFromType(type: FakeTimersTypes) {\n return type === 'legacy'\n ? { legacyFakeTimers: true }\n : { legacyFakeTimers: false };\n}\n\nconst jestFakeTimersAreEnabled = (): boolean =>\n Boolean(getJestFakeTimersType());\n\n// we only run our tests in node, and setImmediate is supported in node.\nfunction setImmediatePolyfill(fn: Function) {\n return globalObj.setTimeout(fn, 0);\n}\n\ntype BindTimeFunctions = {\n clearTimeoutFn: typeof clearTimeout;\n setImmediateFn: typeof setImmediate;\n setTimeoutFn: typeof setTimeout;\n};\n\nfunction bindTimeFunctions(): BindTimeFunctions {\n return {\n clearTimeoutFn: globalObj.clearTimeout,\n setImmediateFn: globalObj.setImmediate || setImmediatePolyfill,\n setTimeoutFn: globalObj.setTimeout,\n };\n}\n\nconst { clearTimeoutFn, setImmediateFn, setTimeoutFn } = runWithRealTimers(\n bindTimeFunctions\n) as BindTimeFunctions;\n\nexport {\n runWithRealTimers,\n jestFakeTimersAreEnabled,\n clearTimeoutFn as clearTimeout,\n setImmediateFn as setImmediate,\n setTimeoutFn as setTimeout,\n};\n"],"mappings":";;;;;;;;AAAA;;AACA;AACA,MAAMA,SAAS,GAAG,OAAOC,MAAP,KAAkB,WAAlB,GAAgCC,MAAhC,GAAyCD,MAA3D;;AAIA;AACA,SAASE,iBAAT,CAA8BC,QAA9B,EAAoD;EAClD,MAAMC,cAAc,GAAGC,qBAAqB,EAA5C;;EACA,IAAID,cAAJ,EAAoB;IAClBE,IAAI,CAACC,aAAL;EACD;;EAED,MAAMC,mBAAmB,GAAGL,QAAQ,EAApC;;EAEA,IAAIC,cAAJ,EAAoB;IAClB,MAAMK,gBAAgB,GAAGC,2BAA2B,CAACN,cAAD,CAApD;IACAE,IAAI,CAACK,aAAL,CAAmBF,gBAAnB;EACD;;EAED,OAAOD,mBAAP;AACD;;AAED,SAASH,qBAAT,GAAyD;EACvD;EACA,IACE,OAAOC,IAAP,KAAgB,WAAhB,IACA,OAAOP,SAAS,CAACa,UAAjB,KAAgC,WADhC,IAEAC,OAAO,CAACC,GAAR,CAAYC,iCAHd,EAIE;IACA,OAAO,IAAP;EACD;;EAED,KACE;EACA,OAAOhB,SAAS,CAACa,UAAV,CAAqBI,eAA5B,KAAgD,WAAhD,IACA;EACAjB,SAAS,CAACa,UAAV,CAAqBI,eAJvB,EAKE;IACA,OAAO,QAAP;EACD;;EAED,KACE;EACA,OAAOjB,SAAS,CAACa,UAAV,CAAqBK,KAA5B,KAAsC,WAAtC,IACA,OAAOX,IAAI,CAACY,iBAAZ,KAAkC,WAHpC,EAIE;IACA,IAAI;MACF;MACAZ,IAAI,CAACY,iBAAL;MACA,OAAO,QAAP;IACD,CAJD,CAIE,MAAM,CACN;IACD;EACF;;EAED,OAAO,IAAP;AACD;;AAED,SAASR,2BAAT,CAAqCS,IAArC,EAA4D;EAC1D,OAAOA,IAAI,KAAK,QAAT,GACH;IAAEC,gBAAgB,EAAE;EAApB,CADG,GAEH;IAAEA,gBAAgB,EAAE;EAApB,CAFJ;AAGD;;AAED,MAAMC,wBAAwB,GAAG,MAC/BC,OAAO,CAACjB,qBAAqB,EAAtB,CADT,C,CAGA;;;;;AACA,SAASkB,oBAAT,CAA8BC,EAA9B,EAA4C;EAC1C,OAAOzB,SAAS,CAACa,UAAV,CAAqBY,EAArB,EAAyB,CAAzB,CAAP;AACD;;AAQD,SAASC,iBAAT,GAAgD;EAC9C,OAAO;IACLC,cAAc,EAAE3B,SAAS,CAAC4B,YADrB;IAELC,cAAc,EAAE7B,SAAS,CAAC8B,YAAV,IAA0BN,oBAFrC;IAGLO,YAAY,EAAE/B,SAAS,CAACa;EAHnB,CAAP;AAKD;;AAED,MAAM;EAAEc,cAAF;EAAkBE,cAAlB;EAAkCE;AAAlC,IAAmD5B,iBAAiB,CACxEuB,iBADwE,CAA1E"}