@react-native-harness/runtime 1.0.0-alpha.2 → 1.0.0-alpha.20

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 (311) hide show
  1. package/README.md +23 -4
  2. package/assets/harness-module-system.js +73 -0
  3. package/dist/bundler/bundle.d.ts.map +1 -1
  4. package/dist/bundler/bundle.js +7 -2
  5. package/dist/bundler/errors.d.ts +5 -0
  6. package/dist/bundler/errors.d.ts.map +1 -1
  7. package/dist/bundler/errors.js +10 -0
  8. package/dist/bundler/evaluate.d.ts.map +1 -1
  9. package/dist/bundler/evaluate.js +7 -7
  10. package/dist/bundler/factory.d.ts +3 -0
  11. package/dist/bundler/factory.d.ts.map +1 -0
  12. package/dist/bundler/factory.js +36 -0
  13. package/dist/bundler/index.d.ts +2 -1
  14. package/dist/bundler/index.d.ts.map +1 -1
  15. package/dist/bundler/index.js +1 -1
  16. package/dist/bundler/types.d.ts +7 -0
  17. package/dist/bundler/types.d.ts.map +1 -0
  18. package/dist/bundler/types.js +1 -0
  19. package/dist/client/factory.d.ts.map +1 -1
  20. package/dist/client/factory.js +34 -6
  21. package/dist/client/getDeviceDescriptor.d.ts +1 -1
  22. package/dist/client/getDeviceDescriptor.d.ts.map +1 -1
  23. package/dist/client/getDeviceDescriptor.js +18 -6
  24. package/dist/client/getWSServer.d.ts.map +1 -1
  25. package/dist/client/getWSServer.js +2 -1
  26. package/dist/client/setup-files.d.ts +12 -0
  27. package/dist/client/setup-files.d.ts.map +1 -0
  28. package/dist/client/setup-files.js +60 -0
  29. package/dist/client/store.d.ts +4 -0
  30. package/dist/client/store.d.ts.map +1 -0
  31. package/dist/client/store.js +10 -0
  32. package/dist/collector/functions.d.ts +1 -1
  33. package/dist/collector/functions.d.ts.map +1 -1
  34. package/dist/collector/functions.js +10 -2
  35. package/dist/collector/types.d.ts +1 -1
  36. package/dist/collector/types.d.ts.map +1 -1
  37. package/dist/constants.d.ts +0 -1
  38. package/dist/constants.d.ts.map +1 -1
  39. package/dist/constants.js +0 -1
  40. package/dist/disableHMRWhenReady.d.ts +2 -0
  41. package/dist/disableHMRWhenReady.d.ts.map +1 -0
  42. package/dist/disableHMRWhenReady.js +20 -0
  43. package/dist/entry-point.d.ts +2 -0
  44. package/dist/entry-point.d.ts.map +1 -0
  45. package/dist/entry-point.js +4 -0
  46. package/dist/expect/expect.d.ts +9 -0
  47. package/dist/expect/expect.d.ts.map +1 -0
  48. package/dist/expect/expect.js +77 -0
  49. package/dist/expect/index.d.ts.map +1 -1
  50. package/dist/expect/index.js +2 -0
  51. package/dist/expect/matchers/toMatchImageSnapshot.d.ts +12 -0
  52. package/dist/expect/matchers/toMatchImageSnapshot.d.ts.map +1 -0
  53. package/dist/expect/matchers/toMatchImageSnapshot.js +11 -0
  54. package/dist/expect/setup.js +2 -0
  55. package/dist/filtering/index.d.ts +2 -0
  56. package/dist/filtering/index.d.ts.map +1 -0
  57. package/dist/filtering/index.js +1 -0
  58. package/dist/filtering/testNameFilter.d.ts +12 -0
  59. package/dist/filtering/testNameFilter.d.ts.map +1 -0
  60. package/dist/filtering/testNameFilter.js +56 -0
  61. package/dist/globals.d.ts +6 -2
  62. package/dist/globals.d.ts.map +1 -1
  63. package/dist/globals.js +7 -1
  64. package/dist/index.d.ts +3 -0
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +3 -0
  67. package/dist/initialize.js +14 -6
  68. package/dist/jest-mock.d.ts +2 -0
  69. package/dist/jest-mock.d.ts.map +1 -0
  70. package/dist/jest-mock.js +25 -0
  71. package/dist/mocker/index.d.ts +1 -1
  72. package/dist/mocker/index.d.ts.map +1 -1
  73. package/dist/mocker/index.js +1 -1
  74. package/dist/mocker/registry.d.ts +2 -3
  75. package/dist/mocker/registry.d.ts.map +1 -1
  76. package/dist/mocker/registry.js +25 -16
  77. package/dist/namespace.d.ts +18 -0
  78. package/dist/namespace.d.ts.map +1 -0
  79. package/dist/namespace.js +19 -0
  80. package/dist/render/ErrorBoundary.d.ts +17 -0
  81. package/dist/render/ErrorBoundary.d.ts.map +1 -0
  82. package/dist/render/ErrorBoundary.js +73 -0
  83. package/dist/render/TestComponentOverlay.d.ts +3 -0
  84. package/dist/render/TestComponentOverlay.d.ts.map +1 -0
  85. package/dist/render/TestComponentOverlay.js +36 -0
  86. package/dist/render/cleanup.d.ts +2 -0
  87. package/dist/render/cleanup.d.ts.map +1 -0
  88. package/dist/render/cleanup.js +6 -0
  89. package/dist/render/index.d.ts +6 -0
  90. package/dist/render/index.d.ts.map +1 -0
  91. package/dist/render/index.js +66 -0
  92. package/dist/render/queries.d.ts +7 -0
  93. package/dist/render/queries.d.ts.map +1 -0
  94. package/dist/render/queries.js +99 -0
  95. package/dist/render/setup.d.ts +2 -0
  96. package/dist/render/setup.d.ts.map +1 -0
  97. package/dist/render/setup.js +7 -0
  98. package/dist/render/types.d.ts +12 -0
  99. package/dist/render/types.d.ts.map +1 -0
  100. package/dist/render/types.js +1 -0
  101. package/dist/runner/context.d.ts +10 -0
  102. package/dist/runner/context.d.ts.map +1 -0
  103. package/dist/runner/context.js +6 -0
  104. package/dist/runner/errors.d.ts +4 -2
  105. package/dist/runner/errors.d.ts.map +1 -1
  106. package/dist/runner/errors.js +21 -3
  107. package/dist/runner/factory.d.ts.map +1 -1
  108. package/dist/runner/factory.js +6 -1
  109. package/dist/runner/runSuite.d.ts.map +1 -1
  110. package/dist/runner/runSuite.js +59 -7
  111. package/dist/screen/index.d.ts +8 -0
  112. package/dist/screen/index.d.ts.map +1 -0
  113. package/dist/screen/index.js +18 -0
  114. package/dist/symbolicate.d.ts +3 -0
  115. package/dist/symbolicate.d.ts.map +1 -0
  116. package/dist/symbolicate.js +19 -0
  117. package/dist/tsconfig.lib.tsbuildinfo +1 -1
  118. package/dist/ui/ReadyScreen.d.ts.map +1 -1
  119. package/dist/ui/ReadyScreen.js +3 -10
  120. package/dist/ui/WrongEnvironmentScreen.d.ts.map +1 -1
  121. package/dist/ui/WrongEnvironmentScreen.js +2 -10
  122. package/dist/ui/state.d.ts +14 -1
  123. package/dist/ui/state.d.ts.map +1 -1
  124. package/dist/ui/state.js +22 -0
  125. package/dist/userEvent/index.d.ts +6 -0
  126. package/dist/userEvent/index.d.ts.map +1 -0
  127. package/dist/userEvent/index.js +10 -0
  128. package/dist/utils/emitter.d.ts.map +1 -1
  129. package/dist/waitFor.d.ts +21 -0
  130. package/dist/waitFor.d.ts.map +1 -0
  131. package/dist/waitFor.js +137 -0
  132. package/eslint.config.mjs +1 -7
  133. package/out-tsc/vitest/src/__tests__/collector.test.d.ts +2 -0
  134. package/out-tsc/vitest/src/__tests__/collector.test.d.ts.map +1 -0
  135. package/out-tsc/vitest/src/__tests__/error-handling.test.d.ts +2 -0
  136. package/out-tsc/vitest/src/__tests__/error-handling.test.d.ts.map +1 -0
  137. package/out-tsc/vitest/src/__tests__/expect.test.d.ts +2 -0
  138. package/out-tsc/vitest/src/__tests__/expect.test.d.ts.map +1 -0
  139. package/out-tsc/vitest/src/__tests__/spy.test.d.ts +2 -0
  140. package/out-tsc/vitest/src/__tests__/spy.test.d.ts.map +1 -0
  141. package/out-tsc/vitest/src/bundler/bundle.d.ts +2 -0
  142. package/out-tsc/vitest/src/bundler/bundle.d.ts.map +1 -0
  143. package/out-tsc/vitest/src/bundler/errors.d.ts +15 -0
  144. package/out-tsc/vitest/src/bundler/errors.d.ts.map +1 -0
  145. package/out-tsc/vitest/src/bundler/evaluate.d.ts +2 -0
  146. package/out-tsc/vitest/src/bundler/evaluate.d.ts.map +1 -0
  147. package/out-tsc/vitest/src/bundler/factory.d.ts +3 -0
  148. package/out-tsc/vitest/src/bundler/factory.d.ts.map +1 -0
  149. package/out-tsc/vitest/src/bundler/index.d.ts +4 -0
  150. package/out-tsc/vitest/src/bundler/index.d.ts.map +1 -0
  151. package/out-tsc/vitest/src/bundler/types.d.ts +7 -0
  152. package/out-tsc/vitest/src/bundler/types.d.ts.map +1 -0
  153. package/out-tsc/vitest/src/client/factory.d.ts +2 -0
  154. package/out-tsc/vitest/src/client/factory.d.ts.map +1 -0
  155. package/out-tsc/vitest/src/client/getDeviceDescriptor.d.ts +8 -0
  156. package/out-tsc/vitest/src/client/getDeviceDescriptor.d.ts.map +1 -0
  157. package/out-tsc/vitest/src/client/getWSServer.d.ts +2 -0
  158. package/out-tsc/vitest/src/client/getWSServer.d.ts.map +1 -0
  159. package/out-tsc/vitest/src/client/index.d.ts +2 -0
  160. package/out-tsc/vitest/src/client/index.d.ts.map +1 -0
  161. package/out-tsc/vitest/src/client/setup-files.d.ts +12 -0
  162. package/out-tsc/vitest/src/client/setup-files.d.ts.map +1 -0
  163. package/out-tsc/vitest/src/client/store.d.ts +4 -0
  164. package/out-tsc/vitest/src/client/store.d.ts.map +1 -0
  165. package/out-tsc/vitest/src/collector/errors.d.ts +8 -0
  166. package/out-tsc/vitest/src/collector/errors.d.ts.map +1 -0
  167. package/out-tsc/vitest/src/collector/factory.d.ts +3 -0
  168. package/out-tsc/vitest/src/collector/factory.d.ts.map +1 -0
  169. package/out-tsc/vitest/src/collector/functions.d.ts +22 -0
  170. package/out-tsc/vitest/src/collector/functions.d.ts.map +1 -0
  171. package/out-tsc/vitest/src/collector/index.d.ts +5 -0
  172. package/out-tsc/vitest/src/collector/index.d.ts.map +1 -0
  173. package/out-tsc/vitest/src/collector/types.d.ts +10 -0
  174. package/out-tsc/vitest/src/collector/types.d.ts.map +1 -0
  175. package/out-tsc/vitest/src/collector/validation.d.ts +4 -0
  176. package/out-tsc/vitest/src/collector/validation.d.ts.map +1 -0
  177. package/out-tsc/vitest/src/constants.d.ts +2 -0
  178. package/out-tsc/vitest/src/constants.d.ts.map +1 -0
  179. package/out-tsc/vitest/src/entry-point.d.ts +2 -0
  180. package/out-tsc/vitest/src/entry-point.d.ts.map +1 -0
  181. package/out-tsc/vitest/src/errors.d.ts +6 -0
  182. package/out-tsc/vitest/src/errors.d.ts.map +1 -0
  183. package/out-tsc/vitest/src/expect/index.d.ts +14 -0
  184. package/out-tsc/vitest/src/expect/index.d.ts.map +1 -0
  185. package/out-tsc/vitest/src/expect/matchers/toMatchImageSnapshot.d.ts +7 -0
  186. package/out-tsc/vitest/src/expect/matchers/toMatchImageSnapshot.d.ts.map +1 -0
  187. package/out-tsc/vitest/src/expect/setup.d.ts +2 -0
  188. package/out-tsc/vitest/src/expect/setup.d.ts.map +1 -0
  189. package/out-tsc/vitest/src/filtering/index.d.ts +2 -0
  190. package/out-tsc/vitest/src/filtering/index.d.ts.map +1 -0
  191. package/out-tsc/vitest/src/filtering/testNameFilter.d.ts +12 -0
  192. package/out-tsc/vitest/src/filtering/testNameFilter.d.ts.map +1 -0
  193. package/out-tsc/vitest/src/globals.d.ts +8 -0
  194. package/out-tsc/vitest/src/globals.d.ts.map +1 -0
  195. package/out-tsc/vitest/src/index.d.ts +13 -0
  196. package/out-tsc/vitest/src/index.d.ts.map +1 -0
  197. package/out-tsc/vitest/src/initialize.d.ts +2 -0
  198. package/out-tsc/vitest/src/initialize.d.ts.map +1 -0
  199. package/out-tsc/vitest/src/jest-mock.d.ts +2 -0
  200. package/out-tsc/vitest/src/jest-mock.d.ts.map +1 -0
  201. package/out-tsc/vitest/src/mocker/index.d.ts +2 -0
  202. package/out-tsc/vitest/src/mocker/index.d.ts.map +1 -0
  203. package/out-tsc/vitest/src/mocker/registry.d.ts +7 -0
  204. package/out-tsc/vitest/src/mocker/registry.d.ts.map +1 -0
  205. package/out-tsc/vitest/src/mocker/types.d.ts +6 -0
  206. package/out-tsc/vitest/src/mocker/types.d.ts.map +1 -0
  207. package/out-tsc/vitest/src/namespace.d.ts +18 -0
  208. package/out-tsc/vitest/src/namespace.d.ts.map +1 -0
  209. package/out-tsc/vitest/src/render/ErrorBoundary.d.ts +17 -0
  210. package/out-tsc/vitest/src/render/ErrorBoundary.d.ts.map +1 -0
  211. package/out-tsc/vitest/src/render/TestComponentOverlay.d.ts +3 -0
  212. package/out-tsc/vitest/src/render/TestComponentOverlay.d.ts.map +1 -0
  213. package/out-tsc/vitest/src/render/cleanup.d.ts +2 -0
  214. package/out-tsc/vitest/src/render/cleanup.d.ts.map +1 -0
  215. package/out-tsc/vitest/src/render/index.d.ts +6 -0
  216. package/out-tsc/vitest/src/render/index.d.ts.map +1 -0
  217. package/out-tsc/vitest/src/render/setup.d.ts +2 -0
  218. package/out-tsc/vitest/src/render/setup.d.ts.map +1 -0
  219. package/out-tsc/vitest/src/render/types.d.ts +12 -0
  220. package/out-tsc/vitest/src/render/types.d.ts.map +1 -0
  221. package/out-tsc/vitest/src/runner/errors.d.ts +11 -0
  222. package/out-tsc/vitest/src/runner/errors.d.ts.map +1 -0
  223. package/out-tsc/vitest/src/runner/factory.d.ts +3 -0
  224. package/out-tsc/vitest/src/runner/factory.d.ts.map +1 -0
  225. package/out-tsc/vitest/src/runner/hooks.d.ts +4 -0
  226. package/out-tsc/vitest/src/runner/hooks.d.ts.map +1 -0
  227. package/out-tsc/vitest/src/runner/index.d.ts +4 -0
  228. package/out-tsc/vitest/src/runner/index.d.ts.map +1 -0
  229. package/out-tsc/vitest/src/runner/runSuite.d.ts +4 -0
  230. package/out-tsc/vitest/src/runner/runSuite.d.ts.map +1 -0
  231. package/out-tsc/vitest/src/runner/types.d.ts +13 -0
  232. package/out-tsc/vitest/src/runner/types.d.ts.map +1 -0
  233. package/out-tsc/vitest/src/screen/index.d.ts +8 -0
  234. package/out-tsc/vitest/src/screen/index.d.ts.map +1 -0
  235. package/out-tsc/vitest/src/spy/index.d.ts +2 -0
  236. package/out-tsc/vitest/src/spy/index.d.ts.map +1 -0
  237. package/out-tsc/vitest/src/symbolicate.d.ts +3 -0
  238. package/out-tsc/vitest/src/symbolicate.d.ts.map +1 -0
  239. package/out-tsc/vitest/src/ui/ReadyScreen.d.ts +2 -0
  240. package/out-tsc/vitest/src/ui/ReadyScreen.d.ts.map +1 -0
  241. package/out-tsc/vitest/src/ui/WrongEnvironmentScreen.d.ts +2 -0
  242. package/out-tsc/vitest/src/ui/WrongEnvironmentScreen.d.ts.map +1 -0
  243. package/out-tsc/vitest/src/ui/index.d.ts +2 -0
  244. package/out-tsc/vitest/src/ui/index.d.ts.map +1 -0
  245. package/out-tsc/vitest/src/ui/state.d.ts +20 -0
  246. package/out-tsc/vitest/src/ui/state.d.ts.map +1 -0
  247. package/out-tsc/vitest/src/userEvent/index.d.ts +6 -0
  248. package/out-tsc/vitest/src/userEvent/index.d.ts.map +1 -0
  249. package/out-tsc/vitest/src/utils/dev-server.d.ts +2 -0
  250. package/out-tsc/vitest/src/utils/dev-server.d.ts.map +1 -0
  251. package/out-tsc/vitest/src/utils/emitter.d.ts +16 -0
  252. package/out-tsc/vitest/src/utils/emitter.d.ts.map +1 -0
  253. package/out-tsc/vitest/src/waitFor.d.ts +21 -0
  254. package/out-tsc/vitest/src/waitFor.d.ts.map +1 -0
  255. package/out-tsc/vitest/tsconfig.spec.tsbuildinfo +1 -0
  256. package/out-tsc/vitest/vite.config.d.ts +3 -0
  257. package/out-tsc/vitest/vite.config.d.ts.map +1 -0
  258. package/package.json +22 -14
  259. package/src/__tests__/collector.test.ts +55 -55
  260. package/src/__tests__/error-handling.test.ts +34 -34
  261. package/src/__tests__/expect.test.ts +13 -5
  262. package/src/__tests__/initialize.test.ts +24 -0
  263. package/src/bundler/bundle.ts +9 -2
  264. package/src/bundler/errors.ts +10 -0
  265. package/src/bundler/evaluate.ts +9 -9
  266. package/src/bundler/factory.ts +43 -0
  267. package/src/bundler/index.ts +2 -1
  268. package/src/bundler/types.ts +7 -0
  269. package/src/client/factory.ts +53 -11
  270. package/src/client/getDeviceDescriptor.ts +29 -8
  271. package/src/client/getWSServer.ts +2 -1
  272. package/src/client/setup-files.ts +81 -0
  273. package/src/collector/functions.ts +18 -2
  274. package/src/collector/types.ts +4 -1
  275. package/src/constants.ts +0 -1
  276. package/src/disableHMRWhenReady.ts +27 -0
  277. package/src/entry-point.ts +8 -0
  278. package/src/expect/index.ts +8 -2
  279. package/src/expect/setup.ts +3 -0
  280. package/src/filtering/index.ts +4 -0
  281. package/src/filtering/testNameFilter.ts +82 -0
  282. package/src/globals.ts +15 -2
  283. package/src/index.ts +3 -0
  284. package/src/initialize.ts +21 -8
  285. package/src/jest-mock.ts +32 -0
  286. package/src/mocker/index.ts +6 -1
  287. package/src/mocker/metro-require.d.ts +2 -0
  288. package/src/mocker/registry.ts +29 -18
  289. package/src/namespace.ts +41 -0
  290. package/src/react-native.d.ts +35 -6
  291. package/src/render/ErrorBoundary.tsx +108 -0
  292. package/src/render/TestComponentOverlay.tsx +47 -0
  293. package/src/render/cleanup.ts +7 -0
  294. package/src/render/index.ts +96 -0
  295. package/src/render/setup.ts +8 -0
  296. package/src/render/types.ts +11 -0
  297. package/src/runner/errors.ts +35 -5
  298. package/src/runner/factory.ts +8 -1
  299. package/src/runner/runSuite.ts +70 -9
  300. package/src/symbolicate.ts +24 -0
  301. package/src/ui/ReadyScreen.tsx +2 -12
  302. package/src/ui/WrongEnvironmentScreen.tsx +1 -19
  303. package/src/ui/state.ts +39 -0
  304. package/src/utils/emitter.ts +1 -0
  305. package/src/waitFor.ts +199 -0
  306. package/tsconfig.spec.json +7 -3
  307. package/tsconfig.tsbuildinfo +1 -1
  308. package/assets/logo.png +0 -0
  309. package/assets/moduleSystem.flow.js +0 -1062
  310. package/types/global.d.ts +0 -2
  311. package/types/index.d.ts +0 -1
@@ -0,0 +1,6 @@
1
+ import { store } from '../ui/state.js';
2
+ export const cleanup = () => {
3
+ store.getState().setRenderedElement(null);
4
+ store.getState().setOnLayoutCallback(null);
5
+ store.getState().setOnRenderCallback(null);
6
+ };
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ import type { RenderResult, RenderOptions } from './types.js';
3
+ export declare const render: (element: React.ReactElement, options?: RenderOptions) => Promise<RenderResult>;
4
+ export { cleanup } from './cleanup.js';
5
+ export type { RenderResult, RenderOptions } from './types.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/render/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAY9D,eAAO,MAAM,MAAM,GACjB,SAAS,KAAK,CAAC,YAAY,EAC3B,UAAS,aAAkB,KAC1B,OAAO,CAAC,YAAY,CA2EtB,CAAC;AAEF,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,66 @@
1
+ import React from 'react';
2
+ import { store } from '../ui/state.js';
3
+ const wrapElement = (element, wrapper) => {
4
+ if (!wrapper) {
5
+ return element;
6
+ }
7
+ return React.createElement(wrapper, { children: element });
8
+ };
9
+ export const render = async (element, options = {}) => {
10
+ const { timeout = 1000, wrapper } = options;
11
+ // If an element is already rendered, unmount it first
12
+ if (store.getState().renderedElement !== null) {
13
+ store.getState().setRenderedElement(null);
14
+ store.getState().setOnLayoutCallback(null);
15
+ store.getState().setOnRenderCallback(null);
16
+ }
17
+ // Create a promise that resolves when the element is laid out
18
+ const layoutPromise = new Promise((resolve, reject) => {
19
+ const timeoutId = setTimeout(() => {
20
+ store.getState().setOnLayoutCallback(null);
21
+ reject(new Error(`Render timeout: Element did not mount within ${timeout}ms`));
22
+ }, timeout);
23
+ store.getState().setOnLayoutCallback(() => {
24
+ clearTimeout(timeoutId);
25
+ resolve();
26
+ });
27
+ });
28
+ // Wrap and set the element in state (key is generated automatically)
29
+ const wrappedElement = wrapElement(element, wrapper);
30
+ store.getState().setRenderedElement(wrappedElement);
31
+ // Wait for layout
32
+ await layoutPromise;
33
+ const rerender = async (newElement) => {
34
+ if (store.getState().renderedElement === null) {
35
+ throw new Error('No element is currently rendered. Call render() first.');
36
+ }
37
+ // Create a promise that resolves when the element is re-rendered
38
+ const renderPromise = new Promise((resolve, reject) => {
39
+ const timeoutId = setTimeout(() => {
40
+ store.getState().setOnRenderCallback(null);
41
+ reject(new Error(`Rerender timeout: Element did not update within ${timeout}ms`));
42
+ }, timeout);
43
+ store.getState().setOnRenderCallback(() => {
44
+ clearTimeout(timeoutId);
45
+ resolve();
46
+ });
47
+ });
48
+ const wrappedNewElement = wrapElement(newElement, wrapper);
49
+ store.getState().updateRenderedElement(wrappedNewElement);
50
+ // Wait for render
51
+ await renderPromise;
52
+ };
53
+ const unmount = () => {
54
+ if (store.getState().renderedElement === null) {
55
+ return;
56
+ }
57
+ store.getState().setRenderedElement(null);
58
+ store.getState().setOnLayoutCallback(null);
59
+ store.getState().setOnRenderCallback(null);
60
+ };
61
+ return {
62
+ rerender,
63
+ unmount,
64
+ };
65
+ };
66
+ export { cleanup } from './cleanup.js';
@@ -0,0 +1,7 @@
1
+ import { HostInstance } from 'react-native';
2
+ export declare const setRoot: (rootInstance: HostInstance) => void;
3
+ declare const queryByTestId: (params: string) => import("react-native/types_generated/src/private/webapis/dom/nodes/ReactNativeElement").default | null, queryAllByTestId: (params: string) => import("react-native/types_generated/src/private/webapis/dom/nodes/ReactNativeElement").default[], getByTestId: (params: string) => import("react-native/types_generated/src/private/webapis/dom/nodes/ReactNativeElement").default | null, getAllByTestId: (params: string) => import("react-native/types_generated/src/private/webapis/dom/nodes/ReactNativeElement").default[], findByTestId: (params: string) => Promise<import("react-native/types_generated/src/private/webapis/dom/nodes/ReactNativeElement").default>, findAllByTestId: (params: string) => Promise<import("react-native/types_generated/src/private/webapis/dom/nodes/ReactNativeElement").default[]>;
4
+ declare const queryById: (params: string) => import("react-native/types_generated/src/private/webapis/dom/nodes/ReactNativeElement").default | null, queryAllById: (params: string) => import("react-native/types_generated/src/private/webapis/dom/nodes/ReactNativeElement").default[], getId: (params: string) => import("react-native/types_generated/src/private/webapis/dom/nodes/ReactNativeElement").default | null, getAllById: (params: string) => import("react-native/types_generated/src/private/webapis/dom/nodes/ReactNativeElement").default[], findById: (params: string) => Promise<import("react-native/types_generated/src/private/webapis/dom/nodes/ReactNativeElement").default>, findAllById: (params: string) => Promise<import("react-native/types_generated/src/private/webapis/dom/nodes/ReactNativeElement").default[]>;
5
+ export { queryByTestId, queryAllByTestId, getByTestId, getAllByTestId, findByTestId, findAllByTestId, };
6
+ export { queryById, queryAllById, getId, getAllById, findById, findAllById };
7
+ //# sourceMappingURL=queries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../src/render/queries.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAM5C,eAAO,MAAM,OAAO,GAAI,cAAc,YAAY,SAEjD,CAAC;AA6IF,QAAA,MACW,aAAa,8HACV,gBAAgB,yHACrB,WAAW,8HACR,cAAc,yHAChB,YAAY,gIACT,eAAe,gIAG3B,CAAC;AACF,QAAA,MACW,SAAS,8HACN,YAAY,yHACjB,KAAK,8HACF,UAAU,yHACZ,QAAQ,gIACL,WAAW,gIAC+B,CAAC;AAExD,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,WAAW,EACX,cAAc,EACd,YAAY,EACZ,eAAe,GAChB,CAAC;AAEF,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC"}
@@ -0,0 +1,99 @@
1
+ // import { store } from '../ui/state.js';
2
+ import { waitUntil } from '../waitFor.js';
3
+ let root = null;
4
+ export const setRoot = (rootInstance) => {
5
+ root = rootInstance;
6
+ };
7
+ const getRoot = () => {
8
+ const container = root;
9
+ if (!container) {
10
+ throw new Error('You need to render a component first!');
11
+ }
12
+ const ownerDocument = container.ownerDocument;
13
+ if (!ownerDocument) {
14
+ throw new Error('This feature is supported in React Native 0.82 and later!');
15
+ }
16
+ return ownerDocument.getRootNode();
17
+ };
18
+ const findNodeByPredicate = (predicate) => {
19
+ const queue = [getRoot()];
20
+ while (queue.length > 0) {
21
+ const node = queue.shift();
22
+ if (predicate(node)) {
23
+ return node;
24
+ }
25
+ for (const child of node.children) {
26
+ queue.push(child);
27
+ }
28
+ }
29
+ return null;
30
+ };
31
+ const findNodesByPredicate = (predicate) => {
32
+ const nodes = [];
33
+ const queue = [getRoot()];
34
+ while (queue.length > 0) {
35
+ const node = queue.shift();
36
+ if (predicate(node)) {
37
+ nodes.push(node);
38
+ }
39
+ for (const child of node.children) {
40
+ queue.push(child);
41
+ }
42
+ }
43
+ return nodes;
44
+ };
45
+ const getFiberOfHostInstance = (hostInstance) => {
46
+ // This should be considered as 'reaching into the implementation details' of React Native.
47
+ // Not perfect, but it's the only way to get the props of the host instance.
48
+ return (hostInstance
49
+ .__internalInstanceHandle || null);
50
+ };
51
+ const getPropsOfHostInstance = (hostInstance) => {
52
+ return getFiberOfHostInstance(hostInstance)?.memoizedProps || {};
53
+ };
54
+ const findBy = (predicate, options) => {
55
+ return waitUntil(() => findNodeByPredicate(predicate), options);
56
+ };
57
+ const findAllBy = (predicate, options) => {
58
+ return waitUntil(() => {
59
+ const nodes = findNodesByPredicate(predicate);
60
+ if (nodes.length === 0) {
61
+ return null;
62
+ }
63
+ return nodes;
64
+ }, options);
65
+ };
66
+ const queryBy = (predicate) => {
67
+ return findNodeByPredicate(predicate);
68
+ };
69
+ const queryAllBy = (predicate) => {
70
+ return findNodesByPredicate(predicate);
71
+ };
72
+ const getBy = (predicate) => {
73
+ const node = queryBy(predicate);
74
+ if (!node) {
75
+ throw new Error(`No node found with predicate ${predicate}`);
76
+ }
77
+ return node;
78
+ };
79
+ const getAllBy = (predicate) => {
80
+ const nodes = queryAllBy(predicate);
81
+ if (nodes.length === 0) {
82
+ throw new Error(`No nodes found with predicate ${predicate}`);
83
+ }
84
+ return nodes;
85
+ };
86
+ const createQueries = (predicate) => {
87
+ return {
88
+ findBy: (params) => findBy((node) => predicate(node, params)),
89
+ findAllBy: (params) => findAllBy((node) => predicate(node, params)),
90
+ queryBy: (params) => queryBy((node) => predicate(node, params)),
91
+ queryAllBy: (params) => queryAllBy((node) => predicate(node, params)),
92
+ getBy: (params) => getBy((node) => predicate(node, params)),
93
+ getAllBy: (params) => getAllBy((node) => predicate(node, params)),
94
+ };
95
+ };
96
+ const { queryBy: queryByTestId, queryAllBy: queryAllByTestId, getBy: getByTestId, getAllBy: getAllByTestId, findBy: findByTestId, findAllBy: findAllByTestId, } = createQueries((node, testId) => getPropsOfHostInstance(node).testID === testId);
97
+ const { queryBy: queryById, queryAllBy: queryAllById, getBy: getId, getAllBy: getAllById, findBy: findById, findAllBy: findAllById, } = createQueries((node, id) => node.id === id);
98
+ export { queryByTestId, queryAllByTestId, getByTestId, getAllByTestId, findByTestId, findAllByTestId, };
99
+ export { queryById, queryAllById, getId, getAllById, findById, findAllById };
@@ -0,0 +1,2 @@
1
+ export declare const setup: () => void;
2
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/render/setup.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,KAAK,YAIjB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { afterEach } from '../collector/functions.js';
2
+ import { cleanup } from './cleanup.js';
3
+ export const setup = () => {
4
+ afterEach(() => {
5
+ cleanup();
6
+ });
7
+ };
@@ -0,0 +1,12 @@
1
+ import type React from 'react';
2
+ export type RenderResult = {
3
+ rerender: (element: React.ReactElement) => Promise<void>;
4
+ unmount: () => void;
5
+ };
6
+ export type RenderOptions = {
7
+ timeout?: number;
8
+ wrapper?: React.ComponentType<{
9
+ children: React.ReactNode;
10
+ }>;
11
+ };
12
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/render/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;QAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;KAAE,CAAC,CAAC;CAC9D,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,10 @@
1
+ export type HarnessContext = {
2
+ testFilePath: string;
3
+ runner: string;
4
+ };
5
+ declare global {
6
+ var HARNESS_CONTEXT: HarnessContext;
7
+ }
8
+ export declare const getHarnessContext: () => HarnessContext;
9
+ export declare const setHarnessContext: (context: HarnessContext) => void;
10
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/runner/context.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,OAAO,CAAC,MAAM,CAAC;IACb,IAAI,eAAe,EAAE,cAAc,CAAC;CACrC;AAED,eAAO,MAAM,iBAAiB,QAAO,cAEpC,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,SAAS,cAAc,KAAG,IAE3D,CAAC"}
@@ -0,0 +1,6 @@
1
+ export const getHarnessContext = () => {
2
+ return globalThis['HARNESS_CONTEXT'];
3
+ };
4
+ export const setHarnessContext = (context) => {
5
+ globalThis['HARNESS_CONTEXT'] = context;
6
+ };
@@ -1,9 +1,11 @@
1
- import type { SerializedError } from '@react-native-harness/bridge';
1
+ import type { SerializedError, CodeFrame } from '@react-native-harness/bridge';
2
2
  export declare class TestExecutionError extends Error {
3
3
  file: string;
4
4
  suite: string;
5
5
  test: string;
6
- constructor(error: unknown, file: string, suite: string, test: string);
6
+ codeFrame?: CodeFrame;
7
+ constructor(error: unknown, file: string, suite: string, test: string, codeFrame?: CodeFrame);
7
8
  toSerializedJSON(): SerializedError;
8
9
  }
10
+ export declare const getTestExecutionError: (error: unknown, file: string, suite: string, test: string) => Promise<TestExecutionError>;
9
11
  //# sourceMappingURL=errors.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/runner/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAEpE,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;gBAED,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IASrE,gBAAgB,IAAI,eAAe;CAcpC"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/runner/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAG/E,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,SAAS,CAAC;gBAGpB,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,SAAS,CAAC,EAAE,SAAS;IAWvB,gBAAgB,IAAI,eAAe;CAapC;AAED,eAAO,MAAM,qBAAqB,GAChC,OAAO,OAAO,EACd,MAAM,MAAM,EACZ,OAAO,MAAM,EACb,MAAM,MAAM,KACX,OAAO,CAAC,kBAAkB,CAe5B,CAAC"}
@@ -1,23 +1,41 @@
1
+ import { getCodeFrame } from '../symbolicate.js';
1
2
  export class TestExecutionError extends Error {
2
3
  file;
3
4
  suite;
4
5
  test;
5
- constructor(error, file, suite, test) {
6
+ codeFrame;
7
+ constructor(error, file, suite, test, codeFrame) {
6
8
  super('Test execution error');
7
9
  this.name = 'TestExecutionError';
8
10
  this.file = file;
9
11
  this.suite = suite;
10
12
  this.test = test;
11
13
  this.cause = error;
14
+ this.codeFrame = codeFrame;
12
15
  }
13
16
  toSerializedJSON() {
14
17
  const causeName = this.cause instanceof Error ? this.cause.name : 'Unknown name';
15
18
  const causeMessage = this.cause instanceof Error ? this.cause.message : 'Unknown message';
16
- const causeStack = this.cause instanceof Error ? this.cause.stack : undefined;
19
+ const causeCodeFrame = this.codeFrame;
17
20
  return {
18
21
  name: causeName,
19
22
  message: causeMessage,
20
- stack: causeStack,
23
+ codeFrame: causeCodeFrame,
21
24
  };
22
25
  }
23
26
  }
27
+ export const getTestExecutionError = async (error, file, suite, test) => {
28
+ try {
29
+ if (error instanceof Error) {
30
+ const codeFrame = await getCodeFrame(error);
31
+ if (codeFrame) {
32
+ return new TestExecutionError(error, file, suite, test, codeFrame);
33
+ }
34
+ }
35
+ return new TestExecutionError(error, file, suite, test);
36
+ }
37
+ catch (error) {
38
+ // If the stack cannot be symbolicated, return the original error
39
+ return new TestExecutionError(error, file, suite, test);
40
+ }
41
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/runner/factory.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,eAAO,MAAM,aAAa,QAAO,UAehC,CAAC"}
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/runner/factory.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,eAAO,MAAM,aAAa,QAAO,UAsBhC,CAAC"}
@@ -5,10 +5,15 @@ export const getTestRunner = () => {
5
5
  return {
6
6
  events,
7
7
  run: async (testSuite, testFilePath) => {
8
- return runSuite(testSuite, {
8
+ const result = await runSuite(testSuite, {
9
9
  events,
10
10
  testFilePath,
11
11
  });
12
+ // If coverage is enabled, there will be a global variable called __coverage__
13
+ if ('__coverage__' in global && !!global.__coverage__) {
14
+ result.coverage = global.__coverage__;
15
+ }
16
+ return result;
12
17
  },
13
18
  dispose: () => {
14
19
  events.clearAllListeners();
@@ -1 +1 @@
1
- {"version":3,"file":"runSuite.d.ts","sourceRoot":"","sources":["../../src/runner/runSuite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,SAAS,EACT,eAAe,EAChB,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAsH/C,eAAO,MAAM,QAAQ,GACnB,OAAO,SAAS,EAChB,SAAS,iBAAiB,KACzB,OAAO,CAAC,eAAe,CAuEzB,CAAC"}
1
+ {"version":3,"file":"runSuite.d.ts","sourceRoot":"","sources":["../../src/runner/runSuite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,SAAS,EACT,eAAe,EAChB,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAsH/C,eAAO,MAAM,QAAQ,GACnB,OAAO,SAAS,EAChB,SAAS,iBAAiB,KACzB,OAAO,CAAC,eAAe,CAoIzB,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { runHooks } from './hooks.js';
2
- import { TestExecutionError } from './errors.js';
2
+ import { getTestExecutionError } from './errors.js';
3
3
  const runTest = async (test, suite, context) => {
4
4
  const startTime = Date.now();
5
5
  // Emit test-started event
@@ -69,7 +69,7 @@ const runTest = async (test, suite, context) => {
69
69
  return result;
70
70
  }
71
71
  catch (error) {
72
- const testError = new TestExecutionError(error, context.testFilePath, suite.name, test.name);
72
+ const testError = await getTestExecutionError(error, context.testFilePath, suite.name, test.name);
73
73
  const duration = Date.now() - startTime;
74
74
  const result = {
75
75
  name: test.name,
@@ -98,6 +98,43 @@ export const runSuite = async (suite, context) => {
98
98
  name: suite.name,
99
99
  file: context.testFilePath,
100
100
  });
101
+ // Check if suite should be skipped or is todo
102
+ if (suite.status === 'skipped') {
103
+ const result = {
104
+ name: suite.name,
105
+ tests: [],
106
+ suites: [],
107
+ status: 'skipped',
108
+ duration: 0,
109
+ };
110
+ // Emit suite-finished event
111
+ context.events.emit({
112
+ type: 'suite-finished',
113
+ file: context.testFilePath,
114
+ name: suite.name,
115
+ duration: 0,
116
+ status: 'skipped',
117
+ });
118
+ return result;
119
+ }
120
+ if (suite.status === 'todo') {
121
+ const result = {
122
+ name: suite.name,
123
+ tests: [],
124
+ suites: [],
125
+ status: 'todo',
126
+ duration: 0,
127
+ };
128
+ // Emit suite-finished event
129
+ context.events.emit({
130
+ type: 'suite-finished',
131
+ file: context.testFilePath,
132
+ name: suite.name,
133
+ duration: 0,
134
+ status: 'todo',
135
+ });
136
+ return result;
137
+ }
101
138
  const testResults = [];
102
139
  const suiteResults = [];
103
140
  // Run beforeAll hooks
@@ -123,11 +160,26 @@ export const runSuite = async (suite, context) => {
123
160
  if (hasFailedTests || hasFailedSuites) {
124
161
  status = 'failed';
125
162
  }
126
- else if ((testResults.every((result) => result.status === 'skipped') &&
127
- suiteResults.every((result) => result.status === 'skipped') &&
128
- testResults.length > 0) ||
129
- suiteResults.length > 0) {
130
- status = 'skipped';
163
+ else {
164
+ // Check if all tests and suites are skipped (and there are some tests/suites to check)
165
+ const allTestsSkipped = testResults.length > 0 &&
166
+ testResults.every((result) => result.status === 'skipped');
167
+ const allSuitesSkipped = suiteResults.length > 0 &&
168
+ suiteResults.every((result) => result.status === 'skipped');
169
+ const hasAnyContent = testResults.length > 0 || suiteResults.length > 0;
170
+ if (hasAnyContent &&
171
+ ((testResults.length > 0 &&
172
+ allTestsSkipped &&
173
+ suiteResults.length === 0) ||
174
+ (suiteResults.length > 0 &&
175
+ allSuitesSkipped &&
176
+ testResults.length === 0) ||
177
+ (testResults.length > 0 &&
178
+ suiteResults.length > 0 &&
179
+ allTestsSkipped &&
180
+ allSuitesSkipped))) {
181
+ status = 'skipped';
182
+ }
131
183
  }
132
184
  // Emit suite-finished event
133
185
  context.events.emit({
@@ -0,0 +1,8 @@
1
+ import type { ElementReference, FileReference } from '@react-native-harness/bridge';
2
+ export type Screen = {
3
+ findByTestId: (testId: string) => Promise<ElementReference>;
4
+ findAllByTestId: (testId: string) => Promise<ElementReference[]>;
5
+ screenshot: (name?: string) => Promise<FileReference>;
6
+ };
7
+ export declare const screen: Screen;
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/screen/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,aAAa,EACd,MAAM,8BAA8B,CAAC;AAGtC,MAAM,MAAM,MAAM,GAAG;IACnB,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC5D,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;IACjE,UAAU,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;CACvD,CAAC;AAmBF,eAAO,MAAM,MAAM,QAAiB,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { getClientInstance } from '../client/store.js';
2
+ const createScreen = () => {
3
+ return {
4
+ findByTestId: async (testId) => {
5
+ const client = getClientInstance();
6
+ return await client.rpc['platform.queries.findByTestId'](testId);
7
+ },
8
+ findAllByTestId: async (testId) => {
9
+ const client = getClientInstance();
10
+ return await client.rpc['platform.queries.findAllByTestId'](testId);
11
+ },
12
+ screenshot: async () => {
13
+ const client = getClientInstance();
14
+ return await client.rpc['platform.actions.screenshot']();
15
+ },
16
+ };
17
+ };
18
+ export const screen = createScreen();
@@ -0,0 +1,3 @@
1
+ import type { CodeFrame } from '@react-native-harness/bridge';
2
+ export declare const getCodeFrame: (error: Error) => Promise<CodeFrame | null>;
3
+ //# sourceMappingURL=symbolicate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symbolicate.d.ts","sourceRoot":"","sources":["../src/symbolicate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAI9D,eAAO,MAAM,YAAY,GAAU,OAAO,KAAK,KAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAmBzE,CAAC"}
@@ -0,0 +1,19 @@
1
+ import parseErrorStack from 'react-native/Libraries/Core/Devtools/parseErrorStack';
2
+ import symbolicateStackTrace from 'react-native/Libraries/Core/Devtools/symbolicateStackTrace';
3
+ export const getCodeFrame = async (error) => {
4
+ const parsedStack = parseErrorStack(error.stack);
5
+ const symbolicatedStack = await symbolicateStackTrace(parsedStack);
6
+ if (!('codeFrame' in symbolicatedStack) || !symbolicatedStack.codeFrame) {
7
+ return null;
8
+ }
9
+ const codeFrame = symbolicatedStack.codeFrame;
10
+ // Normalize optionality (null -> undefined)
11
+ return {
12
+ ...codeFrame,
13
+ location: codeFrame.location
14
+ ? {
15
+ ...codeFrame.location,
16
+ }
17
+ : undefined,
18
+ };
19
+ };