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
@@ -13,6 +13,7 @@ import {
13
13
  SOOTSIM_BRIDGE_SIM_CLOSE_CODE,
14
14
  SOOTSIM_BRIDGE_SIM_CLOSE_REASON,
15
15
  } from '../bridge-constants.ts'
16
+ import { commandWritesSim, type WsCommand } from '../bridge-contract.ts'
16
17
  import { getCliVersion } from '../cli-version.ts'
17
18
  import { activeDesktopHostApp } from '../desktop-host-delivery.ts'
18
19
  import { handleExpoSwiftRequest } from '../expo-swift-host.ts'
@@ -69,7 +70,6 @@ import {
69
70
  handleWebSocketProxyUpgrade,
70
71
  rejectUntrustedBridgeUpgrade,
71
72
  } from './websocket-proxy.ts'
72
- import type { WsCommand } from '../bridge-contract.ts'
73
73
 
74
74
  const SOOTSIM_CROSS_ORIGIN_EMBEDDER_POLICY = 'require-corp'
75
75
 
@@ -197,22 +197,6 @@ interface BridgeCliLease {
197
197
  ownerSocket?: WebSocket
198
198
  }
199
199
 
200
- // interactive commands change app state and must respect the lease.
201
- // observational/lifecycle commands (evaluate/tree/query/resolve/screenshot/capture/focus/call/close)
202
- // pass through without taking or checking a lease so cleanup never gets stuck
203
- // behind a stale cli owner.
204
- // `call` used to acquire a lease too, but most call paths are queries
205
- // (`__sootsimTest.findByTestId`, state reads, etc.). the CLI opts write
206
- // calls into lease acquisition via msg.acquireLock=true.
207
- const WRITE_COMMAND_TYPES = new Set([
208
- 'tap',
209
- 'keyboard',
210
- 'longPress',
211
- 'perform',
212
- 'reset',
213
- 'camera',
214
- ])
215
-
216
200
  // how long a `close` waits for the sim page to tear itself down before the
217
201
  // host disconnects the sim socket. the close code is part of the protocol:
218
202
  // browser clients treat it as terminal and skip their normal reconnect loop.
@@ -223,13 +207,6 @@ const FORCE_CLOSE_TERMINATE_MS = 1000
223
207
  // type). a duplicate copy used to live here from a concurrent edit and
224
208
  // broke the standalone CLI esbuild bundle ("symbol already declared").
225
209
 
226
- function shouldAcquireLease(msg: any): boolean {
227
- if (!msg || typeof msg.type !== 'string') return false
228
- if (msg.acquireLock === true) return true
229
- if (msg.readOnly === true) return false
230
- return WRITE_COMMAND_TYPES.has(msg.type)
231
- }
232
-
233
210
  interface BridgeRestorableSimState {
234
211
  recentActions: BridgeRecentAction[]
235
212
  lastActiveAt: number
@@ -1075,7 +1052,7 @@ export class SootSimBridgeHost {
1075
1052
  }
1076
1053
 
1077
1054
  const targetSim = await this.waitForSim(msg.simId)
1078
- if (shouldAcquireLease(msg)) {
1055
+ if (commandWritesSim(msg)) {
1079
1056
  const outcome = this.tryAcquireLease(ws, targetSim)
1080
1057
  if (!outcome.granted) {
1081
1058
  if (ws.readyState === WebSocket.OPEN) {
@@ -2516,7 +2493,7 @@ export class SootSimBridgeHost {
2516
2493
  // called when the sim reports a real user interaction (pointerdown,
2517
2494
  // keydown, wheel, touch). creates or refreshes a short `user-active` lease
2518
2495
  // that keeps agent writes from trampling a user who is driving the sim.
2519
- // reads still pass through — shouldAcquireLease only blocks on writes.
2496
+ // reads still pass through — commandWritesSim only blocks on writes.
2520
2497
  private updateUserActivity(sim: BridgeSimConnection) {
2521
2498
  const existing = this.getActiveLease(sim)
2522
2499
  if (existing && existing.kind === 'cli') {
@@ -0,0 +1,71 @@
1
+ export interface BrowserPointerRequest {
2
+ phase: 'down' | 'move' | 'up' | 'cancel'
3
+ x: number
4
+ y: number
5
+ pointerId: number
6
+ }
7
+
8
+ // both browser hosts use chromium input so editable defaults and cross-origin
9
+ // iframe hit testing run in the browser, rather than simulated DOM events.
10
+ export function createBrowserPointerDispatcher(
11
+ send: (
12
+ method: 'Input.dispatchTouchEvent',
13
+ params: {
14
+ type: 'touchStart' | 'touchMove' | 'touchEnd' | 'touchCancel'
15
+ touchPoints: Array<{ x: number; y: number; id: number }>
16
+ },
17
+ ) => Promise<unknown>,
18
+ ) {
19
+ const points = new Map<number, { x: number; y: number; id: number }>()
20
+ return async (value: unknown): Promise<void> => {
21
+ if (!value || typeof value !== 'object') throw new Error('missing browser pointer')
22
+ const phase = Reflect.get(value, 'phase')
23
+ const x = Reflect.get(value, 'x')
24
+ const y = Reflect.get(value, 'y')
25
+ const pointerId = Reflect.get(value, 'pointerId')
26
+ if (phase !== 'down' && phase !== 'move' && phase !== 'up' && phase !== 'cancel')
27
+ throw new Error('invalid browser pointer phase')
28
+ if (
29
+ typeof x !== 'number' ||
30
+ !Number.isFinite(x) ||
31
+ typeof y !== 'number' ||
32
+ !Number.isFinite(y)
33
+ )
34
+ throw new Error('browser pointer coordinates must be finite')
35
+ if (
36
+ typeof pointerId !== 'number' ||
37
+ !Number.isSafeInteger(pointerId) ||
38
+ pointerId < 0
39
+ )
40
+ throw new Error('browser pointer id must be a nonnegative integer')
41
+ const request: BrowserPointerRequest = { phase, x, y, pointerId }
42
+ if (request.phase === 'down') {
43
+ if (points.has(request.pointerId)) throw new Error('browser pointer already down')
44
+ points.set(request.pointerId, { x: request.x, y: request.y, id: request.pointerId })
45
+ } else {
46
+ // chromium cancels the entire touch stream at once; the caller still
47
+ // releases each bound pointer while unwinding a multi-touch gesture.
48
+ if (request.phase === 'cancel' && points.size === 0) return
49
+ if (!points.has(request.pointerId)) throw new Error('browser pointer is not down')
50
+ if (request.phase === 'move')
51
+ points.set(request.pointerId, {
52
+ x: request.x,
53
+ y: request.y,
54
+ id: request.pointerId,
55
+ })
56
+ else if (request.phase === 'cancel') points.clear()
57
+ else points.delete(request.pointerId)
58
+ }
59
+ await send('Input.dispatchTouchEvent', {
60
+ type:
61
+ request.phase === 'down'
62
+ ? 'touchStart'
63
+ : request.phase === 'move'
64
+ ? 'touchMove'
65
+ : request.phase === 'up'
66
+ ? 'touchEnd'
67
+ : 'touchCancel',
68
+ touchPoints: [...points.values()],
69
+ })
70
+ }
71
+ }
@@ -0,0 +1,23 @@
1
+ import fs from 'fs'
2
+ import path from 'path'
3
+ import { readInstalledNativePackageVersionsAsync } from '../installed-package-versions.ts'
4
+ import { resolveMetroProjectRoot } from '../metro-project-root.ts'
5
+ import type { PackageVersions } from '../packageVersionsContract'
6
+
7
+ // a plain Metro or Expo dev server records no installed versions in its
8
+ // bundle. the bridge serving that bundle reads them from the project the
9
+ // server names, the way `peach open` reads its own project. a server that
10
+ // names no project, or one whose project is not on this machine, gets none.
11
+ export async function readDevServerPackageVersions(
12
+ bundleUrl: URL,
13
+ ): Promise<PackageVersions | null> {
14
+ if (!bundleUrl.pathname.endsWith('.bundle')) return null
15
+ const projectRoot = await resolveMetroProjectRoot(bundleUrl.href)
16
+ if (!projectRoot) return null
17
+ try {
18
+ await fs.promises.access(path.join(projectRoot, 'package.json'))
19
+ } catch {
20
+ return null
21
+ }
22
+ return readInstalledNativePackageVersionsAsync(projectRoot)
23
+ }
@@ -33,6 +33,8 @@ import {
33
33
  isTrustedBridgeRequest,
34
34
  normalizeHostname,
35
35
  } from '../backend-origin.ts'
36
+ import { PACKAGE_VERSIONS_HEADER } from '../packageVersionsContract'
37
+ import { readDevServerPackageVersions } from './dev-server-package-versions.ts'
36
38
  import {
37
39
  buildFetchProxyUpstreamHeaders,
38
40
  FETCH_PROXY_FAILURE_HEADER,
@@ -218,7 +220,7 @@ export async function handleFetchProxyRequest(
218
220
 
219
221
  await proxyUpstream(req, res, upstreamUrl, params.has(FETCH_PROXY_FAILURE_PARAM), {
220
222
  requestHeaders: (target) => buildFetchProxyHeaders(req.headers, target),
221
- respond: (upstream, setCookies) => {
223
+ respond: async (upstream, setCookies) => {
222
224
  for (const [key, value] of Object.entries(upstream.headers)) {
223
225
  const lowerKey = key.toLowerCase()
224
226
  if (
@@ -240,6 +242,17 @@ export async function handleFetchProxyRequest(
240
242
  }
241
243
  res.setHeader(key, value)
242
244
  }
245
+ // a bundle whose server records no install gets the one its project holds
246
+ if (
247
+ isBundleProxyRequestUrl(req.url) &&
248
+ req.method === 'GET' &&
249
+ upstream.statusCode === 200 &&
250
+ !res.hasHeader(PACKAGE_VERSIONS_HEADER)
251
+ ) {
252
+ const packageVersions = await readDevServerPackageVersions(upstreamUrl)
253
+ if (packageVersions)
254
+ res.setHeader(PACKAGE_VERSIONS_HEADER, JSON.stringify(packageVersions))
255
+ }
243
256
  applyFetchProxyCors(req, res)
244
257
  if (setCookies.length > 0)
245
258
  res.setHeader('x-sootsim-set-cookie', setCookies.join(', '))
@@ -345,7 +358,7 @@ async function proxyUpstream(
345
358
  reportFailure: boolean,
346
359
  route: {
347
360
  requestHeaders: (targetUrl: URL) => Record<string, string | string[]>
348
- respond: (upstream: IncomingMessage, setCookies: string[]) => void
361
+ respond: (upstream: IncomingMessage, setCookies: string[]) => void | Promise<void>
349
362
  },
350
363
  ): Promise<void> {
351
364
  const originalMethod = req.method || 'GET'
@@ -444,7 +457,7 @@ async function proxyUpstream(
444
457
  redirectLimit: 10,
445
458
  }
446
459
  res.setHeader(FETCH_PROXY_NATIVE_COOKIE_RESPONSE_HEADER, nativeCookieHopHeader(hop))
447
- route.respond(proxyRes, hopCookies)
460
+ await route.respond(proxyRes, hopCookies)
448
461
  if (isNativeCookieRedirect(hop)) res.removeHeader('location')
449
462
  res.statusCode = isNativeCookieRedirect(hop) ? 200 : status
450
463
  await pipeline(proxyRes, res)
@@ -479,7 +492,7 @@ async function proxyUpstream(
479
492
  }
480
493
 
481
494
  if (redirects > 0) res.setHeader(FETCH_PROXY_RESPONSE_URL_HEADER, targetUrl.href)
482
- route.respond(proxyRes, hopCookies)
495
+ await route.respond(proxyRes, hopCookies)
483
496
  res.statusCode = status
484
497
  await pipeline(proxyRes, res)
485
498
  }
@@ -2,38 +2,144 @@
2
2
  // compiles a package's native side from the copy autolinking finds, which is
3
3
  // Node resolution from the project root, so that is the copy read here even
4
4
  // when the graph also bundles a nested one.
5
+ //
6
+ // each walk yields the file system reads it needs. the sync driver answers
7
+ // them for one-shot callers; the async one for servers that must keep
8
+ // answering other requests while a large workspace is read.
5
9
 
6
10
  import fs from 'fs'
7
11
  import path from 'path'
8
12
  import { LAZY_STUB_PATTERNS } from '@peach/compat/lazy-stub-patterns'
9
13
  import { NATIVE_RUNTIME_PACKAGE_NAMES } from '@peach/compat/native-package-names'
10
14
  import { COMPAT_STUBS } from '@peach/compat/stub-manifest'
11
- import { extractPackageFromPath } from '../../peach-engine/src/stub-pattern-matcher'
15
+ import { extractPackageFromPath } from './stub-pattern-matcher.ts'
12
16
  import type { PackageVersions } from './packageVersionsContract'
13
17
 
14
- function readInstalledPackage(projectRoot: string, name: string) {
15
- let dir = projectRoot
16
- for (;;) {
17
- let manifest: unknown
18
- try {
19
- manifest = JSON.parse(
20
- fs.readFileSync(path.join(dir, 'node_modules', name, 'package.json'), 'utf8'),
21
- )
22
- } catch (error) {
23
- if (!(error instanceof Error && 'code' in error && error.code === 'ENOENT')) {
24
- throw error
18
+ type InstalledPackage = { root: string; manifest: object }
19
+
20
+ type FsStep =
21
+ | { op: 'exists'; path: string }
22
+ | { op: 'realpath'; path: string }
23
+ // the parsed package.json, or null when there is none or it is not an object
24
+ | { op: 'manifest'; path: string }
25
+ type FsAnswer = boolean | string | object | null
26
+ type FsWalk<T> = Generator<FsStep, T, FsAnswer>
27
+
28
+ function* exists(target: string): FsWalk<boolean> {
29
+ return (yield { op: 'exists', path: target }) === true
30
+ }
31
+
32
+ function* realpath(target: string): FsWalk<string> {
33
+ const resolved = yield { op: 'realpath', path: target }
34
+ if (typeof resolved !== 'string') throw new Error(`could not resolve ${target}`)
35
+ return resolved
36
+ }
37
+
38
+ function* readManifest(target: string): FsWalk<object | null> {
39
+ const manifest = yield { op: 'manifest', path: target }
40
+ return typeof manifest === 'object' ? manifest : null
41
+ }
42
+
43
+ function parseManifest(source: string): object | null {
44
+ const manifest: unknown = JSON.parse(source)
45
+ return typeof manifest === 'object' && manifest !== null ? manifest : null
46
+ }
47
+
48
+ function isMissing(error: unknown): boolean {
49
+ return error instanceof Error && 'code' in error && error.code === 'ENOENT'
50
+ }
51
+
52
+ function answerSync(step: FsStep): FsAnswer {
53
+ if (step.op === 'exists') return fs.existsSync(step.path)
54
+ if (step.op === 'realpath') return fs.realpathSync(step.path)
55
+ try {
56
+ return parseManifest(fs.readFileSync(step.path, 'utf8'))
57
+ } catch (error) {
58
+ if (isMissing(error)) return null
59
+ throw error
60
+ }
61
+ }
62
+
63
+ async function answerAsync(step: FsStep): Promise<FsAnswer> {
64
+ if (step.op === 'exists')
65
+ return fs.promises.access(step.path).then(
66
+ () => true,
67
+ () => false,
68
+ )
69
+ if (step.op === 'realpath') return fs.promises.realpath(step.path)
70
+ try {
71
+ return parseManifest(await fs.promises.readFile(step.path, 'utf8'))
72
+ } catch (error) {
73
+ if (isMissing(error)) return null
74
+ throw error
75
+ }
76
+ }
77
+
78
+ function runSync<T>(walk: FsWalk<T>): T {
79
+ for (let step = walk.next(); ; ) {
80
+ if (step.done) return step.value
81
+ step = walk.next(answerSync(step.value))
82
+ }
83
+ }
84
+
85
+ async function runAsync<T>(walk: FsWalk<T>): Promise<T> {
86
+ for (let step = walk.next(); ; ) {
87
+ if (step.done) return step.value
88
+ step = walk.next(await answerAsync(step.value))
89
+ }
90
+ }
91
+
92
+ // Node resolution looks in each ancestor's node_modules, skipping directories
93
+ // that are themselves node_modules. one walk asks the same ancestors for many
94
+ // names, so each directory's node_modules is checked once and each manifest
95
+ // read once.
96
+ function createInstalledPackageReader() {
97
+ const hasModules = new Map<string, boolean>()
98
+ const manifests = new Map<string, InstalledPackage | null>()
99
+ return function* readInstalledPackage(
100
+ fromDir: string,
101
+ name: string,
102
+ ): FsWalk<InstalledPackage | null> {
103
+ for (let dir = fromDir; ; ) {
104
+ if (path.basename(dir) !== 'node_modules') {
105
+ const modules = path.join(dir, 'node_modules')
106
+ let present = hasModules.get(dir)
107
+ if (present === undefined) {
108
+ present = yield* exists(modules)
109
+ hasModules.set(dir, present)
110
+ }
111
+ if (present) {
112
+ const root = path.join(modules, name)
113
+ let installed = manifests.get(root)
114
+ if (installed === undefined) {
115
+ const manifest = yield* readManifest(path.join(root, 'package.json'))
116
+ installed = manifest ? { root, manifest } : null
117
+ manifests.set(root, installed)
118
+ }
119
+ if (installed) return installed
120
+ }
25
121
  }
26
122
  const parent = path.dirname(dir)
27
123
  if (parent === dir) return null
28
124
  dir = parent
29
- continue
30
125
  }
31
- return typeof manifest === 'object' && manifest !== null
32
- ? { root: path.join(dir, 'node_modules', name), manifest }
33
- : null
34
126
  }
35
127
  }
36
128
 
129
+ function* installedVersionsWalk(
130
+ projectRoot: string,
131
+ names: Iterable<string>,
132
+ ): FsWalk<PackageVersions> {
133
+ const readInstalledPackage = createInstalledPackageReader()
134
+ const versions: PackageVersions = {}
135
+ for (const name of [...names].sort()) {
136
+ const installed = yield* readInstalledPackage(projectRoot, name)
137
+ const version = installed && Reflect.get(installed.manifest, 'version')
138
+ if (typeof version === 'string' && version.length > 0) versions[name] = version
139
+ }
140
+ return versions
141
+ }
142
+
37
143
  export function readInstalledPackageVersions(
38
144
  projectRoot: string,
39
145
  modulePaths: Iterable<string>,
@@ -43,20 +149,14 @@ export function readInstalledPackageVersions(
43
149
  const name = extractPackageFromPath(modulePath.replaceAll(path.sep, '/'))
44
150
  if (name) names.add(name)
45
151
  }
46
- const versions: PackageVersions = {}
47
- for (const name of [...names].sort()) {
48
- const installed = readInstalledPackage(projectRoot, name)
49
- const version = installed && Reflect.get(installed.manifest, 'version')
50
- if (typeof version === 'string' && version.length > 0) versions[name] = version
51
- }
52
- return versions
152
+ return runSync(installedVersionsWalk(projectRoot, names))
53
153
  }
54
154
 
55
155
  // plain expo and one servers need no peach plugin. the launcher reads their
56
156
  // installed native packages from the app's dependency graph. an unrelated
57
157
  // package hoisted beside a workspace app is resolvable but is not linked.
58
- export function readInstalledNativePackageVersions(projectRoot: string): PackageVersions {
59
- const appRoot = fs.realpathSync(projectRoot)
158
+ function* nativePackageVersionsWalk(projectRoot: string): FsWalk<PackageVersions> {
159
+ const appRoot = yield* realpath(projectRoot)
60
160
  const nativeNames = new Set<string>()
61
161
  for (const specifier of [
62
162
  'react-native',
@@ -67,17 +167,14 @@ export function readInstalledNativePackageVersions(projectRoot: string): Package
67
167
  const name = extractPackageFromPath(`node_modules/${specifier}`)
68
168
  if (name) nativeNames.add(name)
69
169
  }
70
- const manifest: unknown = JSON.parse(
71
- fs.readFileSync(path.join(appRoot, 'package.json'), 'utf8'),
72
- )
73
- if (typeof manifest !== 'object' || manifest === null) {
74
- throw new Error('app package.json must contain an object')
75
- }
76
- const pending = [{ root: appRoot, manifest }]
170
+ const manifest = yield* readManifest(path.join(appRoot, 'package.json'))
171
+ if (!manifest) throw new Error('app package.json must contain an object')
172
+ const readInstalledPackage = createInstalledPackageReader()
173
+ const pending: InstalledPackage[] = [{ root: appRoot, manifest }]
77
174
  const visited = new Set<string>()
78
175
  const needed = new Set<string>()
79
176
  for (let next = pending.pop(); next; next = pending.pop()) {
80
- const root = fs.realpathSync(next.root)
177
+ const root = yield* realpath(next.root)
81
178
  if (visited.has(root)) continue
82
179
  visited.add(root)
83
180
  const fields = ['dependencies', 'optionalDependencies', 'peerDependencies']
@@ -92,15 +189,22 @@ export function readInstalledNativePackageVersions(projectRoot: string): Package
92
189
  if (typeof peer === 'object' && peer !== null && Reflect.get(peer, 'optional'))
93
190
  continue
94
191
  }
95
- const installed = readInstalledPackage(root, name)
192
+ const installed = yield* readInstalledPackage(root, name)
96
193
  if (!installed) continue
97
194
  if (nativeNames.has(name)) needed.add(name)
98
195
  pending.push(installed)
99
196
  }
100
197
  }
101
198
  }
102
- return readInstalledPackageVersions(
103
- projectRoot,
104
- [...needed].map((specifier) => `node_modules/${specifier}`),
105
- )
199
+ return yield* installedVersionsWalk(projectRoot, needed)
200
+ }
201
+
202
+ export function readInstalledNativePackageVersions(projectRoot: string): PackageVersions {
203
+ return runSync(nativePackageVersionsWalk(projectRoot))
204
+ }
205
+
206
+ export function readInstalledNativePackageVersionsAsync(
207
+ projectRoot: string,
208
+ ): Promise<PackageVersions> {
209
+ return runAsync(nativePackageVersionsWalk(projectRoot))
106
210
  }
@@ -325,7 +325,7 @@ function entrySource(ids: string[]): string {
325
325
  '@JsExport',
326
326
  'fun peachSetAndroidBuildInfo(model: String, release: String) = Build.setDevice(model, release)',
327
327
  '',
328
- '@OptIn(kotlin.js.ExperimentalJsExport::class, kotlin.js.ExperimentalWasmJsInterop::class, kotlinx.coroutines.DelicateCoroutinesApi::class)',
328
+ '@OptIn(kotlin.js.ExperimentalJsExport::class, kotlinx.coroutines.DelicateCoroutinesApi::class)',
329
329
  '@JsExport',
330
330
  'fun peachNativeCall(module: String, method: String, argsJson: String, contractHash: String): Promise<JsAny?> =',
331
331
  ' GlobalScope.promise(Dispatchers.Main) {',
@@ -12,10 +12,6 @@ import fs from 'fs'
12
12
  import { createRequire } from 'module'
13
13
  import { randomUUID } from 'node:crypto'
14
14
  import path from 'path'
15
- import {
16
- getRuntimePlatformAdapter,
17
- isRuntimePlatform,
18
- } from '../../peach-engine/src/platform/adapter'
19
15
  import { resolveAppProject } from '../cli/app-project'
20
16
  import { collectAndroidAutolinkedPackages } from './android-autolinking'
21
17
  import { insertAndroidAutolinkingFooter } from './androidAutolinkingContract'
@@ -51,6 +47,10 @@ import {
51
47
  serveRuntimeFile,
52
48
  SOOTSIM_RUNTIME_MISSING_MESSAGE,
53
49
  } from './runtime-assets'
50
+ import {
51
+ getRuntimePlatformAdapter,
52
+ isRuntimePlatform,
53
+ } from './runtimePlatformContract.ts'
54
54
 
55
55
  const prefix = '/__peachsim'
56
56
  export { toPeachDevelopmentBundleUrl, toPeachProductionBundleUrl }
@@ -0,0 +1,68 @@
1
+ import { resolveListeningPid, resolveProcessCwd } from '../scripts/dev-server-scanner'
2
+ import { loopbackOriginOf } from './backend-origin'
3
+ import { MANIFEST_PROBE_TIMEOUT_MS } from './dev-bundle-resolution'
4
+ import { parseExpoManifestBody } from './expo-manifest-body'
5
+
6
+ // resolve a metro dev server's project root. Expo's middleware advertises it
7
+ // in X-React-Native-Project-Root, encoded with encodeURI. Older servers name it
8
+ // in extra.expoClient._internal.projectRoot. The local peach open path runs from the
9
+ // CLI's cwd, which almost never owns the bundle being opened (e.g.
10
+ // `peach open 8081` run from ~/contrast against a 3pc metro), so scanning cwd for
11
+ // font declarations finds nothing.
12
+ //
13
+ // a bare react-native packager serves no such manifest, so the same resolver
14
+ // asks the OS for the listening process's cwd. that is still the development
15
+ // server's project identity; the invoking CLI's cwd is never consulted.
16
+ //
17
+ // it waits on the same budget as the manifest resolution that found this dev
18
+ // server. a cold Expo Metro answers /status in 2-4s while it builds a bundle,
19
+ // and dropping the project there opens the app without its fonts, splash or
20
+ // Firebase config. a server that stays silent past the budget fails the open.
21
+ export async function resolveMetroProjectRoot(bundleUrl: string): Promise<string | null> {
22
+ const origin = loopbackOriginOf(bundleUrl)
23
+ if (!origin) return null
24
+ const controller = new AbortController()
25
+ const timer = setTimeout(() => controller.abort(), MANIFEST_PROBE_TIMEOUT_MS)
26
+ let servedManifest = false
27
+ let metroRunning = false
28
+ try {
29
+ const status = await fetch(`${origin}/status`, { signal: controller.signal })
30
+ const advertisedRoot = status.headers.get('X-React-Native-Project-Root')
31
+ if (status.ok && advertisedRoot) return decodeURI(advertisedRoot)
32
+ metroRunning = status.ok && (await status.text()).trim() === 'packager-status:running'
33
+ const res = await fetch(`${origin}/`, {
34
+ headers: { 'expo-platform': 'ios', Accept: 'application/json' },
35
+ signal: controller.signal,
36
+ })
37
+ if (res.ok) {
38
+ const manifest: unknown = parseExpoManifestBody(await res.text())
39
+ servedManifest = true
40
+ let root: unknown = manifest
41
+ for (const key of ['extra', 'expoClient', '_internal', 'projectRoot']) {
42
+ root =
43
+ typeof root === 'object' && root !== null ? Reflect.get(root, key) : undefined
44
+ }
45
+ if (typeof root === 'string' && root.length > 0) return root
46
+ }
47
+ } catch {
48
+ if (controller.signal.aborted)
49
+ throw new Error(
50
+ `Metro project root request timed out after ${MANIFEST_PROBE_TIMEOUT_MS / 1000}s: ${origin}. Wait for the dev server to finish starting or pass --project-root.`,
51
+ )
52
+ } finally {
53
+ clearTimeout(timer)
54
+ }
55
+
56
+ // a server that answered with a manifest has already told us everything it
57
+ // knows. if it did not name a project root there is none to learn, and asking
58
+ // the OS about the listening process would answer with whatever directory
59
+ // that process happens to sit in — which is the CLI's own cwd trap this
60
+ // function exists to avoid. only a server whose status identifies Metro
61
+ // and which served no manifest gets the process lookup.
62
+ if (servedManifest || !metroRunning) return null
63
+
64
+ const port = Number(new URL(origin).port)
65
+ if (!Number.isFinite(port) || port <= 0) return null
66
+ const pid = await resolveListeningPid(port)
67
+ return pid === null ? null : resolveProcessCwd(pid)
68
+ }
@@ -0,0 +1,26 @@
1
+ {
2
+ "schema": 1,
3
+ "platform": "ios",
4
+ "target": "wasm32-unknown-wasip1",
5
+ "recipe": "93ec12de28e70ccd6a0ff72c91fe59add61930da9b9f0c981c35b8ff64abdf8e",
6
+ "adapter": {
7
+ "sha256": "051a6905f1194aa18075d68e0444d30e69b4e52dc6017f3e70815a2403e3c306"
8
+ },
9
+ "headers": {
10
+ "reactNativeJsi": "96db4e758dd53e9320cef7cad485e00aa06e7a982cefd920f17007de8a5bd9f9",
11
+ "nitroModules": "372b6f69fc063a0b316792eec9b26f36063868dc206f169acbb5d993c6572f65"
12
+ },
13
+ "compiler": "swift-6.4.0-RELEASE-custom-0d775d32d7c74eae",
14
+ "sdk": {
15
+ "id": "swift-6.4.0-RELEASE_wasm-peach-f02bd198",
16
+ "checksum": "1e19ea768fd4e821aae34b8966c4ddcee45615c4b3cf018979b061aee2fb5504"
17
+ },
18
+ "framework": {
19
+ "distribution": "e3bdd3d8fa4f9993",
20
+ "wireAbi": "ed0b01fcc0a79236d88ef9ac7950ac30932dfc19c19112c69d1d6a039a489292"
21
+ },
22
+ "archive": {
23
+ "sha256": "1cf000ee821aaf65b04a3d6702c7d4341e450371cfd199e5887c6056f80af899",
24
+ "size": 31175
25
+ }
26
+ }