peachsim 0.1.1644 → 0.1.1653

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 (608) hide show
  1. package/README.md +12 -0
  2. package/cli/app-catalog.ts +1 -1
  3. package/cli/app-fonts.ts +11 -80
  4. package/cli/app-splash.ts +18 -12
  5. package/cli/bridge-flow-runner.ts +11 -7
  6. package/cli/cloud-client.ts +10 -13
  7. package/cli/command-registry.ts +13 -4
  8. package/cli/commands/box.ts +4 -4
  9. package/cli/commands/control.ts +93 -53
  10. package/cli/commands/coverage-parser.ts +67 -0
  11. package/cli/commands/coverage.ts +550 -0
  12. package/cli/commands/debug.ts +9 -18
  13. package/cli/commands/desktop.ts +19 -7
  14. package/cli/commands/device.ts +14 -9
  15. package/cli/commands/guest-host.ts +6 -10
  16. package/cli/commands/inspect/core.ts +81 -17
  17. package/cli/commands/inspect.ts +13 -8
  18. package/cli/commands/kotlin.ts +2 -2
  19. package/cli/commands/maestro-compare.ts +1 -1
  20. package/cli/commands/platform.ts +20 -11
  21. package/cli/commands/preview.ts +16 -18
  22. package/cli/commands/runtime.ts +3 -2
  23. package/cli/commands/screenshot-layers.ts +1 -1
  24. package/cli/commands/screenshot.ts +1 -1
  25. package/cli/commands/serve.ts +5 -1
  26. package/cli/commands/support.ts +4 -4
  27. package/cli/commands/three-mode.ts +22 -15
  28. package/cli/commands/upload.ts +44 -45
  29. package/cli/current-sim.ts +38 -0
  30. package/cli/desktop-companion.ts +36 -8
  31. package/cli/device-option.ts +1 -1
  32. package/cli/drivers/playwright.ts +1 -0
  33. package/cli/drivers/types.ts +4 -0
  34. package/cli/help-core.ts +1 -1
  35. package/cli/internal-child.ts +2 -1
  36. package/cli/main.ts +9 -3
  37. package/cli/outbound-endpoints.ts +11 -3
  38. package/cli/output-redaction.ts +39 -14
  39. package/cli/remote-simulators.ts +4 -1
  40. package/cli/scene-video.ts +5 -2
  41. package/cli/send-to-box.ts +7 -10
  42. package/cli/telemetry.ts +1 -1
  43. package/cli/ws-bridge.ts +8 -1
  44. package/detox/attempt-events.cjs +3 -1
  45. package/detox/attempt-events.d.cts +1 -1
  46. package/detox/expectations.ts +108 -99
  47. package/detox/frame-offset.d.mts +6 -0
  48. package/detox/frame-offset.mjs +35 -0
  49. package/detox/gestures.ts +6 -18
  50. package/detox/index.ts +169 -101
  51. package/detox/jest-preset.cjs +1 -3
  52. package/detox/jest-transform.cjs +4 -0
  53. package/detox/matchers.ts +3 -0
  54. package/detox/motion-change.cjs +46 -114
  55. package/detox/motion-change.d.cts +5 -27
  56. package/dist-lib/agent-daemon-client.cjs +1 -1
  57. package/dist-lib/agent-events.cjs +1 -1
  58. package/dist-lib/attached-projects.cjs +1 -1
  59. package/dist-lib/auth/shared-session.cjs +1 -1
  60. package/dist-lib/backend-origin.cjs +1 -1
  61. package/dist-lib/beta.cjs +1 -1
  62. package/dist-lib/beta.mjs +1 -1
  63. package/dist-lib/bridge-constants.cjs +1 -1
  64. package/dist-lib/bridge-contract-input.cjs +65 -1
  65. package/dist-lib/bridge-contract-input.mjs +63 -1
  66. package/dist-lib/bridge-contract.cjs +19 -1
  67. package/dist-lib/bridge-contract.mjs +17 -1
  68. package/dist-lib/bundle-channel.cjs +38091 -14846
  69. package/dist-lib/capture-contract.cjs +1 -1
  70. package/dist-lib/capture-contract.mjs +1 -1
  71. package/dist-lib/cloud-contract.cjs +1 -1
  72. package/dist-lib/cloud-contract.mjs +1 -1
  73. package/dist-lib/cloud-test-args.cjs +1 -1
  74. package/dist-lib/cloud-test-args.mjs +1 -1
  75. package/dist-lib/cloud.cjs +1 -1
  76. package/dist-lib/cloud.mjs +1 -1
  77. package/dist-lib/config.cjs +1 -1
  78. package/dist-lib/config.mjs +5 -3
  79. package/dist-lib/detox/index.cjs +1244 -4509
  80. package/dist-lib/detox/jest-preset.cjs +1 -3
  81. package/dist-lib/detox/jest-transform.cjs +4 -0
  82. package/dist-lib/dev-bundle-resolution.cjs +28 -24
  83. package/dist-lib/expo-swift-bundle.cjs +35049 -13125
  84. package/dist-lib/expo-swift-metadata.cjs +1 -1
  85. package/dist-lib/expo-swift-metadata.mjs +1 -1
  86. package/dist-lib/home-paths.cjs +1 -1
  87. package/dist-lib/host/bridge-host.cjs +45112 -63143
  88. package/dist-lib/host/fetch-proxy-handler.cjs +3544 -11
  89. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  90. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  91. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  92. package/dist-lib/host/websocket-proxy.cjs +1 -1
  93. package/dist-lib/index.cjs +1909 -2029
  94. package/dist-lib/jump-to-source-babel.cjs +1 -1
  95. package/dist-lib/jump-to-source-native.cjs +1 -1
  96. package/dist-lib/kotlin-host.cjs +2 -2
  97. package/dist-lib/menu.cjs +1 -1
  98. package/dist-lib/menu.mjs +1 -1
  99. package/dist-lib/metro-fingerprint-registry.cjs +1 -1
  100. package/dist-lib/metro-fingerprint-registry.mjs +1 -1
  101. package/dist-lib/metro-production-bundle.cjs +1 -1
  102. package/dist-lib/metro-production-bundle.mjs +1 -1
  103. package/dist-lib/metro.cjs +380 -522
  104. package/dist-lib/native-app-identity-project.cjs +39 -252
  105. package/dist-lib/native-app-identity-project.mjs +1174 -11
  106. package/dist-lib/native-app-identity.cjs +8 -3
  107. package/dist-lib/native-app-identity.mjs +8 -3
  108. package/dist-lib/native-firebase-metadata.cjs +1 -1
  109. package/dist-lib/native-firebase-metadata.mjs +1 -1
  110. package/dist-lib/plist.cjs +2 -244
  111. package/dist-lib/plist.mjs +1 -1
  112. package/dist-lib/profiles.cjs +1 -1
  113. package/dist-lib/public-brand.cjs +1 -1
  114. package/dist-lib/public-origins-lib-esm.json +290 -0
  115. package/dist-lib/public-origins-lib-static.json +1 -0
  116. package/dist-lib/public-origins-lib.json +1852 -0
  117. package/dist-lib/react-native-host-modules.cjs +1 -1
  118. package/dist-lib/react-native-host-modules.mjs +1 -1
  119. package/dist-lib/scripts/dev-server-scanner.cjs +14 -253
  120. package/dist-lib/sdk.cjs +83 -16
  121. package/dist-lib/sdk.mjs +81 -15
  122. package/dist-lib/skills.cjs +50546 -75098
  123. package/dist-lib/swift-compile.cjs +25897 -1070
  124. package/dist-lib/swift-compile.mjs +25866 -1033
  125. package/dist-lib/swift-package.cjs +79 -1
  126. package/dist-lib/swift-package.mjs +75 -1
  127. package/dist-lib/swift-submit.cjs +1 -1
  128. package/dist-lib/swift-submit.mjs +1 -1
  129. package/dist-lib/swift-toolchain.cjs +1 -1
  130. package/dist-lib/swift.cjs +1 -1
  131. package/dist-lib/vite-swift.cjs +34273 -12349
  132. package/dist-lib/vite.cjs +373 -298
  133. package/dist-lib/worklet-executable.cjs +1 -1
  134. package/dist-lib/worklet-executable.mjs +1 -1
  135. package/dist-types/packages/peach-compat/src/engine-config.d.ts +2 -0
  136. package/dist-types/packages/peach-compat/src/stubs/form-sheet-spring.d.ts +9 -0
  137. package/dist-types/packages/peach-compat/src/stubs/native-evaluation-lease.d.ts +47 -0
  138. package/dist-types/packages/peach-compat/src/stubs/native-seams/react-native-cookies.d.ts +113 -0
  139. package/dist-types/packages/peach-compat/src/stubs/native-seams/react-native-gesture-handler.d.ts +154 -0
  140. package/dist-types/packages/peach-compat/src/stubs/screen-transition-math.d.ts +756 -0
  141. package/dist-types/packages/peach-compat/src/stubs/transition-scalar.d.ts +25 -0
  142. package/dist-types/packages/peach-engine/src/billing/plans.d.ts +64 -0
  143. package/dist-types/packages/peach-engine/src/browser-page-target.d.ts +2 -0
  144. package/dist-types/packages/peach-engine/src/bundle-platform-url.d.ts +3 -0
  145. package/dist-types/packages/peach-engine/src/capture/browser-accessibility-host.d.ts +3 -0
  146. package/dist-types/packages/peach-engine/src/capture/browser-composite.d.ts +55 -0
  147. package/dist-types/packages/peach-engine/src/capture/browserAccessibilityContract.d.ts +27 -0
  148. package/dist-types/packages/peach-engine/src/capture/nativeScreenCaptureContract.d.ts +22 -0
  149. package/dist-types/packages/peach-engine/src/cli-companion.d.ts +36 -0
  150. package/dist-types/packages/peach-engine/src/components/native-ui/webview-frame-bridge.d.ts +34 -0
  151. package/dist-types/packages/peach-engine/src/config.d.ts +5 -0
  152. package/dist-types/packages/peach-engine/src/engine/android-stretch-effect.d.ts +57 -0
  153. package/dist-types/packages/peach-engine/src/engine/animated-driven-style.d.ts +47 -0
  154. package/dist-types/packages/peach-engine/src/engine/animated-value.d.ts +5 -0
  155. package/dist-types/packages/peach-engine/src/engine/animated.d.ts +195 -0
  156. package/dist-types/packages/peach-engine/src/engine/animation-clockContract.d.ts +15 -0
  157. package/dist-types/packages/peach-engine/src/engine/animation-graph.d.ts +148 -0
  158. package/dist-types/packages/peach-engine/src/engine/app-catalog-wire.d.ts +10 -0
  159. package/dist-types/packages/peach-engine/src/engine/app-font-registry.d.ts +87 -0
  160. package/dist-types/packages/peach-engine/src/engine/attributed-paragraph-paint.d.ts +7 -0
  161. package/dist-types/packages/peach-engine/src/engine/attributed-paragraph.d.ts +123 -0
  162. package/dist-types/packages/peach-engine/src/engine/audioContract.d.ts +16 -0
  163. package/dist-types/packages/peach-engine/src/engine/canvaskit-api.d.ts +93 -0
  164. package/dist-types/packages/peach-engine/src/engine/canvaskit-renderer.d.ts +216 -0
  165. package/dist-types/packages/peach-engine/src/engine/config-plugin-fonts.d.ts +40 -0
  166. package/dist-types/packages/peach-engine/src/engine/config-plugin-splash.d.ts +25 -0
  167. package/dist-types/packages/peach-engine/src/engine/cull-visibility.d.ts +44 -0
  168. package/dist-types/packages/peach-engine/src/engine/damage-rect.d.ts +19 -0
  169. package/dist-types/packages/peach-engine/src/engine/engine-resource.d.ts +6 -0
  170. package/dist-types/packages/peach-engine/src/engine/expo-manifest.d.ts +5 -0
  171. package/dist-types/packages/peach-engine/src/engine/fiber-debug-metadata.d.ts +30 -0
  172. package/dist-types/packages/peach-engine/src/engine/font-config.d.ts +139 -0
  173. package/dist-types/packages/peach-engine/src/engine/generated/sf-pro-font.d.ts +1 -0
  174. package/dist-types/packages/peach-engine/src/engine/glass-material.d.ts +31 -0
  175. package/dist-types/packages/peach-engine/src/engine/host-composite.d.ts +100 -0
  176. package/dist-types/packages/peach-engine/src/engine/hosted-semantics.d.ts +49 -0
  177. package/dist-types/packages/peach-engine/src/engine/image-audit.d.ts +70 -0
  178. package/dist-types/packages/peach-engine/src/engine/image-loader.d.ts +350 -0
  179. package/dist-types/packages/peach-engine/src/engine/inspect-info.d.ts +27 -0
  180. package/dist-types/packages/peach-engine/src/engine/inspect-outline.d.ts +14 -0
  181. package/dist-types/packages/peach-engine/src/engine/inspect-visibility.d.ts +33 -0
  182. package/dist-types/packages/peach-engine/src/engine/ios-fast-scroll.d.ts +16 -0
  183. package/dist-types/packages/peach-engine/src/engine/layout-sab.d.ts +43 -0
  184. package/dist-types/packages/peach-engine/src/engine/liquid-glass-rect.d.ts +23 -0
  185. package/dist-types/packages/peach-engine/src/engine/liquid-glass-shaders.d.ts +9 -0
  186. package/dist-types/packages/peach-engine/src/engine/liquid-glass.d.ts +283 -0
  187. package/dist-types/packages/peach-engine/src/engine/live-object-counts.d.ts +6 -0
  188. package/dist-types/packages/peach-engine/src/engine/lottie-runtime.d.ts +32 -0
  189. package/dist-types/packages/peach-engine/src/engine/lottie-types.d.ts +138 -0
  190. package/dist-types/packages/peach-engine/src/engine/memory-counts.d.ts +27 -0
  191. package/dist-types/packages/peach-engine/src/engine/metalDirectContract.d.ts +108 -0
  192. package/dist-types/packages/peach-engine/src/engine/metalShaderContract.d.ts +217 -0
  193. package/dist-types/packages/peach-engine/src/engine/native-animation-driver.d.ts +112 -0
  194. package/dist-types/packages/peach-engine/src/engine/native-animation-graph.d.ts +62 -0
  195. package/dist-types/packages/peach-engine/src/engine/native-layout.d.ts +133 -0
  196. package/dist-types/packages/peach-engine/src/engine/native-resources.d.ts +26 -0
  197. package/dist-types/packages/peach-engine/src/engine/nativeReanimatedContract.d.ts +25 -0
  198. package/dist-types/packages/peach-engine/src/engine/nativeReplayContract.d.ts +64 -0
  199. package/dist-types/packages/peach-engine/src/engine/node.d.ts +589 -0
  200. package/dist-types/packages/peach-engine/src/engine/paint-boundary-types.d.ts +112 -0
  201. package/dist-types/packages/peach-engine/src/engine/paint-boundary.d.ts +57 -0
  202. package/dist-types/packages/peach-engine/src/engine/portalContract.d.ts +21 -0
  203. package/dist-types/packages/peach-engine/src/engine/portals.d.ts +20 -0
  204. package/dist-types/packages/peach-engine/src/engine/render-damage.d.ts +107 -0
  205. package/dist-types/packages/peach-engine/src/engine/riveContract.d.ts +420 -0
  206. package/dist-types/packages/peach-engine/src/engine/rn-spring.d.ts +51 -0
  207. package/dist-types/packages/peach-engine/src/engine/scene-table.d.ts +379 -0
  208. package/dist-types/packages/peach-engine/src/engine/scroll-momentum-math.d.ts +152 -0
  209. package/dist-types/packages/peach-engine/src/engine/scroll-pan-contacts.d.ts +10 -0
  210. package/dist-types/packages/peach-engine/src/engine/scroll-platform.d.ts +75 -0
  211. package/dist-types/packages/peach-engine/src/engine/scroll-range.d.ts +14 -0
  212. package/dist-types/packages/peach-engine/src/engine/scroll-velocity.d.ts +14 -0
  213. package/dist-types/packages/peach-engine/src/engine/scroll.d.ts +320 -0
  214. package/dist-types/packages/peach-engine/src/engine/signal.d.ts +7 -0
  215. package/dist-types/packages/peach-engine/src/engine/snapshot-cache-policy.d.ts +6 -0
  216. package/dist-types/packages/peach-engine/src/engine/svg-geometry.d.ts +41 -0
  217. package/dist-types/packages/peach-engine/src/engine/text-attachment-paragraphs.d.ts +10 -0
  218. package/dist-types/packages/peach-engine/src/engine/text-decoration.d.ts +11 -0
  219. package/dist-types/packages/peach-engine/src/engine/text-line-break.d.ts +22 -0
  220. package/dist-types/packages/peach-engine/src/engine/text-paint-receipt.d.ts +98 -0
  221. package/dist-types/packages/peach-engine/src/engine/text-paragraph.d.ts +11 -0
  222. package/dist-types/packages/peach-engine/src/engine/text-paragraphContract.d.ts +34 -0
  223. package/dist-types/packages/peach-engine/src/engine/text-transform.d.ts +1 -0
  224. package/dist-types/packages/peach-engine/src/engine/types.d.ts +657 -0
  225. package/dist-types/packages/peach-engine/src/engine/visible-frame.d.ts +54 -0
  226. package/dist-types/packages/peach-engine/src/engine/webrtcContract.d.ts +74 -0
  227. package/dist-types/packages/peach-engine/src/graphite-stats-fields.d.ts +184 -0
  228. package/dist-types/packages/peach-engine/src/guest-import-meta.d.ts +12 -0
  229. package/dist-types/packages/peach-engine/src/guest-module-overrides.d.ts +7 -0
  230. package/dist-types/packages/peach-engine/src/ios/app-card-types.d.ts +7 -0
  231. package/dist-types/packages/peach-engine/src/ios/apps/canvas-map-data.d.ts +177 -0
  232. package/dist-types/packages/peach-engine/src/ios/aux-home-scene.d.ts +54 -0
  233. package/dist-types/packages/peach-engine/src/ios/chrome-metrics.d.ts +47 -0
  234. package/dist-types/packages/peach-engine/src/ios/constants.d.ts +21 -0
  235. package/dist-types/packages/peach-engine/src/ios/duo-housing.d.ts +37 -0
  236. package/dist-types/packages/peach-engine/src/ios/home/types.d.ts +29 -0
  237. package/dist-types/packages/peach-engine/src/ios/home-app-catalog.d.ts +43 -0
  238. package/dist-types/packages/peach-engine/src/ios/photo-store.d.ts +73 -0
  239. package/dist-types/packages/peach-engine/src/ios/photoLibraryContract.d.ts +166 -0
  240. package/dist-types/packages/peach-engine/src/ios/shell-controller-types.d.ts +21 -0
  241. package/dist-types/packages/peach-engine/src/ios/shell-transition-debug.d.ts +18 -0
  242. package/dist-types/packages/peach-engine/src/metro-asset-path.d.ts +21 -0
  243. package/dist-types/packages/peach-engine/src/metro-fingerprint-registry-client.d.ts +11 -0
  244. package/dist-types/packages/peach-engine/src/metro-fingerprint.d.ts +38 -0
  245. package/dist-types/packages/peach-engine/src/native-preview-bundle.d.ts +44 -0
  246. package/dist-types/packages/peach-engine/src/observability/types.d.ts +74 -0
  247. package/dist-types/packages/peach-engine/src/peach-warm-manifest.d.ts +32 -0
  248. package/dist-types/packages/peach-engine/src/permissions/app-settings-client.d.ts +25 -0
  249. package/dist-types/packages/peach-engine/src/permissions/system-permission-types.d.ts +20 -0
  250. package/dist-types/packages/peach-engine/src/platform/android-back-panel.d.ts +131 -0
  251. package/dist-types/packages/peach-engine/src/platform/android-gesture-exclusion.d.ts +28 -0
  252. package/dist-types/packages/peach-engine/src/platform/android-predictive-back.d.ts +33 -0
  253. package/dist-types/packages/peach-engine/src/platform/system-bars-state.d.ts +14 -0
  254. package/dist-types/packages/peach-engine/src/playwright-sim-host.d.ts +1 -0
  255. package/dist-types/packages/peach-engine/src/preview/bundle-layout.d.ts +8 -0
  256. package/dist-types/packages/peach-engine/src/preview/bundle-variantContract.d.ts +24 -0
  257. package/dist-types/packages/peach-engine/src/preview/capture-bundle.d.ts +26 -0
  258. package/dist-types/packages/peach-engine/src/preview/compress-node.d.ts +2 -0
  259. package/dist-types/packages/peach-engine/src/preview/compress.d.ts +2 -0
  260. package/dist-types/packages/peach-engine/src/preview/presigned-upload.d.ts +60 -0
  261. package/dist-types/packages/peach-engine/src/preview/trace.d.ts +144 -0
  262. package/dist-types/packages/peach-engine/src/preview/upload-protocol.d.ts +152 -0
  263. package/dist-types/packages/peach-engine/src/profiler/animation-recording-loader.d.ts +1 -0
  264. package/dist-types/packages/peach-engine/src/profiler/profile-trace.d.ts +4 -0
  265. package/dist-types/packages/peach-engine/src/react-bridge.d.ts +3 -0
  266. package/dist-types/packages/peach-engine/src/react-native/AppState.d.ts +45 -0
  267. package/dist-types/packages/peach-engine/src/react-native/Appearance.d.ts +34 -0
  268. package/dist-types/packages/peach-engine/src/react-native/framework-colors-data.d.ts +2 -0
  269. package/dist-types/packages/peach-engine/src/react-native/host-services.d.ts +42 -0
  270. package/dist-types/packages/peach-engine/src/react-native/layout-animation.d.ts +22 -0
  271. package/dist-types/packages/peach-engine/src/react-native/platform-colors.d.ts +17 -0
  272. package/dist-types/packages/peach-engine/src/remote-stream/client-config.d.ts +10 -0
  273. package/dist-types/packages/peach-engine/src/remote-stream/cloud-display.d.ts +58 -0
  274. package/dist-types/packages/peach-engine/src/remote-stream/scene-recording.d.ts +45 -0
  275. package/dist-types/packages/peach-engine/src/render-worker/animated-drive-output.d.ts +35 -0
  276. package/dist-types/packages/peach-engine/src/render-worker/app-load.d.ts +16 -0
  277. package/dist-types/packages/peach-engine/src/render-worker/aux-surface-types.d.ts +2 -0
  278. package/dist-types/packages/peach-engine/src/render-worker/canvaskit-shared.d.ts +42 -0
  279. package/dist-types/packages/peach-engine/src/render-worker/canvaskit-webgpu.d.ts +434 -0
  280. package/dist-types/packages/peach-engine/src/render-worker/canvaskit-worker-init.d.ts +12 -0
  281. package/dist-types/packages/peach-engine/src/render-worker/compositor-backend.d.ts +31 -0
  282. package/dist-types/packages/peach-engine/src/render-worker/compositor-gpu.d.ts +202 -0
  283. package/dist-types/packages/peach-engine/src/render-worker/compositor-protocol.d.ts +1945 -0
  284. package/dist-types/packages/peach-engine/src/render-worker/compositor-runtime/scroll-drag-resample.d.ts +44 -0
  285. package/dist-types/packages/peach-engine/src/render-worker/css-keyframes-drive.d.ts +36 -0
  286. package/dist-types/packages/peach-engine/src/render-worker/edit-menu-geometry.d.ts +8 -0
  287. package/dist-types/packages/peach-engine/src/render-worker/engine-resource-relay.d.ts +21 -0
  288. package/dist-types/packages/peach-engine/src/render-worker/expo-widgetContract.d.ts +16 -0
  289. package/dist-types/packages/peach-engine/src/render-worker/gesture-seam-protocol.d.ts +152 -0
  290. package/dist-types/packages/peach-engine/src/render-worker/graph-linked-value.d.ts +29 -0
  291. package/dist-types/packages/peach-engine/src/render-worker/graphite-pipeline-compiler-contract.d.ts +49 -0
  292. package/dist-types/packages/peach-engine/src/render-worker/graphite-pipeline-compiler.d.ts +12 -0
  293. package/dist-types/packages/peach-engine/src/render-worker/host-service-protocol.d.ts +756 -0
  294. package/dist-types/packages/peach-engine/src/render-worker/image-lifecycle-event.d.ts +22 -0
  295. package/dist-types/packages/peach-engine/src/render-worker/image-pixel-contract.d.ts +48 -0
  296. package/dist-types/packages/peach-engine/src/render-worker/live-frame-mirror.d.ts +34 -0
  297. package/dist-types/packages/peach-engine/src/render-worker/map-command-channel.d.ts +189 -0
  298. package/dist-types/packages/peach-engine/src/render-worker/mapNativeContract.d.ts +101 -0
  299. package/dist-types/packages/peach-engine/src/render-worker/native-dynamic-synchronizable.d.ts +22 -0
  300. package/dist-types/packages/peach-engine/src/render-worker/native-menu-gesture.d.ts +9 -0
  301. package/dist-types/packages/peach-engine/src/render-worker/native-ui-commandContract.d.ts +23 -0
  302. package/dist-types/packages/peach-engine/src/render-worker/native-ui-protocol.d.ts +1087 -0
  303. package/dist-types/packages/peach-engine/src/render-worker/native-widgetContract.d.ts +100 -0
  304. package/dist-types/packages/peach-engine/src/render-worker/nativeAnimMirrorContract.d.ts +174 -0
  305. package/dist-types/packages/peach-engine/src/render-worker/nativeSyncReplyContract.d.ts +11 -0
  306. package/dist-types/packages/peach-engine/src/render-worker/one-native-contentContract.d.ts +54 -0
  307. package/dist-types/packages/peach-engine/src/render-worker/pointerSampleContract.d.ts +14 -0
  308. package/dist-types/packages/peach-engine/src/render-worker/protocol.d.ts +880 -0
  309. package/dist-types/packages/peach-engine/src/render-worker/reanimated-css-contract.d.ts +63 -0
  310. package/dist-types/packages/peach-engine/src/render-worker/reanimated-readiness.d.ts +29 -0
  311. package/dist-types/packages/peach-engine/src/render-worker/resilient-frame-clock.d.ts +22 -0
  312. package/dist-types/packages/peach-engine/src/render-worker/retained-app-load.d.ts +20 -0
  313. package/dist-types/packages/peach-engine/src/render-worker/screen-edge-swipe-commit-protocol.d.ts +1 -0
  314. package/dist-types/packages/peach-engine/src/render-worker/screen-form-sheet-commit-protocol.d.ts +26 -0
  315. package/dist-types/packages/peach-engine/src/render-worker/scroll-mirror-tenant.d.ts +37 -0
  316. package/dist-types/packages/peach-engine/src/render-worker/scroll-mirror.d.ts +164 -0
  317. package/dist-types/packages/peach-engine/src/render-worker/shell-event-registry.d.ts +119 -0
  318. package/dist-types/packages/peach-engine/src/render-worker/shell-gesture-regions.d.ts +41 -0
  319. package/dist-types/packages/peach-engine/src/render-worker/shell-protocol.d.ts +603 -0
  320. package/dist-types/packages/peach-engine/src/render-worker/shell-scene-schema.d.ts +101 -0
  321. package/dist-types/packages/peach-engine/src/render-worker/shell-tree-inline-sources.d.ts +13 -0
  322. package/dist-types/packages/peach-engine/src/render-worker/shell-tree-wire.d.ts +87 -0
  323. package/dist-types/packages/peach-engine/src/render-worker/test-bridge-protocol.d.ts +47 -0
  324. package/dist-types/packages/peach-engine/src/render-worker/text-inputContract.d.ts +93 -0
  325. package/dist-types/packages/peach-engine/src/render-worker/tree-sync-port.d.ts +102 -0
  326. package/dist-types/packages/peach-engine/src/render-worker/webgpu-frame-transaction.d.ts +292 -0
  327. package/dist-types/packages/peach-engine/src/render-worker/webgpu-readback-scheduler.d.ts +107 -0
  328. package/dist-types/packages/peach-engine/src/render-worker/webview-capture-protocol.d.ts +16 -0
  329. package/dist-types/packages/peach-engine/src/render-worker/worker-input-runtime.d.ts +211 -0
  330. package/dist-types/packages/peach-engine/src/render-worker/worker-storage.d.ts +33 -0
  331. package/dist-types/packages/peach-engine/src/render-worker/worklet-runtime.d.ts +987 -0
  332. package/dist-types/packages/peach-engine/src/render-worker/worklet-sab.d.ts +24 -0
  333. package/dist-types/packages/peach-engine/src/rolldown-bundle-inventory.d.ts +84 -0
  334. package/dist-types/packages/peach-engine/src/rolldown-production-fingerprint.d.ts +31 -0
  335. package/dist-types/packages/peach-engine/src/screenshots/timeline-assets.d.ts +10 -0
  336. package/dist-types/packages/peach-engine/src/screenshots/tokens.d.ts +9 -0
  337. package/dist-types/packages/peach-engine/src/settings/devices.d.ts +70 -0
  338. package/dist-types/packages/peach-engine/src/settings/duo-fold-bus.d.ts +87 -0
  339. package/dist-types/packages/peach-engine/src/settings/interface-rotation.d.ts +30 -0
  340. package/dist-types/packages/peach-engine/src/settings/react-native-configuration.d.ts +12 -0
  341. package/dist-types/packages/peach-engine/src/settings/scene-geometryContract.d.ts +40 -0
  342. package/dist-types/packages/peach-engine/src/settings/store.d.ts +37 -0
  343. package/dist-types/packages/peach-engine/src/shell-events.d.ts +203 -0
  344. package/dist-types/packages/peach-engine/src/shell-intent.d.ts +68 -0
  345. package/dist-types/packages/peach-engine/src/sootsim-event.d.ts +35 -0
  346. package/dist-types/packages/peach-engine/src/top-overlay-state.d.ts +5 -0
  347. package/dist-types/packages/peach-engine/src/web-authentication-automation-host.d.ts +2 -0
  348. package/dist-types/packages/peach-engine/src/webAuthenticationContract.d.ts +34 -0
  349. package/dist-types/packages/peach-engine/src/webview-automation-host.d.ts +180 -0
  350. package/dist-types/packages/peach-engine/src/wireframe-mode.d.ts +16 -0
  351. package/dist-types/packages/peach-globals/src/frameBreakdownContract.d.ts +16 -0
  352. package/dist-types/packages/peach-globals/src/index.d.ts +3311 -0
  353. package/dist-types/packages/peach-globals/src/nativeSurfaceContract.d.ts +76 -0
  354. package/dist-types/packages/peach-globals/src/pointerSourceEventContract.d.ts +8 -0
  355. package/dist-types/packages/peach-globals/src/profileTrace.d.ts +11 -0
  356. package/dist-types/packages/peach-globals/src/profilerContract.d.ts +223 -0
  357. package/dist-types/packages/peach-kit/src/capabilities.d.ts +721 -0
  358. package/dist-types/packages/peach-kit/src/internal.d.ts +4 -0
  359. package/dist-types/packages/peach-kit/src/materials/types.d.ts +27 -0
  360. package/dist-types/packages/peach-kit/src/materials/uikit-blur-material.d.ts +14 -0
  361. package/dist-types/packages/peach-kit/src/navigation-types.d.ts +11 -0
  362. package/dist-types/packages/peach-kit/src/react-bridge.d.ts +53 -0
  363. package/dist-types/packages/peach-kit/src/runtime.d.ts +26 -0
  364. package/dist-types/packages/peach-kit/src/ui/hosting-safe-area.d.ts +24 -0
  365. package/dist-types/packages/peach-kit/src/ui/popover-placement.d.ts +53 -0
  366. package/dist-types/packages/peach-kit/src/ui/presentationContract.d.ts +17 -0
  367. package/kotlin/ComposeSources/PeachComposeHost.kt +1 -1
  368. package/kotlin/JniSources/com/facebook/jni/HybridData.kt +0 -2
  369. package/kotlin/JniSources/dev/peach/jni/NativeBindings.kt +0 -2
  370. package/kotlin/JniTransportSources/dev/peach/jni/integration/JniTransport.kt +0 -2
  371. package/kotlin/README.md +6 -0
  372. package/package.json +22 -2
  373. package/runtime-companion.json +1 -0
  374. package/skills/contrast/SKILL.md +1 -0
  375. package/src/assetCatalogContract.ts +21 -0
  376. package/src/bridge-contract-input.ts +84 -0
  377. package/src/bridge-contract.ts +35 -3
  378. package/src/browser-launch-policy.ts +1 -0
  379. package/src/bundle-channel.mjs +4 -2
  380. package/src/cli-runtime.ts +55 -0
  381. package/src/crash-fingerprint.ts +26 -0
  382. package/src/dev-bundle-resolution.ts +50 -23
  383. package/src/device-catalog.ts +1159 -0
  384. package/src/host/bridge-host.ts +3 -26
  385. package/src/host/browser-pointer.ts +71 -0
  386. package/src/host/dev-server-package-versions.ts +23 -0
  387. package/src/host/fetch-proxy-handler.ts +17 -4
  388. package/src/installed-package-versions.ts +142 -38
  389. package/src/kotlin-host.ts +1 -1
  390. package/src/metro-plugin.ts +4 -4
  391. package/src/metro-project-root.ts +68 -0
  392. package/src/nitro-adapter.lock.json +26 -0
  393. package/src/nitro-adapter.ts +103 -0
  394. package/src/nitro-bundle.ts +24 -10
  395. package/src/nitro-compile.ts +33 -51
  396. package/src/nitro-source.ts +177 -96
  397. package/src/nitroAdapterContract.ts +217 -0
  398. package/src/nitroContract.ts +24 -11
  399. package/src/process-group.ts +41 -34
  400. package/src/react-bridge-importers.ts +28 -0
  401. package/src/reactNativeConfigurationContract.ts +36 -0
  402. package/src/runtime-assets.ts +7 -2
  403. package/src/runtime-delivery.ts +2 -0
  404. package/src/runtimePlatformContract.ts +70 -0
  405. package/src/screenshots/frame-compose.ts +42 -43
  406. package/src/screenshots/org-deck.ts +9 -4
  407. package/src/screenshots/preset-names.ts +29 -0
  408. package/src/screenshots/registry.ts +5 -5
  409. package/src/screenshots/schema.ts +1 -1
  410. package/src/screenshots/screenshotContract.ts +971 -0
  411. package/src/settings-flags.ts +107 -0
  412. package/src/settingsContract.ts +609 -0
  413. package/src/storageSnapshotContract.ts +344 -0
  414. package/src/stub-pattern-matcher.ts +550 -0
  415. package/src/swift-compile.ts +908 -40
  416. package/src/swift-compiler-digest.ts +13 -1
  417. package/src/swift-distribution.lock.json +49 -22
  418. package/src/swift-host.ts +167 -52
  419. package/src/swift-objc-compile.ts +54 -24
  420. package/src/swift-objc-export.ts +532 -0
  421. package/src/swift-objc-import.ts +769 -0
  422. package/src/swift-objc-metadata.ts +285 -10
  423. package/src/swift-objc-sdk.ts +13970 -158
  424. package/src/swift-objc-standin.ts +137 -1
  425. package/src/swift-package.ts +94 -0
  426. package/src/swift-packages.ts +5 -5
  427. package/src/swift-submit.ts +6 -0
  428. package/src/swiftContract.ts +99 -0
  429. package/src/target-matcher.ts +6 -1
  430. package/src/vite-plugin.ts +14 -40
  431. package/src/worker-system-chunks.ts +1 -1
  432. package/src/workerChunkContract.ts +5 -0
  433. package/src/worklets-babel.ts +24 -5
  434. package/src/xcode-project.ts +36 -7
  435. package/src/xcode-target-members.ts +10 -3
  436. package/cli/drivers/playwright-sim-host.ts +0 -825
  437. package/kotlin/fixtures/counter/Counter.d.kt.ts +0 -17
  438. package/kotlin/fixtures/counter/Counter.kt +0 -51
  439. package/kotlin/fixtures/counter/CounterApp.native.tsx +0 -61
  440. package/kotlin/fixtures/counter/CounterApp.tsx +0 -3
  441. package/kotlin/fixtures/counter/CounterScreen.d.kt.ts +0 -8
  442. package/kotlin/fixtures/counter/CounterScreen.kt +0 -56
  443. package/kotlin/fixtures/counter/app/_layout.tsx +0 -4
  444. package/kotlin/fixtures/counter/app/index+spa.tsx +0 -1
  445. package/kotlin/fixtures/counter/app/routes.d.ts +0 -18
  446. package/kotlin/fixtures/counter/package.json +0 -20
  447. package/kotlin/fixtures/counter/tsconfig.json +0 -19
  448. package/kotlin/fixtures/counter/vite.config.ts +0 -20
  449. package/kotlin/fixtures/headless-counter/Headless.kt +0 -234
  450. package/kotlin/fixtures/import-animation/Animation.d.kt.ts +0 -7
  451. package/kotlin/fixtures/import-animation/Animation.kt +0 -80
  452. package/kotlin/fixtures/import-animation/ImportAnimation.native.tsx +0 -13
  453. package/kotlin/fixtures/import-animation/README.md +0 -24
  454. package/kotlin/fixtures/import-animation/app/_layout.tsx +0 -4
  455. package/kotlin/fixtures/import-animation/app/index+spa.tsx +0 -1
  456. package/kotlin/fixtures/import-animation/app/routes.d.ts +0 -18
  457. package/kotlin/fixtures/import-animation/package.json +0 -23
  458. package/kotlin/fixtures/import-animation/tsconfig.json +0 -20
  459. package/kotlin/fixtures/import-animation/vite.config.ts +0 -20
  460. package/kotlin/fixtures/import-drawing/Drawing.d.kt.ts +0 -7
  461. package/kotlin/fixtures/import-drawing/Drawing.kt +0 -101
  462. package/kotlin/fixtures/import-drawing/ImportDrawing.native.tsx +0 -18
  463. package/kotlin/fixtures/import-drawing/README.md +0 -34
  464. package/kotlin/fixtures/import-drawing/app/_layout.tsx +0 -4
  465. package/kotlin/fixtures/import-drawing/app/index+spa.tsx +0 -1
  466. package/kotlin/fixtures/import-drawing/package.json +0 -23
  467. package/kotlin/fixtures/import-drawing/tsconfig.json +0 -20
  468. package/kotlin/fixtures/import-drawing/vite.config.ts +0 -20
  469. package/kotlin/fixtures/import-editor/Editor.d.kt.ts +0 -7
  470. package/kotlin/fixtures/import-editor/Editor.kt +0 -59
  471. package/kotlin/fixtures/import-editor/ImportEditor.native.tsx +0 -23
  472. package/kotlin/fixtures/import-editor/README.md +0 -27
  473. package/kotlin/fixtures/import-editor/app/_layout.tsx +0 -4
  474. package/kotlin/fixtures/import-editor/app/index+spa.tsx +0 -1
  475. package/kotlin/fixtures/import-editor/package.json +0 -23
  476. package/kotlin/fixtures/import-editor/tsconfig.json +0 -20
  477. package/kotlin/fixtures/import-editor/vite.config.ts +0 -20
  478. package/kotlin/fixtures/import-effects/Effects.d.kt.ts +0 -7
  479. package/kotlin/fixtures/import-effects/Effects.kt +0 -87
  480. package/kotlin/fixtures/import-effects/ImportEffects.native.tsx +0 -13
  481. package/kotlin/fixtures/import-effects/README.md +0 -19
  482. package/kotlin/fixtures/import-effects/app/_layout.tsx +0 -4
  483. package/kotlin/fixtures/import-effects/app/index+spa.tsx +0 -1
  484. package/kotlin/fixtures/import-effects/package.json +0 -23
  485. package/kotlin/fixtures/import-effects/tsconfig.json +0 -20
  486. package/kotlin/fixtures/import-effects/vite.config.ts +0 -20
  487. package/kotlin/fixtures/import-layout/ImportLayout.native.tsx +0 -13
  488. package/kotlin/fixtures/import-layout/Layout.d.kt.ts +0 -7
  489. package/kotlin/fixtures/import-layout/Layout.kt +0 -72
  490. package/kotlin/fixtures/import-layout/README.md +0 -24
  491. package/kotlin/fixtures/import-layout/app/_layout.tsx +0 -4
  492. package/kotlin/fixtures/import-layout/app/index+spa.tsx +0 -1
  493. package/kotlin/fixtures/import-layout/package.json +0 -23
  494. package/kotlin/fixtures/import-layout/tsconfig.json +0 -20
  495. package/kotlin/fixtures/import-layout/vite.config.ts +0 -20
  496. package/kotlin/fixtures/import-navigation/ImportNavigation.native.tsx +0 -18
  497. package/kotlin/fixtures/import-navigation/Navigation.d.kt.ts +0 -7
  498. package/kotlin/fixtures/import-navigation/Navigation.kt +0 -104
  499. package/kotlin/fixtures/import-navigation/README.md +0 -31
  500. package/kotlin/fixtures/import-navigation/app/_layout.tsx +0 -4
  501. package/kotlin/fixtures/import-navigation/app/index+spa.tsx +0 -1
  502. package/kotlin/fixtures/import-navigation/package.json +0 -23
  503. package/kotlin/fixtures/import-navigation/tsconfig.json +0 -20
  504. package/kotlin/fixtures/import-navigation/vite.config.ts +0 -20
  505. package/kotlin/fixtures/import-overlays/ImportOverlays.native.tsx +0 -29
  506. package/kotlin/fixtures/import-overlays/Overlays.d.kt.ts +0 -7
  507. package/kotlin/fixtures/import-overlays/Overlays.kt +0 -93
  508. package/kotlin/fixtures/import-overlays/README.md +0 -34
  509. package/kotlin/fixtures/import-overlays/app/_layout.tsx +0 -4
  510. package/kotlin/fixtures/import-overlays/app/index+spa.tsx +0 -1
  511. package/kotlin/fixtures/import-overlays/package.json +0 -23
  512. package/kotlin/fixtures/import-overlays/tsconfig.json +0 -20
  513. package/kotlin/fixtures/import-overlays/vite.config.ts +0 -20
  514. package/kotlin/fixtures/import-resources/ImportResources.native.tsx +0 -18
  515. package/kotlin/fixtures/import-resources/README.md +0 -26
  516. package/kotlin/fixtures/import-resources/Resources.d.kt.ts +0 -6
  517. package/kotlin/fixtures/import-resources/Resources.kt +0 -72
  518. package/kotlin/fixtures/import-resources/app/_layout.tsx +0 -4
  519. package/kotlin/fixtures/import-resources/app/index+spa.tsx +0 -1
  520. package/kotlin/fixtures/import-resources/package.json +0 -23
  521. package/kotlin/fixtures/import-resources/tsconfig.json +0 -20
  522. package/kotlin/fixtures/import-resources/vite.config.ts +0 -20
  523. package/kotlin/fixtures/import-scroll/ImportNested.native.tsx +0 -10
  524. package/kotlin/fixtures/import-scroll/ImportScroll.native.tsx +0 -13
  525. package/kotlin/fixtures/import-scroll/Nested.d.kt.ts +0 -4
  526. package/kotlin/fixtures/import-scroll/Nested.kt +0 -64
  527. package/kotlin/fixtures/import-scroll/README.md +0 -38
  528. package/kotlin/fixtures/import-scroll/Scroll.d.kt.ts +0 -7
  529. package/kotlin/fixtures/import-scroll/Scroll.kt +0 -91
  530. package/kotlin/fixtures/import-scroll/app/_layout.tsx +0 -4
  531. package/kotlin/fixtures/import-scroll/app/index+spa.tsx +0 -1
  532. package/kotlin/fixtures/import-scroll/app/nested+spa.tsx +0 -1
  533. package/kotlin/fixtures/import-scroll/package.json +0 -23
  534. package/kotlin/fixtures/import-scroll/tsconfig.json +0 -20
  535. package/kotlin/fixtures/import-scroll/vite.config.ts +0 -20
  536. package/kotlin/fixtures/import-selection/ImportSelection.native.tsx +0 -44
  537. package/kotlin/fixtures/import-selection/README.md +0 -32
  538. package/kotlin/fixtures/import-selection/Selection.d.kt.ts +0 -8
  539. package/kotlin/fixtures/import-selection/Selection.kt +0 -78
  540. package/kotlin/fixtures/import-selection/app/_layout.tsx +0 -4
  541. package/kotlin/fixtures/import-selection/app/index+spa.tsx +0 -1
  542. package/kotlin/fixtures/import-selection/package.json +0 -23
  543. package/kotlin/fixtures/import-selection/tsconfig.json +0 -20
  544. package/kotlin/fixtures/import-selection/vite.config.ts +0 -20
  545. package/kotlin/fixtures/import-surfaces/ImportSurfaces.native.tsx +0 -13
  546. package/kotlin/fixtures/import-surfaces/README.md +0 -22
  547. package/kotlin/fixtures/import-surfaces/Surfaces.d.kt.ts +0 -7
  548. package/kotlin/fixtures/import-surfaces/Surfaces.kt +0 -64
  549. package/kotlin/fixtures/import-surfaces/app/_layout.tsx +0 -4
  550. package/kotlin/fixtures/import-surfaces/app/index+spa.tsx +0 -1
  551. package/kotlin/fixtures/import-surfaces/package.json +0 -23
  552. package/kotlin/fixtures/import-surfaces/tsconfig.json +0 -20
  553. package/kotlin/fixtures/import-surfaces/vite.config.ts +0 -20
  554. package/kotlin/fixtures/import-values/ImportValues.native.tsx +0 -61
  555. package/kotlin/fixtures/import-values/README.md +0 -28
  556. package/kotlin/fixtures/import-values/Values.d.kt.ts +0 -15
  557. package/kotlin/fixtures/import-values/Values.kt +0 -84
  558. package/kotlin/fixtures/import-values/app/_layout.tsx +0 -4
  559. package/kotlin/fixtures/import-values/app/index+spa.tsx +0 -1
  560. package/kotlin/fixtures/import-values/package.json +0 -23
  561. package/kotlin/fixtures/import-values/tsconfig.json +0 -20
  562. package/kotlin/fixtures/import-values/vite.config.ts +0 -20
  563. package/kotlin/fixtures/kotlin-app/app/build.gradle.kts +0 -30
  564. package/kotlin/fixtures/kotlin-app/app/src/main/AndroidManifest.xml +0 -13
  565. package/kotlin/fixtures/kotlin-app/app/src/main/java/dev/contrast/kotlinapp/MainActivity.kt +0 -60
  566. package/kotlin/fixtures/kotlin-app/app/src/main/java/dev/contrast/kotlinapp/ProbeApplication.kt +0 -18
  567. package/kotlin/fixtures/kotlin-app/build.gradle.kts +0 -5
  568. package/kotlin/fixtures/kotlin-app/gradle.properties +0 -4
  569. package/kotlin/fixtures/kotlin-app/settings.gradle.kts +0 -4
  570. package/kotlin/fixtures/kotlin-app-variants/Anim.kt +0 -62
  571. package/kotlin/fixtures/kotlin-app-variants/BarBehavior.kt +0 -38
  572. package/kotlin/fixtures/kotlin-app-variants/BarVisibility.kt +0 -36
  573. package/kotlin/fixtures/kotlin-app-variants/Bitmaps.kt +0 -50
  574. package/kotlin/fixtures/kotlin-app-variants/Browse.kt +0 -73
  575. package/kotlin/fixtures/kotlin-app-variants/Colors.kt +0 -41
  576. package/kotlin/fixtures/kotlin-app-variants/Controls.kt +0 -62
  577. package/kotlin/fixtures/kotlin-app-variants/Drag.kt +0 -56
  578. package/kotlin/fixtures/kotlin-app-variants/Draw.kt +0 -74
  579. package/kotlin/fixtures/kotlin-app-variants/Drawables.kt +0 -53
  580. package/kotlin/fixtures/kotlin-app-variants/Focus.kt +0 -62
  581. package/kotlin/fixtures/kotlin-app-variants/Form.kt +0 -47
  582. package/kotlin/fixtures/kotlin-app-variants/Icons.kt +0 -59
  583. package/kotlin/fixtures/kotlin-app-variants/Ime.kt +0 -53
  584. package/kotlin/fixtures/kotlin-app-variants/Lists.kt +0 -57
  585. package/kotlin/fixtures/kotlin-app-variants/Nav.kt +0 -47
  586. package/kotlin/fixtures/kotlin-app-variants/Note.kt +0 -40
  587. package/kotlin/fixtures/kotlin-app-variants/Overlays.kt +0 -56
  588. package/kotlin/fixtures/kotlin-app-variants/Pan.kt +0 -38
  589. package/kotlin/fixtures/kotlin-app-variants/Pickers.kt +0 -44
  590. package/kotlin/fixtures/kotlin-app-variants/Press.kt +0 -43
  591. package/kotlin/fixtures/kotlin-app-variants/Scroll.kt +0 -63
  592. package/kotlin/fixtures/kotlin-app-variants/Sheet.kt +0 -43
  593. package/kotlin/fixtures/kotlin-app-variants/Strings.kt +0 -49
  594. package/kotlin/fixtures/kotlin-app-variants/Tabs.kt +0 -47
  595. package/kotlin/fixtures/kotlin-app-variants/TextWidth.kt +0 -45
  596. package/kotlin/fixtures/kotlin-app-variants/TransientInsets.kt +0 -50
  597. package/kotlin/fixtures/kotlin-app-variants/Transition.kt +0 -69
  598. package/kotlin/fixtures/kotlin-app-variants/ViewConfig.kt +0 -22
  599. package/kotlin/fixtures/kotlin-app-variants/Widgets.kt +0 -67
  600. package/kotlin/fixtures/runtime-state/RuntimeState.kt +0 -200
  601. package/kotlin/fork/README.md +0 -97
  602. package/kotlin/fork/build.sh +0 -176
  603. package/kotlin/fork/compose-worker-globals.patch +0 -1247
  604. package/kotlin/fork/fork.json +0 -46
  605. package/kotlin/fork/publish.ts +0 -99
  606. package/kotlin/fork/skia-android-shaping.patch +0 -189
  607. package/kotlin/fork/skiko-local.init.gradle +0 -10
  608. package/kotlin/fork/skiko-worker-clock.patch +0 -122
package/detox/index.ts CHANGED
@@ -13,24 +13,19 @@ import {
13
13
  reserveChromiumAdmission,
14
14
  type ChromiumLaunchAdmission,
15
15
  } from '../../../scripts/lib/reap-browser'
16
- import { automateWebAuthenticationSessions } from '../../peach-engine/src/web-authentication-automation-host'
16
+ import {
17
+ MOTION_CHANGE_DEFINITION,
18
+ type DiscreteFrameCadence,
19
+ type MotionChangeDefinition,
20
+ } from '../../peach-conformance/src/cases/checkpoint-evidence.cjs'
21
+ import { getCliRuntime } from '../src/cli-runtime.ts'
17
22
  import type {
18
23
  LockstepInputReceipt,
19
24
  LockstepScheduledInput,
20
25
  SootSimLockstepFrameReceipt,
21
26
  } from '@peach/globals'
22
27
  export { reserveChromiumAdmission } from '../../../scripts/lib/reap-browser'
23
- import {
24
- readBrowserCompositeCaptureRequest,
25
- resolveBrowserCompositeCdpClip,
26
- } from '../../peach-engine/src/capture/browser-composite'
27
- import { WEBVIEW_HOST_BOOTSTRAP_SOURCE } from '../../peach-engine/src/components/native-ui/webview-frame-bridge'
28
- import { isAppBootTargetUrl } from '../../peach-engine/src/render-worker/app-load'
29
- import {
30
- automateWebViewFrames,
31
- webViewAutomationHelpers,
32
- webViewAutomationNames,
33
- } from '../../peach-engine/src/webview-automation-host'
28
+
34
29
  import { waitForSootsimIdle as waitForRuntimeIdle } from '../cli/commands/inspect/settling'
35
30
  import { createBridge } from '../cli/ws-bridge'
36
31
  import { resolveSootsimBridgePortForHttpPort } from '../src/bridge-constants'
@@ -45,6 +40,7 @@ import {
45
40
  isTextInputNodeFocused,
46
41
  isNodeVisible,
47
42
  } from './expectations'
43
+ import { frameTimingRoundingBound } from './frame-offset.mjs'
48
44
  import {
49
45
  dispatchTwoFingerGesture,
50
46
  DETOX_PLATFORM,
@@ -57,13 +53,10 @@ import {
57
53
  } from './gestures'
58
54
  import { by, type Matcher } from './matchers'
59
55
  import {
60
- MOTION_CHANGE_DEFINITION,
61
56
  measureMotionChange,
62
57
  classifyDiscreteFrame,
63
- type DiscreteFrameCadence,
64
58
  type DiscreteFrameObservation,
65
59
  type DiscreteFrameTrace,
66
- type MotionChangeDefinition,
67
60
  type MotionChangeMeasurement,
68
61
  } from './motion-change.cjs'
69
62
  import { describeSootsimBridgeFailure, navigateSootsimPage } from './navigation-lifecycle'
@@ -277,7 +270,8 @@ export async function waitForSootsimShellReady(
277
270
  // shell first paint for home boots, compositor app-surface first paint for
278
271
  // app boots.
279
272
  // exported for the focused regression test.
280
- const expectsInitialAppPaint = isAppBootTargetUrl(page.url())
273
+ const expectsInitialAppPaint =
274
+ getCliRuntime().render_worker_app_load.isAppBootTargetUrl(page.url())
281
275
  try {
282
276
  await page.evaluate(
283
277
  async ({ timeoutMs, expectsInitialAppPaint }) => {
@@ -2027,23 +2021,28 @@ export const device = {
2027
2021
  reapOwnedBrowser()
2028
2022
  throw error
2029
2023
  }
2030
- await automateWebViewFrames(
2024
+ await getCliRuntime().webview_automation_host.automateWebViewFrames(
2031
2025
  _context,
2032
- webViewAutomationNames(
2026
+ getCliRuntime().webview_automation_host.webViewAutomationNames(
2033
2027
  `peachwv${randomBytes(12).toString('hex')}`,
2034
- WEBVIEW_HOST_BOOTSTRAP_SOURCE,
2028
+ getCliRuntime().components_native_ui_webview_frame_bridge
2029
+ .WEBVIEW_HOST_BOOTSTRAP_SOURCE,
2035
2030
  ),
2036
- webViewAutomationHelpers,
2031
+ getCliRuntime().webview_automation_host.webViewAutomationHelpers,
2037
2032
  (page) => page.workers(),
2038
2033
  )
2039
2034
  await _context.exposeBinding('__sootsimHostCapture', async (source, value) => {
2040
- const request = readBrowserCompositeCaptureRequest(value)
2035
+ const request =
2036
+ getCliRuntime().capture_browser_composite.readBrowserCompositeCaptureRequest(
2037
+ value,
2038
+ )
2041
2039
  const session = await source.page.context().newCDPSession(source.page)
2042
2040
  try {
2043
- const { clip, originX, originY } = resolveBrowserCompositeCdpClip(
2044
- request,
2045
- await session.send('Page.getLayoutMetrics'),
2046
- )
2041
+ const { clip, originX, originY } =
2042
+ getCliRuntime().capture_browser_composite.resolveBrowserCompositeCdpClip(
2043
+ request,
2044
+ await session.send('Page.getLayoutMetrics'),
2045
+ )
2047
2046
  const result = await session.send('Page.captureScreenshot', {
2048
2047
  format: 'png',
2049
2048
  fromSurface: true,
@@ -2064,7 +2063,7 @@ export const device = {
2064
2063
  reapOwnedBrowser()
2065
2064
  throw error
2066
2065
  }
2067
- await automateWebAuthenticationSessions(
2066
+ await getCliRuntime().web_authentication_automation_host.automateWebAuthenticationSessions(
2068
2067
  _context!,
2069
2068
  '__peachWebAuthenticationHost',
2070
2069
  _page,
@@ -2310,6 +2309,7 @@ export const device = {
2310
2309
  }
2311
2310
  lockstepCapture: {
2312
2311
  begin: (fps: number) => Promise<{
2312
+ framesForOffset: (offsetMs: number) => number
2313
2313
  stepFrame: () => Promise<{ frameIndex: number; virtualTimestampMs: number }>
2314
2314
  end: () => void
2315
2315
  }>
@@ -2366,6 +2366,7 @@ export const device = {
2366
2366
  let baseMs: number | null = null
2367
2367
  let currentMs = 0
2368
2368
  let anchorMs: number | null = null
2369
+ let anchorFrameIndex = 0
2369
2370
  const stageFrames: DiscreteStageFrame[] = []
2370
2371
  const observeTick = async () => {
2371
2372
  const receipt = await controller.stepFrame()
@@ -2406,14 +2407,16 @@ export const device = {
2406
2407
  anchorMs === null &&
2407
2408
  classification.phase === cadence.entryFrame &&
2408
2409
  rows[0].phase !== cadence.entryFrame
2409
- )
2410
+ ) {
2410
2411
  anchorMs = currentMs
2412
+ anchorFrameIndex = rows.length - 1
2413
+ }
2411
2414
  if (anchorMs !== null) {
2412
2415
  const next = stages[stageFrames.length]
2413
2416
  if (
2414
2417
  next &&
2415
- currentMs + 0.00001 >=
2416
- anchorMs + (Math.ceil((next.offsetMs * 60) / 1000) * 1000) / 60
2418
+ rows.length - 1 >=
2419
+ anchorFrameIndex + controller.framesForOffset(next.offsetMs)
2417
2420
  ) {
2418
2421
  requestedPngs++
2419
2422
  stageFrames.push({
@@ -2433,20 +2436,13 @@ export const device = {
2433
2436
  step: async (durationMs) => {
2434
2437
  if (!Number.isFinite(durationMs) || durationMs < 0)
2435
2438
  throw new Error('peach discrete wait needs a nonnegative duration')
2436
- const end = currentMs + durationMs
2437
- // a wait reaching the playing horizon covers it exactly: the
2438
- // receiver compares coverage with anchor + 1900 without slack
2439
- const horizon =
2440
- cadence.mode === 'playing' && anchorMs !== null ? anchorMs + 1900 : null
2441
- while (
2442
- currentMs + 0.00001 < end ||
2443
- (horizon !== null && end + 0.00001 >= horizon && currentMs < horizon)
2444
- ) {
2445
- if (
2446
- cadence.mode === 'playing' &&
2447
- anchorMs !== null &&
2448
- currentMs >= anchorMs + 1900
2449
- ) {
2439
+ const endFrame = rows.length - 1 + controller.framesForOffset(durationMs)
2440
+ const horizonFrame =
2441
+ cadence.mode === 'playing' && anchorMs !== null
2442
+ ? anchorFrameIndex + controller.framesForOffset(1900)
2443
+ : null
2444
+ while (rows.length - 1 < endFrame) {
2445
+ if (horizonFrame !== null && rows.length - 1 >= horizonFrame) {
2450
2446
  await new Promise((resolve) => setTimeout(resolve, 1000 / 60))
2451
2447
  break
2452
2448
  }
@@ -2601,6 +2597,8 @@ export const device = {
2601
2597
  throw new Error('discrete capture missed requested stages')
2602
2598
  const discreteTrace = await this.endProofFrameObservation()
2603
2599
  ended = true
2600
+ const anchorFrame = discreteTrace.observations.find((row) => row.atMs === anchorMs)
2601
+ if (!anchorFrame) throw new Error('discrete capture has no observed anchor frame')
2604
2602
  discreteTrace.triggerStartedAtMs = triggerStartMs
2605
2603
  discreteTrace.triggerCompletedAtMs = triggerCompletedMs
2606
2604
  discreteTrace.completedAtMs = Date.now()
@@ -2610,7 +2608,7 @@ export const device = {
2610
2608
  triggerCompletedMs,
2611
2609
  discreteTrace,
2612
2610
  driveStart: {
2613
- frameIndex: Math.round((anchorMs * 60) / 1000),
2611
+ frameIndex: anchorFrame.frameIndex,
2614
2612
  virtualTimestampMs: anchorMs,
2615
2613
  },
2616
2614
  anchors: [],
@@ -2668,6 +2666,9 @@ export const device = {
2668
2666
  // delivers its release ('up') rather than from the first visible
2669
2667
  // change, the delivered touch anchor the native lane uses.
2670
2668
  anchorAtTouch?: 'down' | 'up'
2669
+ // a witnessed drag replays native delivered times and samples the
2670
+ // declared offsets directly, as the native lane does.
2671
+ witnessedDrag?: boolean
2671
2672
  rootFrame?: { height: number; width: number; x: number; y: number } | null
2672
2673
  settleMs?: number
2673
2674
  trigger?: () => unknown
@@ -2704,7 +2705,7 @@ export const device = {
2704
2705
  totalPixels: number
2705
2706
  frameIndex: number
2706
2707
  virtualTimestampMs: number
2707
- }
2708
+ } | null
2708
2709
  }> {
2709
2710
  const page = getPage()
2710
2711
  const token = `motion-${process.pid}-${Date.now()}-${Math.random()}`
@@ -2725,6 +2726,7 @@ export const device = {
2725
2726
  }, WORKLET_FRAME_TRACE_LIMIT)
2726
2727
  }
2727
2728
  const capturePromise: Promise<{
2729
+ workletFirstDelivery: { first: number | null; initial: number } | null
2728
2730
  inputReceipts: LockstepInputReceipt[]
2729
2731
  anchors: Array<{
2730
2732
  changedPixelPercent: number
@@ -2750,7 +2752,7 @@ export const device = {
2750
2752
  minimumChangePercent: number
2751
2753
  totalPixels: number
2752
2754
  virtualTimestampMs: number
2753
- }
2755
+ } | null
2754
2756
  }> = page.evaluate(
2755
2757
  async (input) => {
2756
2758
  type CaptureWindow = Window & {
@@ -2975,7 +2977,13 @@ export const device = {
2975
2977
  heldInput.catch(() => {})
2976
2978
  await controller.flushFrame()
2977
2979
  } else {
2978
- while (!state.triggerStarted) {
2980
+ // the paired receipt starts after native touch-up. target lookup
2981
+ // and synthetic press delivery must finish before consuming it.
2982
+ while (
2983
+ !(input.workletFrameTimestampsSeconds
2984
+ ? state.triggerCompleted
2985
+ : state.triggerStarted)
2986
+ ) {
2979
2987
  if (state.cancelled) throw new Error('peach motion capture was cancelled')
2980
2988
  await new Promise((resolve) => setTimeout(resolve, 0))
2981
2989
  }
@@ -2984,8 +2992,12 @@ export const device = {
2984
2992
  let visibleStart: SootSimLockstepFrameReceipt | null = null
2985
2993
  let detectedMeasurement: MotionChangeMeasurement | null = null
2986
2994
  let previousBitmap: ImageBitmap | null = null
2995
+ const detectionFrameLimit = controller.framesForOffset(input.detectionTimeoutMs)
2996
+ // a touch anchor takes stage zero from the delivered touch on both
2997
+ // legs, so no visible change gates its drive; a feedback below the
2998
+ // change minimum still captures, as it does natively.
2987
2999
  // android can publish mount layout at p=0 before a clock step.
2988
- if (input.platform === 'android') {
3000
+ if (!input.anchorAtTouch && input.platform === 'android') {
2989
3001
  // time zero needs the same producer publication fence as stepped
2990
3002
  // frames; intermediate tree paints are not a transition onset.
2991
3003
  const receipt = await controller.flushFrame()
@@ -3007,19 +3019,14 @@ export const device = {
3007
3019
  candidateBitmap.close()
3008
3020
  }
3009
3021
  }
3010
- const detectionFrameLimit = Math.ceil((input.detectionTimeoutMs * 60) / 1000)
3011
- for (let frame = 0; !visibleStart && frame < detectionFrameLimit; frame++) {
3022
+ for (
3023
+ let frame = 0;
3024
+ !input.anchorAtTouch && !visibleStart && frame < detectionFrameLimit;
3025
+ frame++
3026
+ ) {
3012
3027
  if (state.cancelled) throw new Error('peach motion capture was cancelled')
3013
3028
  const receipt = await controller.stepFrame()
3014
3029
  const candidateBitmap = await captureBitmap()
3015
- // a touch anchor's stages may precede the first visible change
3016
- if (
3017
- input.anchorAtTouch === 'down' ||
3018
- (input.anchorAtTouch === 'up' &&
3019
- releaseReceipt()?.frameIndex === receipt.frameIndex)
3020
- ) {
3021
- keepFrame(receipt, await createImageBitmap(candidateBitmap))
3022
- }
3023
3030
  const bounds = boundsFor(candidateBitmap)
3024
3031
  const measurement = measureChange({
3025
3032
  baseline,
@@ -3040,22 +3047,36 @@ export const device = {
3040
3047
  previousBitmap?.close()
3041
3048
  previousBitmap = candidateBitmap
3042
3049
  }
3043
- if (!visibleStart || !detectedMeasurement) {
3044
- previousBitmap?.close()
3045
- throw new Error(
3046
- `peach motion had no visible change before ${input.detectionTimeoutMs}ms`,
3047
- )
3048
- }
3050
+ previousBitmap?.close()
3049
3051
  // stages on every platform measure from the first frame that
3050
3052
  // differs from baseline: native extraction anchors at its
3051
3053
  // detection frame's pts, so the drive starts here too. the
3052
3054
  // preceding tick is still baseline on both legs. a touch anchor
3053
3055
  // instead starts the drive at the press or at the frame that
3054
3056
  // delivers the touch-up.
3055
- let driveStart = visibleStart
3056
- let currentReceipt = visibleStart
3057
- if (input.anchorAtTouch === 'down') driveStart = controller.initialFrame
3058
- if (input.anchorAtTouch === 'up') {
3057
+ let driveStart: SootSimLockstepFrameReceipt
3058
+ let currentReceipt: SootSimLockstepFrameReceipt
3059
+ if (!input.anchorAtTouch) {
3060
+ if (!visibleStart || !detectedMeasurement) {
3061
+ throw new Error(
3062
+ `peach motion had no visible change before ${input.detectionTimeoutMs}ms`,
3063
+ )
3064
+ }
3065
+ driveStart = visibleStart
3066
+ currentReceipt = visibleStart
3067
+ } else if (input.anchorAtTouch === 'down') {
3068
+ const press = controller.inputReceipts.find(
3069
+ (receipt) => receipt.phase === 'down',
3070
+ )
3071
+ if (press?.frameIndex !== controller.initialFrame.frameIndex) {
3072
+ throw new Error(
3073
+ 'peach press anchoring found no press delivered on the baseline frame',
3074
+ )
3075
+ }
3076
+ driveStart = controller.initialFrame
3077
+ currentReceipt = controller.initialFrame
3078
+ } else {
3079
+ currentReceipt = controller.initialFrame
3059
3080
  while (!releaseReceipt()) {
3060
3081
  if (state.cancelled) throw new Error('peach motion capture was cancelled')
3061
3082
  const receipt = await controller.stepFrame()
@@ -3099,15 +3120,17 @@ export const device = {
3099
3120
  // proof.js owns the default and fills it; this backstop only
3100
3121
  // serves direct shim callers.
3101
3122
  const onsetThresholdPercent = anchor.onsetThresholdPercent ?? 5
3123
+ const searchStartFrame =
3124
+ driveStart.frameIndex + controller.framesForOffset(anchor.notBeforeMs)
3102
3125
  const searchStartVts = driveStart.virtualTimestampMs + anchor.notBeforeMs
3103
- if (currentReceipt.virtualTimestampMs > searchStartVts) {
3126
+ if (currentReceipt.frameIndex > searchStartFrame) {
3104
3127
  throw new Error(
3105
3128
  `peach motion anchor ${anchor.id} searches from ${anchor.notBeforeMs}ms but the clock already sits past it: the ladder is unexecutable`,
3106
3129
  )
3107
3130
  }
3108
3131
  // step, never jump, to the search start so hold moves land.
3109
3132
  let searchReceipt = currentReceipt
3110
- while (searchReceipt.virtualTimestampMs < searchStartVts) {
3133
+ while (searchReceipt.frameIndex < searchStartFrame) {
3111
3134
  if (state.cancelled) throw new Error('peach motion capture was cancelled')
3112
3135
  searchReceipt = await controller.stepFrame()
3113
3136
  }
@@ -3173,12 +3196,42 @@ export const device = {
3173
3196
  return { anchorId: anchor.id, receipt: anchorReceipt }
3174
3197
  }
3175
3198
 
3199
+ // the hold's schedule in delivery order, in ms after the press.
3200
+ const holdScheduleMs = input.hold
3201
+ ? [
3202
+ 0,
3203
+ ...(input.hold.moves ?? []).map((move) => move.afterMs),
3204
+ input.hold.durationMs,
3205
+ ].sort((a, b) => a - b)
3206
+ : []
3207
+ // transition stages take the native touch rule from the touches this
3208
+ // lane delivered, stepping until the last one due has landed.
3209
+ const stageOffsetMs = async (offsetMs: number, anchorId: string) => {
3210
+ if (anchorId !== 'transition' || input.witnessedDrag) return offsetMs
3211
+ const due = holdScheduleMs.filter((scheduledMs) => scheduledMs <= offsetMs)
3212
+ while (controller.inputReceipts.length < due.length) {
3213
+ if (state.cancelled) throw new Error('peach motion capture was cancelled')
3214
+ currentReceipt = await controller.stepFrame()
3215
+ }
3216
+ const [press] = controller.inputReceipts
3217
+ return controller.stageTouchOffsetMs(
3218
+ due.map((scheduledMs, index) => ({
3219
+ scheduledMs,
3220
+ landedMs:
3221
+ controller.inputReceipts[index].virtualTimestampMs -
3222
+ press.virtualTimestampMs,
3223
+ })),
3224
+ offsetMs,
3225
+ )
3226
+ }
3227
+
3176
3228
  const snapshots: Snapshot[] = []
3177
3229
  for (const stage of input.stages) {
3178
3230
  if (state.cancelled) throw new Error('peach motion capture was cancelled')
3179
3231
  const { anchorId, receipt: anchorReceipt } = await resolveAnchor(stage)
3232
+ const touchOffsetMs = await stageOffsetMs(stage.offsetMs, anchorId)
3180
3233
  const stageFrameIndex =
3181
- anchorReceipt.frameIndex + controller.framesForOffset(stage.offsetMs)
3234
+ anchorReceipt.frameIndex + controller.framesForOffset(touchOffsetMs)
3182
3235
  const kept = keptFrames.get(stageFrameIndex)
3183
3236
  if (kept && stageFrameIndex <= currentReceipt.frameIndex) {
3184
3237
  snapshots.push({
@@ -3193,7 +3246,7 @@ export const device = {
3193
3246
  })
3194
3247
  continue
3195
3248
  }
3196
- const receipt = await controller.stepToOffset(anchorReceipt, stage.offsetMs)
3249
+ const receipt = await controller.stepToOffset(anchorReceipt, touchOffsetMs)
3197
3250
  currentReceipt = receipt
3198
3251
  snapshots.push({
3199
3252
  actualMs: receipt.virtualTimestampMs - anchorReceipt.virtualTimestampMs,
@@ -3233,21 +3286,16 @@ export const device = {
3233
3286
  await controller.stepFrame()
3234
3287
  await new Promise((resolve) => setTimeout(resolve, 0))
3235
3288
  }
3236
- if (input.workletFrameTimestampsSeconds) {
3237
- const stats = await pairedPeerStats()
3238
- const first = stats.nativeFrameFirstTimestampMs
3239
- const firstFrameIndex =
3240
- first === null
3241
- ? null
3242
- : Math.round(
3243
- (first - controller.initialFrame.virtualTimestampMs) / (1000 / 60),
3244
- )
3245
- if (firstFrameIndex !== 1)
3246
- throw new Error(
3247
- `paired worklets first delivery did not match the next UI frame: ${firstFrameIndex}`,
3248
- )
3249
- }
3289
+ const stats = input.workletFrameTimestampsSeconds
3290
+ ? await pairedPeerStats()
3291
+ : null
3250
3292
  return {
3293
+ workletFirstDelivery: stats
3294
+ ? {
3295
+ first: stats.nativeFrameFirstTimestampMs,
3296
+ initial: controller.initialFrame.virtualTimestampMs,
3297
+ }
3298
+ : null,
3251
3299
  inputReceipts: controller.inputReceipts,
3252
3300
  anchors: anchorRecords,
3253
3301
  driveStart: {
@@ -3255,16 +3303,20 @@ export const device = {
3255
3303
  virtualTimestampMs: driveStart.virtualTimestampMs,
3256
3304
  },
3257
3305
  frames: snapshots.map(encode),
3258
- visibleChangeDetection: {
3259
- actualMs: (visibleStart.frameIndex * 1000) / 60,
3260
- changedPixelPercent: detectedMeasurement.changePercent,
3261
- changedPixels: detectedMeasurement.changePixels,
3262
- channelThreshold: input.motionChangeDefinition.channelThreshold,
3263
- minimumChangePercent: input.motionChangeDefinition.minimumChangePercent,
3264
- totalPixels: detectedMeasurement.totalPixels,
3265
- frameIndex: visibleStart.frameIndex,
3266
- virtualTimestampMs: visibleStart.virtualTimestampMs,
3267
- },
3306
+ visibleChangeDetection:
3307
+ visibleStart && detectedMeasurement
3308
+ ? {
3309
+ actualMs: (visibleStart.frameIndex * 1000) / 60,
3310
+ changedPixelPercent: detectedMeasurement.changePercent,
3311
+ changedPixels: detectedMeasurement.changePixels,
3312
+ channelThreshold: input.motionChangeDefinition.channelThreshold,
3313
+ minimumChangePercent:
3314
+ input.motionChangeDefinition.minimumChangePercent,
3315
+ totalPixels: detectedMeasurement.totalPixels,
3316
+ frameIndex: visibleStart.frameIndex,
3317
+ virtualTimestampMs: visibleStart.virtualTimestampMs,
3318
+ }
3319
+ : null,
3268
3320
  }
3269
3321
  } finally {
3270
3322
  for (const kept of keptFrames.values()) kept.bitmap.close()
@@ -3277,6 +3329,7 @@ export const device = {
3277
3329
  detectionTimeoutMs: options.detectionTimeoutMs ?? 3000,
3278
3330
  frame: options.frame ?? null,
3279
3331
  anchorAtTouch: options.anchorAtTouch ?? null,
3332
+ witnessedDrag: options.witnessedDrag === true,
3280
3333
  hold: options.hold ?? null,
3281
3334
  motionChangeDefinition: MOTION_CHANGE_DEFINITION,
3282
3335
  platform: device.getPlatform(),
@@ -3327,6 +3380,19 @@ export const device = {
3327
3380
  }, token)
3328
3381
  })()
3329
3382
  const [capture] = await Promise.all([capturePromise, triggerPromise])
3383
+ if (capture.workletFirstDelivery) {
3384
+ const { first, initial } = capture.workletFirstDelivery
3385
+ const interval = 1000 / 60
3386
+ if (
3387
+ first === null ||
3388
+ !Number.isFinite(first) ||
3389
+ Math.abs(first - initial - interval) >
3390
+ frameTimingRoundingBound(first, initial, interval)
3391
+ )
3392
+ throw new Error(
3393
+ `paired worklets first delivery did not match the next UI frame: ${first}`,
3394
+ )
3395
+ }
3330
3396
  return {
3331
3397
  inputReceipts: capture.inputReceipts,
3332
3398
  anchors: capture.anchors,
@@ -3334,11 +3400,13 @@ export const device = {
3334
3400
  frames: writeFastScreenshotFrames(namePrefix, capture.frames),
3335
3401
  triggerCompletedMs,
3336
3402
  triggerStartMs,
3337
- visibleChangeDetection: {
3338
- ...capture.visibleChangeDetection,
3339
- frame: options.frame ?? null,
3340
- rootFrame: options.rootFrame ?? null,
3341
- },
3403
+ visibleChangeDetection: capture.visibleChangeDetection
3404
+ ? {
3405
+ ...capture.visibleChangeDetection,
3406
+ frame: options.frame ?? null,
3407
+ rootFrame: options.rootFrame ?? null,
3408
+ }
3409
+ : null,
3342
3410
  }
3343
3411
  } catch (error) {
3344
3412
  captureFailure = { error }
@@ -22,9 +22,7 @@ module.exports = {
22
22
  // keep per-pixel arithmetic inside the module instead of the vm global proxy.
23
23
  sandboxInjectedGlobals: ['Math'],
24
24
  setupFilesAfterEnv: [path.join(PACKAGE_ROOT, 'detox', 'jest-setup-after-env.cjs')],
25
- transform: {
26
- '^.+\\.[jt]sx?$': ['@sucrase/jest-plugin', { jsxRuntime: 'automatic' }],
27
- },
25
+ transform: require('./jest-transform.cjs'),
28
26
  moduleNameMapper: {
29
27
  '^detox$': DRIVER_ENTRY,
30
28
  },
@@ -0,0 +1,4 @@
1
+ // native and peach conformance share module syntax, including esm helpers.
2
+ module.exports = {
3
+ '^.+\\.(?:[jt]sx?|mjs)$': ['@sucrase/jest-plugin', { jsxRuntime: 'automatic' }],
4
+ }
package/detox/matchers.ts CHANGED
@@ -7,6 +7,9 @@ export type Matcher = SootSimTargetMatcher
7
7
 
8
8
  function createMatcher(type: 'id' | 'text' | 'label', value: string | RegExp): Matcher {
9
9
  if (typeof value === 'string') return { type, value }
10
+ if (Object.prototype.toString.call(value) !== '[object RegExp]') {
11
+ throw new Error(`${type} should be a string or regex, but got ${value}`)
12
+ }
10
13
  // detox ignores global and sticky state and always uses unicode matching.
11
14
  return {
12
15
  type,