@terreno/ui 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (446) hide show
  1. package/LICENSE +203 -0
  2. package/README.md +160 -0
  3. package/dist/Accordion.d.ts +3 -0
  4. package/dist/Accordion.js +30 -0
  5. package/dist/Accordion.js.map +1 -0
  6. package/dist/ActionSheet.d.ts +169 -0
  7. package/dist/ActionSheet.js +637 -0
  8. package/dist/ActionSheet.js.map +1 -0
  9. package/dist/AddressField.d.ts +3 -0
  10. package/dist/AddressField.js +18 -0
  11. package/dist/AddressField.js.map +1 -0
  12. package/dist/Avatar.d.ts +3 -0
  13. package/dist/Avatar.js +189 -0
  14. package/dist/Avatar.js.map +1 -0
  15. package/dist/Badge.d.ts +3 -0
  16. package/dist/Badge.js +100 -0
  17. package/dist/Badge.js.map +1 -0
  18. package/dist/Banner.d.ts +4 -0
  19. package/dist/Banner.js +103 -0
  20. package/dist/Banner.js.map +1 -0
  21. package/dist/Body.d.ts +3 -0
  22. package/dist/Body.js +17 -0
  23. package/dist/Body.js.map +1 -0
  24. package/dist/BooleanField.d.ts +3 -0
  25. package/dist/BooleanField.js +89 -0
  26. package/dist/BooleanField.js.map +1 -0
  27. package/dist/Box.d.ts +3 -0
  28. package/dist/Box.js +289 -0
  29. package/dist/Box.js.map +1 -0
  30. package/dist/Button.d.ts +3 -0
  31. package/dist/Button.js +105 -0
  32. package/dist/Button.js.map +1 -0
  33. package/dist/Card.d.ts +2 -0
  34. package/dist/Card.js +18 -0
  35. package/dist/Card.js.map +1 -0
  36. package/dist/CheckBox.d.ts +3 -0
  37. package/dist/CheckBox.js +28 -0
  38. package/dist/CheckBox.js.map +1 -0
  39. package/dist/Common.d.ts +2325 -0
  40. package/dist/Common.js +47 -0
  41. package/dist/Common.js.map +1 -0
  42. package/dist/CommonIconTypes.d.ts +3 -0
  43. package/dist/CommonIconTypes.js +2 -0
  44. package/dist/CommonIconTypes.js.map +1 -0
  45. package/dist/Constants.d.ts +12685 -0
  46. package/dist/Constants.js +3310 -0
  47. package/dist/Constants.js.map +1 -0
  48. package/dist/CustomSelectField.d.ts +3 -0
  49. package/dist/CustomSelectField.js +59 -0
  50. package/dist/CustomSelectField.js.map +1 -0
  51. package/dist/DataTable.d.ts +3 -0
  52. package/dist/DataTable.js +190 -0
  53. package/dist/DataTable.js.map +1 -0
  54. package/dist/DateTimeActionSheet.d.ts +2 -0
  55. package/dist/DateTimeActionSheet.js +270 -0
  56. package/dist/DateTimeActionSheet.js.map +1 -0
  57. package/dist/DateTimeField.d.ts +3 -0
  58. package/dist/DateTimeField.js +514 -0
  59. package/dist/DateTimeField.js.map +1 -0
  60. package/dist/DateUtilities.d.ts +57 -0
  61. package/dist/DateUtilities.js +308 -0
  62. package/dist/DateUtilities.js.map +1 -0
  63. package/dist/DecimalRangeActionSheet.d.ts +6 -0
  64. package/dist/DecimalRangeActionSheet.js +45 -0
  65. package/dist/DecimalRangeActionSheet.js.map +1 -0
  66. package/dist/DismissButton.d.ts +3 -0
  67. package/dist/DismissButton.js +12 -0
  68. package/dist/DismissButton.js.map +1 -0
  69. package/dist/EmailField.d.ts +3 -0
  70. package/dist/EmailField.js +48 -0
  71. package/dist/EmailField.js.map +1 -0
  72. package/dist/EmojiSelector.d.ts +113 -0
  73. package/dist/EmojiSelector.js +322 -0
  74. package/dist/EmojiSelector.js.map +1 -0
  75. package/dist/ErrorBoundary.d.ts +19 -0
  76. package/dist/ErrorBoundary.js +30 -0
  77. package/dist/ErrorBoundary.js.map +1 -0
  78. package/dist/ErrorPage.d.ts +6 -0
  79. package/dist/ErrorPage.js +15 -0
  80. package/dist/ErrorPage.js.map +1 -0
  81. package/dist/Field.d.ts +3 -0
  82. package/dist/Field.js +80 -0
  83. package/dist/Field.js.map +1 -0
  84. package/dist/FlatList.d.ts +2 -0
  85. package/dist/FlatList.js +3 -0
  86. package/dist/FlatList.js.map +1 -0
  87. package/dist/Heading.d.ts +3 -0
  88. package/dist/Heading.js +43 -0
  89. package/dist/Heading.js.map +1 -0
  90. package/dist/HeightActionSheet.d.ts +11 -0
  91. package/dist/HeightActionSheet.js +46 -0
  92. package/dist/HeightActionSheet.js.map +1 -0
  93. package/dist/Hyperlink.d.ts +30 -0
  94. package/dist/Hyperlink.js +144 -0
  95. package/dist/Hyperlink.js.map +1 -0
  96. package/dist/Icon.d.ts +3 -0
  97. package/dist/Icon.js +15 -0
  98. package/dist/Icon.js.map +1 -0
  99. package/dist/IconButton.d.ts +3 -0
  100. package/dist/IconButton.js +111 -0
  101. package/dist/IconButton.js.map +1 -0
  102. package/dist/Image.d.ts +8 -0
  103. package/dist/Image.js +37 -0
  104. package/dist/Image.js.map +1 -0
  105. package/dist/ImageBackground.d.ts +10 -0
  106. package/dist/ImageBackground.js +9 -0
  107. package/dist/ImageBackground.js.map +1 -0
  108. package/dist/InfoModalIcon.d.ts +3 -0
  109. package/dist/InfoModalIcon.js +10 -0
  110. package/dist/InfoModalIcon.js.map +1 -0
  111. package/dist/InfoTooltipButton.d.ts +3 -0
  112. package/dist/InfoTooltipButton.js +6 -0
  113. package/dist/InfoTooltipButton.js.map +1 -0
  114. package/dist/Link.d.ts +3 -0
  115. package/dist/Link.js +10 -0
  116. package/dist/Link.js.map +1 -0
  117. package/dist/MarkdownView.d.ts +5 -0
  118. package/dist/MarkdownView.js +44 -0
  119. package/dist/MarkdownView.js.map +1 -0
  120. package/dist/MediaQuery.d.ts +4 -0
  121. package/dist/MediaQuery.js +52 -0
  122. package/dist/MediaQuery.js.map +1 -0
  123. package/dist/MobileAddressAutoComplete.d.ts +2 -0
  124. package/dist/MobileAddressAutoComplete.js +54 -0
  125. package/dist/MobileAddressAutoComplete.js.map +1 -0
  126. package/dist/Modal.d.ts +3 -0
  127. package/dist/Modal.js +127 -0
  128. package/dist/Modal.js.map +1 -0
  129. package/dist/ModalSheet.d.ts +6 -0
  130. package/dist/ModalSheet.js +42 -0
  131. package/dist/ModalSheet.js.map +1 -0
  132. package/dist/MultiselectField.d.ts +3 -0
  133. package/dist/MultiselectField.js +45 -0
  134. package/dist/MultiselectField.js.map +1 -0
  135. package/dist/NumberField.d.ts +3 -0
  136. package/dist/NumberField.js +60 -0
  137. package/dist/NumberField.js.map +1 -0
  138. package/dist/NumberPickerActionSheet.d.ts +7 -0
  139. package/dist/NumberPickerActionSheet.js +22 -0
  140. package/dist/NumberPickerActionSheet.js.map +1 -0
  141. package/dist/OpenAPIContext.d.ts +4 -0
  142. package/dist/OpenAPIContext.js +53 -0
  143. package/dist/OpenAPIContext.js.map +1 -0
  144. package/dist/Page.d.ts +7 -0
  145. package/dist/Page.js +24 -0
  146. package/dist/Page.js.map +1 -0
  147. package/dist/Pagination.d.ts +3 -0
  148. package/dist/Pagination.js +106 -0
  149. package/dist/Pagination.js.map +1 -0
  150. package/dist/PasswordField.d.ts +2 -0
  151. package/dist/PasswordField.js +6 -0
  152. package/dist/PasswordField.js.map +1 -0
  153. package/dist/Permissions.d.ts +2 -0
  154. package/dist/Permissions.js +35 -0
  155. package/dist/Permissions.js.map +1 -0
  156. package/dist/PhoneNumberField.d.ts +3 -0
  157. package/dist/PhoneNumberField.js +83 -0
  158. package/dist/PhoneNumberField.js.map +1 -0
  159. package/dist/PickerSelect.d.ts +46 -0
  160. package/dist/PickerSelect.js +306 -0
  161. package/dist/PickerSelect.js.map +1 -0
  162. package/dist/Radio.d.ts +3 -0
  163. package/dist/Radio.js +21 -0
  164. package/dist/Radio.js.map +1 -0
  165. package/dist/RadioField.d.ts +3 -0
  166. package/dist/RadioField.js +16 -0
  167. package/dist/RadioField.js.map +1 -0
  168. package/dist/ScrollView.d.ts +2 -0
  169. package/dist/ScrollView.js +3 -0
  170. package/dist/ScrollView.js.map +1 -0
  171. package/dist/SectionDivider.d.ts +2 -0
  172. package/dist/SectionDivider.js +12 -0
  173. package/dist/SectionDivider.js.map +1 -0
  174. package/dist/SegmentedControl.d.ts +3 -0
  175. package/dist/SegmentedControl.js +65 -0
  176. package/dist/SegmentedControl.js.map +1 -0
  177. package/dist/SelectBadge.d.ts +3 -0
  178. package/dist/SelectBadge.js +166 -0
  179. package/dist/SelectBadge.js.map +1 -0
  180. package/dist/SelectField.d.ts +3 -0
  181. package/dist/SelectField.js +16 -0
  182. package/dist/SelectField.js.map +1 -0
  183. package/dist/SideDrawer.d.ts +3 -0
  184. package/dist/SideDrawer.js +32 -0
  185. package/dist/SideDrawer.js.map +1 -0
  186. package/dist/Signature.d.ts +8 -0
  187. package/dist/Signature.js +21 -0
  188. package/dist/Signature.js.map +1 -0
  189. package/dist/Signature.native.d.ts +8 -0
  190. package/dist/Signature.native.js +26 -0
  191. package/dist/Signature.native.js.map +1 -0
  192. package/dist/SignatureField.d.ts +3 -0
  193. package/dist/SignatureField.js +42 -0
  194. package/dist/SignatureField.js.map +1 -0
  195. package/dist/Slider.d.ts +3 -0
  196. package/dist/Slider.js +78 -0
  197. package/dist/Slider.js.map +1 -0
  198. package/dist/Spinner.d.ts +3 -0
  199. package/dist/Spinner.js +33 -0
  200. package/dist/Spinner.js.map +1 -0
  201. package/dist/SplitPage.d.ts +2 -0
  202. package/dist/SplitPage.js +139 -0
  203. package/dist/SplitPage.js.map +1 -0
  204. package/dist/SplitPage.native.d.ts +2 -0
  205. package/dist/SplitPage.native.js +75 -0
  206. package/dist/SplitPage.native.js.map +1 -0
  207. package/dist/TapToEdit.d.ts +4 -0
  208. package/dist/TapToEdit.js +170 -0
  209. package/dist/TapToEdit.js.map +1 -0
  210. package/dist/TerrenoProvider.d.ts +6 -0
  211. package/dist/TerrenoProvider.js +10 -0
  212. package/dist/TerrenoProvider.js.map +1 -0
  213. package/dist/Text.d.ts +3 -0
  214. package/dist/Text.js +95 -0
  215. package/dist/Text.js.map +1 -0
  216. package/dist/TextArea.d.ts +3 -0
  217. package/dist/TextArea.js +6 -0
  218. package/dist/TextArea.js.map +1 -0
  219. package/dist/TextField.d.ts +3 -0
  220. package/dist/TextField.js +144 -0
  221. package/dist/TextField.js.map +1 -0
  222. package/dist/TextFieldNumberActionSheet.d.ts +7 -0
  223. package/dist/TextFieldNumberActionSheet.js +20 -0
  224. package/dist/TextFieldNumberActionSheet.js.map +1 -0
  225. package/dist/Theme.d.ts +96 -0
  226. package/dist/Theme.js +213 -0
  227. package/dist/Theme.js.map +1 -0
  228. package/dist/TimezonePicker.d.ts +11 -0
  229. package/dist/TimezonePicker.js +27 -0
  230. package/dist/TimezonePicker.js.map +1 -0
  231. package/dist/Toast.d.ts +23 -0
  232. package/dist/Toast.js +157 -0
  233. package/dist/Toast.js.map +1 -0
  234. package/dist/Tooltip.d.ts +3 -0
  235. package/dist/Tooltip.js +289 -0
  236. package/dist/Tooltip.js.map +1 -0
  237. package/dist/UnifiedAddressAutoComplete.d.ts +2 -0
  238. package/dist/UnifiedAddressAutoComplete.js +23 -0
  239. package/dist/UnifiedAddressAutoComplete.js.map +1 -0
  240. package/dist/Unifier.d.ts +43 -0
  241. package/dist/Unifier.js +154 -0
  242. package/dist/Unifier.js.map +1 -0
  243. package/dist/Utilities.d.ts +56 -0
  244. package/dist/Utilities.js +193 -0
  245. package/dist/Utilities.js.map +1 -0
  246. package/dist/WebAddressAutocomplete.d.ts +3 -0
  247. package/dist/WebAddressAutocomplete.js +61 -0
  248. package/dist/WebAddressAutocomplete.js.map +1 -0
  249. package/dist/fieldElements/FieldError.d.ts +6 -0
  250. package/dist/fieldElements/FieldError.js +9 -0
  251. package/dist/fieldElements/FieldError.js.map +1 -0
  252. package/dist/fieldElements/FieldHelperText.d.ts +6 -0
  253. package/dist/fieldElements/FieldHelperText.js +8 -0
  254. package/dist/fieldElements/FieldHelperText.js.map +1 -0
  255. package/dist/fieldElements/FieldTitle.d.ts +6 -0
  256. package/dist/fieldElements/FieldTitle.js +16 -0
  257. package/dist/fieldElements/FieldTitle.js.map +1 -0
  258. package/dist/fieldElements/index.d.ts +3 -0
  259. package/dist/fieldElements/index.js +4 -0
  260. package/dist/fieldElements/index.js.map +1 -0
  261. package/dist/icons/MobileIcon.d.ts +2 -0
  262. package/dist/icons/MobileIcon.js +18 -0
  263. package/dist/icons/MobileIcon.js.map +1 -0
  264. package/dist/icons/OfflineIcon.d.ts +2 -0
  265. package/dist/icons/OfflineIcon.js +18 -0
  266. package/dist/icons/OfflineIcon.js.map +1 -0
  267. package/dist/icons/OnlineIcon.d.ts +2 -0
  268. package/dist/icons/OnlineIcon.js +19 -0
  269. package/dist/icons/OnlineIcon.js.map +1 -0
  270. package/dist/icons/OutOfficeIcon.d.ts +2 -0
  271. package/dist/icons/OutOfficeIcon.js +18 -0
  272. package/dist/icons/OutOfficeIcon.js.map +1 -0
  273. package/dist/icons/index.d.ts +4 -0
  274. package/dist/icons/index.js +5 -0
  275. package/dist/icons/index.js.map +1 -0
  276. package/dist/index.d.ts +1328 -0
  277. package/dist/index.js +89 -0
  278. package/dist/index.js.map +1 -0
  279. package/dist/table/Table.d.ts +3 -0
  280. package/dist/table/Table.js +53 -0
  281. package/dist/table/Table.js.map +1 -0
  282. package/dist/table/TableBadge.d.ts +6 -0
  283. package/dist/table/TableBadge.js +23 -0
  284. package/dist/table/TableBadge.js.map +1 -0
  285. package/dist/table/TableBoolean.d.ts +6 -0
  286. package/dist/table/TableBoolean.js +37 -0
  287. package/dist/table/TableBoolean.js.map +1 -0
  288. package/dist/table/TableDate.d.ts +3 -0
  289. package/dist/table/TableDate.js +27 -0
  290. package/dist/table/TableDate.js.map +1 -0
  291. package/dist/table/TableHeader.d.ts +6 -0
  292. package/dist/table/TableHeader.js +10 -0
  293. package/dist/table/TableHeader.js.map +1 -0
  294. package/dist/table/TableHeaderCell.d.ts +6 -0
  295. package/dist/table/TableHeaderCell.js +54 -0
  296. package/dist/table/TableHeaderCell.js.map +1 -0
  297. package/dist/table/TableIconButton.d.ts +3 -0
  298. package/dist/table/TableIconButton.js +39 -0
  299. package/dist/table/TableIconButton.js.map +1 -0
  300. package/dist/table/TableNumber.d.ts +3 -0
  301. package/dist/table/TableNumber.js +18 -0
  302. package/dist/table/TableNumber.js.map +1 -0
  303. package/dist/table/TableRow.d.ts +6 -0
  304. package/dist/table/TableRow.js +22 -0
  305. package/dist/table/TableRow.js.map +1 -0
  306. package/dist/table/TableText.d.ts +3 -0
  307. package/dist/table/TableText.js +18 -0
  308. package/dist/table/TableText.js.map +1 -0
  309. package/dist/table/TableTitle.d.ts +3 -0
  310. package/dist/table/TableTitle.js +21 -0
  311. package/dist/table/TableTitle.js.map +1 -0
  312. package/dist/table/tableContext.d.ts +5 -0
  313. package/dist/table/tableContext.js +38 -0
  314. package/dist/table/tableContext.js.map +1 -0
  315. package/dist/useStoredState.d.ts +1 -0
  316. package/dist/useStoredState.js +49 -0
  317. package/dist/useStoredState.js.map +1 -0
  318. package/package.json +123 -0
  319. package/src/Accordion.test.tsx +104 -0
  320. package/src/Accordion.tsx +81 -0
  321. package/src/ActionSheet.tsx +881 -0
  322. package/src/AddressField.test.tsx +120 -0
  323. package/src/AddressField.tsx +122 -0
  324. package/src/Avatar.test.tsx +163 -0
  325. package/src/Avatar.tsx +298 -0
  326. package/src/Badge.test.tsx +116 -0
  327. package/src/Badge.tsx +136 -0
  328. package/src/Banner.tsx +200 -0
  329. package/src/Body.tsx +34 -0
  330. package/src/BooleanField.tsx +141 -0
  331. package/src/Box.test.tsx +662 -0
  332. package/src/Box.tsx +368 -0
  333. package/src/Button.tsx +196 -0
  334. package/src/Card.tsx +19 -0
  335. package/src/CheckBox.tsx +45 -0
  336. package/src/Common.ts +2787 -0
  337. package/src/CommonIconTypes.ts +2030 -0
  338. package/src/Constants.ts +3311 -0
  339. package/src/CustomSelectField.tsx +115 -0
  340. package/src/DataTable.tsx +674 -0
  341. package/src/DateTimeActionSheet.tsx +559 -0
  342. package/src/DateTimeField.test.tsx +393 -0
  343. package/src/DateTimeField.tsx +777 -0
  344. package/src/DateUtilities.test.ts +440 -0
  345. package/src/DateUtilities.tsx +370 -0
  346. package/src/DecimalRangeActionSheet.tsx +85 -0
  347. package/src/DismissButton.tsx +31 -0
  348. package/src/EmailField.tsx +66 -0
  349. package/src/EmojiSelector.test.tsx +61 -0
  350. package/src/EmojiSelector.tsx +510 -0
  351. package/src/ErrorBoundary.tsx +37 -0
  352. package/src/ErrorPage.tsx +41 -0
  353. package/src/Field.tsx +101 -0
  354. package/src/FlatList.tsx +2 -0
  355. package/src/Heading.tsx +66 -0
  356. package/src/HeightActionSheet.tsx +91 -0
  357. package/src/Hyperlink.tsx +179 -0
  358. package/src/Icon.tsx +36 -0
  359. package/src/IconButton.tsx +217 -0
  360. package/src/Image.tsx +51 -0
  361. package/src/ImageBackground.tsx +14 -0
  362. package/src/InfoModalIcon.tsx +42 -0
  363. package/src/InfoTooltipButton.tsx +16 -0
  364. package/src/Link.tsx +22 -0
  365. package/src/MarkdownView.tsx +67 -0
  366. package/src/MediaQuery.ts +46 -0
  367. package/src/MobileAddressAutoComplete.tsx +126 -0
  368. package/src/Modal.tsx +300 -0
  369. package/src/ModalSheet.tsx +58 -0
  370. package/src/MultiselectField.tsx +112 -0
  371. package/src/NumberField.tsx +67 -0
  372. package/src/NumberPickerActionSheet.tsx +51 -0
  373. package/src/OpenAPIContext.tsx +74 -0
  374. package/src/Page.tsx +105 -0
  375. package/src/Pagination.tsx +169 -0
  376. package/src/PasswordField.tsx +7 -0
  377. package/src/Permissions.ts +43 -0
  378. package/src/PhoneNumberField.tsx +109 -0
  379. package/src/PickerSelect.tsx +571 -0
  380. package/src/Radio.tsx +33 -0
  381. package/src/RadioField.tsx +43 -0
  382. package/src/ScrollView.tsx +2 -0
  383. package/src/SectionDivider.tsx +18 -0
  384. package/src/SegmentedControl.tsx +126 -0
  385. package/src/SelectBadge.tsx +280 -0
  386. package/src/SelectField.tsx +41 -0
  387. package/src/SideDrawer.tsx +56 -0
  388. package/src/Signature.native.tsx +57 -0
  389. package/src/Signature.tsx +44 -0
  390. package/src/SignatureField.tsx +92 -0
  391. package/src/Slider.tsx +199 -0
  392. package/src/Spinner.tsx +35 -0
  393. package/src/SplitPage.native.tsx +163 -0
  394. package/src/SplitPage.tsx +304 -0
  395. package/src/TapToEdit.tsx +292 -0
  396. package/src/TerrenoProvider.tsx +31 -0
  397. package/src/Text.tsx +123 -0
  398. package/src/TextArea.test.tsx +255 -0
  399. package/src/TextArea.tsx +8 -0
  400. package/src/TextField.test.tsx +487 -0
  401. package/src/TextField.tsx +260 -0
  402. package/src/TextFieldNumberActionSheet.tsx +46 -0
  403. package/src/Theme.tsx +248 -0
  404. package/src/TimezonePicker.tsx +45 -0
  405. package/src/Toast.tsx +234 -0
  406. package/src/Tooltip.tsx +407 -0
  407. package/src/UnifiedAddressAutoComplete.tsx +66 -0
  408. package/src/Unifier.ts +172 -0
  409. package/src/Utilities.tsx +329 -0
  410. package/src/WebAddressAutocomplete.tsx +84 -0
  411. package/src/__snapshots__/Accordion.test.tsx.snap +126 -0
  412. package/src/__snapshots__/AddressField.test.tsx.snap +1197 -0
  413. package/src/__snapshots__/Avatar.test.tsx.snap +57 -0
  414. package/src/__snapshots__/Badge.test.tsx.snap +55 -0
  415. package/src/__snapshots__/Box.test.tsx.snap +162 -0
  416. package/src/__snapshots__/EmojiSelector.test.tsx.snap +422 -0
  417. package/src/__snapshots__/TextArea.test.tsx.snap +521 -0
  418. package/src/__snapshots__/TextField.test.tsx.snap +569 -0
  419. package/src/bunSetup.ts +1235 -0
  420. package/src/fieldElements/FieldError.tsx +24 -0
  421. package/src/fieldElements/FieldHelperText.tsx +20 -0
  422. package/src/fieldElements/FieldTitle.tsx +31 -0
  423. package/src/fieldElements/index.tsx +3 -0
  424. package/src/icons/MobileIcon.tsx +40 -0
  425. package/src/icons/OfflineIcon.tsx +37 -0
  426. package/src/icons/OnlineIcon.tsx +39 -0
  427. package/src/icons/OutOfficeIcon.tsx +36 -0
  428. package/src/icons/index.ts +4 -0
  429. package/src/index.tsx +1375 -0
  430. package/src/polyfill.d.ts +11 -0
  431. package/src/table/Table.tsx +109 -0
  432. package/src/table/TableBadge.tsx +46 -0
  433. package/src/table/TableBoolean.tsx +70 -0
  434. package/src/table/TableDate.tsx +38 -0
  435. package/src/table/TableHeader.tsx +20 -0
  436. package/src/table/TableHeaderCell.tsx +94 -0
  437. package/src/table/TableIconButton.tsx +61 -0
  438. package/src/table/TableNumber.tsx +29 -0
  439. package/src/table/TableRow.tsx +67 -0
  440. package/src/table/TableText.tsx +29 -0
  441. package/src/table/TableTitle.tsx +31 -0
  442. package/src/table/tableContext.tsx +67 -0
  443. package/src/test-utils.tsx +27 -0
  444. package/src/types/react-native-swiper-flatlist.d.ts +56 -0
  445. package/src/useStoredState.test.tsx +143 -0
  446. package/src/useStoredState.ts +56 -0
@@ -0,0 +1,1235 @@
1
+ import {beforeEach, mock} from "bun:test";
2
+ import React from "react";
3
+
4
+ // Set environment variables
5
+ process.env.TZ = "America/New_York";
6
+ process.env.EXPO_OS = "ios";
7
+
8
+ // Define React Native globals
9
+ (globalThis as any).__DEV__ = true;
10
+ (globalThis as any).__BUNDLE_START_TIME__ = Date.now();
11
+
12
+ // Mock react-native to avoid Flow type errors
13
+ mock.module("react-native", () => {
14
+ const View = ({children, style, testID, ...props}: any) =>
15
+ React.createElement("View", {style, testID, ...props}, children);
16
+ const Text = ({children, style, ...props}: any) =>
17
+ React.createElement("Text", {style, ...props}, children);
18
+ const TextInput = (props: any) => React.createElement("TextInput", props);
19
+ const TouchableOpacity = ({children, ...props}: any) =>
20
+ React.createElement("TouchableOpacity", props, children);
21
+ const Pressable = ({children, ...props}: any) =>
22
+ React.createElement("Pressable", props, children);
23
+ const ScrollView = ({children, ...props}: any) =>
24
+ React.createElement("ScrollView", props, children);
25
+ const Image = (props: any) => React.createElement("Image", props);
26
+ const ImageBackground = ({children, ...props}: any) =>
27
+ React.createElement("ImageBackground", props, children);
28
+ const ActivityIndicator = (props: any) => React.createElement("ActivityIndicator", props);
29
+ const FlatList = ({data, renderItem, keyExtractor, ...props}: any) =>
30
+ React.createElement(
31
+ "FlatList",
32
+ props,
33
+ data?.map((item: any, index: number) =>
34
+ renderItem({index, item, separators: {highlight: () => {}, unhighlight: () => {}}})
35
+ )
36
+ );
37
+ const SectionList = (props: any) => React.createElement("SectionList", props);
38
+ const KeyboardAvoidingView = ({children, ...props}: any) =>
39
+ React.createElement("KeyboardAvoidingView", props, children);
40
+ const SafeAreaView = ({children, ...props}: any) =>
41
+ React.createElement("SafeAreaView", props, children);
42
+ const Modal = ({children, ...props}: any) => React.createElement("Modal", props, children);
43
+ const Switch = (props: any) => React.createElement("Switch", props);
44
+ const Animated = {
45
+ createAnimatedComponent: (comp: any) => comp,
46
+ event: mock(() => () => {}),
47
+ FlatList,
48
+ Image,
49
+ ScrollView,
50
+ spring: mock(() => ({start: mock(() => {})})),
51
+ Text,
52
+ timing: mock(() => ({start: mock(() => {})})),
53
+ Value: class Value {
54
+ constructor(public _value: number = 0) {}
55
+ setValue = mock(() => {});
56
+ interpolate = mock(() => this);
57
+ },
58
+ View,
59
+ };
60
+ const StyleSheet = {
61
+ absoluteFill: {bottom: 0, left: 0, position: "absolute", right: 0, top: 0},
62
+ absoluteFillObject: {bottom: 0, left: 0, position: "absolute", right: 0, top: 0},
63
+ create: (styles: any) => styles,
64
+ flatten: (style: any) => (Array.isArray(style) ? Object.assign({}, ...style) : style || {}),
65
+ hairlineWidth: 1,
66
+ };
67
+ const Platform = {
68
+ OS: "ios",
69
+ select: (obj: any) => obj.ios || obj.default,
70
+ Version: "14.0",
71
+ };
72
+ const Dimensions = {
73
+ addEventListener: mock(() => ({remove: mock(() => {})})),
74
+ get: mock(() => ({fontScale: 1, height: 812, scale: 2, width: 375})),
75
+ };
76
+ const useColorScheme = mock(() => "light");
77
+ const useWindowDimensions = mock(() => ({fontScale: 1, height: 812, scale: 2, width: 375}));
78
+ const Keyboard = {
79
+ addListener: mock(() => ({remove: mock(() => {})})),
80
+ dismiss: mock(() => {}),
81
+ };
82
+ const LayoutAnimation = {
83
+ configureNext: mock(() => {}),
84
+ create: mock(() => ({})),
85
+ Presets: {},
86
+ Properties: {},
87
+ Types: {},
88
+ };
89
+ const Linking = {
90
+ addEventListener: mock(() => ({remove: mock(() => {})})),
91
+ canOpenURL: mock(() => Promise.resolve(true)),
92
+ getInitialURL: mock(() => Promise.resolve(null)),
93
+ openURL: mock(() => Promise.resolve()),
94
+ };
95
+ const Alert = {
96
+ alert: mock(() => {}),
97
+ };
98
+ const Appearance = {
99
+ addChangeListener: mock(() => ({remove: mock(() => {})})),
100
+ getColorScheme: mock(() => "light"),
101
+ };
102
+ const Vibration = {
103
+ cancel: mock(() => {}),
104
+ vibrate: mock(() => {}),
105
+ };
106
+ const NativeModules = {};
107
+ const StatusBar = {
108
+ setBackgroundColor: mock(() => {}),
109
+ setBarStyle: mock(() => {}),
110
+ setHidden: mock(() => {}),
111
+ setNetworkActivityIndicatorVisible: mock(() => {}),
112
+ setTranslucent: mock(() => {}),
113
+ };
114
+ const AccessibilityInfo = {
115
+ addEventListener: mock(() => ({remove: mock(() => {})})),
116
+ announceForAccessibility: mock(() => {}),
117
+ isAccessibilityServiceEnabled: mock(() => Promise.resolve(false)),
118
+ isBoldTextEnabled: mock(() => Promise.resolve(false)),
119
+ isGrayscaleEnabled: mock(() => Promise.resolve(false)),
120
+ isInvertColorsEnabled: mock(() => Promise.resolve(false)),
121
+ isReduceMotionEnabled: mock(() => Promise.resolve(false)),
122
+ isReduceTransparencyEnabled: mock(() => Promise.resolve(false)),
123
+ isScreenReaderEnabled: mock(() => Promise.resolve(false)),
124
+ setAccessibilityFocus: mock(() => {}),
125
+ };
126
+ const Share = {
127
+ dismiss: mock(() => Promise.resolve()),
128
+ share: mock(() => Promise.resolve({action: "sharedAction"})),
129
+ };
130
+ const PixelRatio = {
131
+ get: mock(() => 2),
132
+ getFontScale: mock(() => 1),
133
+ getPixelSizeForLayoutSize: mock((size: number) => size * 2),
134
+ roundToNearestPixel: mock((size: number) => size),
135
+ };
136
+ const I18nManager = {
137
+ allowRTL: mock(() => {}),
138
+ doLeftAndRightSwapInRTL: true,
139
+ forceRTL: mock(() => {}),
140
+ isRTL: false,
141
+ swapLeftAndRightInRTL: mock(() => {}),
142
+ };
143
+ const BackHandler = {
144
+ addEventListener: mock(() => ({remove: mock(() => {})})),
145
+ exitApp: mock(() => {}),
146
+ };
147
+ const TouchableWithoutFeedback = ({children, ...props}: any) =>
148
+ React.createElement("TouchableWithoutFeedback", props, children);
149
+ const TouchableHighlight = ({children, ...props}: any) =>
150
+ React.createElement("TouchableHighlight", props, children);
151
+ const TouchableNativeFeedback = ({children, ...props}: any) =>
152
+ React.createElement("TouchableNativeFeedback", props, children);
153
+ const Touchable = {
154
+ Mixin: {
155
+ touchableGetInitialState: () => ({}),
156
+ touchableHandleResponderGrant: mock(() => {}),
157
+ touchableHandleResponderMove: mock(() => {}),
158
+ touchableHandleResponderRelease: mock(() => {}),
159
+ touchableHandleResponderTerminate: mock(() => {}),
160
+ touchableHandleResponderTerminationRequest: () => true,
161
+ touchableHandleStartShouldSetResponder: () => true,
162
+ },
163
+ renderDebugView: mock(() => null),
164
+ TOUCH_TARGET_DEBUG: false,
165
+ };
166
+ const processColor = (color: string | number | null | undefined) => {
167
+ if (color === null || color === undefined) {
168
+ return null;
169
+ }
170
+ if (typeof color === "number") {
171
+ return color;
172
+ }
173
+ // Return a mock color number
174
+ return 0xff000000;
175
+ };
176
+ const UIManager = {
177
+ getViewManagerConfig: mock(() => ({})),
178
+ setLayoutAnimationEnabledExperimental: mock(() => {}),
179
+ };
180
+ const findNodeHandle = mock(() => null);
181
+ const requireNativeComponent = mock((name: string) => name);
182
+ const TurboModuleRegistry = {
183
+ get: mock(() => null),
184
+ getEnforcing: mock(() => ({})),
185
+ };
186
+ const PanResponder = {
187
+ create: mock(() => ({
188
+ getInteractionHandle: mock(() => null),
189
+ panHandlers: {
190
+ onMoveShouldSetResponder: mock(() => false),
191
+ onMoveShouldSetResponderCapture: mock(() => false),
192
+ onResponderEnd: mock(() => {}),
193
+ onResponderGrant: mock(() => {}),
194
+ onResponderMove: mock(() => {}),
195
+ onResponderReject: mock(() => {}),
196
+ onResponderRelease: mock(() => {}),
197
+ onResponderStart: mock(() => {}),
198
+ onResponderTerminate: mock(() => {}),
199
+ onResponderTerminationRequest: mock(() => true),
200
+ onStartShouldSetResponder: mock(() => false),
201
+ onStartShouldSetResponderCapture: mock(() => false),
202
+ },
203
+ })),
204
+ };
205
+ const Easing = {
206
+ back: mock(() => (t: number) => t),
207
+ bezier: mock(() => (t: number) => t),
208
+ bounce: mock((t: number) => t),
209
+ circle: mock((t: number) => t),
210
+ cubic: mock((t: number) => t * t * t),
211
+ ease: mock((t: number) => t),
212
+ elastic: mock(() => (t: number) => t),
213
+ exp: mock((t: number) => t),
214
+ in: mock((f: any) => f),
215
+ inOut: mock((f: any) => f),
216
+ linear: mock((t: number) => t),
217
+ out: mock((f: any) => f),
218
+ poly: mock(() => (t: number) => t),
219
+ quad: mock((t: number) => t * t),
220
+ sin: mock((t: number) => Math.sin(t)),
221
+ };
222
+ const NativeEventEmitter = class {
223
+ addListener = mock(() => ({remove: mock(() => {})}));
224
+ removeAllListeners = mock(() => {});
225
+ removeSubscription = mock(() => {});
226
+ };
227
+
228
+ return {
229
+ AccessibilityInfo,
230
+ ActivityIndicator,
231
+ Alert,
232
+ Animated,
233
+ Appearance,
234
+ BackHandler,
235
+ Dimensions,
236
+ default: {
237
+ AccessibilityInfo,
238
+ ActivityIndicator,
239
+ Alert,
240
+ Animated,
241
+ Appearance,
242
+ BackHandler,
243
+ Dimensions,
244
+ Easing,
245
+ FlatList,
246
+ findNodeHandle,
247
+ I18nManager,
248
+ Image,
249
+ ImageBackground,
250
+ Keyboard,
251
+ KeyboardAvoidingView,
252
+ LayoutAnimation,
253
+ Linking,
254
+ Modal,
255
+ NativeEventEmitter,
256
+ NativeModules,
257
+ PanResponder,
258
+ PixelRatio,
259
+ Platform,
260
+ Pressable,
261
+ processColor,
262
+ requireNativeComponent,
263
+ SafeAreaView,
264
+ ScrollView,
265
+ SectionList,
266
+ Share,
267
+ StatusBar,
268
+ StyleSheet,
269
+ Switch,
270
+ Text,
271
+ TextInput,
272
+ Touchable,
273
+ TouchableHighlight,
274
+ TouchableNativeFeedback,
275
+ TouchableOpacity,
276
+ TouchableWithoutFeedback,
277
+ TurboModuleRegistry,
278
+ UIManager,
279
+ useColorScheme,
280
+ useWindowDimensions,
281
+ Vibration,
282
+ View,
283
+ },
284
+ Easing,
285
+ FlatList,
286
+ findNodeHandle,
287
+ I18nManager,
288
+ Image,
289
+ ImageBackground,
290
+ Keyboard,
291
+ KeyboardAvoidingView,
292
+ LayoutAnimation,
293
+ Linking,
294
+ Modal,
295
+ NativeEventEmitter,
296
+ NativeModules,
297
+ PanResponder,
298
+ PixelRatio,
299
+ Platform,
300
+ Pressable,
301
+ processColor,
302
+ requireNativeComponent,
303
+ SafeAreaView,
304
+ ScrollView,
305
+ SectionList,
306
+ Share,
307
+ StatusBar,
308
+ StyleSheet,
309
+ Switch,
310
+ Text,
311
+ TextInput,
312
+ Touchable,
313
+ TouchableHighlight,
314
+ TouchableNativeFeedback,
315
+ TouchableOpacity,
316
+ TouchableWithoutFeedback,
317
+ TurboModuleRegistry,
318
+ UIManager,
319
+ useColorScheme,
320
+ useWindowDimensions,
321
+ Vibration,
322
+ View,
323
+ };
324
+ });
325
+
326
+ // Initialize globalThis.expo early for expo-modules-core
327
+ if (typeof globalThis.expo === "undefined") {
328
+ const EventEmitterClass = class EventEmitter {
329
+ addListener = mock(() => {});
330
+ removeListener = mock(() => {});
331
+ removeAllListeners = mock(() => {});
332
+ emit = mock(() => {});
333
+ };
334
+
335
+ globalThis.expo = {
336
+ EventEmitter: EventEmitterClass,
337
+ NativeModule: class NativeModule {},
338
+ SharedObject: class SharedObject {},
339
+ } as any;
340
+ }
341
+
342
+ // Mock @react-native-async-storage/async-storage
343
+ mock.module("@react-native-async-storage/async-storage", () => ({
344
+ clear: mock(() => Promise.resolve()),
345
+ default: {
346
+ clear: mock(() => Promise.resolve()),
347
+ getAllKeys: mock(() => Promise.resolve([])),
348
+ getItem: mock(() => Promise.resolve(null)),
349
+ mergeItem: mock(() => Promise.resolve()),
350
+ multiGet: mock(() => Promise.resolve([])),
351
+ multiRemove: mock(() => Promise.resolve()),
352
+ multiSet: mock(() => Promise.resolve()),
353
+ removeItem: mock(() => Promise.resolve()),
354
+ setItem: mock(() => Promise.resolve()),
355
+ },
356
+ getAllKeys: mock(() => Promise.resolve([])),
357
+ getItem: mock(() => Promise.resolve(null)),
358
+ mergeItem: mock(() => Promise.resolve()),
359
+ multiGet: mock(() => Promise.resolve([])),
360
+ multiRemove: mock(() => Promise.resolve()),
361
+ multiSet: mock(() => Promise.resolve()),
362
+ removeItem: mock(() => Promise.resolve()),
363
+ setItem: mock(() => Promise.resolve()),
364
+ }));
365
+
366
+ // Mock react-native-signature-canvas
367
+ mock.module("react-native-signature-canvas", () => ({
368
+ Signature: mock(() => null),
369
+ }));
370
+
371
+ // Mock IconButton component
372
+ mock.module("./IconButton", () => ({
373
+ IconButton: mock(() => null),
374
+ }));
375
+
376
+ // Mock expo-font
377
+ mock.module("expo-font", () => ({
378
+ isLoaded: mock(() => true),
379
+ loadAsync: mock(() => Promise.resolve()),
380
+ loadNativeFonts: mock(() => Promise.resolve()),
381
+ useFonts: mock(() => [true, null]),
382
+ }));
383
+
384
+ // Mock Google fonts packages
385
+ mock.module("@expo-google-fonts/nunito", () => ({
386
+ Nunito_200ExtraLight: "Nunito_200ExtraLight",
387
+ Nunito_200ExtraLight_Italic: "Nunito_200ExtraLight_Italic",
388
+ Nunito_300Light: "Nunito_300Light",
389
+ Nunito_300Light_Italic: "Nunito_300Light_Italic",
390
+ Nunito_400Regular: "Nunito_400Regular",
391
+ Nunito_400Regular_Italic: "Nunito_400Regular_Italic",
392
+ Nunito_500Medium: "Nunito_500Medium",
393
+ Nunito_500Medium_Italic: "Nunito_500Medium_Italic",
394
+ Nunito_600SemiBold: "Nunito_600SemiBold",
395
+ Nunito_600SemiBold_Italic: "Nunito_600SemiBold_Italic",
396
+ Nunito_700Bold: "Nunito_700Bold",
397
+ Nunito_700Bold_Italic: "Nunito_700Bold_Italic",
398
+ Nunito_800ExtraBold: "Nunito_800ExtraBold",
399
+ Nunito_800ExtraBold_Italic: "Nunito_800ExtraBold_Italic",
400
+ Nunito_900Black: "Nunito_900Black",
401
+ Nunito_900Black_Italic: "Nunito_900Black_Italic",
402
+ useFonts: mock(() => [true, null]),
403
+ }));
404
+
405
+ mock.module("@expo-google-fonts/titillium-web", () => ({
406
+ TitilliumWeb_200ExtraLight: "TitilliumWeb_200ExtraLight",
407
+ TitilliumWeb_200ExtraLight_Italic: "TitilliumWeb_200ExtraLight_Italic",
408
+ TitilliumWeb_300Light: "TitilliumWeb_300Light",
409
+ TitilliumWeb_300Light_Italic: "TitilliumWeb_300Light_Italic",
410
+ TitilliumWeb_400Regular: "TitilliumWeb_400Regular",
411
+ TitilliumWeb_400Regular_Italic: "TitilliumWeb_400Regular_Italic",
412
+ TitilliumWeb_600SemiBold: "TitilliumWeb_600SemiBold",
413
+ TitilliumWeb_600SemiBold_Italic: "TitilliumWeb_600SemiBold_Italic",
414
+ TitilliumWeb_700Bold: "TitilliumWeb_700Bold",
415
+ TitilliumWeb_700Bold_Italic: "TitilliumWeb_700Bold_Italic",
416
+ TitilliumWeb_900Black: "TitilliumWeb_900Black",
417
+ useFonts: mock(() => [true, null]),
418
+ }));
419
+
420
+ // Mock DateTimeActionSheet
421
+ mock.module("./DateTimeActionSheet", () => ({
422
+ DateTimeActionSheet: mock(() => null),
423
+ }));
424
+
425
+ // Mock MediaQuery
426
+ mock.module("./MediaQuery", () => ({
427
+ isMobileDevice: mock(() => false),
428
+ mediaQueryLargerThan: mock(() => false),
429
+ }));
430
+
431
+ // Mock expo-image-manipulator
432
+ mock.module("expo-image-manipulator", () => ({
433
+ ImageManipulator: {
434
+ manipulateAsync: mock(() => {}),
435
+ },
436
+ SaveFormat: {
437
+ JPEG: "jpeg",
438
+ PNG: "png",
439
+ },
440
+ }));
441
+
442
+ // Mock expo-image-picker
443
+ mock.module("expo-image-picker", () => ({
444
+ launchImageLibraryAsync: mock(() => {}),
445
+ MediaTypeOptions: {
446
+ Images: "images",
447
+ },
448
+ requestMediaLibraryPermissionsAsync: mock(() => {}),
449
+ }));
450
+
451
+ // Mock expo-haptics
452
+ mock.module("expo-haptics", () => ({
453
+ ImpactFeedbackStyle: {
454
+ Heavy: "heavy",
455
+ Light: "light",
456
+ Medium: "medium",
457
+ },
458
+ impactAsync: mock(() => {}),
459
+ NotificationFeedbackType: {
460
+ Error: "error",
461
+ Success: "success",
462
+ Warning: "warning",
463
+ },
464
+ notificationAsync: mock(() => {}),
465
+ selectionAsync: mock(() => {}),
466
+ }));
467
+
468
+ // Mock expo-clipboard
469
+ mock.module("expo-clipboard", () => ({
470
+ getStringAsync: mock(() => Promise.resolve("")),
471
+ hasStringAsync: mock(() => Promise.resolve(false)),
472
+ setStringAsync: mock(() => Promise.resolve(undefined)),
473
+ }));
474
+
475
+ // Mock expo-localization
476
+ mock.module("expo-localization", () => ({
477
+ getCalendars: mock(() => [
478
+ {
479
+ calendar: "gregorian",
480
+ id: "gregorian",
481
+ locale: "en-US",
482
+ timeZone: "America/New_York",
483
+ },
484
+ ]),
485
+ getLocales: mock(() => [
486
+ {
487
+ countryCode: "US",
488
+ decimalSeparator: ".",
489
+ digitGroupingSeparator: ",",
490
+ languageCode: "en",
491
+ measurementSystem: "US",
492
+ temperatureUnit: "F",
493
+ textDirection: "ltr",
494
+ uses24hourClock: false,
495
+ usesMetricSystem: false,
496
+ },
497
+ ]),
498
+ isRTL: false,
499
+ locale: "en-US",
500
+ locales: ["en-US"],
501
+ timezone: "America/New_York",
502
+ }));
503
+
504
+ // Mock @expo/vector-icons
505
+ mock.module("@expo/vector-icons", () => ({
506
+ default: mock(() => null),
507
+ FontAwesome6: mock(() => null),
508
+ }));
509
+
510
+ // Mock @expo/vector-icons/FontAwesome6
511
+ mock.module("@expo/vector-icons/FontAwesome6", () => ({
512
+ default: mock(() => null),
513
+ }));
514
+
515
+ // Mock linkify-it - need to mock the Hyperlink component directly instead
516
+ mock.module("./Hyperlink", () => ({
517
+ Hyperlink: ({children}: any) => React.createElement("View", {}, children),
518
+ }));
519
+
520
+ // Mock react-native internal modules with Flow types
521
+ // These modules use Flow type syntax that Bun cannot parse
522
+
523
+ // StyleSheet related
524
+ mock.module("react-native/Libraries/StyleSheet/processColor", () => {
525
+ const processColor = (color: any) => {
526
+ if (color === null || color === undefined) return null;
527
+ if (typeof color === "number") return color;
528
+ return 0xff000000;
529
+ };
530
+ return {__esModule: true, default: processColor};
531
+ });
532
+
533
+ mock.module("react-native/Libraries/StyleSheet/normalizeColor", () => {
534
+ const normalizeColor = (color: any) => {
535
+ if (color === null || color === undefined) return null;
536
+ if (typeof color === "number") return color;
537
+ return 0xff000000;
538
+ };
539
+ return {__esModule: true, default: normalizeColor};
540
+ });
541
+
542
+ mock.module("react-native/Libraries/StyleSheet/PlatformColorValueTypes", () => ({
543
+ DynamicColorIOS: (obj: any) => obj.light,
544
+ normalizeColorObject: (color: any) => color,
545
+ PlatformColor: (...args: any[]) => args[0],
546
+ processColorObject: (color: any) => color,
547
+ }));
548
+
549
+ mock.module("react-native/Libraries/StyleSheet/StyleSheet", () => ({
550
+ absoluteFill: {bottom: 0, left: 0, position: "absolute", right: 0, top: 0},
551
+ absoluteFillObject: {bottom: 0, left: 0, position: "absolute", right: 0, top: 0},
552
+ create: (styles: any) => styles,
553
+ default: {
554
+ absoluteFill: {bottom: 0, left: 0, position: "absolute", right: 0, top: 0},
555
+ absoluteFillObject: {bottom: 0, left: 0, position: "absolute", right: 0, top: 0},
556
+ create: (styles: any) => styles,
557
+ flatten: (style: any) => (Array.isArray(style) ? Object.assign({}, ...style) : style || {}),
558
+ hairlineWidth: 1,
559
+ },
560
+ flatten: (style: any) => (Array.isArray(style) ? Object.assign({}, ...style) : style || {}),
561
+ hairlineWidth: 1,
562
+ }));
563
+
564
+ // NativeComponent related
565
+ mock.module("react-native/Libraries/NativeComponent/NativeComponentRegistry", () => ({
566
+ get: mock(() => "View"),
567
+ getWithFallback_DEPRECATED: mock(() => "View"),
568
+ setRuntimeConfigProvider: mock(() => {}),
569
+ }));
570
+
571
+ mock.module("react-native/Libraries/NativeComponent/ViewConfigIgnore", () => ({
572
+ ConditionallyIgnoredEventHandlers: (handlers: any) => handlers,
573
+ DifferentHeuristics: {},
574
+ ignoredViewConfigPropNames: new Set(),
575
+ isIgnoredViewConfigProp: mock(() => false),
576
+ }));
577
+
578
+ // Mock @react-native-community/slider
579
+ mock.module("@react-native-community/slider", () => ({
580
+ default: (props: any) => React.createElement("Slider", props),
581
+ Slider: (props: any) => React.createElement("Slider", props),
582
+ }));
583
+
584
+ // Mock react-native-swiper-flatlist
585
+ mock.module("react-native-swiper-flatlist", () => ({
586
+ default: ({children, ...props}: any) => React.createElement("SwiperFlatList", props, children),
587
+ SwiperFlatList: ({children, ...props}: any) =>
588
+ React.createElement("SwiperFlatList", props, children),
589
+ }));
590
+
591
+ // Mock Unifier module
592
+ mock.module("./Unifier", () => ({
593
+ changeColorLuminance: mock((hex: string, _luminanceChange: string) => hex),
594
+ Unifier: {
595
+ dev: false,
596
+ initIcons: mock(() => {}),
597
+ navigation: {
598
+ dismissOverlay: mock(() => {}),
599
+ },
600
+ storage: {
601
+ getItem: mock(() => Promise.resolve(null)),
602
+ setItem: mock(() => Promise.resolve()),
603
+ },
604
+ tracking: {
605
+ log: mock(() => {}),
606
+ },
607
+ utils: {
608
+ copyToClipboard: mock(() => {}),
609
+ dimensions: mock(() => ({height: 812, width: 375})),
610
+ dismissKeyboard: mock(() => {}),
611
+ haptic: mock(() => Promise.resolve()),
612
+ makePurchase: mock(() => {}),
613
+ openUrl: mock(() => Promise.resolve()),
614
+ orientationChange: mock(() => {}),
615
+ PaymentService: mock(() => {}),
616
+ requestPermissions: mock(() => Promise.resolve(true)),
617
+ vibrate: mock(() => {}),
618
+ },
619
+ web: false,
620
+ },
621
+ }));
622
+
623
+ mock.module("react-native/Libraries/Utilities/codegenNativeComponent", () => ({
624
+ default: mock((name: string) => name),
625
+ }));
626
+
627
+ mock.module("react-native/Libraries/Utilities/codegenNativeCommands", () => ({
628
+ default: mock(() => ({})),
629
+ }));
630
+
631
+ // Image related
632
+ mock.module("react-native/Libraries/Image/resolveAssetSource", () => {
633
+ const resolveAssetSource = (source: any) => ({
634
+ height: source?.height || 0,
635
+ scale: 1,
636
+ uri: source?.uri || "",
637
+ width: source?.width || 0,
638
+ });
639
+ return {__esModule: true, default: resolveAssetSource};
640
+ });
641
+
642
+ mock.module("react-native/Libraries/Image/AssetSourceResolver", () => ({
643
+ default: class AssetSourceResolver {
644
+ defaultAsset = () => ({height: 0, scale: 1, uri: "", width: 0});
645
+ fromSource = () => ({height: 0, scale: 1, uri: "", width: 0});
646
+ },
647
+ }));
648
+
649
+ mock.module("react-native/Libraries/Image/ImageSource", () => ({
650
+ default: {},
651
+ }));
652
+
653
+ // Animated related
654
+ mock.module("react-native/Libraries/Animated/Animated", () => {
655
+ const View = ({children, style}: any) => React.createElement("View", {style}, children);
656
+ const Text = ({children, style}: any) => React.createElement("Text", {style}, children);
657
+ const Image = (props: any) => React.createElement("Image", props);
658
+ const ScrollView = ({children}: any) => React.createElement("ScrollView", {}, children);
659
+ return {
660
+ createAnimatedComponent: (c: any) => c,
661
+ default: {createAnimatedComponent: (c: any) => c, Image, ScrollView, Text, View},
662
+ Image,
663
+ ScrollView,
664
+ Text,
665
+ View,
666
+ };
667
+ });
668
+
669
+ mock.module("react-native/Libraries/Animated/NativeAnimatedHelper", () => ({
670
+ default: {},
671
+ shouldUseNativeDriver: () => false,
672
+ }));
673
+
674
+ // Event related
675
+ mock.module("react-native/Libraries/EventEmitter/NativeEventEmitter", () => ({
676
+ default: class NativeEventEmitter {
677
+ addListener = mock(() => ({remove: mock(() => {})}));
678
+ removeAllListeners = mock(() => {});
679
+ },
680
+ }));
681
+
682
+ // TurboModule related
683
+ mock.module("react-native/Libraries/TurboModule/TurboModuleRegistry", () => ({
684
+ get: mock(() => null),
685
+ getEnforcing: mock(() => ({})),
686
+ }));
687
+
688
+ // Utilities
689
+ mock.module("react-native/Libraries/Utilities/Platform", () => ({
690
+ default: {OS: "ios", select: (obj: any) => obj.ios || obj.default, Version: "14.0"},
691
+ OS: "ios",
692
+ select: (obj: any) => obj.ios || obj.default,
693
+ Version: "14.0",
694
+ }));
695
+
696
+ mock.module("react-native/Libraries/Utilities/Dimensions", () => ({
697
+ addEventListener: () => ({remove: () => {}}),
698
+ default: {
699
+ addEventListener: () => ({remove: () => {}}),
700
+ get: () => ({fontScale: 1, height: 812, scale: 2, width: 375}),
701
+ },
702
+ get: () => ({fontScale: 1, height: 812, scale: 2, width: 375}),
703
+ }));
704
+
705
+ mock.module("react-native/Libraries/Utilities/PixelRatio", () => ({
706
+ default: {
707
+ get: () => 2,
708
+ getFontScale: () => 1,
709
+ getPixelSizeForLayoutSize: (size: number) => size * 2,
710
+ roundToNearestPixel: (size: number) => size,
711
+ },
712
+ }));
713
+
714
+ mock.module("react-native/Libraries/Utilities/useWindowDimensions", () => ({
715
+ default: () => ({fontScale: 1, height: 812, scale: 2, width: 375}),
716
+ }));
717
+
718
+ mock.module("react-native/Libraries/Utilities/useColorScheme", () => ({
719
+ default: () => "light",
720
+ }));
721
+
722
+ // Components
723
+ mock.module("react-native/Libraries/Components/View/View", () => ({
724
+ default: ({children, style, testID, ...props}: any) =>
725
+ React.createElement("View", {style, testID, ...props}, children),
726
+ }));
727
+
728
+ mock.module("react-native/Libraries/Text/Text", () => ({
729
+ default: ({children, style, ...props}: any) =>
730
+ React.createElement("Text", {style, ...props}, children),
731
+ }));
732
+
733
+ mock.module("react-native/Libraries/Components/TextInput/TextInput", () => ({
734
+ default: (props: any) => React.createElement("TextInput", props),
735
+ }));
736
+
737
+ mock.module("react-native/Libraries/Image/Image", () => ({
738
+ default: (props: any) => React.createElement("Image", props),
739
+ }));
740
+
741
+ mock.module("react-native/Libraries/Components/ScrollView/ScrollView", () => ({
742
+ default: ({children, ...props}: any) => React.createElement("ScrollView", props, children),
743
+ }));
744
+
745
+ mock.module("react-native/Libraries/Components/Pressable/Pressable", () => ({
746
+ default: ({children, ...props}: any) => React.createElement("Pressable", props, children),
747
+ }));
748
+
749
+ mock.module("react-native/Libraries/Components/Touchable/TouchableOpacity", () => ({
750
+ default: ({children, ...props}: any) => React.createElement("TouchableOpacity", props, children),
751
+ }));
752
+
753
+ mock.module("react-native/Libraries/Components/ActivityIndicator/ActivityIndicator", () => ({
754
+ default: (props: any) => React.createElement("ActivityIndicator", props),
755
+ }));
756
+
757
+ mock.module("react-native/Libraries/Modal/Modal", () => ({
758
+ default: ({children, ...props}: any) => React.createElement("Modal", props, children),
759
+ }));
760
+
761
+ mock.module("react-native/Libraries/Components/Switch/Switch", () => ({
762
+ default: (props: any) => React.createElement("Switch", props),
763
+ }));
764
+
765
+ mock.module("react-native/Libraries/Lists/FlatList", () => ({
766
+ default: ({data, renderItem, ...props}: any) =>
767
+ React.createElement(
768
+ "FlatList",
769
+ props,
770
+ data?.map((item: any, index: number) =>
771
+ renderItem({index, item, separators: {highlight: () => {}, unhighlight: () => {}}})
772
+ )
773
+ ),
774
+ }));
775
+
776
+ mock.module("react-native/Libraries/Lists/SectionList", () => ({
777
+ default: (props: any) => React.createElement("SectionList", props),
778
+ }));
779
+
780
+ // APIs
781
+ mock.module("react-native/Libraries/Alert/Alert", () => ({
782
+ default: {alert: mock(() => {})},
783
+ }));
784
+
785
+ mock.module("react-native/Libraries/Linking/Linking", () => ({
786
+ default: {
787
+ addEventListener: mock(() => ({remove: mock(() => {})})),
788
+ canOpenURL: mock(() => Promise.resolve(true)),
789
+ getInitialURL: mock(() => Promise.resolve(null)),
790
+ openURL: mock(() => Promise.resolve()),
791
+ },
792
+ }));
793
+
794
+ mock.module("react-native/Libraries/Share/Share", () => ({
795
+ default: {
796
+ dismiss: mock(() => Promise.resolve()),
797
+ share: mock(() => Promise.resolve({action: "sharedAction"})),
798
+ },
799
+ }));
800
+
801
+ mock.module("react-native/Libraries/Vibration/Vibration", () => ({
802
+ default: {
803
+ cancel: mock(() => {}),
804
+ vibrate: mock(() => {}),
805
+ },
806
+ }));
807
+
808
+ mock.module("react-native/Libraries/Components/Keyboard/Keyboard", () => ({
809
+ default: {
810
+ addListener: mock(() => ({remove: mock(() => {})})),
811
+ dismiss: mock(() => {}),
812
+ },
813
+ }));
814
+
815
+ mock.module("react-native/Libraries/AppState/AppState", () => ({
816
+ default: {
817
+ addEventListener: mock(() => ({remove: mock(() => {})})),
818
+ currentState: "active",
819
+ },
820
+ }));
821
+
822
+ mock.module("react-native/Libraries/Interaction/PanResponder", () => ({
823
+ default: {
824
+ create: mock(() => ({
825
+ getInteractionHandle: mock(() => null),
826
+ panHandlers: {},
827
+ })),
828
+ },
829
+ }));
830
+
831
+ mock.module("react-native/Libraries/LayoutAnimation/LayoutAnimation", () => ({
832
+ default: {
833
+ configureNext: mock(() => {}),
834
+ create: mock(() => ({})),
835
+ Presets: {},
836
+ Properties: {},
837
+ Types: {},
838
+ },
839
+ }));
840
+
841
+ mock.module("react-native/Libraries/ReactNative/UIManager", () => ({
842
+ default: {
843
+ getViewManagerConfig: mock(() => ({})),
844
+ setLayoutAnimationEnabledExperimental: mock(() => {}),
845
+ },
846
+ }));
847
+
848
+ mock.module("react-native/Libraries/Renderer/shims/ReactNative", () => ({
849
+ findNodeHandle: mock(() => null),
850
+ }));
851
+
852
+ mock.module("react-native/Libraries/Components/StatusBar/StatusBar", () => ({
853
+ default: {
854
+ setBackgroundColor: mock(() => {}),
855
+ setBarStyle: mock(() => {}),
856
+ setHidden: mock(() => {}),
857
+ setNetworkActivityIndicatorVisible: mock(() => {}),
858
+ setTranslucent: mock(() => {}),
859
+ },
860
+ }));
861
+
862
+ mock.module("react-native/Libraries/Components/AccessibilityInfo/AccessibilityInfo", () => ({
863
+ default: {
864
+ addEventListener: mock(() => ({remove: mock(() => {})})),
865
+ announceForAccessibility: mock(() => {}),
866
+ isAccessibilityServiceEnabled: mock(() => Promise.resolve(false)),
867
+ isBoldTextEnabled: mock(() => Promise.resolve(false)),
868
+ isGrayscaleEnabled: mock(() => Promise.resolve(false)),
869
+ isInvertColorsEnabled: mock(() => Promise.resolve(false)),
870
+ isReduceMotionEnabled: mock(() => Promise.resolve(false)),
871
+ isReduceTransparencyEnabled: mock(() => Promise.resolve(false)),
872
+ isScreenReaderEnabled: mock(() => Promise.resolve(false)),
873
+ setAccessibilityFocus: mock(() => {}),
874
+ },
875
+ }));
876
+
877
+ mock.module("react-native/Libraries/Utilities/BackHandler", () => ({
878
+ default: {
879
+ addEventListener: mock(() => ({remove: mock(() => {})})),
880
+ exitApp: mock(() => {}),
881
+ },
882
+ }));
883
+
884
+ mock.module("react-native/Libraries/Utilities/Appearance", () => ({
885
+ default: {
886
+ addChangeListener: mock(() => ({remove: mock(() => {})})),
887
+ getColorScheme: mock(() => "light"),
888
+ },
889
+ }));
890
+
891
+ mock.module("react-native/Libraries/ReactNative/I18nManager", () => ({
892
+ default: {
893
+ allowRTL: mock(() => {}),
894
+ doLeftAndRightSwapInRTL: true,
895
+ forceRTL: mock(() => {}),
896
+ isRTL: false,
897
+ swapLeftAndRightInRTL: mock(() => {}),
898
+ },
899
+ }));
900
+
901
+ mock.module("react-native/Libraries/BatchedBridge/NativeModules", () => ({
902
+ default: {},
903
+ }));
904
+
905
+ mock.module("react-native/Libraries/Animated/Easing", () => ({
906
+ default: {
907
+ back: () => (t: number) => t,
908
+ bezier: () => (t: number) => t,
909
+ bounce: (t: number) => t,
910
+ circle: (t: number) => t,
911
+ cubic: (t: number) => t * t * t,
912
+ ease: (t: number) => t,
913
+ elastic: () => (t: number) => t,
914
+ exp: (t: number) => t,
915
+ in: (f: any) => f,
916
+ inOut: (f: any) => f,
917
+ linear: (t: number) => t,
918
+ out: (f: any) => f,
919
+ poly: () => (t: number) => t,
920
+ quad: (t: number) => t * t,
921
+ sin: (t: number) => Math.sin(t),
922
+ },
923
+ }));
924
+
925
+ mock.module("react-native/Libraries/Components/Touchable/Touchable", () => ({
926
+ default: {
927
+ Mixin: {
928
+ touchableGetInitialState: () => ({}),
929
+ touchableHandleResponderGrant: mock(() => {}),
930
+ touchableHandleResponderMove: mock(() => {}),
931
+ touchableHandleResponderRelease: mock(() => {}),
932
+ touchableHandleResponderTerminate: mock(() => {}),
933
+ touchableHandleResponderTerminationRequest: () => true,
934
+ touchableHandleStartShouldSetResponder: () => true,
935
+ },
936
+ renderDebugView: mock(() => null),
937
+ TOUCH_TARGET_DEBUG: false,
938
+ },
939
+ Mixin: {
940
+ touchableGetInitialState: () => ({}),
941
+ touchableHandleResponderGrant: mock(() => {}),
942
+ touchableHandleResponderMove: mock(() => {}),
943
+ touchableHandleResponderRelease: mock(() => {}),
944
+ touchableHandleResponderTerminate: mock(() => {}),
945
+ touchableHandleResponderTerminationRequest: () => true,
946
+ touchableHandleStartShouldSetResponder: () => true,
947
+ },
948
+ }));
949
+
950
+ // Additional internal modules
951
+ mock.module("react-native/Libraries/vendor/core/ErrorUtils", () => ({
952
+ default: {
953
+ getGlobalHandler: mock(() => () => {}),
954
+ setGlobalHandler: mock(() => {}),
955
+ },
956
+ }));
957
+
958
+ mock.module("react-native/Libraries/Core/ReactNativeVersion", () => ({
959
+ version: {major: 0, minor: 81, patch: 5},
960
+ }));
961
+
962
+ mock.module("react-native/Libraries/Core/NativeExceptionsManager", () => ({
963
+ default: null,
964
+ }));
965
+
966
+ mock.module("react-native/Libraries/NativeModules/specs/NativeDevSettings", () => ({
967
+ default: null,
968
+ }));
969
+
970
+ mock.module("react-native/Libraries/Core/Devtools/parseErrorStack", () => ({
971
+ default: mock(() => []),
972
+ }));
973
+
974
+ mock.module("react-native/Libraries/LogBox/LogBox", () => ({
975
+ default: {
976
+ ignoreAllLogs: mock(() => {}),
977
+ ignoreLogs: mock(() => {}),
978
+ install: mock(() => {}),
979
+ uninstall: mock(() => {}),
980
+ },
981
+ }));
982
+
983
+ // Mock @react-native-picker/picker
984
+ const PickerComponent = ({children, ...props}: any) =>
985
+ React.createElement("Picker", props, children);
986
+ (PickerComponent as any).Item = ({children, ...props}: any) =>
987
+ React.createElement("Picker.Item", props, children);
988
+ mock.module("@react-native-picker/picker", () => ({
989
+ Picker: PickerComponent,
990
+ PickerIOS: PickerComponent,
991
+ }));
992
+
993
+ // Mock react-native-picker-select
994
+ mock.module("react-native-picker-select", () => ({
995
+ default: ({children, ...props}: any) => React.createElement("RNPickerSelect", props, children),
996
+ }));
997
+
998
+ // Mock @react-native-community/datetimepicker
999
+ mock.module("@react-native-community/datetimepicker", () => ({
1000
+ DateTimePickerAndroid: {
1001
+ dismiss: mock(() => Promise.resolve()),
1002
+ open: mock(() => Promise.resolve({action: "dismissed"})),
1003
+ },
1004
+ default: (props: any) => React.createElement("DateTimePicker", props),
1005
+ }));
1006
+
1007
+ // Mock react-native-calendars
1008
+ mock.module("react-native-calendars", () => ({
1009
+ Agenda: (props: any) => React.createElement("Agenda", props),
1010
+ AgendaList: (props: any) => React.createElement("AgendaList", props),
1011
+ Calendar: (props: any) => React.createElement("Calendar", props),
1012
+ CalendarList: (props: any) => React.createElement("CalendarList", props),
1013
+ ExpandableCalendar: (props: any) => React.createElement("ExpandableCalendar", props),
1014
+ LocaleConfig: {
1015
+ defaultLocale: "en",
1016
+ locales: {},
1017
+ },
1018
+ WeekCalendar: (props: any) => React.createElement("WeekCalendar", props),
1019
+ }));
1020
+
1021
+ // Mock more react-native internal modules with Flow types
1022
+ mock.module("react-native/Libraries/Image/resolveAssetSource", () => ({
1023
+ default: mock((source: any) => ({
1024
+ height: source?.height || 0,
1025
+ scale: 1,
1026
+ uri: source?.uri || "",
1027
+ width: source?.width || 0,
1028
+ })),
1029
+ }));
1030
+
1031
+ mock.module("react-native/Libraries/Image/AssetSourceResolver", () => ({
1032
+ default: class AssetSourceResolver {
1033
+ defaultAsset = mock(() => ({height: 0, scale: 1, uri: "", width: 0}));
1034
+ fromSource = mock(() => ({height: 0, scale: 1, uri: "", width: 0}));
1035
+ },
1036
+ }));
1037
+
1038
+ // Mock react-native-gesture-handler
1039
+ mock.module("react-native-gesture-handler", () => {
1040
+ const GestureHandler = ({children}: any) => children;
1041
+
1042
+ // Create a chainable gesture object that returns itself for all method calls
1043
+ const createChainableGesture = (): any => {
1044
+ const gesture: any = {};
1045
+ const chainableMethods = [
1046
+ "onStart",
1047
+ "onEnd",
1048
+ "onUpdate",
1049
+ "onChange",
1050
+ "onFinalize",
1051
+ "onTouchesDown",
1052
+ "onTouchesMove",
1053
+ "onTouchesUp",
1054
+ "onTouchesCancelled",
1055
+ "enabled",
1056
+ "shouldCancelWhenOutside",
1057
+ "hitSlop",
1058
+ "simultaneousWithExternalGesture",
1059
+ "requireExternalGestureToFail",
1060
+ "blocksExternalGesture",
1061
+ "withTestId",
1062
+ "minPointers",
1063
+ "maxPointers",
1064
+ "minDistance",
1065
+ "minVelocity",
1066
+ "minVelocityX",
1067
+ "minVelocityY",
1068
+ "activeOffsetX",
1069
+ "activeOffsetY",
1070
+ "failOffsetX",
1071
+ "failOffsetY",
1072
+ "averageTouches",
1073
+ "enableTrackpadTwoFingerGesture",
1074
+ "numberOfTaps",
1075
+ "maxDuration",
1076
+ "maxDelay",
1077
+ "maxDist",
1078
+ "minDuration",
1079
+ "numberOfPointers",
1080
+ "direction",
1081
+ "minScale",
1082
+ "minRotation",
1083
+ "runOnJS",
1084
+ ];
1085
+ chainableMethods.forEach((method) => {
1086
+ gesture[method] = mock(() => gesture);
1087
+ });
1088
+ return gesture;
1089
+ };
1090
+
1091
+ return {
1092
+ BaseButton: GestureHandler,
1093
+ BorderlessButton: GestureHandler,
1094
+ createNativeWrapper: (comp: any) => comp,
1095
+ Directions: {
1096
+ DOWN: 8,
1097
+ LEFT: 2,
1098
+ RIGHT: 1,
1099
+ UP: 4,
1100
+ },
1101
+ DrawerLayout: GestureHandler,
1102
+ FlatList: GestureHandler,
1103
+ FlingGestureHandler: GestureHandler,
1104
+ Gesture: {
1105
+ Exclusive: (..._gestures: any[]) => createChainableGesture(),
1106
+ Fling: () => createChainableGesture(),
1107
+ LongPress: () => createChainableGesture(),
1108
+ Manual: () => createChainableGesture(),
1109
+ Native: () => createChainableGesture(),
1110
+ Pan: () => createChainableGesture(),
1111
+ Pinch: () => createChainableGesture(),
1112
+ Race: (..._gestures: any[]) => createChainableGesture(),
1113
+ Rotation: () => createChainableGesture(),
1114
+ Simultaneous: (..._gestures: any[]) => createChainableGesture(),
1115
+ Tap: () => createChainableGesture(),
1116
+ },
1117
+ GestureDetector: GestureHandler,
1118
+ GestureHandlerRootView: GestureHandler,
1119
+ gestureHandlerRootHOC: (comp: any) => comp,
1120
+ LongPressGestureHandler: GestureHandler,
1121
+ NativeViewGestureHandler: GestureHandler,
1122
+ PanGestureHandler: GestureHandler,
1123
+ PinchGestureHandler: GestureHandler,
1124
+ RectButton: GestureHandler,
1125
+ RotationGestureHandler: GestureHandler,
1126
+ ScrollView: GestureHandler,
1127
+ State: {
1128
+ ACTIVE: 4,
1129
+ BEGAN: 2,
1130
+ CANCELLED: 3,
1131
+ END: 5,
1132
+ FAILED: 1,
1133
+ UNDETERMINED: 0,
1134
+ },
1135
+ Swipeable: GestureHandler,
1136
+ TapGestureHandler: GestureHandler,
1137
+ TouchableHighlight: GestureHandler,
1138
+ TouchableNativeFeedback: GestureHandler,
1139
+ TouchableOpacity: GestureHandler,
1140
+ TouchableWithoutFeedback: GestureHandler,
1141
+ };
1142
+ });
1143
+
1144
+ // Mock react-native-reanimated
1145
+ mock.module("react-native-reanimated", () => {
1146
+ const Animated = {
1147
+ createAnimatedComponent: (comp: any) => comp,
1148
+ Image: (props: any) => React.createElement("Image", props),
1149
+ ScrollView: ({children}: any) => React.createElement("ScrollView", {}, children),
1150
+ Text: ({children, style}: any) => React.createElement("Text", {style}, children),
1151
+ View: ({children, style}: any) => React.createElement("View", {style}, children),
1152
+ };
1153
+ return {
1154
+ default: Animated,
1155
+ Easing: {
1156
+ cubic: (t: number) => t,
1157
+ ease: (t: number) => t,
1158
+ linear: (t: number) => t,
1159
+ quad: (t: number) => t,
1160
+ },
1161
+ runOnJS: mock((fn: any) => fn),
1162
+ runOnUI: mock((fn: any) => fn),
1163
+ useAnimatedGestureHandler: mock(() => ({})),
1164
+ useAnimatedStyle: mock((fn: any) => fn()),
1165
+ useDerivedValue: mock((fn: any) => ({value: fn()})),
1166
+ useSharedValue: mock((val: any) => ({value: val})),
1167
+ withDecay: mock((val: any) => val),
1168
+ withDelay: mock((_delay: any, val: any) => val),
1169
+ withRepeat: mock((val: any) => val),
1170
+ withSequence: mock((...vals: any[]) => vals[0]),
1171
+ withSpring: mock((val: any) => val),
1172
+ withTiming: mock((val: any) => val),
1173
+ ...Animated,
1174
+ };
1175
+ });
1176
+
1177
+ // Mock react-native-svg
1178
+ mock.module("react-native-svg", () => {
1179
+ const createSvgComponent =
1180
+ (name: string) =>
1181
+ ({children, ...props}: any) =>
1182
+ React.createElement(name, props, children);
1183
+
1184
+ return {
1185
+ Circle: createSvgComponent("Circle"),
1186
+ ClipPath: createSvgComponent("ClipPath"),
1187
+ Defs: createSvgComponent("Defs"),
1188
+ default: createSvgComponent("Svg"),
1189
+ Ellipse: createSvgComponent("Ellipse"),
1190
+ ForeignObject: createSvgComponent("ForeignObject"),
1191
+ G: createSvgComponent("G"),
1192
+ Image: createSvgComponent("SvgImage"),
1193
+ Line: createSvgComponent("Line"),
1194
+ LinearGradient: createSvgComponent("LinearGradient"),
1195
+ Mask: createSvgComponent("Mask"),
1196
+ Path: createSvgComponent("Path"),
1197
+ Pattern: createSvgComponent("Pattern"),
1198
+ Polygon: createSvgComponent("Polygon"),
1199
+ Polyline: createSvgComponent("Polyline"),
1200
+ RadialGradient: createSvgComponent("RadialGradient"),
1201
+ Rect: createSvgComponent("Rect"),
1202
+ Stop: createSvgComponent("Stop"),
1203
+ Svg: createSvgComponent("Svg"),
1204
+ Symbol: createSvgComponent("Symbol"),
1205
+ Text: createSvgComponent("SvgText"),
1206
+ TextPath: createSvgComponent("TextPath"),
1207
+ TSpan: createSvgComponent("TSpan"),
1208
+ Use: createSvgComponent("Use"),
1209
+ };
1210
+ });
1211
+
1212
+ // Mock expo-modules-core
1213
+ mock.module("expo-modules-core/src/Refs", () => ({
1214
+ createRef: mock(() => ({current: null})),
1215
+ }));
1216
+
1217
+ mock.module("expo-modules-core/src/web/index.web", () => ({
1218
+ EventEmitter: class EventEmitter {
1219
+ addListener = mock(() => {});
1220
+ removeListener = mock(() => {});
1221
+ removeAllListeners = mock(() => {});
1222
+ emit = mock(() => {});
1223
+ },
1224
+ }));
1225
+
1226
+ mock.module("expo-modules-core/src/uuid/uuid.web", () => ({
1227
+ uuid4: mock(() => `mock-uuid-${Math.random().toString(36).substr(2, 9)}`),
1228
+ }));
1229
+
1230
+ // Reset mock date before each test
1231
+ beforeEach(() => {
1232
+ // Set a fixed date for testing
1233
+ const fixedDate = new Date("2023-05-15T10:30:00.000Z");
1234
+ global.Date.now = mock(() => fixedDate.getTime());
1235
+ });