@testing-library/react-native 12.1.1 → 12.1.3

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 (372) hide show
  1. package/.DS_Store +0 -0
  2. package/.codecov.yml +9 -0
  3. package/.eslintcache +1 -0
  4. package/.eslintignore +2 -0
  5. package/.eslintrc +19 -0
  6. package/.flowconfig +63 -0
  7. package/.github/ISSUE_TEMPLATE/bug_report.md +38 -0
  8. package/.github/ISSUE_TEMPLATE/feature_request.md +14 -0
  9. package/.github/ISSUE_TEMPLATE/question.md +9 -0
  10. package/.github/PULL_REQUEST_TEMPLATE.md +10 -0
  11. package/.github/actions/setup-deps/action.yml +22 -0
  12. package/.github/actions/setup-website-deps/action.yml +22 -0
  13. package/.github/dependabot.yml +10 -0
  14. package/.github/workflows/deploy-website.yml +36 -0
  15. package/.github/workflows/example-apps.yml +25 -0
  16. package/.github/workflows/main.yml +103 -0
  17. package/.gitignore +11 -0
  18. package/.prettierrc.js +5 -0
  19. package/CODE_OF_CONDUCT.md +73 -0
  20. package/CONTRIBUTING.md +64 -0
  21. package/README.md +8 -7
  22. package/babel.config.js +22 -0
  23. package/build/act.js.map +1 -1
  24. package/build/cleanup.js.map +1 -1
  25. package/build/config.d.ts +1 -0
  26. package/build/config.js.map +1 -1
  27. package/build/fireEvent.d.ts +13 -5
  28. package/build/fireEvent.js +57 -48
  29. package/build/fireEvent.js.map +1 -1
  30. package/build/flush-micro-tasks.d.ts +19 -0
  31. package/build/flush-micro-tasks.js +36 -0
  32. package/build/flush-micro-tasks.js.map +1 -0
  33. package/build/helpers/accessiblity.js +3 -1
  34. package/build/helpers/accessiblity.js.map +1 -1
  35. package/build/helpers/component-tree.d.ts +0 -15
  36. package/build/helpers/component-tree.js +0 -45
  37. package/build/helpers/component-tree.js.map +1 -1
  38. package/build/helpers/deprecation.d.ts +1 -0
  39. package/build/helpers/deprecation.js +16 -0
  40. package/build/helpers/deprecation.js.map +1 -1
  41. package/build/helpers/errors.d.ts +0 -4
  42. package/build/helpers/errors.js +1 -25
  43. package/build/helpers/errors.js.map +1 -1
  44. package/build/helpers/findAll.js.map +1 -1
  45. package/build/helpers/format-default.js.map +1 -1
  46. package/build/helpers/format.js.map +1 -1
  47. package/build/helpers/host-component-names.js +4 -1
  48. package/build/helpers/host-component-names.js.map +1 -1
  49. package/build/helpers/matchers/matchLabelText.js.map +1 -1
  50. package/build/helpers/pointer-events.d.ts +9 -0
  51. package/build/helpers/pointer-events.js +25 -0
  52. package/build/helpers/pointer-events.js.map +1 -0
  53. package/build/helpers/stringValidation.js.map +1 -1
  54. package/build/helpers/timers.js.map +1 -1
  55. package/build/index.js +2 -2
  56. package/build/index.js.map +1 -1
  57. package/build/matches.js.map +1 -1
  58. package/build/pure.d.ts +1 -1
  59. package/build/pure.js.map +1 -1
  60. package/build/queries/a11yState.js.map +1 -1
  61. package/build/queries/a11yValue.js.map +1 -1
  62. package/build/queries/displayValue.js.map +1 -1
  63. package/build/queries/hintText.js.map +1 -1
  64. package/build/queries/labelText.js.map +1 -1
  65. package/build/queries/makeQueries.js.map +1 -1
  66. package/build/queries/placeholderText.js.map +1 -1
  67. package/build/queries/role.js.map +1 -1
  68. package/build/queries/testId.js.map +1 -1
  69. package/build/queries/text.js.map +1 -1
  70. package/build/queries/unsafeProps.js.map +1 -1
  71. package/build/render.d.ts +171 -12
  72. package/build/render.js +11 -4
  73. package/build/render.js.map +1 -1
  74. package/build/renderHook.d.ts +3 -6
  75. package/build/renderHook.js +4 -3
  76. package/build/renderHook.js.map +1 -1
  77. package/build/shallow.js.map +1 -1
  78. package/build/test-utils/events.d.ts +10 -0
  79. package/build/test-utils/events.js +27 -0
  80. package/build/test-utils/events.js.map +1 -0
  81. package/build/test-utils/index.d.ts +1 -0
  82. package/build/test-utils/index.js +17 -0
  83. package/build/test-utils/index.js.map +1 -0
  84. package/build/user-event/event-builder/common.d.ts +45 -0
  85. package/build/user-event/event-builder/common.js +58 -0
  86. package/build/user-event/event-builder/common.js.map +1 -0
  87. package/build/user-event/event-builder/index.d.ts +32 -0
  88. package/build/user-event/event-builder/index.js +12 -0
  89. package/build/user-event/event-builder/index.js.map +1 -0
  90. package/build/user-event/index.d.ts +9 -0
  91. package/build/user-event/index.js +16 -0
  92. package/build/user-event/index.js.map +1 -0
  93. package/build/user-event/press/constants.d.ts +2 -0
  94. package/build/user-event/press/constants.js +16 -0
  95. package/build/user-event/press/constants.js.map +1 -0
  96. package/build/user-event/press/index.d.ts +1 -0
  97. package/build/user-event/press/index.js +19 -0
  98. package/build/user-event/press/index.js.map +1 -0
  99. package/build/user-event/press/press.d.ts +7 -0
  100. package/build/user-event/press/press.js +106 -0
  101. package/build/user-event/press/press.js.map +1 -0
  102. package/build/user-event/press/utils/warnAboutRealTimers.d.ts +1 -0
  103. package/build/user-event/press/utils/warnAboutRealTimers.js +14 -0
  104. package/build/user-event/press/utils/warnAboutRealTimers.js.map +1 -0
  105. package/build/user-event/setup/index.d.ts +2 -0
  106. package/build/user-event/setup/index.js +13 -0
  107. package/build/user-event/setup/index.js.map +1 -0
  108. package/build/user-event/setup/setup.d.ts +39 -0
  109. package/build/user-event/setup/setup.js +56 -0
  110. package/build/user-event/setup/setup.js.map +1 -0
  111. package/build/user-event/type/index.d.ts +1 -0
  112. package/build/user-event/type/index.js +13 -0
  113. package/build/user-event/type/index.js.map +1 -0
  114. package/build/user-event/type/type.d.ts +3 -0
  115. package/build/user-event/type/type.js +18 -0
  116. package/build/user-event/type/type.js.map +1 -0
  117. package/build/user-event/utils/events.d.ts +9 -0
  118. package/build/user-event/utils/events.js +44 -0
  119. package/build/user-event/utils/events.js.map +1 -0
  120. package/build/user-event/utils/index.d.ts +2 -0
  121. package/build/user-event/utils/index.js +28 -0
  122. package/build/user-event/utils/index.js.map +1 -0
  123. package/build/user-event/utils/wait.d.ts +2 -0
  124. package/build/user-event/utils/wait.js +14 -0
  125. package/build/user-event/utils/wait.js.map +1 -0
  126. package/build/waitFor.js +3 -3
  127. package/build/waitFor.js.map +1 -1
  128. package/build/waitForElementToBeRemoved.js.map +1 -1
  129. package/examples/basic/.expo-shared/assets.json +4 -0
  130. package/examples/basic/.gitignore +14 -0
  131. package/examples/basic/App.tsx +20 -0
  132. package/examples/basic/README.md +11 -0
  133. package/examples/basic/__tests__/App.test.tsx +119 -0
  134. package/examples/basic/app.json +31 -0
  135. package/examples/basic/assets/adaptive-icon.png +0 -0
  136. package/examples/basic/assets/favicon.png +0 -0
  137. package/examples/basic/assets/icon.png +0 -0
  138. package/examples/basic/assets/splash.png +0 -0
  139. package/examples/basic/babel.config.js +6 -0
  140. package/examples/basic/components/Home.tsx +28 -0
  141. package/examples/basic/components/LoginForm.tsx +138 -0
  142. package/examples/basic/jest-setup.ts +7 -0
  143. package/examples/basic/jest.config.js +5 -0
  144. package/examples/basic/package.json +30 -0
  145. package/examples/basic/tsconfig.json +7 -0
  146. package/examples/react-navigation/README.md +14 -0
  147. package/examples/react-navigation/babel.config.js +4 -0
  148. package/examples/react-navigation/jest-setup.js +11 -0
  149. package/examples/react-navigation/jest.config.js +10 -0
  150. package/examples/react-navigation/package.json +31 -0
  151. package/examples/react-navigation/src/App.js +21 -0
  152. package/examples/react-navigation/src/DrawerNavigator.js +15 -0
  153. package/examples/react-navigation/src/DrawerNavigator.test.js +42 -0
  154. package/examples/react-navigation/src/NativeStackNavigator.js +15 -0
  155. package/examples/react-navigation/src/NativeStackNavigator.test.js +34 -0
  156. package/examples/react-navigation/src/StackNavigator.js +15 -0
  157. package/examples/react-navigation/src/StackNavigator.test.js +34 -0
  158. package/examples/react-navigation/src/TabNavigator.js +15 -0
  159. package/examples/react-navigation/src/TabNavigator.test.js +21 -0
  160. package/examples/react-navigation/src/screens/DetailsScreen.js +43 -0
  161. package/examples/react-navigation/src/screens/DetailsScreen.test.js +27 -0
  162. package/examples/react-navigation/src/screens/DrawerHomeScreen.js +26 -0
  163. package/examples/react-navigation/src/screens/HomeScreen.js +48 -0
  164. package/examples/react-navigation/src/screens/SettingsScreen.js +20 -0
  165. package/examples/react-navigation/src/test-utils.js +12 -0
  166. package/examples/redux/App.js +27 -0
  167. package/examples/redux/actions/todoActions.js +25 -0
  168. package/examples/redux/babel.config.js +6 -0
  169. package/examples/redux/components/AddTodo.js +73 -0
  170. package/examples/redux/components/AddTodo.test.js +27 -0
  171. package/examples/redux/components/TodoElem.js +25 -0
  172. package/examples/redux/components/TodoList.js +29 -0
  173. package/examples/redux/components/TodoList.test.js +34 -0
  174. package/examples/redux/index.js +8 -0
  175. package/examples/redux/jest-setup.js +2 -0
  176. package/examples/redux/jest.config.js +4 -0
  177. package/examples/redux/package.json +23 -0
  178. package/examples/redux/reducers/index.js +6 -0
  179. package/examples/redux/reducers/todoReducer.js +27 -0
  180. package/examples/redux/store.js +10 -0
  181. package/examples/redux/test-utils.js +11 -0
  182. package/experiments-app/.expo/README.md +15 -0
  183. package/experiments-app/.expo/devices.json +3 -0
  184. package/experiments-app/.expo/packager-info.json +9 -0
  185. package/experiments-app/.expo/settings.json +9 -0
  186. package/experiments-app/.gitignore +17 -0
  187. package/experiments-app/.prettierrc.js +5 -0
  188. package/experiments-app/app.json +30 -0
  189. package/experiments-app/assets/adaptive-icon.png +0 -0
  190. package/experiments-app/assets/favicon.png +0 -0
  191. package/experiments-app/assets/icon.png +0 -0
  192. package/experiments-app/assets/splash.png +0 -0
  193. package/experiments-app/babel.config.js +6 -0
  194. package/experiments-app/index.js +4 -0
  195. package/experiments-app/package.json +31 -0
  196. package/experiments-app/src/App.tsx +31 -0
  197. package/experiments-app/src/MainScreen.tsx +51 -0
  198. package/experiments-app/src/experiments.ts +17 -0
  199. package/experiments-app/src/screens/TextInputEventPropagation.tsx +54 -0
  200. package/experiments-app/src/screens/TextInputEvents.tsx +50 -0
  201. package/experiments-app/src/utils/helpers.ts +8 -0
  202. package/experiments-app/tsconfig.json +6 -0
  203. package/experiments-app/yarn.lock +6913 -0
  204. package/flow-typed/npm/jest_v26.x.x.js +1218 -0
  205. package/flow-typed/npm/react-test-renderer_v16.x.x.js +81 -0
  206. package/jest-setup.ts +10 -0
  207. package/package.json +6 -6
  208. package/renovate.json +19 -0
  209. package/scripts/test_react_17 +12 -0
  210. package/src/__tests__/__snapshots__/render-debug.test.tsx.snap +548 -0
  211. package/src/__tests__/__snapshots__/render.test.tsx.snap +39 -0
  212. package/src/__tests__/act.test.tsx +52 -0
  213. package/src/__tests__/auto-cleanup-skip.test.tsx +39 -0
  214. package/src/__tests__/auto-cleanup.test.tsx +50 -0
  215. package/src/__tests__/cleanup.test.tsx +26 -0
  216. package/src/__tests__/config.test.ts +55 -0
  217. package/src/__tests__/fireEvent-textInput.test.tsx +154 -0
  218. package/src/__tests__/fireEvent.test.tsx +485 -0
  219. package/src/__tests__/host-component-names.test.tsx +109 -0
  220. package/src/__tests__/host-text-nesting.test.tsx +90 -0
  221. package/src/__tests__/jest-native.test.tsx +84 -0
  222. package/src/__tests__/questionsBoard.test.tsx +62 -0
  223. package/src/__tests__/react-native-api.test.tsx +126 -0
  224. package/src/__tests__/render-debug.test.tsx +207 -0
  225. package/src/__tests__/render-stringValidation.test.tsx +157 -0
  226. package/src/__tests__/render.test.tsx +256 -0
  227. package/src/__tests__/renderHook.test.tsx +114 -0
  228. package/src/__tests__/screen.test.tsx +66 -0
  229. package/src/__tests__/timerUtils.ts +7 -0
  230. package/src/__tests__/timers.test.ts +27 -0
  231. package/src/__tests__/waitFor.test.tsx +327 -0
  232. package/src/__tests__/waitForElementToBeRemoved.test.tsx +151 -0
  233. package/src/__tests__/within.test.tsx +96 -0
  234. package/src/act.ts +86 -0
  235. package/src/cleanup.ts +15 -0
  236. package/src/config.ts +72 -0
  237. package/src/fireEvent.ts +163 -0
  238. package/src/flush-micro-tasks.ts +30 -0
  239. package/src/helpers/__tests__/accessiblity.test.tsx +373 -0
  240. package/src/helpers/__tests__/component-tree.test.tsx +226 -0
  241. package/src/helpers/__tests__/format-default.tsx +114 -0
  242. package/src/helpers/__tests__/getTextContent.test.tsx +49 -0
  243. package/src/helpers/__tests__/includeHiddenElements.test.tsx +39 -0
  244. package/src/helpers/__tests__/query-name.test.ts +10 -0
  245. package/src/helpers/__tests__/timers.test.ts +8 -0
  246. package/src/helpers/accessiblity.ts +108 -0
  247. package/src/helpers/component-tree.ts +89 -0
  248. package/src/helpers/debugDeep.ts +27 -0
  249. package/src/helpers/debugShallow.ts +22 -0
  250. package/src/helpers/deprecation.ts +53 -0
  251. package/src/helpers/errors.ts +66 -0
  252. package/src/helpers/filterNodeByType.ts +7 -0
  253. package/src/helpers/findAll.ts +68 -0
  254. package/src/helpers/format-default.ts +72 -0
  255. package/src/helpers/format.ts +47 -0
  256. package/src/helpers/getTextContent.ts +20 -0
  257. package/src/helpers/host-component-names.tsx +67 -0
  258. package/src/helpers/matchers/__tests__/matchArrayValue.test.ts +34 -0
  259. package/src/helpers/matchers/__tests__/matchObject.test.ts +37 -0
  260. package/src/helpers/matchers/__tests__/matchStringValue.test.ts +15 -0
  261. package/src/helpers/matchers/accessibilityState.ts +48 -0
  262. package/src/helpers/matchers/accessibilityValue.ts +24 -0
  263. package/src/helpers/matchers/matchArrayProp.ts +21 -0
  264. package/src/helpers/matchers/matchLabelText.ts +51 -0
  265. package/src/helpers/matchers/matchObjectProp.ts +25 -0
  266. package/src/helpers/matchers/matchStringProp.ts +23 -0
  267. package/src/helpers/matchers/matchTextContent.ts +20 -0
  268. package/src/helpers/pointer-events.ts +27 -0
  269. package/src/helpers/query-name.ts +4 -0
  270. package/src/helpers/stringValidation.ts +36 -0
  271. package/src/helpers/timers.ts +98 -0
  272. package/src/index.ts +33 -0
  273. package/src/matches.ts +49 -0
  274. package/src/pure.ts +25 -0
  275. package/src/queries/__tests__/a11yState.test.tsx +439 -0
  276. package/src/queries/__tests__/a11yValue.test.tsx +309 -0
  277. package/src/queries/__tests__/displayValue.test.tsx +221 -0
  278. package/src/queries/__tests__/hintText.test.tsx +177 -0
  279. package/src/queries/__tests__/labelText.test.tsx +242 -0
  280. package/src/queries/__tests__/makeQueries.test.tsx +235 -0
  281. package/src/queries/__tests__/placeholderText.test.tsx +136 -0
  282. package/src/queries/__tests__/role-value.test.tsx +176 -0
  283. package/src/queries/__tests__/role.test.tsx +824 -0
  284. package/src/queries/__tests__/testId.test.tsx +200 -0
  285. package/src/queries/__tests__/text.test.tsx +556 -0
  286. package/src/queries/a11yState.ts +131 -0
  287. package/src/queries/a11yValue.ts +131 -0
  288. package/src/queries/displayValue.ts +78 -0
  289. package/src/queries/hintText.ts +112 -0
  290. package/src/queries/labelText.ts +59 -0
  291. package/src/queries/makeQueries.ts +255 -0
  292. package/src/queries/options.ts +14 -0
  293. package/src/queries/placeholderText.ts +79 -0
  294. package/src/queries/role.ts +132 -0
  295. package/src/queries/testId.ts +71 -0
  296. package/src/queries/text.ts +66 -0
  297. package/src/queries/unsafeProps.ts +76 -0
  298. package/src/queries/unsafeType.ts +73 -0
  299. package/src/react-versions.ts +11 -0
  300. package/src/render-act.ts +19 -0
  301. package/src/render.tsx +183 -0
  302. package/src/renderHook.tsx +56 -0
  303. package/src/screen.ts +123 -0
  304. package/src/shallow.ts +18 -0
  305. package/src/test-utils/events.ts +24 -0
  306. package/src/test-utils/index.ts +1 -0
  307. package/src/user-event/event-builder/common.ts +50 -0
  308. package/src/user-event/event-builder/index.ts +5 -0
  309. package/src/user-event/index.ts +14 -0
  310. package/src/user-event/press/__tests__/longPress.real-timers.test.tsx +115 -0
  311. package/src/user-event/press/__tests__/longPress.test.tsx +157 -0
  312. package/src/user-event/press/__tests__/press.real-timers.test.tsx +318 -0
  313. package/src/user-event/press/__tests__/press.test.tsx +422 -0
  314. package/src/user-event/press/constants.ts +7 -0
  315. package/src/user-event/press/index.ts +1 -0
  316. package/src/user-event/press/press.ts +134 -0
  317. package/src/user-event/press/utils/warnAboutRealTimers.ts +6 -0
  318. package/src/user-event/setup/index.ts +2 -0
  319. package/src/user-event/setup/setup.ts +93 -0
  320. package/src/user-event/type/__tests__/__snapshots__/type.test.tsx.snap +26 -0
  321. package/src/user-event/type/__tests__/type.test.tsx +63 -0
  322. package/src/user-event/type/index.ts +1 -0
  323. package/src/user-event/type/type.ts +20 -0
  324. package/src/user-event/utils/__tests__/wait.test.ts +63 -0
  325. package/src/user-event/utils/events.ts +54 -0
  326. package/src/user-event/utils/index.ts +2 -0
  327. package/src/user-event/utils/wait.ts +15 -0
  328. package/src/waitFor.ts +228 -0
  329. package/src/waitForElementToBeRemoved.ts +42 -0
  330. package/src/within.ts +30 -0
  331. package/tsconfig.json +17 -0
  332. package/tsconfig.release.json +8 -0
  333. package/website/.gitignore +20 -0
  334. package/website/README.md +33 -0
  335. package/website/docker/.dockerignore +3 -0
  336. package/website/docker/Dockerfile +9 -0
  337. package/website/docker/docker-compose.yml +11 -0
  338. package/website/docs/API.md +946 -0
  339. package/website/docs/EslintPLluginTestingLibrary.md +28 -0
  340. package/website/docs/FAQ.md +44 -0
  341. package/website/docs/GettingStarted.md +100 -0
  342. package/website/docs/HowShouldIQuery.md +21 -0
  343. package/website/docs/MigrationV11.md +64 -0
  344. package/website/docs/MigrationV12.md +67 -0
  345. package/website/docs/MigrationV2.md +126 -0
  346. package/website/docs/MigrationV7.md +119 -0
  347. package/website/docs/MigrationV9.md +67 -0
  348. package/website/docs/Queries.md +567 -0
  349. package/website/docs/ReactNavigation.md +371 -0
  350. package/website/docs/ReduxIntegration.md +137 -0
  351. package/website/docs/TestingEnvironment.md +154 -0
  352. package/website/docs/Troubleshooting.md +44 -0
  353. package/website/docs/UnderstandingAct.md +227 -0
  354. package/website/docs/UserEvent.md +66 -0
  355. package/website/docusaurus.config.js +114 -0
  356. package/website/package.json +31 -0
  357. package/website/sidebars.js +20 -0
  358. package/website/src/components/Feature.js +31 -0
  359. package/website/src/css/custom.css +13 -0
  360. package/website/src/css/index.module.css +77 -0
  361. package/website/src/pages/index.js +82 -0
  362. package/website/static/.nojekyll +0 -0
  363. package/website/static/css/custom.css +28 -0
  364. package/website/static/img/hit.png +0 -0
  365. package/website/static/img/locomotive.png +0 -0
  366. package/website/static/img/owl.png +0 -0
  367. package/website/static/img/tools.png +0 -0
  368. package/website/yarn.lock +7669 -0
  369. package/yarn.lock +7765 -0
  370. package/build/flushMicroTasks.d.ts +0 -5
  371. package/build/flushMicroTasks.js +0 -17
  372. package/build/flushMicroTasks.js.map +0 -1
@@ -0,0 +1,131 @@
1
+ import type { ReactTestInstance } from 'react-test-renderer';
2
+ import { accessiblityValueKeys } from '../helpers/accessiblity';
3
+ import { deprecateQueries } from '../helpers/deprecation';
4
+ import { findAll } from '../helpers/findAll';
5
+ import {
6
+ AccessibilityValueMatcher,
7
+ matchAccessibilityValue,
8
+ } from '../helpers/matchers/accessibilityValue';
9
+ import { makeQueries } from './makeQueries';
10
+ import type {
11
+ FindAllByQuery,
12
+ FindByQuery,
13
+ GetAllByQuery,
14
+ GetByQuery,
15
+ QueryAllByQuery,
16
+ QueryByQuery,
17
+ } from './makeQueries';
18
+ import { CommonQueryOptions } from './options';
19
+
20
+ const queryAllByA11yValue = (
21
+ instance: ReactTestInstance
22
+ ): ((
23
+ value: AccessibilityValueMatcher,
24
+ queryOptions?: CommonQueryOptions
25
+ ) => Array<ReactTestInstance>) =>
26
+ function queryAllByA11yValueFn(value, queryOptions) {
27
+ return findAll(
28
+ instance,
29
+ (node) =>
30
+ typeof node.type === 'string' && matchAccessibilityValue(node, value),
31
+ queryOptions
32
+ );
33
+ };
34
+
35
+ const formatQueryParams = (matcher: AccessibilityValueMatcher) => {
36
+ const params: string[] = [];
37
+
38
+ accessiblityValueKeys.forEach((valueKey) => {
39
+ if (matcher[valueKey] !== undefined) {
40
+ params.push(`${valueKey} value: ${matcher[valueKey]}`);
41
+ }
42
+ });
43
+
44
+ return params.join(', ');
45
+ };
46
+
47
+ const getMultipleError = (matcher: AccessibilityValueMatcher) =>
48
+ `Found multiple elements with ${formatQueryParams(matcher)}`;
49
+
50
+ const getMissingError = (matcher: AccessibilityValueMatcher) =>
51
+ `Unable to find an element with ${formatQueryParams(matcher)}`;
52
+
53
+ const { getBy, getAllBy, queryBy, queryAllBy, findBy, findAllBy } = makeQueries(
54
+ queryAllByA11yValue,
55
+ getMissingError,
56
+ getMultipleError
57
+ );
58
+
59
+ export type ByA11yValueQueries = {
60
+ getByA11yValue: GetByQuery<AccessibilityValueMatcher, CommonQueryOptions>;
61
+ getAllByA11yValue: GetAllByQuery<
62
+ AccessibilityValueMatcher,
63
+ CommonQueryOptions
64
+ >;
65
+ queryByA11yValue: QueryByQuery<AccessibilityValueMatcher, CommonQueryOptions>;
66
+ queryAllByA11yValue: QueryAllByQuery<
67
+ AccessibilityValueMatcher,
68
+ CommonQueryOptions
69
+ >;
70
+ findByA11yValue: FindByQuery<AccessibilityValueMatcher, CommonQueryOptions>;
71
+ findAllByA11yValue: FindAllByQuery<
72
+ AccessibilityValueMatcher,
73
+ CommonQueryOptions
74
+ >;
75
+
76
+ getByAccessibilityValue: GetByQuery<
77
+ AccessibilityValueMatcher,
78
+ CommonQueryOptions
79
+ >;
80
+ getAllByAccessibilityValue: GetAllByQuery<
81
+ AccessibilityValueMatcher,
82
+ CommonQueryOptions
83
+ >;
84
+ queryByAccessibilityValue: QueryByQuery<
85
+ AccessibilityValueMatcher,
86
+ CommonQueryOptions
87
+ >;
88
+ queryAllByAccessibilityValue: QueryAllByQuery<
89
+ AccessibilityValueMatcher,
90
+ CommonQueryOptions
91
+ >;
92
+ findByAccessibilityValue: FindByQuery<
93
+ AccessibilityValueMatcher,
94
+ CommonQueryOptions
95
+ >;
96
+ findAllByAccessibilityValue: FindAllByQuery<
97
+ AccessibilityValueMatcher,
98
+ CommonQueryOptions
99
+ >;
100
+ };
101
+
102
+ export const bindByA11yValueQueries = (
103
+ instance: ReactTestInstance
104
+ ): ByA11yValueQueries => {
105
+ const getByA11yValue = getBy(instance);
106
+ const getAllByA11yValue = getAllBy(instance);
107
+ const queryByA11yValue = queryBy(instance);
108
+ const queryAllByA11yValue = queryAllBy(instance);
109
+ const findByA11yValue = findBy(instance);
110
+ const findAllByA11yValue = findAllBy(instance);
111
+
112
+ return {
113
+ ...deprecateQueries(
114
+ {
115
+ getByA11yValue,
116
+ getAllByA11yValue,
117
+ queryByA11yValue,
118
+ queryAllByA11yValue,
119
+ findByA11yValue,
120
+ findAllByA11yValue,
121
+ getByAccessibilityValue: getByA11yValue,
122
+ getAllByAccessibilityValue: getAllByA11yValue,
123
+ queryByAccessibilityValue: queryByA11yValue,
124
+ queryAllByAccessibilityValue: queryAllByA11yValue,
125
+ findByAccessibilityValue: findByA11yValue,
126
+ findAllByAccessibilityValue: findAllByA11yValue,
127
+ },
128
+ 'Use expect(...).toHaveAccessibilityValue(...) matcher from "@testing-library/jest-native" package or {queryPrefix}ByRole(role, { value: ... }) query instead.'
129
+ ),
130
+ };
131
+ };
@@ -0,0 +1,78 @@
1
+ import type { ReactTestInstance } from 'react-test-renderer';
2
+ import { filterNodeByType } from '../helpers/filterNodeByType';
3
+ import { findAll } from '../helpers/findAll';
4
+ import { matches, TextMatch, TextMatchOptions } from '../matches';
5
+ import { getHostComponentNames } from '../helpers/host-component-names';
6
+ import { makeQueries } from './makeQueries';
7
+ import type {
8
+ FindAllByQuery,
9
+ FindByQuery,
10
+ GetAllByQuery,
11
+ GetByQuery,
12
+ QueryAllByQuery,
13
+ QueryByQuery,
14
+ } from './makeQueries';
15
+ import type { CommonQueryOptions } from './options';
16
+
17
+ type ByDisplayValueOptions = CommonQueryOptions & TextMatchOptions;
18
+
19
+ const getTextInputNodeByDisplayValue = (
20
+ node: ReactTestInstance,
21
+ value: TextMatch,
22
+ options: TextMatchOptions = {}
23
+ ) => {
24
+ const { exact, normalizer } = options;
25
+ const nodeValue =
26
+ node.props.value !== undefined ? node.props.value : node.props.defaultValue;
27
+
28
+ return (
29
+ filterNodeByType(node, getHostComponentNames().textInput) &&
30
+ matches(value, nodeValue, normalizer, exact)
31
+ );
32
+ };
33
+
34
+ const queryAllByDisplayValue = (
35
+ instance: ReactTestInstance
36
+ ): ((
37
+ displayValue: TextMatch,
38
+ queryOptions?: ByDisplayValueOptions
39
+ ) => Array<ReactTestInstance>) =>
40
+ function queryAllByDisplayValueFn(displayValue, queryOptions) {
41
+ return findAll(
42
+ instance,
43
+ (node) =>
44
+ getTextInputNodeByDisplayValue(node, displayValue, queryOptions),
45
+ queryOptions
46
+ );
47
+ };
48
+
49
+ const getMultipleError = (displayValue: TextMatch) =>
50
+ `Found multiple elements with display value: ${String(displayValue)} `;
51
+ const getMissingError = (displayValue: TextMatch) =>
52
+ `Unable to find an element with displayValue: ${String(displayValue)}`;
53
+
54
+ const { getBy, getAllBy, queryBy, queryAllBy, findBy, findAllBy } = makeQueries(
55
+ queryAllByDisplayValue,
56
+ getMissingError,
57
+ getMultipleError
58
+ );
59
+
60
+ export type ByDisplayValueQueries = {
61
+ getByDisplayValue: GetByQuery<TextMatch, ByDisplayValueOptions>;
62
+ getAllByDisplayValue: GetAllByQuery<TextMatch, ByDisplayValueOptions>;
63
+ queryByDisplayValue: QueryByQuery<TextMatch, ByDisplayValueOptions>;
64
+ queryAllByDisplayValue: QueryAllByQuery<TextMatch, ByDisplayValueOptions>;
65
+ findByDisplayValue: FindByQuery<TextMatch, ByDisplayValueOptions>;
66
+ findAllByDisplayValue: FindAllByQuery<TextMatch, ByDisplayValueOptions>;
67
+ };
68
+
69
+ export const bindByDisplayValueQueries = (
70
+ instance: ReactTestInstance
71
+ ): ByDisplayValueQueries => ({
72
+ getByDisplayValue: getBy(instance),
73
+ getAllByDisplayValue: getAllBy(instance),
74
+ queryByDisplayValue: queryBy(instance),
75
+ queryAllByDisplayValue: queryAllBy(instance),
76
+ findByDisplayValue: findBy(instance),
77
+ findAllByDisplayValue: findAllBy(instance),
78
+ });
@@ -0,0 +1,112 @@
1
+ import type { ReactTestInstance } from 'react-test-renderer';
2
+ import { findAll } from '../helpers/findAll';
3
+ import { matches, TextMatch, TextMatchOptions } from '../matches';
4
+ import { makeQueries } from './makeQueries';
5
+ import type {
6
+ FindAllByQuery,
7
+ FindByQuery,
8
+ GetAllByQuery,
9
+ GetByQuery,
10
+ QueryAllByQuery,
11
+ QueryByQuery,
12
+ } from './makeQueries';
13
+ import { CommonQueryOptions } from './options';
14
+
15
+ type ByHintTextOptions = CommonQueryOptions & TextMatchOptions;
16
+
17
+ const getNodeByHintText = (
18
+ node: ReactTestInstance,
19
+ text: TextMatch,
20
+ options: TextMatchOptions = {}
21
+ ) => {
22
+ const { exact, normalizer } = options;
23
+ return matches(text, node.props.accessibilityHint, normalizer, exact);
24
+ };
25
+
26
+ const queryAllByHintText = (
27
+ instance: ReactTestInstance
28
+ ): ((
29
+ hint: TextMatch,
30
+ queryOptions?: ByHintTextOptions
31
+ ) => Array<ReactTestInstance>) =>
32
+ function queryAllByA11yHintFn(hint, queryOptions) {
33
+ return findAll(
34
+ instance,
35
+ (node) =>
36
+ typeof node.type === 'string' &&
37
+ getNodeByHintText(node, hint, queryOptions),
38
+ queryOptions
39
+ );
40
+ };
41
+
42
+ const getMultipleError = (hint: TextMatch) =>
43
+ `Found multiple elements with accessibilityHint: ${String(hint)} `;
44
+ const getMissingError = (hint: TextMatch) =>
45
+ `Unable to find an element with accessibilityHint: ${String(hint)}`;
46
+
47
+ const { getBy, getAllBy, queryBy, queryAllBy, findBy, findAllBy } = makeQueries(
48
+ queryAllByHintText,
49
+ getMissingError,
50
+ getMultipleError
51
+ );
52
+
53
+ export type ByHintTextQueries = {
54
+ getByHintText: GetByQuery<TextMatch, ByHintTextOptions>;
55
+ getAllByHintText: GetAllByQuery<TextMatch, ByHintTextOptions>;
56
+ queryByHintText: QueryByQuery<TextMatch, ByHintTextOptions>;
57
+ queryAllByHintText: QueryAllByQuery<TextMatch, ByHintTextOptions>;
58
+ findByHintText: FindByQuery<TextMatch, ByHintTextOptions>;
59
+ findAllByHintText: FindAllByQuery<TextMatch, ByHintTextOptions>;
60
+
61
+ // a11yHint aliases
62
+ getByA11yHint: GetByQuery<TextMatch, ByHintTextOptions>;
63
+ getAllByA11yHint: GetAllByQuery<TextMatch, ByHintTextOptions>;
64
+ queryByA11yHint: QueryByQuery<TextMatch, ByHintTextOptions>;
65
+ queryAllByA11yHint: QueryAllByQuery<TextMatch, ByHintTextOptions>;
66
+ findByA11yHint: FindByQuery<TextMatch, ByHintTextOptions>;
67
+ findAllByA11yHint: FindAllByQuery<TextMatch, ByHintTextOptions>;
68
+
69
+ // accessibilityHint aliases
70
+ getByAccessibilityHint: GetByQuery<TextMatch, ByHintTextOptions>;
71
+ getAllByAccessibilityHint: GetAllByQuery<TextMatch, ByHintTextOptions>;
72
+ queryByAccessibilityHint: QueryByQuery<TextMatch, ByHintTextOptions>;
73
+ queryAllByAccessibilityHint: QueryAllByQuery<TextMatch, ByHintTextOptions>;
74
+ findByAccessibilityHint: FindByQuery<TextMatch, ByHintTextOptions>;
75
+ findAllByAccessibilityHint: FindAllByQuery<TextMatch, ByHintTextOptions>;
76
+ };
77
+
78
+ export const bindByHintTextQueries = (
79
+ instance: ReactTestInstance
80
+ ): ByHintTextQueries => {
81
+ const getByHintText = getBy(instance);
82
+ const getAllByHintText = getAllBy(instance);
83
+ const queryByHintText = queryBy(instance);
84
+ const queryAllByHintText = queryAllBy(instance);
85
+ const findByHintText = findBy(instance);
86
+ const findAllByHintText = findAllBy(instance);
87
+
88
+ return {
89
+ getByHintText,
90
+ getAllByHintText,
91
+ queryByHintText,
92
+ queryAllByHintText,
93
+ findByHintText,
94
+ findAllByHintText,
95
+
96
+ // a11yHint aliases
97
+ getByA11yHint: getByHintText,
98
+ getAllByA11yHint: getAllByHintText,
99
+ queryByA11yHint: queryByHintText,
100
+ queryAllByA11yHint: queryAllByHintText,
101
+ findByA11yHint: findByHintText,
102
+ findAllByA11yHint: findAllByHintText,
103
+
104
+ // accessibilityHint aliases
105
+ getByAccessibilityHint: getByHintText,
106
+ getAllByAccessibilityHint: getAllByHintText,
107
+ queryByAccessibilityHint: queryByHintText,
108
+ queryAllByAccessibilityHint: queryAllByHintText,
109
+ findByAccessibilityHint: findByHintText,
110
+ findAllByAccessibilityHint: findAllByHintText,
111
+ };
112
+ };
@@ -0,0 +1,59 @@
1
+ import type { ReactTestInstance } from 'react-test-renderer';
2
+ import { findAll } from '../helpers/findAll';
3
+ import { TextMatch, TextMatchOptions } from '../matches';
4
+ import { matchLabelText } from '../helpers/matchers/matchLabelText';
5
+ import { makeQueries } from './makeQueries';
6
+ import type {
7
+ FindAllByQuery,
8
+ FindByQuery,
9
+ GetAllByQuery,
10
+ GetByQuery,
11
+ QueryAllByQuery,
12
+ QueryByQuery,
13
+ } from './makeQueries';
14
+ import { CommonQueryOptions } from './options';
15
+
16
+ type ByLabelTextOptions = CommonQueryOptions & TextMatchOptions;
17
+
18
+ function queryAllByLabelText(instance: ReactTestInstance) {
19
+ return (text: TextMatch, queryOptions?: ByLabelTextOptions) => {
20
+ return findAll(
21
+ instance,
22
+ (node) =>
23
+ typeof node.type === 'string' &&
24
+ matchLabelText(instance, node, text, queryOptions),
25
+ queryOptions
26
+ );
27
+ };
28
+ }
29
+
30
+ const getMultipleError = (labelText: TextMatch) =>
31
+ `Found multiple elements with accessibilityLabel: ${String(labelText)} `;
32
+ const getMissingError = (labelText: TextMatch) =>
33
+ `Unable to find an element with accessibilityLabel: ${String(labelText)}`;
34
+
35
+ const { getBy, getAllBy, queryBy, queryAllBy, findBy, findAllBy } = makeQueries(
36
+ queryAllByLabelText,
37
+ getMissingError,
38
+ getMultipleError
39
+ );
40
+
41
+ export type ByLabelTextQueries = {
42
+ getByLabelText: GetByQuery<TextMatch, ByLabelTextOptions>;
43
+ getAllByLabelText: GetAllByQuery<TextMatch, ByLabelTextOptions>;
44
+ queryByLabelText: QueryByQuery<TextMatch, ByLabelTextOptions>;
45
+ queryAllByLabelText: QueryAllByQuery<TextMatch, ByLabelTextOptions>;
46
+ findByLabelText: FindByQuery<TextMatch, ByLabelTextOptions>;
47
+ findAllByLabelText: FindAllByQuery<TextMatch, ByLabelTextOptions>;
48
+ };
49
+
50
+ export const bindByLabelTextQueries = (
51
+ instance: ReactTestInstance
52
+ ): ByLabelTextQueries => ({
53
+ getByLabelText: getBy(instance),
54
+ getAllByLabelText: getAllBy(instance),
55
+ queryByLabelText: queryBy(instance),
56
+ queryAllByLabelText: queryAllBy(instance),
57
+ findByLabelText: findBy(instance),
58
+ findAllByLabelText: findAllBy(instance),
59
+ });
@@ -0,0 +1,255 @@
1
+ import type { ReactTestInstance } from 'react-test-renderer';
2
+ import { ErrorWithStack } from '../helpers/errors';
3
+ import waitFor from '../waitFor';
4
+ import type { WaitForOptions } from '../waitFor';
5
+ import format from '../helpers/format';
6
+ import { screen } from '../screen';
7
+ import { defaultMapProps } from '../helpers/format-default';
8
+
9
+ export type GetByQuery<Predicate, Options = void> = (
10
+ predicate: Predicate,
11
+ options?: Options
12
+ ) => ReactTestInstance;
13
+
14
+ export type GetAllByQuery<Predicate, Options = void> = (
15
+ predicate: Predicate,
16
+ options?: Options
17
+ ) => ReactTestInstance[];
18
+
19
+ export type QueryByQuery<Predicate, Options = void> = (
20
+ predicate: Predicate,
21
+ options?: Options
22
+ ) => ReactTestInstance | null;
23
+
24
+ export type QueryAllByQuery<Predicate, Options = void> = (
25
+ predicate: Predicate,
26
+ options?: Options
27
+ ) => ReactTestInstance[];
28
+
29
+ export type FindByQuery<Predicate, Options = void> = (
30
+ predicate: Predicate,
31
+ // Remove `& WaitForOptions` when all queries have been migrated to support 2nd arg query options.
32
+ options?: Options & WaitForOptions,
33
+ waitForOptions?: WaitForOptions
34
+ ) => Promise<ReactTestInstance>;
35
+
36
+ export type FindAllByQuery<Predicate, Options = void> = (
37
+ predicate: Predicate,
38
+ // Remove `& WaitForOptions` when all queries have been migrated to support 2nd arg query options.
39
+ options?: Options & WaitForOptions,
40
+ waitForOptions?: WaitForOptions
41
+ ) => Promise<ReactTestInstance[]>;
42
+
43
+ type UnboundQuery<Query> = (instance: ReactTestInstance) => Query;
44
+
45
+ export type UnboundQueries<Predicate, Options> = {
46
+ getBy: UnboundQuery<GetByQuery<Predicate, Options>>;
47
+ getAllBy: UnboundQuery<GetAllByQuery<Predicate, Options>>;
48
+ queryBy: UnboundQuery<QueryByQuery<Predicate, Options>>;
49
+ queryAllBy: UnboundQuery<QueryAllByQuery<Predicate, Options>>;
50
+ findBy: UnboundQuery<FindByQuery<Predicate, Options>>;
51
+ findAllBy: UnboundQuery<FindAllByQuery<Predicate, Options>>;
52
+ };
53
+
54
+ const deprecatedKeys: (keyof WaitForOptions)[] = [
55
+ 'timeout',
56
+ 'interval',
57
+ 'stackTraceError',
58
+ ];
59
+
60
+ // The WaitForOptions has been moved to the second option param of findBy* methods with the adding of TextMatchOptions
61
+ // To make the migration easier and avoid a breaking change, keep reading this options from the first param but warn
62
+ function extractDeprecatedWaitForOptions(options?: WaitForOptions) {
63
+ if (!options) {
64
+ return undefined;
65
+ }
66
+
67
+ const waitForOptions: WaitForOptions = {
68
+ timeout: options.timeout,
69
+ interval: options.interval,
70
+ stackTraceError: options.stackTraceError,
71
+ };
72
+
73
+ deprecatedKeys.forEach((key) => {
74
+ const option = options[key];
75
+ if (option) {
76
+ // eslint-disable-next-line no-console
77
+ console.warn(
78
+ `Use of option "${key}" in a findBy* query options (2nd parameter) is deprecated. Please pass this option in the waitForOptions (3rd parameter).
79
+ Example:
80
+
81
+ findByText(text, {}, { ${key}: ${option.toString()} })`
82
+ );
83
+ }
84
+ });
85
+
86
+ return waitForOptions;
87
+ }
88
+
89
+ function formatErrorMessage(message: string, printElementTree: boolean) {
90
+ if (!printElementTree) {
91
+ return message;
92
+ }
93
+
94
+ const json = screen.toJSON();
95
+ if (!json) {
96
+ return message;
97
+ }
98
+
99
+ return `${message}\n\n${format(json, {
100
+ mapProps: defaultMapProps,
101
+ })}`;
102
+ }
103
+
104
+ function appendElementTreeToError(error: Error) {
105
+ const oldMessage = error.message;
106
+ error.message = formatErrorMessage(oldMessage, true);
107
+
108
+ // Required to make Jest print the element tree on error
109
+ error.stack = error.stack?.replace(oldMessage, error.message);
110
+
111
+ return error;
112
+ }
113
+
114
+ export function makeQueries<Predicate, Options>(
115
+ queryAllByQuery: UnboundQuery<QueryAllByQuery<Predicate, Options>>,
116
+ getMissingError: (predicate: Predicate, options?: Options) => string,
117
+ getMultipleError: (predicate: Predicate, options?: Options) => string
118
+ ): UnboundQueries<Predicate, Options> {
119
+ function getAllByQuery(
120
+ instance: ReactTestInstance,
121
+ { printElementTree = true } = {}
122
+ ) {
123
+ return function getAllFn(predicate: Predicate, options?: Options) {
124
+ const results = queryAllByQuery(instance)(predicate, options);
125
+
126
+ if (results.length === 0) {
127
+ const errorMessage = formatErrorMessage(
128
+ getMissingError(predicate, options),
129
+ printElementTree
130
+ );
131
+ throw new ErrorWithStack(errorMessage, getAllFn);
132
+ }
133
+
134
+ return results;
135
+ };
136
+ }
137
+
138
+ function queryByQuery(
139
+ instance: ReactTestInstance,
140
+ { printElementTree = true } = {}
141
+ ) {
142
+ return function singleQueryFn(predicate: Predicate, options?: Options) {
143
+ const results = queryAllByQuery(instance)(predicate, options);
144
+
145
+ if (results.length > 1) {
146
+ throw new ErrorWithStack(
147
+ formatErrorMessage(
148
+ getMultipleError(predicate, options),
149
+ printElementTree
150
+ ),
151
+ singleQueryFn
152
+ );
153
+ }
154
+
155
+ if (results.length === 0) {
156
+ return null;
157
+ }
158
+
159
+ return results[0];
160
+ };
161
+ }
162
+
163
+ function getByQuery(
164
+ instance: ReactTestInstance,
165
+ { printElementTree = true } = {}
166
+ ) {
167
+ return function getFn(predicate: Predicate, options?: Options) {
168
+ const results = queryAllByQuery(instance)(predicate, options);
169
+
170
+ if (results.length > 1) {
171
+ throw new ErrorWithStack(getMultipleError(predicate, options), getFn);
172
+ }
173
+
174
+ if (results.length === 0) {
175
+ const errorMessage = formatErrorMessage(
176
+ getMissingError(predicate, options),
177
+ printElementTree
178
+ );
179
+ throw new ErrorWithStack(errorMessage, getFn);
180
+ }
181
+
182
+ return results[0];
183
+ };
184
+ }
185
+
186
+ function findAllByQuery(instance: ReactTestInstance) {
187
+ return function findAllFn(
188
+ predicate: Predicate,
189
+ queryOptions?: Options & WaitForOptions,
190
+ {
191
+ onTimeout = (error) => appendElementTreeToError(error),
192
+ ...waitForOptions
193
+ }: WaitForOptions = {}
194
+ ) {
195
+ const stackTraceError = new ErrorWithStack(
196
+ 'STACK_TRACE_ERROR',
197
+ findAllFn
198
+ );
199
+ const deprecatedWaitForOptions =
200
+ extractDeprecatedWaitForOptions(queryOptions);
201
+
202
+ return waitFor(
203
+ () =>
204
+ getAllByQuery(instance, { printElementTree: false })(
205
+ predicate,
206
+ queryOptions
207
+ ),
208
+ {
209
+ ...deprecatedWaitForOptions,
210
+ ...waitForOptions,
211
+ stackTraceError,
212
+ onTimeout,
213
+ }
214
+ );
215
+ };
216
+ }
217
+
218
+ function findByQuery(instance: ReactTestInstance) {
219
+ return function findFn(
220
+ predicate: Predicate,
221
+ queryOptions?: Options & WaitForOptions,
222
+ {
223
+ onTimeout = (error) => appendElementTreeToError(error),
224
+ ...waitForOptions
225
+ }: WaitForOptions = {}
226
+ ) {
227
+ const stackTraceError = new ErrorWithStack('STACK_TRACE_ERROR', findFn);
228
+ const deprecatedWaitForOptions =
229
+ extractDeprecatedWaitForOptions(queryOptions);
230
+
231
+ return waitFor(
232
+ () =>
233
+ getByQuery(instance, { printElementTree: false })(
234
+ predicate,
235
+ queryOptions
236
+ ),
237
+ {
238
+ ...deprecatedWaitForOptions,
239
+ ...waitForOptions,
240
+ stackTraceError,
241
+ onTimeout,
242
+ }
243
+ );
244
+ };
245
+ }
246
+
247
+ return {
248
+ getBy: getByQuery,
249
+ getAllBy: getAllByQuery,
250
+ queryBy: queryByQuery,
251
+ queryAllBy: queryAllByQuery,
252
+ findBy: findByQuery,
253
+ findAllBy: findAllByQuery,
254
+ };
255
+ }
@@ -0,0 +1,14 @@
1
+ import { NormalizerFn } from '../matches';
2
+
3
+ export type CommonQueryOptions = {
4
+ /** Should query include elements hidden from accessibility. */
5
+ includeHiddenElements?: boolean;
6
+
7
+ /** RTL-compatibile alias to `includeHiddenElements`. */
8
+ hidden?: boolean;
9
+ };
10
+
11
+ export type TextMatchOptions = {
12
+ exact?: boolean;
13
+ normalizer?: NormalizerFn;
14
+ };