@testing-library/react-native 14.0.0-alpha.1 → 14.0.0-alpha.2

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 (126) hide show
  1. package/README.md +7 -11
  2. package/build/act.d.ts +2 -4
  3. package/build/act.js +4 -5
  4. package/build/act.js.map +1 -1
  5. package/build/cleanup.d.ts +3 -1
  6. package/build/cleanup.js +8 -0
  7. package/build/cleanup.js.map +1 -1
  8. package/build/event-handler.d.ts +2 -2
  9. package/build/event-handler.js +10 -10
  10. package/build/event-handler.js.map +1 -1
  11. package/build/fire-event.d.ts +8 -1
  12. package/build/fire-event.js +44 -28
  13. package/build/fire-event.js.map +1 -1
  14. package/build/helpers/accessibility.js +5 -2
  15. package/build/helpers/accessibility.js.map +1 -1
  16. package/build/helpers/component-tree.d.ts +8 -8
  17. package/build/helpers/component-tree.js +19 -16
  18. package/build/helpers/component-tree.js.map +1 -1
  19. package/build/helpers/debug.d.ts +1 -1
  20. package/build/helpers/debug.js +6 -7
  21. package/build/helpers/debug.js.map +1 -1
  22. package/build/helpers/find-all.js +7 -27
  23. package/build/helpers/find-all.js.map +1 -1
  24. package/build/helpers/format-element.d.ts +3 -3
  25. package/build/helpers/format-element.js +9 -9
  26. package/build/helpers/format-element.js.map +1 -1
  27. package/build/helpers/host-component-names.d.ts +0 -1
  28. package/build/helpers/host-component-names.js +7 -9
  29. package/build/helpers/host-component-names.js.map +1 -1
  30. package/build/helpers/logger.d.ts +22 -0
  31. package/build/helpers/logger.js +13 -8
  32. package/build/helpers/logger.js.map +1 -1
  33. package/build/helpers/pointer-events.js +9 -5
  34. package/build/helpers/pointer-events.js.map +1 -1
  35. package/build/helpers/wrap-async.d.ts +0 -1
  36. package/build/helpers/wrap-async.js +0 -1
  37. package/build/helpers/wrap-async.js.map +1 -1
  38. package/build/index.d.ts +0 -1
  39. package/build/index.flow.js +5 -4
  40. package/build/index.js +1 -12
  41. package/build/index.js.map +1 -1
  42. package/build/matchers/to-be-empty-element.js +6 -3
  43. package/build/matchers/to-be-empty-element.js.map +1 -1
  44. package/build/matchers/to-be-visible.js +3 -3
  45. package/build/matchers/to-be-visible.js.map +1 -1
  46. package/build/matchers/to-contain-element.js +1 -2
  47. package/build/matchers/to-contain-element.js.map +1 -1
  48. package/build/matchers/to-have-style.js +1 -1
  49. package/build/matchers/to-have-style.js.map +1 -1
  50. package/build/matchers/utils.js +3 -2
  51. package/build/matchers/utils.js.map +1 -1
  52. package/build/pure.d.ts +7 -5
  53. package/build/pure.js +30 -4
  54. package/build/pure.js.map +1 -1
  55. package/build/queries/display-value.d.ts +1 -1
  56. package/build/queries/display-value.js +9 -9
  57. package/build/queries/display-value.js.map +1 -1
  58. package/build/queries/hint-text.d.ts +1 -1
  59. package/build/queries/hint-text.js +9 -9
  60. package/build/queries/hint-text.js.map +1 -1
  61. package/build/queries/label-text.d.ts +1 -1
  62. package/build/queries/label-text.js +9 -9
  63. package/build/queries/label-text.js.map +1 -1
  64. package/build/queries/make-queries.d.ts +2 -2
  65. package/build/queries/make-queries.js +11 -11
  66. package/build/queries/make-queries.js.map +1 -1
  67. package/build/queries/placeholder-text.d.ts +1 -1
  68. package/build/queries/placeholder-text.js +9 -9
  69. package/build/queries/placeholder-text.js.map +1 -1
  70. package/build/queries/role.d.ts +2 -2
  71. package/build/queries/role.js +16 -9
  72. package/build/queries/role.js.map +1 -1
  73. package/build/queries/test-id.d.ts +1 -1
  74. package/build/queries/test-id.js +9 -9
  75. package/build/queries/test-id.js.map +1 -1
  76. package/build/queries/text.d.ts +1 -1
  77. package/build/queries/text.js +9 -9
  78. package/build/queries/text.js.map +1 -1
  79. package/build/react-versions.js +1 -2
  80. package/build/react-versions.js.map +1 -1
  81. package/build/render-act.d.ts +3 -0
  82. package/build/render-act.js +29 -0
  83. package/build/render-act.js.map +1 -0
  84. package/build/render-async.d.ts +83 -0
  85. package/build/render-async.js +96 -0
  86. package/build/render-async.js.map +1 -0
  87. package/build/render-hook.d.ts +9 -7
  88. package/build/render-hook.js +44 -14
  89. package/build/render-hook.js.map +1 -1
  90. package/build/render.d.ts +86 -17
  91. package/build/render.js +44 -27
  92. package/build/render.js.map +1 -1
  93. package/build/screen.js +7 -7
  94. package/build/screen.js.map +1 -1
  95. package/build/test-utils/console.d.ts +1 -0
  96. package/build/test-utils/console.js +17 -0
  97. package/build/test-utils/console.js.map +1 -0
  98. package/build/test-utils/json.d.ts +6 -0
  99. package/build/test-utils/json.js +33 -0
  100. package/build/test-utils/json.js.map +1 -0
  101. package/build/tsconfig.release.tsbuildinfo +1 -1
  102. package/build/types.d.ts +4 -0
  103. package/build/types.js.map +1 -1
  104. package/build/user-event/clear.js +4 -4
  105. package/build/user-event/clear.js.map +1 -1
  106. package/build/user-event/paste.js +8 -8
  107. package/build/user-event/paste.js.map +1 -1
  108. package/build/user-event/press/press.js +17 -10
  109. package/build/user-event/press/press.js.map +1 -1
  110. package/build/user-event/scroll/scroll-to.js +7 -7
  111. package/build/user-event/scroll/scroll-to.js.map +1 -1
  112. package/build/user-event/type/type.js +11 -11
  113. package/build/user-event/type/type.js.map +1 -1
  114. package/build/user-event/utils/dispatch-event.d.ts +1 -1
  115. package/build/user-event/utils/dispatch-event.js +4 -4
  116. package/build/user-event/utils/dispatch-event.js.map +1 -1
  117. package/build/wait-for.js +3 -1
  118. package/build/wait-for.js.map +1 -1
  119. package/build/within.d.ts +19 -19
  120. package/build/within.js +8 -8
  121. package/build/within.js.map +1 -1
  122. package/package.json +37 -35
  123. package/typings/index.flow.js +5 -4
  124. package/build/test-utils/index.d.ts +0 -1
  125. package/build/test-utils/index.js +0 -17
  126. package/build/test-utils/index.js.map +0 -1
package/README.md CHANGED
@@ -1,12 +1,8 @@
1
- <div align='center'>
2
- <h1>React Native Testing Library</h1>
3
- <img
4
- height="80"
5
- width="80"
6
- alt="owl"
7
- src="https://raw.githubusercontent.com/callstack/react-native-testing-library/main/website/docs/public/img/owl.png"
8
- />
9
- <p>Developer-friendly and complete React Native testing utilities that encourage good testing practices.</P>
1
+ <div align="center">
2
+ <a href="https://www.callstack.com/open-source?utm_campaign=generic&utm_source=github&utm_medium=referral&utm_content=react-native-testing-library" align="center">
3
+ <img src="https://github.com/user-attachments/assets/4d452312-4ffd-4439-855f-a9b12ad7d6c2" alt="React Native Testing Library" />
4
+ </a>
5
+ <p align="center">Developer-friendly and complete React Native testing utilities that encourage good testing practices.</p>
10
6
  </div>
11
7
 
12
8
  [![Version][version-badge]][package]
@@ -22,7 +18,7 @@ You want to write maintainable tests for your React Native components. As a part
22
18
 
23
19
  ## This solution
24
20
 
25
- The React Native Testing Library (RNTL) is a comprehensive solution for testing React Native components. It provides React Native runtime simulation on top of `react-test-renderer`, in a way that encourages better testing practices. Its primary guiding principle is:
21
+ The React Native Testing Library (RNTL) is a comprehensive solution for testing React Native components. It provides React Native runtime simulation on top of `universal-test-renderer`, in a way that encourages better testing practices. Its primary guiding principle is:
26
22
 
27
23
  > The more your tests resemble the way your software is used, the more confidence they can give you.
28
24
 
@@ -40,7 +36,7 @@ yarn add --dev @testing-library/react-native
40
36
  npm install --save-dev @testing-library/react-native
41
37
  ```
42
38
 
43
- This library has a `peerDependencies` listing for `react-test-renderer`. Make sure that your `react-test-renderer` version matches exactly the `react` version, avoid using `^` in version number.
39
+ This library has a `peerDependencies` listing for `universal-test-renderer`. Make sure that your `universal-test-renderer` version matches exactly the `react` version, avoid using `^` in version number.
44
40
 
45
41
  ### Additional Jest matchers
46
42
 
package/build/act.d.ts CHANGED
@@ -5,8 +5,6 @@ declare global {
5
5
  }
6
6
  declare function setIsReactActEnvironment(isReactActEnvironment: boolean | undefined): void;
7
7
  declare function getIsReactActEnvironment(): boolean | undefined;
8
- declare const act: (callback: Parameters<ReactAct>[0]) => Promise<unknown> | {
9
- then: (resolve: (value: never) => never, reject: (value: never) => never) => void;
10
- };
8
+ declare const act: ReactAct;
11
9
  export default act;
12
- export { setIsReactActEnvironment as setReactActEnvironment, getIsReactActEnvironment };
10
+ export { getIsReactActEnvironment, setIsReactActEnvironment as setReactActEnvironment };
package/build/act.js CHANGED
@@ -7,11 +7,12 @@ exports.default = void 0;
7
7
  exports.getIsReactActEnvironment = getIsReactActEnvironment;
8
8
  exports.setReactActEnvironment = setIsReactActEnvironment;
9
9
  var React = _interopRequireWildcard(require("react"));
10
- function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
11
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
10
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
12
11
  // This file and the act() implementation is sourced from react-testing-library
13
12
  // https://github.com/testing-library/react-testing-library/blob/3dcd8a9649e25054c0e650d95fca2317b7008576/types/index.d.ts
14
13
 
14
+ const reactAct = React.act;
15
+
15
16
  // See https://github.com/reactwg/react-18/discussions/102 for more context on global.IS_REACT_ACT_ENVIRONMENT
16
17
 
17
18
  function setIsReactActEnvironment(isReactActEnvironment) {
@@ -44,11 +45,9 @@ function withGlobalActEnvironment(actImplementation) {
44
45
  // eslint-disable-next-line promise/always-return
45
46
  returnValue => {
46
47
  setIsReactActEnvironment(previousActEnvironment);
47
- // @ts-expect-error too strict typing
48
48
  resolve(returnValue);
49
49
  }, error => {
50
50
  setIsReactActEnvironment(previousActEnvironment);
51
- // @ts-expect-error too strict typing
52
51
  reject(error);
53
52
  });
54
53
  }
@@ -65,6 +64,6 @@ function withGlobalActEnvironment(actImplementation) {
65
64
  }
66
65
  };
67
66
  }
68
- const act = withGlobalActEnvironment(React.act);
67
+ const act = withGlobalActEnvironment(reactAct);
69
68
  var _default = exports.default = act;
70
69
  //# sourceMappingURL=act.js.map
package/build/act.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"act.js","names":["React","_interopRequireWildcard","require","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","setIsReactActEnvironment","isReactActEnvironment","globalThis","IS_REACT_ACT_ENVIRONMENT","getIsReactActEnvironment","withGlobalActEnvironment","actImplementation","callback","previousActEnvironment","callbackNeedsToBeAwaited","actResult","result","then","thenable","resolve","reject","returnValue","error","act","_default","exports"],"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/3dcd8a9649e25054c0e650d95fca2317b7008576/types/index.d.ts\nimport * as React from 'react';\n\ntype ReactAct = typeof React.act;\n\n// See https://github.com/reactwg/react-18/discussions/102 for more context on global.IS_REACT_ACT_ENVIRONMENT\ndeclare global {\n // eslint-disable-next-line no-var\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\nfunction withGlobalActEnvironment(actImplementation: ReactAct) {\n return (callback: Parameters<ReactAct>[0]) => {\n const previousActEnvironment = getIsReactActEnvironment();\n setIsReactActEnvironment(true);\n\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 // @ts-expect-error TS is too strict here\n if (result !== null && typeof result === 'object' && typeof result.then === 'function') {\n callbackNeedsToBeAwaited = true;\n }\n return result;\n });\n\n if (callbackNeedsToBeAwaited) {\n const thenable = actResult;\n return {\n then: (resolve: (value: never) => never, reject: (value: never) => never) => {\n // eslint-disable-next-line promise/catch-or-return, promise/prefer-await-to-then\n thenable.then(\n // eslint-disable-next-line promise/always-return\n (returnValue) => {\n setIsReactActEnvironment(previousActEnvironment);\n // @ts-expect-error too strict typing\n resolve(returnValue);\n },\n (error) => {\n setIsReactActEnvironment(previousActEnvironment);\n // @ts-expect-error too strict typing\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}\n\nconst act = withGlobalActEnvironment(React.act);\n\nexport default act;\nexport { setIsReactActEnvironment as setReactActEnvironment, getIsReactActEnvironment };\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"act.js","names":["React","_interopRequireWildcard","require","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","reactAct","act","setIsReactActEnvironment","isReactActEnvironment","globalThis","IS_REACT_ACT_ENVIRONMENT","getIsReactActEnvironment","withGlobalActEnvironment","actImplementation","callback","previousActEnvironment","callbackNeedsToBeAwaited","actResult","result","then","thenable","resolve","reject","returnValue","error","_default","exports"],"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/3dcd8a9649e25054c0e650d95fca2317b7008576/types/index.d.ts\nimport * as React from 'react';\n\nconst reactAct = React.act;\ntype ReactAct = typeof React.act;\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\nfunction withGlobalActEnvironment(actImplementation: ReactAct) {\n return (callback: Parameters<ReactAct>[0]) => {\n const previousActEnvironment = getIsReactActEnvironment();\n setIsReactActEnvironment(true);\n\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 // @ts-expect-error TS is too strict here\n if (result !== null && typeof result === 'object' && typeof result.then === 'function') {\n callbackNeedsToBeAwaited = true;\n }\n return result;\n });\n\n if (callbackNeedsToBeAwaited) {\n const thenable = actResult;\n return {\n then: (resolve: (value: never) => never, reject: (value: never) => never) => {\n // eslint-disable-next-line promise/catch-or-return, promise/prefer-await-to-then\n thenable.then(\n // eslint-disable-next-line promise/always-return\n (returnValue) => {\n setIsReactActEnvironment(previousActEnvironment);\n resolve(returnValue as never);\n },\n (error) => {\n setIsReactActEnvironment(previousActEnvironment);\n reject(error as never);\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}\n\nconst act = withGlobalActEnvironment(reactAct) as ReactAct;\n\nexport default act;\nexport { getIsReactActEnvironment, setIsReactActEnvironment as setReactActEnvironment };\n"],"mappings":"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","ignoreList":[]}
@@ -1,4 +1,6 @@
1
1
  type CleanUpFunction = () => void;
2
+ type CleanUpFunctionAsync = () => Promise<void>;
2
3
  export default function cleanup(): void;
3
- export declare function addToCleanupQueue(fn: CleanUpFunction): void;
4
+ export declare function cleanupAsync(): Promise<void>;
5
+ export declare function addToCleanupQueue(fn: CleanUpFunction | CleanUpFunctionAsync): void;
4
6
  export {};
package/build/cleanup.js CHANGED
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.addToCleanupQueue = addToCleanupQueue;
7
+ exports.cleanupAsync = cleanupAsync;
7
8
  exports.default = cleanup;
8
9
  var _screen = require("./screen");
9
10
  const cleanupQueue = new Set();
@@ -12,6 +13,13 @@ function cleanup() {
12
13
  cleanupQueue.forEach(fn => fn());
13
14
  cleanupQueue.clear();
14
15
  }
16
+ async function cleanupAsync() {
17
+ (0, _screen.clearRenderResult)();
18
+ for (const fn of cleanupQueue) {
19
+ await fn();
20
+ }
21
+ cleanupQueue.clear();
22
+ }
15
23
  function addToCleanupQueue(fn) {
16
24
  cleanupQueue.add(fn);
17
25
  }
@@ -1 +1 @@
1
- {"version":3,"file":"cleanup.js","names":["_screen","require","cleanupQueue","Set","cleanup","clearRenderResult","forEach","fn","clear","addToCleanupQueue","add"],"sources":["../src/cleanup.ts"],"sourcesContent":["import { clearRenderResult } from './screen';\n\ntype CleanUpFunction = () => void;\n\nconst cleanupQueue = new Set<CleanUpFunction>();\n\nexport default function cleanup() {\n clearRenderResult();\n\n cleanupQueue.forEach((fn) => fn());\n cleanupQueue.clear();\n}\n\nexport function addToCleanupQueue(fn: CleanUpFunction) {\n cleanupQueue.add(fn);\n}\n"],"mappings":";;;;;;;AAAA,IAAAA,OAAA,GAAAC,OAAA;AAIA,MAAMC,YAAY,GAAG,IAAIC,GAAG,CAAkB,CAAC;AAEhC,SAASC,OAAOA,CAAA,EAAG;EAChC,IAAAC,yBAAiB,EAAC,CAAC;EAEnBH,YAAY,CAACI,OAAO,CAAEC,EAAE,IAAKA,EAAE,CAAC,CAAC,CAAC;EAClCL,YAAY,CAACM,KAAK,CAAC,CAAC;AACtB;AAEO,SAASC,iBAAiBA,CAACF,EAAmB,EAAE;EACrDL,YAAY,CAACQ,GAAG,CAACH,EAAE,CAAC;AACtB","ignoreList":[]}
1
+ {"version":3,"file":"cleanup.js","names":["_screen","require","cleanupQueue","Set","cleanup","clearRenderResult","forEach","fn","clear","cleanupAsync","addToCleanupQueue","add"],"sources":["../src/cleanup.ts"],"sourcesContent":["import { clearRenderResult } from './screen';\n\ntype CleanUpFunction = () => void;\ntype CleanUpFunctionAsync = () => Promise<void>;\n\nconst cleanupQueue = new Set<CleanUpFunction | CleanUpFunctionAsync>();\n\nexport default function cleanup() {\n clearRenderResult();\n\n cleanupQueue.forEach((fn) => fn());\n cleanupQueue.clear();\n}\n\nexport async function cleanupAsync() {\n clearRenderResult();\n\n for (const fn of cleanupQueue) {\n await fn();\n }\n\n cleanupQueue.clear();\n}\n\nexport function addToCleanupQueue(fn: CleanUpFunction | CleanUpFunctionAsync) {\n cleanupQueue.add(fn);\n}\n"],"mappings":";;;;;;;;AAAA,IAAAA,OAAA,GAAAC,OAAA;AAKA,MAAMC,YAAY,GAAG,IAAIC,GAAG,CAAyC,CAAC;AAEvD,SAASC,OAAOA,CAAA,EAAG;EAChC,IAAAC,yBAAiB,EAAC,CAAC;EAEnBH,YAAY,CAACI,OAAO,CAAEC,EAAE,IAAKA,EAAE,CAAC,CAAC,CAAC;EAClCL,YAAY,CAACM,KAAK,CAAC,CAAC;AACtB;AAEO,eAAeC,YAAYA,CAAA,EAAG;EACnC,IAAAJ,yBAAiB,EAAC,CAAC;EAEnB,KAAK,MAAME,EAAE,IAAIL,YAAY,EAAE;IAC7B,MAAMK,EAAE,CAAC,CAAC;EACZ;EAEAL,YAAY,CAACM,KAAK,CAAC,CAAC;AACtB;AAEO,SAASE,iBAAiBA,CAACH,EAA0C,EAAE;EAC5EL,YAAY,CAACS,GAAG,CAACJ,EAAE,CAAC;AACtB","ignoreList":[]}
@@ -1,7 +1,7 @@
1
- import type { HostElement } from 'universal-test-renderer';
1
+ export type EventHandler = (...args: unknown[]) => unknown;
2
2
  export type EventHandlerOptions = {
3
3
  /** Include check for event handler named without adding `on*` prefix. */
4
4
  loose?: boolean;
5
5
  };
6
- export declare function getEventHandler(element: HostElement, eventName: string, options?: EventHandlerOptions): any;
6
+ export declare function getEventHandlerFromProps(props: Record<string, unknown>, eventName: string, options?: EventHandlerOptions): EventHandler | undefined;
7
7
  export declare function getEventHandlerName(eventName: string): string;
@@ -3,21 +3,21 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.getEventHandler = getEventHandler;
6
+ exports.getEventHandlerFromProps = getEventHandlerFromProps;
7
7
  exports.getEventHandlerName = getEventHandlerName;
8
- function getEventHandler(element, eventName, options) {
8
+ function getEventHandlerFromProps(props, eventName, options) {
9
9
  const handlerName = getEventHandlerName(eventName);
10
- if (typeof element.props[handlerName] === 'function') {
11
- return element.props[handlerName];
10
+ if (typeof props[handlerName] === 'function') {
11
+ return props[handlerName];
12
12
  }
13
- if (options?.loose && typeof element.props[eventName] === 'function') {
14
- return element.props[eventName];
13
+ if (options?.loose && typeof props[eventName] === 'function') {
14
+ return props[eventName];
15
15
  }
16
- if (typeof element.props[`testOnly_${handlerName}`] === 'function') {
17
- return element.props[`testOnly_${handlerName}`];
16
+ if (typeof props[`testOnly_${handlerName}`] === 'function') {
17
+ return props[`testOnly_${handlerName}`];
18
18
  }
19
- if (options?.loose && typeof element.props[`testOnly_${eventName}`] === 'function') {
20
- return element.props[`testOnly_${eventName}`];
19
+ if (options?.loose && typeof props[`testOnly_${eventName}`] === 'function') {
20
+ return props[`testOnly_${eventName}`];
21
21
  }
22
22
  return undefined;
23
23
  }
@@ -1 +1 @@
1
- {"version":3,"file":"event-handler.js","names":["getEventHandler","element","eventName","options","handlerName","getEventHandlerName","props","loose","undefined","capitalizeFirstLetter","str","charAt","toUpperCase","slice"],"sources":["../src/event-handler.ts"],"sourcesContent":["import type { HostElement } from 'universal-test-renderer';\n\nexport type EventHandlerOptions = {\n /** Include check for event handler named without adding `on*` prefix. */\n loose?: boolean;\n};\n\nexport function getEventHandler(\n element: HostElement,\n eventName: string,\n options?: EventHandlerOptions,\n) {\n const handlerName = getEventHandlerName(eventName);\n if (typeof element.props[handlerName] === 'function') {\n return element.props[handlerName];\n }\n\n if (options?.loose && typeof element.props[eventName] === 'function') {\n return element.props[eventName];\n }\n\n if (typeof element.props[`testOnly_${handlerName}`] === 'function') {\n return element.props[`testOnly_${handlerName}`];\n }\n\n if (options?.loose && typeof element.props[`testOnly_${eventName}`] === 'function') {\n return element.props[`testOnly_${eventName}`];\n }\n\n return undefined;\n}\n\nexport function getEventHandlerName(eventName: string) {\n return `on${capitalizeFirstLetter(eventName)}`;\n}\n\nfunction capitalizeFirstLetter(str: string) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n"],"mappings":";;;;;;;AAOO,SAASA,eAAeA,CAC7BC,OAAoB,EACpBC,SAAiB,EACjBC,OAA6B,EAC7B;EACA,MAAMC,WAAW,GAAGC,mBAAmB,CAACH,SAAS,CAAC;EAClD,IAAI,OAAOD,OAAO,CAACK,KAAK,CAACF,WAAW,CAAC,KAAK,UAAU,EAAE;IACpD,OAAOH,OAAO,CAACK,KAAK,CAACF,WAAW,CAAC;EACnC;EAEA,IAAID,OAAO,EAAEI,KAAK,IAAI,OAAON,OAAO,CAACK,KAAK,CAACJ,SAAS,CAAC,KAAK,UAAU,EAAE;IACpE,OAAOD,OAAO,CAACK,KAAK,CAACJ,SAAS,CAAC;EACjC;EAEA,IAAI,OAAOD,OAAO,CAACK,KAAK,CAAC,YAAYF,WAAW,EAAE,CAAC,KAAK,UAAU,EAAE;IAClE,OAAOH,OAAO,CAACK,KAAK,CAAC,YAAYF,WAAW,EAAE,CAAC;EACjD;EAEA,IAAID,OAAO,EAAEI,KAAK,IAAI,OAAON,OAAO,CAACK,KAAK,CAAC,YAAYJ,SAAS,EAAE,CAAC,KAAK,UAAU,EAAE;IAClF,OAAOD,OAAO,CAACK,KAAK,CAAC,YAAYJ,SAAS,EAAE,CAAC;EAC/C;EAEA,OAAOM,SAAS;AAClB;AAEO,SAASH,mBAAmBA,CAACH,SAAiB,EAAE;EACrD,OAAO,KAAKO,qBAAqB,CAACP,SAAS,CAAC,EAAE;AAChD;AAEA,SAASO,qBAAqBA,CAACC,GAAW,EAAE;EAC1C,OAAOA,GAAG,CAACC,MAAM,CAAC,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC,GAAGF,GAAG,CAACG,KAAK,CAAC,CAAC,CAAC;AACnD","ignoreList":[]}
1
+ {"version":3,"file":"event-handler.js","names":["getEventHandlerFromProps","props","eventName","options","handlerName","getEventHandlerName","loose","undefined","capitalizeFirstLetter","str","charAt","toUpperCase","slice"],"sources":["../src/event-handler.ts"],"sourcesContent":["export type EventHandler = (...args: unknown[]) => unknown;\n\nexport type EventHandlerOptions = {\n /** Include check for event handler named without adding `on*` prefix. */\n loose?: boolean;\n};\n\nexport function getEventHandlerFromProps(\n props: Record<string, unknown>,\n eventName: string,\n options?: EventHandlerOptions,\n): EventHandler | undefined {\n const handlerName = getEventHandlerName(eventName);\n if (typeof props[handlerName] === 'function') {\n return props[handlerName] as EventHandler;\n }\n\n if (options?.loose && typeof props[eventName] === 'function') {\n return props[eventName] as EventHandler;\n }\n\n if (typeof props[`testOnly_${handlerName}`] === 'function') {\n return props[`testOnly_${handlerName}`] as EventHandler;\n }\n\n if (options?.loose && typeof props[`testOnly_${eventName}`] === 'function') {\n return props[`testOnly_${eventName}`] as EventHandler;\n }\n\n return undefined;\n}\n\nexport function getEventHandlerName(eventName: string) {\n return `on${capitalizeFirstLetter(eventName)}`;\n}\n\nfunction capitalizeFirstLetter(str: string) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n"],"mappings":";;;;;;;AAOO,SAASA,wBAAwBA,CACtCC,KAA8B,EAC9BC,SAAiB,EACjBC,OAA6B,EACH;EAC1B,MAAMC,WAAW,GAAGC,mBAAmB,CAACH,SAAS,CAAC;EAClD,IAAI,OAAOD,KAAK,CAACG,WAAW,CAAC,KAAK,UAAU,EAAE;IAC5C,OAAOH,KAAK,CAACG,WAAW,CAAC;EAC3B;EAEA,IAAID,OAAO,EAAEG,KAAK,IAAI,OAAOL,KAAK,CAACC,SAAS,CAAC,KAAK,UAAU,EAAE;IAC5D,OAAOD,KAAK,CAACC,SAAS,CAAC;EACzB;EAEA,IAAI,OAAOD,KAAK,CAAC,YAAYG,WAAW,EAAE,CAAC,KAAK,UAAU,EAAE;IAC1D,OAAOH,KAAK,CAAC,YAAYG,WAAW,EAAE,CAAC;EACzC;EAEA,IAAID,OAAO,EAAEG,KAAK,IAAI,OAAOL,KAAK,CAAC,YAAYC,SAAS,EAAE,CAAC,KAAK,UAAU,EAAE;IAC1E,OAAOD,KAAK,CAAC,YAAYC,SAAS,EAAE,CAAC;EACvC;EAEA,OAAOK,SAAS;AAClB;AAEO,SAASF,mBAAmBA,CAACH,SAAiB,EAAE;EACrD,OAAO,KAAKM,qBAAqB,CAACN,SAAS,CAAC,EAAE;AAChD;AAEA,SAASM,qBAAqBA,CAACC,GAAW,EAAE;EAC1C,OAAOA,GAAG,CAACC,MAAM,CAAC,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC,GAAGF,GAAG,CAACG,KAAK,CAAC,CAAC,CAAC;AACnD","ignoreList":[]}
@@ -9,8 +9,15 @@ type EventNameExtractor<T> = keyof {
9
9
  type EventName = StringWithAutocomplete<EventNameExtractor<ViewProps> | EventNameExtractor<TextProps> | EventNameExtractor<TextInputProps> | EventNameExtractor<PressableProps> | EventNameExtractor<ScrollViewProps>>;
10
10
  declare function fireEvent(element: HostElement, eventName: EventName, ...data: unknown[]): undefined;
11
11
  declare namespace fireEvent {
12
- var press: (element: HostElement, ...data: unknown[]) => void;
12
+ var press: (element: HostElement, ...data: unknown[]) => undefined;
13
13
  var changeText: (element: HostElement, ...data: unknown[]) => undefined;
14
14
  var scroll: (element: HostElement, ...data: unknown[]) => undefined;
15
15
  }
16
+ declare function fireEventAsync(element: HostElement, eventName: EventName, ...data: unknown[]): Promise<undefined>;
17
+ declare namespace fireEventAsync {
18
+ var press: (element: HostElement, ...data: unknown[]) => Promise<undefined>;
19
+ var changeText: (element: HostElement, ...data: unknown[]) => Promise<undefined>;
20
+ var scroll: (element: HostElement, ...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"));
@@ -13,10 +14,9 @@ var _hostComponentNames = require("./helpers/host-component-names");
13
14
  var _pointerEvents = require("./helpers/pointer-events");
14
15
  var _textInput = require("./helpers/text-input");
15
16
  var _nativeState = require("./native-state");
16
- var _eventBuilder = require("./user-event/event-builder");
17
17
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
18
18
  function isTouchResponder(element) {
19
- if (!(0, _componentTree.isValidElement)(element)) {
19
+ if (!(0, _componentTree.isHostElement)(element)) {
20
20
  return false;
21
21
  }
22
22
  return Boolean(element.props.onStartShouldSetResponder) || (0, _hostComponentNames.isHostTextInput)(element);
@@ -28,7 +28,7 @@ function isTouchResponder(element) {
28
28
  * Note: `fireEvent` is accepting both `press` and `onPress` for event names,
29
29
  * so we need cover both forms.
30
30
  */
31
- const eventsAffectedByPointerEventsProp = new Set(['press', 'onPress', 'responderGrant', 'responderRelease', 'longPress', 'pressIn', 'pressOut']);
31
+ const eventsAffectedByPointerEventsProp = new Set(['press', 'onPress']);
32
32
 
33
33
  /**
34
34
  * List of `TextInput` events not affected by `editable` prop.
@@ -53,19 +53,35 @@ function isEventEnabled(element, eventName, nearestTouchResponder) {
53
53
  }
54
54
  function findEventHandler(element, eventName, nearestTouchResponder) {
55
55
  const touchResponder = isTouchResponder(element) ? element : nearestTouchResponder;
56
- const handler = (0, _eventHandler.getEventHandler)(element, eventName, {
56
+ const handler = (0, _eventHandler.getEventHandlerFromProps)(element.props, eventName, {
57
57
  loose: true
58
- });
58
+ }) ?? findEventHandlerFromFiber(element.unstable_fiber, eventName);
59
59
  if (handler && isEventEnabled(element, eventName, touchResponder)) {
60
60
  return handler;
61
61
  }
62
-
63
- // eslint-disable-next-line @typescript-eslint/prefer-optional-chain
64
- if (element.parent === null || element.parent.parent === null) {
62
+ if (element.parent === null) {
65
63
  return null;
66
64
  }
67
65
  return findEventHandler(element.parent, eventName, touchResponder);
68
66
  }
67
+ function findEventHandlerFromFiber(fiber, eventName) {
68
+ // Container fibers have memoizedProps set to null
69
+ if (!fiber?.memoizedProps) {
70
+ return null;
71
+ }
72
+ const handler = (0, _eventHandler.getEventHandlerFromProps)(fiber.memoizedProps, eventName, {
73
+ loose: true
74
+ });
75
+ if (handler) {
76
+ return handler;
77
+ }
78
+
79
+ // No parent fiber or we reached another host element
80
+ if (fiber.return === null || typeof fiber.return.type === 'string') {
81
+ return null;
82
+ }
83
+ return findEventHandlerFromFiber(fiber.return, eventName);
84
+ }
69
85
 
70
86
  // String union type of keys of T that start with on, stripped of 'on'
71
87
 
@@ -84,28 +100,28 @@ function fireEvent(element, eventName, ...data) {
84
100
  });
85
101
  return returnValue;
86
102
  }
87
- fireEvent.press = (element, ...data) => {
88
- const nativeData = data.length === 1 && typeof data[0] === 'object' && data[0] !== null && 'nativeEvent' in data[0] && typeof data[0].nativeEvent === 'object' ? data[0].nativeEvent : null;
89
- const responderGrantEvent = _eventBuilder.EventBuilder.Common.responderGrant();
90
- if (nativeData) {
91
- responderGrantEvent.nativeEvent = {
92
- ...responderGrantEvent.nativeEvent,
93
- ...nativeData
94
- };
95
- }
96
- fireEvent(element, 'responderGrant', responderGrantEvent);
97
- fireEvent(element, 'press', ...data);
98
- const responderReleaseEvent = _eventBuilder.EventBuilder.Common.responderRelease();
99
- if (nativeData) {
100
- responderReleaseEvent.nativeEvent = {
101
- ...responderReleaseEvent.nativeEvent,
102
- ...nativeData
103
- };
104
- }
105
- fireEvent(element, 'responderRelease', responderReleaseEvent);
106
- };
103
+ fireEvent.press = (element, ...data) => fireEvent(element, 'press', ...data);
107
104
  fireEvent.changeText = (element, ...data) => fireEvent(element, 'changeText', ...data);
108
105
  fireEvent.scroll = (element, ...data) => fireEvent(element, 'scroll', ...data);
106
+ async function fireEventAsync(element, eventName, ...data) {
107
+ if (!(0, _componentTree.isElementMounted)(element)) {
108
+ return;
109
+ }
110
+ setNativeStateIfNeeded(element, eventName, data[0]);
111
+ const handler = findEventHandler(element, eventName);
112
+ if (!handler) {
113
+ return;
114
+ }
115
+ let returnValue;
116
+ // eslint-disable-next-line require-await
117
+ await (0, _act.default)(async () => {
118
+ returnValue = handler(...data);
119
+ });
120
+ return returnValue;
121
+ }
122
+ fireEventAsync.press = async (element, ...data) => await fireEventAsync(element, 'press', ...data);
123
+ fireEventAsync.changeText = async (element, ...data) => await fireEventAsync(element, 'changeText', ...data);
124
+ fireEventAsync.scroll = async (element, ...data) => await fireEventAsync(element, 'scroll', ...data);
109
125
  var _default = exports.default = fireEvent;
110
126
  const scrollEventNames = new Set(['scroll', 'scrollBeginDrag', 'scrollEndDrag', 'momentumScrollBegin', 'momentumScrollEnd']);
111
127
  function setNativeStateIfNeeded(element, eventName, value) {
@@ -1 +1 @@
1
- {"version":3,"file":"fire-event.js","names":["_act","_interopRequireDefault","require","_eventHandler","_componentTree","_hostComponentNames","_pointerEvents","_textInput","_nativeState","_eventBuilder","e","__esModule","default","isTouchResponder","element","isValidElement","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","nativeData","length","nativeEvent","responderGrantEvent","EventBuilder","Common","responderGrant","responderReleaseEvent","responderRelease","changeText","scroll","_default","exports","scrollEventNames","value","nativeState","valueForElement","set","isHostScrollView","contentOffset","tryGetContentOffset","contentOffsetForElement","event","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 { HostElement } from 'universal-test-renderer';\n\nimport act from './act';\nimport { getEventHandler } from './event-handler';\nimport { isElementMounted, isValidElement } 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';\nimport { EventBuilder } from './user-event/event-builder';\n\ntype EventHandler = (...args: unknown[]) => unknown;\n\nexport function isTouchResponder(element: HostElement) {\n if (!isValidElement(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([\n 'press',\n 'onPress',\n 'responderGrant',\n 'responderRelease',\n 'longPress',\n 'pressIn',\n 'pressOut',\n]);\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: HostElement,\n eventName: string,\n nearestTouchResponder?: HostElement,\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: HostElement,\n eventName: string,\n nearestTouchResponder?: HostElement,\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 // eslint-disable-next-line @typescript-eslint/prefer-optional-chain\n if (element.parent === null || element.parent.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: HostElement, 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: HostElement, ...data: unknown[]) => {\n const nativeData =\n data.length === 1 &&\n typeof data[0] === 'object' &&\n data[0] !== null &&\n 'nativeEvent' in data[0] &&\n typeof data[0].nativeEvent === 'object'\n ? data[0].nativeEvent\n : null;\n\n const responderGrantEvent = EventBuilder.Common.responderGrant();\n if (nativeData) {\n responderGrantEvent.nativeEvent = {\n ...responderGrantEvent.nativeEvent,\n ...nativeData,\n };\n }\n fireEvent(element, 'responderGrant', responderGrantEvent);\n\n fireEvent(element, 'press', ...data);\n\n const responderReleaseEvent = EventBuilder.Common.responderRelease();\n if (nativeData) {\n responderReleaseEvent.nativeEvent = {\n ...responderReleaseEvent.nativeEvent,\n ...nativeData,\n };\n }\n fireEvent(element, 'responderRelease', responderReleaseEvent);\n};\n\nfireEvent.changeText = (element: HostElement, ...data: unknown[]) =>\n fireEvent(element, 'changeText', ...data);\n\nfireEvent.scroll = (element: HostElement, ...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: HostElement, 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":[]}
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","getEventHandlerFromProps","loose","findEventHandlerFromFiber","unstable_fiber","parent","fiber","memoizedProps","return","type","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 { Fiber, HostElement } from 'universal-test-renderer';\n\nimport act from './act';\nimport type { EventHandler } from './event-handler';\nimport { getEventHandlerFromProps } 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\nexport function isTouchResponder(element: HostElement) {\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: HostElement,\n eventName: string,\n nearestTouchResponder?: HostElement,\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: HostElement,\n eventName: string,\n nearestTouchResponder?: HostElement,\n): EventHandler | null {\n const touchResponder = isTouchResponder(element) ? element : nearestTouchResponder;\n\n const handler =\n getEventHandlerFromProps(element.props, eventName, { loose: true }) ??\n findEventHandlerFromFiber(element.unstable_fiber, eventName);\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\nfunction findEventHandlerFromFiber(fiber: Fiber | null, eventName: string): EventHandler | null {\n // Container fibers have memoizedProps set to null\n if (!fiber?.memoizedProps) {\n return null;\n }\n\n const handler = getEventHandlerFromProps(fiber.memoizedProps, eventName, { loose: true });\n if (handler) {\n return handler;\n }\n\n // No parent fiber or we reached another host element\n if (fiber.return === null || typeof fiber.return.type === 'string') {\n return null;\n }\n\n return findEventHandlerFromFiber(fiber.return, eventName);\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: HostElement, 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: HostElement, ...data: unknown[]) =>\n fireEvent(element, 'press', ...data);\n\nfireEvent.changeText = (element: HostElement, ...data: unknown[]) =>\n fireEvent(element, 'changeText', ...data);\n\nfireEvent.scroll = (element: HostElement, ...data: unknown[]) =>\n fireEvent(element, 'scroll', ...data);\n\nasync function fireEventAsync(element: HostElement, 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 // 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: HostElement, ...data: unknown[]) =>\n await fireEventAsync(element, 'press', ...data);\n\nfireEventAsync.changeText = async (element: HostElement, ...data: unknown[]) =>\n await fireEventAsync(element, 'changeText', ...data);\n\nfireEventAsync.scroll = async (element: HostElement, ...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: HostElement, 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":[]}
@@ -147,8 +147,8 @@ function computeAriaModal(element) {
147
147
  function computeAriaLabel(element) {
148
148
  const labelElementId = element.props['aria-labelledby'] ?? element.props.accessibilityLabelledBy;
149
149
  if (labelElementId) {
150
- const rootElement = (0, _componentTree.getContainerElement)(element);
151
- const labelElement = (0, _findAll.findAll)(rootElement, node => (0, _componentTree.isValidElement)(node) && node.props.nativeID === labelElementId, {
150
+ const container = (0, _componentTree.getContainerElement)(element);
151
+ const labelElement = (0, _findAll.findAll)(container, node => (0, _componentTree.isHostElement)(node) && node.props.nativeID === labelElementId, {
152
152
  includeHiddenElements: true
153
153
  });
154
154
  if (labelElement.length > 0) {
@@ -197,6 +197,9 @@ function computeAriaDisabled(element) {
197
197
  const {
198
198
  props
199
199
  } = element;
200
+ if ((0, _hostComponentNames.isHostText)(element) && props.disabled) {
201
+ return true;
202
+ }
200
203
  return props['aria-disabled'] ?? props.accessibilityState?.disabled ?? false;
201
204
  }
202
205
 
@@ -1 +1 @@
1
- {"version":3,"file":"accessibility.js","names":["_reactNative","require","_componentTree","_findAll","_hostComponentNames","_textContent","_textInput","accessibilityStateKeys","exports","accessibilityValueKeys","isHiddenFromAccessibility","element","cache","current","isCurrentSubtreeInaccessible","get","undefined","isSubtreeInaccessible","set","parent","isInaccessible","props","accessibilityElementsHidden","importantForAccessibility","flatStyle","StyleSheet","flatten","style","display","hostSiblings","getHostSiblings","some","sibling","computeAriaModal","isAccessibilityElement","isHostImage","alt","accessible","isHostText","isHostTextInput","isHostSwitch","getRole","explicitRole","role","accessibilityRole","normalizeRole","accessibilityViewIsModal","computeAriaLabel","labelElementId","accessibilityLabelledBy","rootElement","getContainerElement","labelElement","findAll","node","isValidElement","nativeID","includeHiddenElements","length","getTextContent","explicitLabel","accessibilityLabel","computeAriaBusy","accessibilityState","busy","computeAriaChecked","value","rolesSupportingCheckedState","checked","computeAriaDisabled","isEditableTextInput","disabled","computeAriaExpanded","expanded","computeAriaSelected","selected","computeAriaValue","accessibilityValue","ariaValueMax","ariaValueMin","ariaValueNow","ariaValueText","max","min","now","text","computeAccessibleName","checkbox","radio","switch"],"sources":["../../src/helpers/accessibility.ts"],"sourcesContent":["import type { AccessibilityRole, AccessibilityState, AccessibilityValue, Role } from 'react-native';\nimport { StyleSheet } from 'react-native';\nimport type { HostElement } from 'universal-test-renderer';\n\nimport { getContainerElement, getHostSiblings, isValidElement } from './component-tree';\nimport { findAll } from './find-all';\nimport { isHostImage, isHostSwitch, isHostText, isHostTextInput } from './host-component-names';\nimport { getTextContent } from './text-content';\nimport { isEditableTextInput } from './text-input';\n\ntype IsInaccessibleOptions = {\n cache?: WeakMap<HostElement, boolean>;\n};\n\nexport const accessibilityStateKeys: (keyof AccessibilityState)[] = [\n 'disabled',\n 'selected',\n 'checked',\n 'busy',\n 'expanded',\n];\n\nexport const accessibilityValueKeys: (keyof AccessibilityValue)[] = ['min', 'max', 'now', 'text'];\n\nexport function isHiddenFromAccessibility(\n element: HostElement | null,\n { cache }: IsInaccessibleOptions = {},\n): boolean {\n if (element == null) {\n return true;\n }\n\n let current: HostElement | null = element;\n while (current) {\n let isCurrentSubtreeInaccessible = cache?.get(current);\n\n if (isCurrentSubtreeInaccessible === undefined) {\n isCurrentSubtreeInaccessible = isSubtreeInaccessible(current);\n cache?.set(current, isCurrentSubtreeInaccessible);\n }\n\n if (isCurrentSubtreeInaccessible) {\n return true;\n }\n\n current = current.parent;\n }\n\n return false;\n}\n\n/** RTL-compatibility alias for `isHiddenFromAccessibility` */\nexport const isInaccessible = isHiddenFromAccessibility;\n\nfunction isSubtreeInaccessible(element: HostElement): boolean {\n // Null props can happen for React.Fragments\n if (element.props == null) {\n return false;\n }\n\n // See: https://reactnative.dev/docs/accessibility#aria-hidden\n if (element.props['aria-hidden']) {\n return true;\n }\n\n // iOS: accessibilityElementsHidden\n // See: https://reactnative.dev/docs/accessibility#accessibilityelementshidden-ios\n if (element.props.accessibilityElementsHidden) {\n return true;\n }\n\n // Android: importantForAccessibility\n // See: https://reactnative.dev/docs/accessibility#importantforaccessibility-android\n if (element.props.importantForAccessibility === 'no-hide-descendants') {\n return true;\n }\n\n // Note that `opacity: 0` is not treated as inaccessible on iOS\n const flatStyle = StyleSheet.flatten(element.props.style) ?? {};\n if (flatStyle.display === 'none') return true;\n\n // iOS: accessibilityViewIsModal or aria-modal\n // See: https://reactnative.dev/docs/accessibility#accessibilityviewismodal-ios\n const hostSiblings = getHostSiblings(element);\n if (hostSiblings.some((sibling) => computeAriaModal(sibling))) {\n return true;\n }\n\n return false;\n}\n\nexport function isAccessibilityElement(element: HostElement | null): boolean {\n if (element == null) {\n return false;\n }\n\n // https://github.com/facebook/react-native/blob/8dabed60f456e76a9e53273b601446f34de41fb5/packages/react-native/Libraries/Image/Image.ios.js#L172\n if (isHostImage(element) && element.props.alt !== undefined) {\n return true;\n }\n\n if (element.props.accessible !== undefined) {\n return element.props.accessible;\n }\n\n return isHostText(element) || isHostTextInput(element) || isHostSwitch(element);\n}\n\n/**\n * Returns the accessibility role for given element. It will return explicit\n * role from either `role` or `accessibilityRole` props if set.\n *\n * If explicit role is not available, it would try to return default element\n * role:\n * - `text` for `Text` elements\n *\n * In all other cases this functions returns `none`.\n *\n * @param element\n * @returns\n */\nexport function getRole(element: HostElement): Role | AccessibilityRole {\n const explicitRole = element.props.role ?? element.props.accessibilityRole;\n if (explicitRole) {\n return normalizeRole(explicitRole);\n }\n\n if (isHostText(element)) {\n return 'text';\n }\n\n // Note: host Image elements report \"image\" role in screen reader only on Android, but not on iOS.\n // It's better to require explicit role for Image elements.\n\n return 'none';\n}\n\n/**\n * There are some duplications between (ARIA) `Role` and `AccessibilityRole` types.\n * Resolve them by using ARIA `Role` type where possible.\n *\n * @param role Role to normalize\n * @returns Normalized role\n */\nexport function normalizeRole(role: string): Role | AccessibilityRole {\n if (role === 'image') {\n return 'img';\n }\n\n return role as Role | AccessibilityRole;\n}\n\nexport function computeAriaModal(element: HostElement): boolean | undefined {\n return element.props['aria-modal'] ?? element.props.accessibilityViewIsModal;\n}\n\nexport function computeAriaLabel(element: HostElement): string | undefined {\n const labelElementId = element.props['aria-labelledby'] ?? element.props.accessibilityLabelledBy;\n if (labelElementId) {\n const rootElement = getContainerElement(element);\n const labelElement = findAll(\n rootElement,\n (node) => isValidElement(node) && node.props.nativeID === labelElementId,\n {\n includeHiddenElements: true,\n },\n );\n if (labelElement.length > 0) {\n return getTextContent(labelElement[0]);\n }\n }\n\n const explicitLabel = element.props['aria-label'] ?? element.props.accessibilityLabel;\n if (explicitLabel) {\n return explicitLabel;\n }\n\n //https://github.com/facebook/react-native/blob/8dabed60f456e76a9e53273b601446f34de41fb5/packages/react-native/Libraries/Image/Image.ios.js#L173\n if (isHostImage(element) && element.props.alt) {\n return element.props.alt;\n }\n\n return undefined;\n}\n\n// See: https://github.com/callstack/react-native-testing-library/wiki/Accessibility:-State#busy-state\nexport function computeAriaBusy({ props }: HostElement): boolean {\n return props['aria-busy'] ?? props.accessibilityState?.busy ?? false;\n}\n\n// See: https://github.com/callstack/react-native-testing-library/wiki/Accessibility:-State#checked-state\nexport function computeAriaChecked(element: HostElement): AccessibilityState['checked'] {\n const { props } = element;\n\n if (isHostSwitch(element)) {\n return props.value;\n }\n\n const role = getRole(element);\n if (!rolesSupportingCheckedState[role]) {\n return undefined;\n }\n\n return props['aria-checked'] ?? props.accessibilityState?.checked;\n}\n\n// See: https://github.com/callstack/react-native-testing-library/wiki/Accessibility:-State#disabled-state\nexport function computeAriaDisabled(element: HostElement): boolean {\n if (isHostTextInput(element) && !isEditableTextInput(element)) {\n return true;\n }\n\n const { props } = element;\n return props['aria-disabled'] ?? props.accessibilityState?.disabled ?? false;\n}\n\n// See: https://github.com/callstack/react-native-testing-library/wiki/Accessibility:-State#expanded-state\nexport function computeAriaExpanded({ props }: HostElement): boolean | undefined {\n return props['aria-expanded'] ?? props.accessibilityState?.expanded;\n}\n\n// See: https://github.com/callstack/react-native-testing-library/wiki/Accessibility:-State#selected-state\nexport function computeAriaSelected({ props }: HostElement): boolean {\n return props['aria-selected'] ?? props.accessibilityState?.selected ?? false;\n}\n\nexport function computeAriaValue(element: HostElement): AccessibilityValue {\n const {\n accessibilityValue,\n 'aria-valuemax': ariaValueMax,\n 'aria-valuemin': ariaValueMin,\n 'aria-valuenow': ariaValueNow,\n 'aria-valuetext': ariaValueText,\n } = element.props;\n\n return {\n max: ariaValueMax ?? accessibilityValue?.max,\n min: ariaValueMin ?? accessibilityValue?.min,\n now: ariaValueNow ?? accessibilityValue?.now,\n text: ariaValueText ?? accessibilityValue?.text,\n };\n}\n\nexport function computeAccessibleName(element: HostElement): string | undefined {\n return computeAriaLabel(element) ?? getTextContent(element);\n}\n\ntype RoleSupportMap = Partial<Record<Role | AccessibilityRole, true>>;\n\nexport const rolesSupportingCheckedState: RoleSupportMap = {\n checkbox: true,\n radio: true,\n switch: true,\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"accessibility.js","names":["_reactNative","require","_componentTree","_findAll","_hostComponentNames","_textContent","_textInput","accessibilityStateKeys","exports","accessibilityValueKeys","isHiddenFromAccessibility","element","cache","current","isCurrentSubtreeInaccessible","get","undefined","isSubtreeInaccessible","set","parent","isInaccessible","props","accessibilityElementsHidden","importantForAccessibility","flatStyle","StyleSheet","flatten","style","display","hostSiblings","getHostSiblings","some","sibling","computeAriaModal","isAccessibilityElement","isHostImage","alt","accessible","isHostText","isHostTextInput","isHostSwitch","getRole","explicitRole","role","accessibilityRole","normalizeRole","accessibilityViewIsModal","computeAriaLabel","labelElementId","accessibilityLabelledBy","container","getContainerElement","labelElement","findAll","node","isHostElement","nativeID","includeHiddenElements","length","getTextContent","explicitLabel","accessibilityLabel","computeAriaBusy","accessibilityState","busy","computeAriaChecked","value","rolesSupportingCheckedState","checked","computeAriaDisabled","isEditableTextInput","disabled","computeAriaExpanded","expanded","computeAriaSelected","selected","computeAriaValue","accessibilityValue","ariaValueMax","ariaValueMin","ariaValueNow","ariaValueText","max","min","now","text","computeAccessibleName","checkbox","radio","switch"],"sources":["../../src/helpers/accessibility.ts"],"sourcesContent":["import type { AccessibilityRole, AccessibilityState, AccessibilityValue, Role } from 'react-native';\nimport { StyleSheet } from 'react-native';\nimport type { HostElement } from 'universal-test-renderer';\n\nimport { getContainerElement, getHostSiblings, isHostElement } from './component-tree';\nimport { findAll } from './find-all';\nimport { isHostImage, isHostSwitch, isHostText, isHostTextInput } from './host-component-names';\nimport { getTextContent } from './text-content';\nimport { isEditableTextInput } from './text-input';\n\ntype IsInaccessibleOptions = {\n cache?: WeakMap<HostElement, boolean>;\n};\n\nexport const accessibilityStateKeys: (keyof AccessibilityState)[] = [\n 'disabled',\n 'selected',\n 'checked',\n 'busy',\n 'expanded',\n];\n\nexport const accessibilityValueKeys: (keyof AccessibilityValue)[] = ['min', 'max', 'now', 'text'];\n\nexport function isHiddenFromAccessibility(\n element: HostElement | null,\n { cache }: IsInaccessibleOptions = {},\n): boolean {\n if (element == null) {\n return true;\n }\n\n let current: HostElement | null = element;\n while (current) {\n let isCurrentSubtreeInaccessible = cache?.get(current);\n\n if (isCurrentSubtreeInaccessible === undefined) {\n isCurrentSubtreeInaccessible = isSubtreeInaccessible(current);\n cache?.set(current, isCurrentSubtreeInaccessible);\n }\n\n if (isCurrentSubtreeInaccessible) {\n return true;\n }\n\n current = current.parent;\n }\n\n return false;\n}\n\n/** RTL-compatibility alias for `isHiddenFromAccessibility` */\nexport const isInaccessible = isHiddenFromAccessibility;\n\nfunction isSubtreeInaccessible(element: HostElement): boolean {\n // Null props can happen for React.Fragments\n if (element.props == null) {\n return false;\n }\n\n // See: https://reactnative.dev/docs/accessibility#aria-hidden\n if (element.props['aria-hidden']) {\n return true;\n }\n\n // iOS: accessibilityElementsHidden\n // See: https://reactnative.dev/docs/accessibility#accessibilityelementshidden-ios\n if (element.props.accessibilityElementsHidden) {\n return true;\n }\n\n // Android: importantForAccessibility\n // See: https://reactnative.dev/docs/accessibility#importantforaccessibility-android\n if (element.props.importantForAccessibility === 'no-hide-descendants') {\n return true;\n }\n\n // Note that `opacity: 0` is not treated as inaccessible on iOS\n const flatStyle = StyleSheet.flatten(element.props.style) ?? {};\n if (flatStyle.display === 'none') return true;\n\n // iOS: accessibilityViewIsModal or aria-modal\n // See: https://reactnative.dev/docs/accessibility#accessibilityviewismodal-ios\n const hostSiblings = getHostSiblings(element);\n if (hostSiblings.some((sibling) => computeAriaModal(sibling))) {\n return true;\n }\n\n return false;\n}\n\nexport function isAccessibilityElement(element: HostElement | null): boolean {\n if (element == null) {\n return false;\n }\n\n // https://github.com/facebook/react-native/blob/8dabed60f456e76a9e53273b601446f34de41fb5/packages/react-native/Libraries/Image/Image.ios.js#L172\n if (isHostImage(element) && element.props.alt !== undefined) {\n return true;\n }\n\n if (element.props.accessible !== undefined) {\n return element.props.accessible;\n }\n\n return isHostText(element) || isHostTextInput(element) || isHostSwitch(element);\n}\n\n/**\n * Returns the accessibility role for given element. It will return explicit\n * role from either `role` or `accessibilityRole` props if set.\n *\n * If explicit role is not available, it would try to return default element\n * role:\n * - `text` for `Text` elements\n *\n * In all other cases this functions returns `none`.\n *\n * @param element\n * @returns\n */\nexport function getRole(element: HostElement): Role | AccessibilityRole {\n const explicitRole = element.props.role ?? element.props.accessibilityRole;\n if (explicitRole) {\n return normalizeRole(explicitRole);\n }\n\n if (isHostText(element)) {\n return 'text';\n }\n\n // Note: host Image elements report \"image\" role in screen reader only on Android, but not on iOS.\n // It's better to require explicit role for Image elements.\n\n return 'none';\n}\n\n/**\n * There are some duplications between (ARIA) `Role` and `AccessibilityRole` types.\n * Resolve them by using ARIA `Role` type where possible.\n *\n * @param role Role to normalize\n * @returns Normalized role\n */\nexport function normalizeRole(role: string): Role | AccessibilityRole {\n if (role === 'image') {\n return 'img';\n }\n\n return role as Role | AccessibilityRole;\n}\n\nexport function computeAriaModal(element: HostElement): boolean | undefined {\n return element.props['aria-modal'] ?? element.props.accessibilityViewIsModal;\n}\n\nexport function computeAriaLabel(element: HostElement): string | undefined {\n const labelElementId = element.props['aria-labelledby'] ?? element.props.accessibilityLabelledBy;\n if (labelElementId) {\n const container = getContainerElement(element);\n const labelElement = findAll(\n container,\n (node) => isHostElement(node) && node.props.nativeID === labelElementId,\n { includeHiddenElements: true },\n );\n if (labelElement.length > 0) {\n return getTextContent(labelElement[0]);\n }\n }\n\n const explicitLabel = element.props['aria-label'] ?? element.props.accessibilityLabel;\n if (explicitLabel) {\n return explicitLabel;\n }\n\n //https://github.com/facebook/react-native/blob/8dabed60f456e76a9e53273b601446f34de41fb5/packages/react-native/Libraries/Image/Image.ios.js#L173\n if (isHostImage(element) && element.props.alt) {\n return element.props.alt;\n }\n\n return undefined;\n}\n\n// See: https://github.com/callstack/react-native-testing-library/wiki/Accessibility:-State#busy-state\nexport function computeAriaBusy({ props }: HostElement): boolean {\n return props['aria-busy'] ?? props.accessibilityState?.busy ?? false;\n}\n\n// See: https://github.com/callstack/react-native-testing-library/wiki/Accessibility:-State#checked-state\nexport function computeAriaChecked(element: HostElement): AccessibilityState['checked'] {\n const { props } = element;\n\n if (isHostSwitch(element)) {\n return props.value;\n }\n\n const role = getRole(element);\n if (!rolesSupportingCheckedState[role]) {\n return undefined;\n }\n\n return props['aria-checked'] ?? props.accessibilityState?.checked;\n}\n\n// See: https://github.com/callstack/react-native-testing-library/wiki/Accessibility:-State#disabled-state\nexport function computeAriaDisabled(element: HostElement): boolean {\n if (isHostTextInput(element) && !isEditableTextInput(element)) {\n return true;\n }\n\n const { props } = element;\n\n if (isHostText(element) && props.disabled) {\n return true;\n }\n\n return props['aria-disabled'] ?? props.accessibilityState?.disabled ?? false;\n}\n\n// See: https://github.com/callstack/react-native-testing-library/wiki/Accessibility:-State#expanded-state\nexport function computeAriaExpanded({ props }: HostElement): boolean | undefined {\n return props['aria-expanded'] ?? props.accessibilityState?.expanded;\n}\n\n// See: https://github.com/callstack/react-native-testing-library/wiki/Accessibility:-State#selected-state\nexport function computeAriaSelected({ props }: HostElement): boolean {\n return props['aria-selected'] ?? props.accessibilityState?.selected ?? false;\n}\n\nexport function computeAriaValue(element: HostElement): AccessibilityValue {\n const {\n accessibilityValue,\n 'aria-valuemax': ariaValueMax,\n 'aria-valuemin': ariaValueMin,\n 'aria-valuenow': ariaValueNow,\n 'aria-valuetext': ariaValueText,\n } = element.props;\n\n return {\n max: ariaValueMax ?? accessibilityValue?.max,\n min: ariaValueMin ?? accessibilityValue?.min,\n now: ariaValueNow ?? accessibilityValue?.now,\n text: ariaValueText ?? accessibilityValue?.text,\n };\n}\n\nexport function computeAccessibleName(element: HostElement): string | undefined {\n return computeAriaLabel(element) ?? getTextContent(element);\n}\n\ntype RoleSupportMap = Partial<Record<Role | AccessibilityRole, true>>;\n\nexport const rolesSupportingCheckedState: RoleSupportMap = {\n checkbox: true,\n radio: true,\n switch: true,\n};\n"],"mappings":"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","ignoreList":[]}
@@ -1,19 +1,19 @@
1
- import type { HostElement } from 'universal-test-renderer';
1
+ import type { HostElement, HostNode } from 'universal-test-renderer';
2
2
  /**
3
3
  * Checks if the given element is a host element.
4
4
  * @param element The element to check.
5
5
  */
6
- export declare function isValidElement(element?: HostElement | null): element is HostElement;
6
+ export declare function isHostElement(element?: HostNode | null): element is HostElement;
7
7
  export declare function isElementMounted(element: HostElement): boolean;
8
8
  /**
9
- * Returns the unsafe root element of the tree (probably composite).
10
- *
9
+ * Returns host siblings for given element.
11
10
  * @param element The element start traversing from.
12
- * @returns The root element of the tree (host or composite).
13
11
  */
14
- export declare function getContainerElement(element: HostElement): HostElement;
12
+ export declare function getHostSiblings(element: HostElement): HostElement[];
15
13
  /**
16
- * Returns host siblings for given element.
14
+ * Returns the containerelement of the tree.
15
+ *
17
16
  * @param element The element start traversing from.
17
+ * @returns The container element of the tree.
18
18
  */
19
- export declare function getHostSiblings(element: HostElement | null): HostElement[];
19
+ export declare function getContainerElement(element: HostElement): HostElement;
@@ -6,40 +6,43 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.getContainerElement = getContainerElement;
7
7
  exports.getHostSiblings = getHostSiblings;
8
8
  exports.isElementMounted = isElementMounted;
9
- exports.isValidElement = isValidElement;
10
- var _universalTestRenderer = require("universal-test-renderer");
9
+ exports.isHostElement = isHostElement;
11
10
  var _screen = require("../screen");
12
11
  /**
13
12
  * Checks if the given element is a host element.
14
13
  * @param element The element to check.
15
14
  */
16
- function isValidElement(element) {
17
- return typeof element?.type === 'string' && element.type !== _universalTestRenderer.CONTAINER_TYPE;
15
+ function isHostElement(element) {
16
+ return typeof element !== 'string' && typeof element?.type === 'string';
18
17
  }
19
18
  function isElementMounted(element) {
20
19
  return getContainerElement(element) === _screen.screen.container;
21
20
  }
22
21
 
23
22
  /**
24
- * Returns the unsafe root element of the tree (probably composite).
25
- *
23
+ * Returns host siblings for given element.
26
24
  * @param element The element start traversing from.
27
- * @returns The root element of the tree (host or composite).
28
25
  */
29
- function getContainerElement(element) {
30
- let current = element;
31
- while (current?.parent) {
32
- current = current.parent;
26
+ function getHostSiblings(element) {
27
+ // Should not happen
28
+ const parent = element.parent;
29
+ if (!parent) {
30
+ return [];
33
31
  }
34
- return current;
32
+ return parent.children.filter(sibling => typeof sibling !== 'string' && sibling !== element);
35
33
  }
36
34
 
37
35
  /**
38
- * Returns host siblings for given element.
36
+ * Returns the containerelement of the tree.
37
+ *
39
38
  * @param element The element start traversing from.
39
+ * @returns The container element of the tree.
40
40
  */
41
- function getHostSiblings(element) {
42
- const hostParent = element?.parent ?? null;
43
- return hostParent?.children.filter(sibling => typeof sibling === 'object' && sibling !== element) ?? [];
41
+ function getContainerElement(element) {
42
+ let current = element;
43
+ while (current.parent) {
44
+ current = current.parent;
45
+ }
46
+ return current;
44
47
  }
45
48
  //# sourceMappingURL=component-tree.js.map