peachsim 0.1.1641 → 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 (618) hide show
  1. package/README.md +12 -0
  2. package/cli/app-bundle-resources.ts +57 -0
  3. package/cli/app-catalog.ts +1 -1
  4. package/cli/app-fonts.ts +11 -80
  5. package/cli/app-splash.ts +18 -12
  6. package/cli/bridge-flow-runner.ts +11 -7
  7. package/cli/cloud-client.ts +10 -13
  8. package/cli/command-registry.ts +13 -4
  9. package/cli/commands/box.ts +4 -4
  10. package/cli/commands/control.ts +105 -53
  11. package/cli/commands/coverage-parser.ts +67 -0
  12. package/cli/commands/coverage.ts +550 -0
  13. package/cli/commands/debug.ts +9 -18
  14. package/cli/commands/desktop.ts +19 -7
  15. package/cli/commands/device.ts +14 -9
  16. package/cli/commands/guest-host.ts +6 -10
  17. package/cli/commands/inspect/core.ts +81 -17
  18. package/cli/commands/inspect.ts +13 -8
  19. package/cli/commands/kotlin.ts +2 -2
  20. package/cli/commands/maestro-compare.ts +1 -1
  21. package/cli/commands/platform.ts +20 -11
  22. package/cli/commands/preview.ts +16 -18
  23. package/cli/commands/runtime.ts +3 -2
  24. package/cli/commands/screenshot-layers.ts +1 -1
  25. package/cli/commands/screenshot.ts +1 -1
  26. package/cli/commands/serve.ts +5 -1
  27. package/cli/commands/support.ts +4 -4
  28. package/cli/commands/three-mode.ts +22 -15
  29. package/cli/commands/upload.ts +44 -45
  30. package/cli/current-sim.ts +38 -0
  31. package/cli/desktop-companion.ts +36 -8
  32. package/cli/device-option.ts +1 -1
  33. package/cli/drivers/playwright.ts +40 -0
  34. package/cli/drivers/types.ts +4 -0
  35. package/cli/help-core.ts +1 -1
  36. package/cli/internal-child.ts +2 -1
  37. package/cli/main.ts +9 -3
  38. package/cli/outbound-endpoints.ts +15 -5
  39. package/cli/output-redaction.ts +39 -14
  40. package/cli/remote-simulators.ts +4 -1
  41. package/cli/scene-video.ts +5 -2
  42. package/cli/send-to-box.ts +7 -10
  43. package/cli/telemetry.ts +1 -1
  44. package/cli/ws-bridge.ts +8 -1
  45. package/detox/attempt-events.cjs +3 -1
  46. package/detox/attempt-events.d.cts +1 -1
  47. package/detox/expectations.ts +108 -99
  48. package/detox/frame-offset.d.mts +6 -0
  49. package/detox/frame-offset.mjs +35 -0
  50. package/detox/gestures.ts +6 -18
  51. package/detox/index.ts +169 -101
  52. package/detox/jest-preset.cjs +1 -3
  53. package/detox/jest-transform.cjs +4 -0
  54. package/detox/matchers.ts +3 -0
  55. package/detox/motion-change.cjs +52 -118
  56. package/detox/motion-change.d.cts +6 -27
  57. package/detox/motion-leg-starts.cjs +20 -0
  58. package/detox/motion-leg-starts.d.cts +8 -0
  59. package/dist-lib/agent-daemon-client.cjs +1 -1
  60. package/dist-lib/agent-events.cjs +1 -1
  61. package/dist-lib/attached-projects.cjs +1 -1
  62. package/dist-lib/auth/shared-session.cjs +1 -1
  63. package/dist-lib/backend-origin.cjs +3 -3
  64. package/dist-lib/beta.cjs +1 -1
  65. package/dist-lib/beta.mjs +1 -1
  66. package/dist-lib/bridge-constants.cjs +1 -1
  67. package/dist-lib/bridge-contract-input.cjs +65 -1
  68. package/dist-lib/bridge-contract-input.mjs +63 -1
  69. package/dist-lib/bridge-contract.cjs +19 -1
  70. package/dist-lib/bridge-contract.mjs +17 -1
  71. package/dist-lib/bundle-channel.cjs +38332 -14940
  72. package/dist-lib/capture-contract.cjs +1 -1
  73. package/dist-lib/capture-contract.mjs +1 -1
  74. package/dist-lib/cloud-contract.cjs +1 -1
  75. package/dist-lib/cloud-contract.mjs +1 -1
  76. package/dist-lib/cloud-test-args.cjs +1 -1
  77. package/dist-lib/cloud-test-args.mjs +1 -1
  78. package/dist-lib/cloud.cjs +1 -1
  79. package/dist-lib/cloud.mjs +1 -1
  80. package/dist-lib/config.cjs +1 -1
  81. package/dist-lib/config.mjs +5 -3
  82. package/dist-lib/detox/index.cjs +1247 -4511
  83. package/dist-lib/detox/jest-preset.cjs +1 -3
  84. package/dist-lib/detox/jest-transform.cjs +4 -0
  85. package/dist-lib/dev-bundle-resolution.cjs +28 -24
  86. package/dist-lib/expo-swift-bundle.cjs +35243 -13172
  87. package/dist-lib/expo-swift-metadata.cjs +1 -1
  88. package/dist-lib/expo-swift-metadata.mjs +1 -1
  89. package/dist-lib/home-paths.cjs +1 -1
  90. package/dist-lib/host/bridge-host.cjs +45285 -63163
  91. package/dist-lib/host/fetch-proxy-handler.cjs +3544 -11
  92. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  93. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  94. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  95. package/dist-lib/host/websocket-proxy.cjs +1 -1
  96. package/dist-lib/index.cjs +1997 -2069
  97. package/dist-lib/jump-to-source-babel.cjs +1 -1
  98. package/dist-lib/jump-to-source-native.cjs +1 -1
  99. package/dist-lib/kotlin-host.cjs +2 -2
  100. package/dist-lib/menu.cjs +14 -6
  101. package/dist-lib/menu.mjs +14 -6
  102. package/dist-lib/metro-fingerprint-registry.cjs +1 -1
  103. package/dist-lib/metro-fingerprint-registry.mjs +1 -1
  104. package/dist-lib/metro-production-bundle.cjs +1 -1
  105. package/dist-lib/metro-production-bundle.mjs +1 -1
  106. package/dist-lib/metro.cjs +468 -563
  107. package/dist-lib/native-app-identity-project.cjs +128 -292
  108. package/dist-lib/native-app-identity-project.mjs +1262 -51
  109. package/dist-lib/native-app-identity.cjs +8 -3
  110. package/dist-lib/native-app-identity.mjs +8 -3
  111. package/dist-lib/native-firebase-metadata.cjs +1 -1
  112. package/dist-lib/native-firebase-metadata.mjs +1 -1
  113. package/dist-lib/plist.cjs +2 -244
  114. package/dist-lib/plist.mjs +1 -1
  115. package/dist-lib/profiles.cjs +1 -1
  116. package/dist-lib/public-brand.cjs +1 -1
  117. package/dist-lib/public-origins-lib-esm.json +290 -0
  118. package/dist-lib/public-origins-lib-static.json +1 -0
  119. package/dist-lib/public-origins-lib.json +1852 -0
  120. package/dist-lib/react-native-host-modules.cjs +1 -1
  121. package/dist-lib/react-native-host-modules.mjs +1 -1
  122. package/dist-lib/scripts/dev-server-scanner.cjs +14 -253
  123. package/dist-lib/sdk.cjs +84 -16
  124. package/dist-lib/sdk.mjs +82 -15
  125. package/dist-lib/skills.cjs +51248 -75450
  126. package/dist-lib/swift-compile.cjs +26154 -1245
  127. package/dist-lib/swift-compile.mjs +26151 -1230
  128. package/dist-lib/swift-package.cjs +79 -1
  129. package/dist-lib/swift-package.mjs +75 -1
  130. package/dist-lib/swift-submit.cjs +1 -1
  131. package/dist-lib/swift-submit.mjs +1 -1
  132. package/dist-lib/swift-toolchain.cjs +1 -1
  133. package/dist-lib/swift.cjs +1 -1
  134. package/dist-lib/vite-swift.cjs +34394 -12323
  135. package/dist-lib/vite.cjs +373 -298
  136. package/dist-lib/worklet-executable.cjs +1 -1
  137. package/dist-lib/worklet-executable.mjs +1 -1
  138. package/dist-types/packages/peach-compat/src/engine-config.d.ts +2 -0
  139. package/dist-types/packages/peach-compat/src/stubs/form-sheet-spring.d.ts +9 -0
  140. package/dist-types/packages/peach-compat/src/stubs/native-evaluation-lease.d.ts +47 -0
  141. package/dist-types/packages/peach-compat/src/stubs/native-seams/react-native-cookies.d.ts +113 -0
  142. package/dist-types/packages/peach-compat/src/stubs/native-seams/react-native-gesture-handler.d.ts +154 -0
  143. package/dist-types/packages/peach-compat/src/stubs/screen-transition-math.d.ts +756 -0
  144. package/dist-types/packages/peach-compat/src/stubs/transition-scalar.d.ts +25 -0
  145. package/dist-types/packages/peach-engine/src/billing/plans.d.ts +64 -0
  146. package/dist-types/packages/peach-engine/src/browser-page-target.d.ts +2 -0
  147. package/dist-types/packages/peach-engine/src/bundle-platform-url.d.ts +3 -0
  148. package/dist-types/packages/peach-engine/src/capture/browser-accessibility-host.d.ts +3 -0
  149. package/dist-types/packages/peach-engine/src/capture/browser-composite.d.ts +55 -0
  150. package/dist-types/packages/peach-engine/src/capture/browserAccessibilityContract.d.ts +27 -0
  151. package/dist-types/packages/peach-engine/src/capture/nativeScreenCaptureContract.d.ts +22 -0
  152. package/dist-types/packages/peach-engine/src/cli-companion.d.ts +36 -0
  153. package/dist-types/packages/peach-engine/src/components/native-ui/webview-frame-bridge.d.ts +34 -0
  154. package/dist-types/packages/peach-engine/src/config.d.ts +5 -0
  155. package/dist-types/packages/peach-engine/src/engine/android-stretch-effect.d.ts +57 -0
  156. package/dist-types/packages/peach-engine/src/engine/animated-driven-style.d.ts +47 -0
  157. package/dist-types/packages/peach-engine/src/engine/animated-value.d.ts +5 -0
  158. package/dist-types/packages/peach-engine/src/engine/animated.d.ts +195 -0
  159. package/dist-types/packages/peach-engine/src/engine/animation-clockContract.d.ts +15 -0
  160. package/dist-types/packages/peach-engine/src/engine/animation-graph.d.ts +148 -0
  161. package/dist-types/packages/peach-engine/src/engine/app-catalog-wire.d.ts +10 -0
  162. package/dist-types/packages/peach-engine/src/engine/app-font-registry.d.ts +87 -0
  163. package/dist-types/packages/peach-engine/src/engine/attributed-paragraph-paint.d.ts +7 -0
  164. package/dist-types/packages/peach-engine/src/engine/attributed-paragraph.d.ts +123 -0
  165. package/dist-types/packages/peach-engine/src/engine/audioContract.d.ts +16 -0
  166. package/dist-types/packages/peach-engine/src/engine/canvaskit-api.d.ts +93 -0
  167. package/dist-types/packages/peach-engine/src/engine/canvaskit-renderer.d.ts +216 -0
  168. package/dist-types/packages/peach-engine/src/engine/config-plugin-fonts.d.ts +40 -0
  169. package/dist-types/packages/peach-engine/src/engine/config-plugin-splash.d.ts +25 -0
  170. package/dist-types/packages/peach-engine/src/engine/cull-visibility.d.ts +44 -0
  171. package/dist-types/packages/peach-engine/src/engine/damage-rect.d.ts +19 -0
  172. package/dist-types/packages/peach-engine/src/engine/engine-resource.d.ts +6 -0
  173. package/dist-types/packages/peach-engine/src/engine/expo-manifest.d.ts +5 -0
  174. package/dist-types/packages/peach-engine/src/engine/fiber-debug-metadata.d.ts +30 -0
  175. package/dist-types/packages/peach-engine/src/engine/font-config.d.ts +139 -0
  176. package/dist-types/packages/peach-engine/src/engine/generated/sf-pro-font.d.ts +1 -0
  177. package/dist-types/packages/peach-engine/src/engine/glass-material.d.ts +31 -0
  178. package/dist-types/packages/peach-engine/src/engine/host-composite.d.ts +100 -0
  179. package/dist-types/packages/peach-engine/src/engine/hosted-semantics.d.ts +49 -0
  180. package/dist-types/packages/peach-engine/src/engine/image-audit.d.ts +70 -0
  181. package/dist-types/packages/peach-engine/src/engine/image-loader.d.ts +350 -0
  182. package/dist-types/packages/peach-engine/src/engine/inspect-info.d.ts +27 -0
  183. package/dist-types/packages/peach-engine/src/engine/inspect-outline.d.ts +14 -0
  184. package/dist-types/packages/peach-engine/src/engine/inspect-visibility.d.ts +33 -0
  185. package/dist-types/packages/peach-engine/src/engine/ios-fast-scroll.d.ts +16 -0
  186. package/dist-types/packages/peach-engine/src/engine/layout-sab.d.ts +43 -0
  187. package/dist-types/packages/peach-engine/src/engine/liquid-glass-rect.d.ts +23 -0
  188. package/dist-types/packages/peach-engine/src/engine/liquid-glass-shaders.d.ts +9 -0
  189. package/dist-types/packages/peach-engine/src/engine/liquid-glass.d.ts +283 -0
  190. package/dist-types/packages/peach-engine/src/engine/live-object-counts.d.ts +6 -0
  191. package/dist-types/packages/peach-engine/src/engine/lottie-runtime.d.ts +32 -0
  192. package/dist-types/packages/peach-engine/src/engine/lottie-types.d.ts +138 -0
  193. package/dist-types/packages/peach-engine/src/engine/memory-counts.d.ts +27 -0
  194. package/dist-types/packages/peach-engine/src/engine/metalDirectContract.d.ts +108 -0
  195. package/dist-types/packages/peach-engine/src/engine/metalShaderContract.d.ts +217 -0
  196. package/dist-types/packages/peach-engine/src/engine/native-animation-driver.d.ts +112 -0
  197. package/dist-types/packages/peach-engine/src/engine/native-animation-graph.d.ts +62 -0
  198. package/dist-types/packages/peach-engine/src/engine/native-layout.d.ts +133 -0
  199. package/dist-types/packages/peach-engine/src/engine/native-resources.d.ts +26 -0
  200. package/dist-types/packages/peach-engine/src/engine/nativeReanimatedContract.d.ts +25 -0
  201. package/dist-types/packages/peach-engine/src/engine/nativeReplayContract.d.ts +64 -0
  202. package/dist-types/packages/peach-engine/src/engine/node.d.ts +589 -0
  203. package/dist-types/packages/peach-engine/src/engine/paint-boundary-types.d.ts +112 -0
  204. package/dist-types/packages/peach-engine/src/engine/paint-boundary.d.ts +57 -0
  205. package/dist-types/packages/peach-engine/src/engine/portalContract.d.ts +21 -0
  206. package/dist-types/packages/peach-engine/src/engine/portals.d.ts +20 -0
  207. package/dist-types/packages/peach-engine/src/engine/render-damage.d.ts +107 -0
  208. package/dist-types/packages/peach-engine/src/engine/riveContract.d.ts +420 -0
  209. package/dist-types/packages/peach-engine/src/engine/rn-spring.d.ts +51 -0
  210. package/dist-types/packages/peach-engine/src/engine/scene-table.d.ts +379 -0
  211. package/dist-types/packages/peach-engine/src/engine/scroll-momentum-math.d.ts +152 -0
  212. package/dist-types/packages/peach-engine/src/engine/scroll-pan-contacts.d.ts +10 -0
  213. package/dist-types/packages/peach-engine/src/engine/scroll-platform.d.ts +75 -0
  214. package/dist-types/packages/peach-engine/src/engine/scroll-range.d.ts +14 -0
  215. package/dist-types/packages/peach-engine/src/engine/scroll-velocity.d.ts +14 -0
  216. package/dist-types/packages/peach-engine/src/engine/scroll.d.ts +320 -0
  217. package/dist-types/packages/peach-engine/src/engine/signal.d.ts +7 -0
  218. package/dist-types/packages/peach-engine/src/engine/snapshot-cache-policy.d.ts +6 -0
  219. package/dist-types/packages/peach-engine/src/engine/svg-geometry.d.ts +41 -0
  220. package/dist-types/packages/peach-engine/src/engine/text-attachment-paragraphs.d.ts +10 -0
  221. package/dist-types/packages/peach-engine/src/engine/text-decoration.d.ts +11 -0
  222. package/dist-types/packages/peach-engine/src/engine/text-line-break.d.ts +22 -0
  223. package/dist-types/packages/peach-engine/src/engine/text-paint-receipt.d.ts +98 -0
  224. package/dist-types/packages/peach-engine/src/engine/text-paragraph.d.ts +11 -0
  225. package/dist-types/packages/peach-engine/src/engine/text-paragraphContract.d.ts +34 -0
  226. package/dist-types/packages/peach-engine/src/engine/text-transform.d.ts +1 -0
  227. package/dist-types/packages/peach-engine/src/engine/types.d.ts +657 -0
  228. package/dist-types/packages/peach-engine/src/engine/visible-frame.d.ts +54 -0
  229. package/dist-types/packages/peach-engine/src/engine/webrtcContract.d.ts +74 -0
  230. package/dist-types/packages/peach-engine/src/graphite-stats-fields.d.ts +184 -0
  231. package/dist-types/packages/peach-engine/src/guest-import-meta.d.ts +12 -0
  232. package/dist-types/packages/peach-engine/src/guest-module-overrides.d.ts +7 -0
  233. package/dist-types/packages/peach-engine/src/ios/app-card-types.d.ts +7 -0
  234. package/dist-types/packages/peach-engine/src/ios/apps/canvas-map-data.d.ts +177 -0
  235. package/dist-types/packages/peach-engine/src/ios/aux-home-scene.d.ts +54 -0
  236. package/dist-types/packages/peach-engine/src/ios/chrome-metrics.d.ts +47 -0
  237. package/dist-types/packages/peach-engine/src/ios/constants.d.ts +21 -0
  238. package/dist-types/packages/peach-engine/src/ios/duo-housing.d.ts +37 -0
  239. package/dist-types/packages/peach-engine/src/ios/home/types.d.ts +29 -0
  240. package/dist-types/packages/peach-engine/src/ios/home-app-catalog.d.ts +43 -0
  241. package/dist-types/packages/peach-engine/src/ios/photo-store.d.ts +73 -0
  242. package/dist-types/packages/peach-engine/src/ios/photoLibraryContract.d.ts +166 -0
  243. package/dist-types/packages/peach-engine/src/ios/shell-controller-types.d.ts +21 -0
  244. package/dist-types/packages/peach-engine/src/ios/shell-transition-debug.d.ts +18 -0
  245. package/dist-types/packages/peach-engine/src/metro-asset-path.d.ts +21 -0
  246. package/dist-types/packages/peach-engine/src/metro-fingerprint-registry-client.d.ts +11 -0
  247. package/dist-types/packages/peach-engine/src/metro-fingerprint.d.ts +38 -0
  248. package/dist-types/packages/peach-engine/src/native-preview-bundle.d.ts +44 -0
  249. package/dist-types/packages/peach-engine/src/observability/types.d.ts +74 -0
  250. package/dist-types/packages/peach-engine/src/peach-warm-manifest.d.ts +32 -0
  251. package/dist-types/packages/peach-engine/src/permissions/app-settings-client.d.ts +25 -0
  252. package/dist-types/packages/peach-engine/src/permissions/system-permission-types.d.ts +20 -0
  253. package/dist-types/packages/peach-engine/src/platform/android-back-panel.d.ts +131 -0
  254. package/dist-types/packages/peach-engine/src/platform/android-gesture-exclusion.d.ts +28 -0
  255. package/dist-types/packages/peach-engine/src/platform/android-predictive-back.d.ts +33 -0
  256. package/dist-types/packages/peach-engine/src/platform/system-bars-state.d.ts +14 -0
  257. package/dist-types/packages/peach-engine/src/playwright-sim-host.d.ts +1 -0
  258. package/dist-types/packages/peach-engine/src/preview/bundle-layout.d.ts +8 -0
  259. package/dist-types/packages/peach-engine/src/preview/bundle-variantContract.d.ts +24 -0
  260. package/dist-types/packages/peach-engine/src/preview/capture-bundle.d.ts +26 -0
  261. package/dist-types/packages/peach-engine/src/preview/compress-node.d.ts +2 -0
  262. package/dist-types/packages/peach-engine/src/preview/compress.d.ts +2 -0
  263. package/dist-types/packages/peach-engine/src/preview/presigned-upload.d.ts +60 -0
  264. package/dist-types/packages/peach-engine/src/preview/trace.d.ts +144 -0
  265. package/dist-types/packages/peach-engine/src/preview/upload-protocol.d.ts +152 -0
  266. package/dist-types/packages/peach-engine/src/profiler/animation-recording-loader.d.ts +1 -0
  267. package/dist-types/packages/peach-engine/src/profiler/profile-trace.d.ts +4 -0
  268. package/dist-types/packages/peach-engine/src/react-bridge.d.ts +3 -0
  269. package/dist-types/packages/peach-engine/src/react-native/AppState.d.ts +45 -0
  270. package/dist-types/packages/peach-engine/src/react-native/Appearance.d.ts +34 -0
  271. package/dist-types/packages/peach-engine/src/react-native/framework-colors-data.d.ts +2 -0
  272. package/dist-types/packages/peach-engine/src/react-native/host-services.d.ts +42 -0
  273. package/dist-types/packages/peach-engine/src/react-native/layout-animation.d.ts +22 -0
  274. package/dist-types/packages/peach-engine/src/react-native/platform-colors.d.ts +17 -0
  275. package/dist-types/packages/peach-engine/src/remote-stream/client-config.d.ts +10 -0
  276. package/dist-types/packages/peach-engine/src/remote-stream/cloud-display.d.ts +58 -0
  277. package/dist-types/packages/peach-engine/src/remote-stream/scene-recording.d.ts +45 -0
  278. package/dist-types/packages/peach-engine/src/render-worker/animated-drive-output.d.ts +35 -0
  279. package/dist-types/packages/peach-engine/src/render-worker/app-load.d.ts +16 -0
  280. package/dist-types/packages/peach-engine/src/render-worker/aux-surface-types.d.ts +2 -0
  281. package/dist-types/packages/peach-engine/src/render-worker/canvaskit-shared.d.ts +42 -0
  282. package/dist-types/packages/peach-engine/src/render-worker/canvaskit-webgpu.d.ts +434 -0
  283. package/dist-types/packages/peach-engine/src/render-worker/canvaskit-worker-init.d.ts +12 -0
  284. package/dist-types/packages/peach-engine/src/render-worker/compositor-backend.d.ts +31 -0
  285. package/dist-types/packages/peach-engine/src/render-worker/compositor-gpu.d.ts +202 -0
  286. package/dist-types/packages/peach-engine/src/render-worker/compositor-protocol.d.ts +1945 -0
  287. package/dist-types/packages/peach-engine/src/render-worker/compositor-runtime/scroll-drag-resample.d.ts +44 -0
  288. package/dist-types/packages/peach-engine/src/render-worker/css-keyframes-drive.d.ts +36 -0
  289. package/dist-types/packages/peach-engine/src/render-worker/edit-menu-geometry.d.ts +8 -0
  290. package/dist-types/packages/peach-engine/src/render-worker/engine-resource-relay.d.ts +21 -0
  291. package/dist-types/packages/peach-engine/src/render-worker/expo-widgetContract.d.ts +16 -0
  292. package/dist-types/packages/peach-engine/src/render-worker/gesture-seam-protocol.d.ts +152 -0
  293. package/dist-types/packages/peach-engine/src/render-worker/graph-linked-value.d.ts +29 -0
  294. package/dist-types/packages/peach-engine/src/render-worker/graphite-pipeline-compiler-contract.d.ts +49 -0
  295. package/dist-types/packages/peach-engine/src/render-worker/graphite-pipeline-compiler.d.ts +12 -0
  296. package/dist-types/packages/peach-engine/src/render-worker/host-service-protocol.d.ts +756 -0
  297. package/dist-types/packages/peach-engine/src/render-worker/image-lifecycle-event.d.ts +22 -0
  298. package/dist-types/packages/peach-engine/src/render-worker/image-pixel-contract.d.ts +48 -0
  299. package/dist-types/packages/peach-engine/src/render-worker/live-frame-mirror.d.ts +34 -0
  300. package/dist-types/packages/peach-engine/src/render-worker/map-command-channel.d.ts +189 -0
  301. package/dist-types/packages/peach-engine/src/render-worker/mapNativeContract.d.ts +101 -0
  302. package/dist-types/packages/peach-engine/src/render-worker/native-dynamic-synchronizable.d.ts +22 -0
  303. package/dist-types/packages/peach-engine/src/render-worker/native-menu-gesture.d.ts +9 -0
  304. package/dist-types/packages/peach-engine/src/render-worker/native-ui-commandContract.d.ts +23 -0
  305. package/dist-types/packages/peach-engine/src/render-worker/native-ui-protocol.d.ts +1087 -0
  306. package/dist-types/packages/peach-engine/src/render-worker/native-widgetContract.d.ts +100 -0
  307. package/dist-types/packages/peach-engine/src/render-worker/nativeAnimMirrorContract.d.ts +174 -0
  308. package/dist-types/packages/peach-engine/src/render-worker/nativeSyncReplyContract.d.ts +11 -0
  309. package/dist-types/packages/peach-engine/src/render-worker/one-native-contentContract.d.ts +54 -0
  310. package/dist-types/packages/peach-engine/src/render-worker/pointerSampleContract.d.ts +14 -0
  311. package/dist-types/packages/peach-engine/src/render-worker/protocol.d.ts +880 -0
  312. package/dist-types/packages/peach-engine/src/render-worker/reanimated-css-contract.d.ts +63 -0
  313. package/dist-types/packages/peach-engine/src/render-worker/reanimated-readiness.d.ts +29 -0
  314. package/dist-types/packages/peach-engine/src/render-worker/resilient-frame-clock.d.ts +22 -0
  315. package/dist-types/packages/peach-engine/src/render-worker/retained-app-load.d.ts +20 -0
  316. package/dist-types/packages/peach-engine/src/render-worker/screen-edge-swipe-commit-protocol.d.ts +1 -0
  317. package/dist-types/packages/peach-engine/src/render-worker/screen-form-sheet-commit-protocol.d.ts +26 -0
  318. package/dist-types/packages/peach-engine/src/render-worker/scroll-mirror-tenant.d.ts +37 -0
  319. package/dist-types/packages/peach-engine/src/render-worker/scroll-mirror.d.ts +164 -0
  320. package/dist-types/packages/peach-engine/src/render-worker/shell-event-registry.d.ts +119 -0
  321. package/dist-types/packages/peach-engine/src/render-worker/shell-gesture-regions.d.ts +41 -0
  322. package/dist-types/packages/peach-engine/src/render-worker/shell-protocol.d.ts +603 -0
  323. package/dist-types/packages/peach-engine/src/render-worker/shell-scene-schema.d.ts +101 -0
  324. package/dist-types/packages/peach-engine/src/render-worker/shell-tree-inline-sources.d.ts +13 -0
  325. package/dist-types/packages/peach-engine/src/render-worker/shell-tree-wire.d.ts +87 -0
  326. package/dist-types/packages/peach-engine/src/render-worker/test-bridge-protocol.d.ts +47 -0
  327. package/dist-types/packages/peach-engine/src/render-worker/text-inputContract.d.ts +93 -0
  328. package/dist-types/packages/peach-engine/src/render-worker/tree-sync-port.d.ts +102 -0
  329. package/dist-types/packages/peach-engine/src/render-worker/webgpu-frame-transaction.d.ts +292 -0
  330. package/dist-types/packages/peach-engine/src/render-worker/webgpu-readback-scheduler.d.ts +107 -0
  331. package/dist-types/packages/peach-engine/src/render-worker/webview-capture-protocol.d.ts +16 -0
  332. package/dist-types/packages/peach-engine/src/render-worker/worker-input-runtime.d.ts +211 -0
  333. package/dist-types/packages/peach-engine/src/render-worker/worker-storage.d.ts +33 -0
  334. package/dist-types/packages/peach-engine/src/render-worker/worklet-runtime.d.ts +987 -0
  335. package/dist-types/packages/peach-engine/src/render-worker/worklet-sab.d.ts +24 -0
  336. package/dist-types/packages/peach-engine/src/rolldown-bundle-inventory.d.ts +84 -0
  337. package/dist-types/packages/peach-engine/src/rolldown-production-fingerprint.d.ts +31 -0
  338. package/dist-types/packages/peach-engine/src/screenshots/timeline-assets.d.ts +10 -0
  339. package/dist-types/packages/peach-engine/src/screenshots/tokens.d.ts +9 -0
  340. package/dist-types/packages/peach-engine/src/settings/devices.d.ts +70 -0
  341. package/dist-types/packages/peach-engine/src/settings/duo-fold-bus.d.ts +87 -0
  342. package/dist-types/packages/peach-engine/src/settings/interface-rotation.d.ts +30 -0
  343. package/dist-types/packages/peach-engine/src/settings/react-native-configuration.d.ts +12 -0
  344. package/dist-types/packages/peach-engine/src/settings/scene-geometryContract.d.ts +40 -0
  345. package/dist-types/packages/peach-engine/src/settings/store.d.ts +37 -0
  346. package/dist-types/packages/peach-engine/src/shell-events.d.ts +203 -0
  347. package/dist-types/packages/peach-engine/src/shell-intent.d.ts +68 -0
  348. package/dist-types/packages/peach-engine/src/sootsim-event.d.ts +35 -0
  349. package/dist-types/packages/peach-engine/src/top-overlay-state.d.ts +5 -0
  350. package/dist-types/packages/peach-engine/src/web-authentication-automation-host.d.ts +2 -0
  351. package/dist-types/packages/peach-engine/src/webAuthenticationContract.d.ts +34 -0
  352. package/dist-types/packages/peach-engine/src/webview-automation-host.d.ts +180 -0
  353. package/dist-types/packages/peach-engine/src/wireframe-mode.d.ts +16 -0
  354. package/dist-types/packages/peach-globals/src/frameBreakdownContract.d.ts +16 -0
  355. package/dist-types/packages/peach-globals/src/index.d.ts +3311 -0
  356. package/dist-types/packages/peach-globals/src/nativeSurfaceContract.d.ts +76 -0
  357. package/dist-types/packages/peach-globals/src/pointerSourceEventContract.d.ts +8 -0
  358. package/dist-types/packages/peach-globals/src/profileTrace.d.ts +11 -0
  359. package/dist-types/packages/peach-globals/src/profilerContract.d.ts +223 -0
  360. package/dist-types/packages/peach-kit/src/capabilities.d.ts +721 -0
  361. package/dist-types/packages/peach-kit/src/internal.d.ts +4 -0
  362. package/dist-types/packages/peach-kit/src/materials/types.d.ts +27 -0
  363. package/dist-types/packages/peach-kit/src/materials/uikit-blur-material.d.ts +14 -0
  364. package/dist-types/packages/peach-kit/src/navigation-types.d.ts +11 -0
  365. package/dist-types/packages/peach-kit/src/react-bridge.d.ts +53 -0
  366. package/dist-types/packages/peach-kit/src/runtime.d.ts +26 -0
  367. package/dist-types/packages/peach-kit/src/ui/hosting-safe-area.d.ts +24 -0
  368. package/dist-types/packages/peach-kit/src/ui/popover-placement.d.ts +53 -0
  369. package/dist-types/packages/peach-kit/src/ui/presentationContract.d.ts +17 -0
  370. package/kotlin/ComposeSources/PeachComposeHost.kt +1 -1
  371. package/kotlin/JniSources/com/facebook/jni/HybridData.kt +0 -2
  372. package/kotlin/JniSources/dev/peach/jni/NativeBindings.kt +0 -2
  373. package/kotlin/JniTransportSources/dev/peach/jni/integration/JniTransport.kt +0 -2
  374. package/kotlin/README.md +6 -0
  375. package/package.json +22 -2
  376. package/runtime-companion.json +1 -0
  377. package/skills/contrast/SKILL.md +1 -0
  378. package/src/appBundleResourcesContract.ts +51 -0
  379. package/src/assetCatalogContract.ts +21 -0
  380. package/src/backend-origin.ts +3 -1
  381. package/src/bridge-contract-input.ts +84 -0
  382. package/src/bridge-contract.ts +35 -3
  383. package/src/browser-launch-policy.ts +1 -0
  384. package/src/bundle-channel.mjs +4 -2
  385. package/src/cli-runtime.ts +55 -0
  386. package/src/crash-fingerprint.ts +26 -0
  387. package/src/dev-bundle-resolution.ts +50 -23
  388. package/src/device-catalog.ts +1159 -0
  389. package/src/host/bridge-host.ts +20 -37
  390. package/src/host/browser-pointer.ts +71 -0
  391. package/src/host/dev-server-package-versions.ts +23 -0
  392. package/src/host/fetch-proxy-handler.ts +17 -4
  393. package/src/host/staged-host-files.ts +28 -4
  394. package/src/installed-package-versions.ts +142 -38
  395. package/src/kotlin-host.ts +1 -1
  396. package/src/launchMetadataContract.ts +1 -0
  397. package/src/menu.ts +12 -4
  398. package/src/metro-plugin.ts +4 -4
  399. package/src/metro-project-root.ts +68 -0
  400. package/src/native-app-identity-project.ts +47 -38
  401. package/src/nitro-adapter.lock.json +26 -0
  402. package/src/nitro-adapter.ts +103 -0
  403. package/src/nitro-bundle.ts +24 -10
  404. package/src/nitro-compile.ts +33 -51
  405. package/src/nitro-source.ts +177 -96
  406. package/src/nitroAdapterContract.ts +217 -0
  407. package/src/nitroContract.ts +24 -11
  408. package/src/process-group.ts +41 -34
  409. package/src/react-bridge-importers.ts +28 -0
  410. package/src/reactNativeConfigurationContract.ts +36 -0
  411. package/src/runtime-assets.ts +7 -2
  412. package/src/runtime-delivery.ts +8 -7
  413. package/src/runtimePlatformContract.ts +70 -0
  414. package/src/screenshots/frame-compose.ts +42 -43
  415. package/src/screenshots/org-deck.ts +9 -4
  416. package/src/screenshots/preset-names.ts +29 -0
  417. package/src/screenshots/registry.ts +5 -5
  418. package/src/screenshots/schema.ts +1 -1
  419. package/src/screenshots/screenshotContract.ts +971 -0
  420. package/src/settings-flags.ts +107 -0
  421. package/src/settingsContract.ts +609 -0
  422. package/src/storageSnapshotContract.ts +344 -0
  423. package/src/stub-pattern-matcher.ts +550 -0
  424. package/src/swift-compile.ts +926 -47
  425. package/src/swift-compiler-digest.ts +17 -3
  426. package/src/swift-distribution.lock.json +49 -22
  427. package/src/swift-host.ts +167 -52
  428. package/src/swift-objc-compile.ts +86 -26
  429. package/src/swift-objc-export.ts +532 -0
  430. package/src/swift-objc-import.ts +769 -0
  431. package/src/swift-objc-metadata.ts +285 -10
  432. package/src/swift-objc-sdk.ts +13970 -158
  433. package/src/swift-objc-standin.ts +137 -1
  434. package/src/swift-package.ts +94 -0
  435. package/src/swift-packages.ts +5 -5
  436. package/src/swift-root-lock.ts +241 -92
  437. package/src/swift-submit.ts +6 -0
  438. package/src/swiftContract.ts +99 -0
  439. package/src/target-matcher.ts +6 -1
  440. package/src/vite-plugin.ts +14 -40
  441. package/src/worker-system-chunks.ts +1 -1
  442. package/src/workerChunkContract.ts +5 -0
  443. package/src/worklets-babel.ts +24 -5
  444. package/src/xcode-project.ts +103 -11
  445. package/src/xcode-target-members.ts +10 -3
  446. package/cli/drivers/playwright-sim-host.ts +0 -825
  447. package/kotlin/fixtures/counter/Counter.d.kt.ts +0 -17
  448. package/kotlin/fixtures/counter/Counter.kt +0 -51
  449. package/kotlin/fixtures/counter/CounterApp.native.tsx +0 -61
  450. package/kotlin/fixtures/counter/CounterApp.tsx +0 -3
  451. package/kotlin/fixtures/counter/CounterScreen.d.kt.ts +0 -8
  452. package/kotlin/fixtures/counter/CounterScreen.kt +0 -56
  453. package/kotlin/fixtures/counter/app/_layout.tsx +0 -4
  454. package/kotlin/fixtures/counter/app/index+spa.tsx +0 -1
  455. package/kotlin/fixtures/counter/app/routes.d.ts +0 -18
  456. package/kotlin/fixtures/counter/package.json +0 -20
  457. package/kotlin/fixtures/counter/tsconfig.json +0 -19
  458. package/kotlin/fixtures/counter/vite.config.ts +0 -20
  459. package/kotlin/fixtures/headless-counter/Headless.kt +0 -234
  460. package/kotlin/fixtures/import-animation/Animation.d.kt.ts +0 -7
  461. package/kotlin/fixtures/import-animation/Animation.kt +0 -80
  462. package/kotlin/fixtures/import-animation/ImportAnimation.native.tsx +0 -13
  463. package/kotlin/fixtures/import-animation/README.md +0 -24
  464. package/kotlin/fixtures/import-animation/app/_layout.tsx +0 -4
  465. package/kotlin/fixtures/import-animation/app/index+spa.tsx +0 -1
  466. package/kotlin/fixtures/import-animation/app/routes.d.ts +0 -18
  467. package/kotlin/fixtures/import-animation/package.json +0 -23
  468. package/kotlin/fixtures/import-animation/tsconfig.json +0 -20
  469. package/kotlin/fixtures/import-animation/vite.config.ts +0 -20
  470. package/kotlin/fixtures/import-drawing/Drawing.d.kt.ts +0 -7
  471. package/kotlin/fixtures/import-drawing/Drawing.kt +0 -101
  472. package/kotlin/fixtures/import-drawing/ImportDrawing.native.tsx +0 -18
  473. package/kotlin/fixtures/import-drawing/README.md +0 -34
  474. package/kotlin/fixtures/import-drawing/app/_layout.tsx +0 -4
  475. package/kotlin/fixtures/import-drawing/app/index+spa.tsx +0 -1
  476. package/kotlin/fixtures/import-drawing/package.json +0 -23
  477. package/kotlin/fixtures/import-drawing/tsconfig.json +0 -20
  478. package/kotlin/fixtures/import-drawing/vite.config.ts +0 -20
  479. package/kotlin/fixtures/import-editor/Editor.d.kt.ts +0 -7
  480. package/kotlin/fixtures/import-editor/Editor.kt +0 -59
  481. package/kotlin/fixtures/import-editor/ImportEditor.native.tsx +0 -23
  482. package/kotlin/fixtures/import-editor/README.md +0 -27
  483. package/kotlin/fixtures/import-editor/app/_layout.tsx +0 -4
  484. package/kotlin/fixtures/import-editor/app/index+spa.tsx +0 -1
  485. package/kotlin/fixtures/import-editor/package.json +0 -23
  486. package/kotlin/fixtures/import-editor/tsconfig.json +0 -20
  487. package/kotlin/fixtures/import-editor/vite.config.ts +0 -20
  488. package/kotlin/fixtures/import-effects/Effects.d.kt.ts +0 -7
  489. package/kotlin/fixtures/import-effects/Effects.kt +0 -87
  490. package/kotlin/fixtures/import-effects/ImportEffects.native.tsx +0 -13
  491. package/kotlin/fixtures/import-effects/README.md +0 -19
  492. package/kotlin/fixtures/import-effects/app/_layout.tsx +0 -4
  493. package/kotlin/fixtures/import-effects/app/index+spa.tsx +0 -1
  494. package/kotlin/fixtures/import-effects/package.json +0 -23
  495. package/kotlin/fixtures/import-effects/tsconfig.json +0 -20
  496. package/kotlin/fixtures/import-effects/vite.config.ts +0 -20
  497. package/kotlin/fixtures/import-layout/ImportLayout.native.tsx +0 -13
  498. package/kotlin/fixtures/import-layout/Layout.d.kt.ts +0 -7
  499. package/kotlin/fixtures/import-layout/Layout.kt +0 -72
  500. package/kotlin/fixtures/import-layout/README.md +0 -24
  501. package/kotlin/fixtures/import-layout/app/_layout.tsx +0 -4
  502. package/kotlin/fixtures/import-layout/app/index+spa.tsx +0 -1
  503. package/kotlin/fixtures/import-layout/package.json +0 -23
  504. package/kotlin/fixtures/import-layout/tsconfig.json +0 -20
  505. package/kotlin/fixtures/import-layout/vite.config.ts +0 -20
  506. package/kotlin/fixtures/import-navigation/ImportNavigation.native.tsx +0 -18
  507. package/kotlin/fixtures/import-navigation/Navigation.d.kt.ts +0 -7
  508. package/kotlin/fixtures/import-navigation/Navigation.kt +0 -104
  509. package/kotlin/fixtures/import-navigation/README.md +0 -31
  510. package/kotlin/fixtures/import-navigation/app/_layout.tsx +0 -4
  511. package/kotlin/fixtures/import-navigation/app/index+spa.tsx +0 -1
  512. package/kotlin/fixtures/import-navigation/package.json +0 -23
  513. package/kotlin/fixtures/import-navigation/tsconfig.json +0 -20
  514. package/kotlin/fixtures/import-navigation/vite.config.ts +0 -20
  515. package/kotlin/fixtures/import-overlays/ImportOverlays.native.tsx +0 -29
  516. package/kotlin/fixtures/import-overlays/Overlays.d.kt.ts +0 -7
  517. package/kotlin/fixtures/import-overlays/Overlays.kt +0 -93
  518. package/kotlin/fixtures/import-overlays/README.md +0 -34
  519. package/kotlin/fixtures/import-overlays/app/_layout.tsx +0 -4
  520. package/kotlin/fixtures/import-overlays/app/index+spa.tsx +0 -1
  521. package/kotlin/fixtures/import-overlays/package.json +0 -23
  522. package/kotlin/fixtures/import-overlays/tsconfig.json +0 -20
  523. package/kotlin/fixtures/import-overlays/vite.config.ts +0 -20
  524. package/kotlin/fixtures/import-resources/ImportResources.native.tsx +0 -18
  525. package/kotlin/fixtures/import-resources/README.md +0 -26
  526. package/kotlin/fixtures/import-resources/Resources.d.kt.ts +0 -6
  527. package/kotlin/fixtures/import-resources/Resources.kt +0 -72
  528. package/kotlin/fixtures/import-resources/app/_layout.tsx +0 -4
  529. package/kotlin/fixtures/import-resources/app/index+spa.tsx +0 -1
  530. package/kotlin/fixtures/import-resources/package.json +0 -23
  531. package/kotlin/fixtures/import-resources/tsconfig.json +0 -20
  532. package/kotlin/fixtures/import-resources/vite.config.ts +0 -20
  533. package/kotlin/fixtures/import-scroll/ImportNested.native.tsx +0 -10
  534. package/kotlin/fixtures/import-scroll/ImportScroll.native.tsx +0 -13
  535. package/kotlin/fixtures/import-scroll/Nested.d.kt.ts +0 -4
  536. package/kotlin/fixtures/import-scroll/Nested.kt +0 -64
  537. package/kotlin/fixtures/import-scroll/README.md +0 -38
  538. package/kotlin/fixtures/import-scroll/Scroll.d.kt.ts +0 -7
  539. package/kotlin/fixtures/import-scroll/Scroll.kt +0 -91
  540. package/kotlin/fixtures/import-scroll/app/_layout.tsx +0 -4
  541. package/kotlin/fixtures/import-scroll/app/index+spa.tsx +0 -1
  542. package/kotlin/fixtures/import-scroll/app/nested+spa.tsx +0 -1
  543. package/kotlin/fixtures/import-scroll/package.json +0 -23
  544. package/kotlin/fixtures/import-scroll/tsconfig.json +0 -20
  545. package/kotlin/fixtures/import-scroll/vite.config.ts +0 -20
  546. package/kotlin/fixtures/import-selection/ImportSelection.native.tsx +0 -44
  547. package/kotlin/fixtures/import-selection/README.md +0 -32
  548. package/kotlin/fixtures/import-selection/Selection.d.kt.ts +0 -8
  549. package/kotlin/fixtures/import-selection/Selection.kt +0 -78
  550. package/kotlin/fixtures/import-selection/app/_layout.tsx +0 -4
  551. package/kotlin/fixtures/import-selection/app/index+spa.tsx +0 -1
  552. package/kotlin/fixtures/import-selection/package.json +0 -23
  553. package/kotlin/fixtures/import-selection/tsconfig.json +0 -20
  554. package/kotlin/fixtures/import-selection/vite.config.ts +0 -20
  555. package/kotlin/fixtures/import-surfaces/ImportSurfaces.native.tsx +0 -13
  556. package/kotlin/fixtures/import-surfaces/README.md +0 -22
  557. package/kotlin/fixtures/import-surfaces/Surfaces.d.kt.ts +0 -7
  558. package/kotlin/fixtures/import-surfaces/Surfaces.kt +0 -64
  559. package/kotlin/fixtures/import-surfaces/app/_layout.tsx +0 -4
  560. package/kotlin/fixtures/import-surfaces/app/index+spa.tsx +0 -1
  561. package/kotlin/fixtures/import-surfaces/package.json +0 -23
  562. package/kotlin/fixtures/import-surfaces/tsconfig.json +0 -20
  563. package/kotlin/fixtures/import-surfaces/vite.config.ts +0 -20
  564. package/kotlin/fixtures/import-values/ImportValues.native.tsx +0 -61
  565. package/kotlin/fixtures/import-values/README.md +0 -28
  566. package/kotlin/fixtures/import-values/Values.d.kt.ts +0 -15
  567. package/kotlin/fixtures/import-values/Values.kt +0 -84
  568. package/kotlin/fixtures/import-values/app/_layout.tsx +0 -4
  569. package/kotlin/fixtures/import-values/app/index+spa.tsx +0 -1
  570. package/kotlin/fixtures/import-values/package.json +0 -23
  571. package/kotlin/fixtures/import-values/tsconfig.json +0 -20
  572. package/kotlin/fixtures/import-values/vite.config.ts +0 -20
  573. package/kotlin/fixtures/kotlin-app/app/build.gradle.kts +0 -30
  574. package/kotlin/fixtures/kotlin-app/app/src/main/AndroidManifest.xml +0 -13
  575. package/kotlin/fixtures/kotlin-app/app/src/main/java/dev/contrast/kotlinapp/MainActivity.kt +0 -60
  576. package/kotlin/fixtures/kotlin-app/app/src/main/java/dev/contrast/kotlinapp/ProbeApplication.kt +0 -18
  577. package/kotlin/fixtures/kotlin-app/build.gradle.kts +0 -5
  578. package/kotlin/fixtures/kotlin-app/gradle.properties +0 -4
  579. package/kotlin/fixtures/kotlin-app/settings.gradle.kts +0 -4
  580. package/kotlin/fixtures/kotlin-app-variants/Anim.kt +0 -62
  581. package/kotlin/fixtures/kotlin-app-variants/BarBehavior.kt +0 -38
  582. package/kotlin/fixtures/kotlin-app-variants/BarVisibility.kt +0 -36
  583. package/kotlin/fixtures/kotlin-app-variants/Bitmaps.kt +0 -50
  584. package/kotlin/fixtures/kotlin-app-variants/Browse.kt +0 -73
  585. package/kotlin/fixtures/kotlin-app-variants/Colors.kt +0 -41
  586. package/kotlin/fixtures/kotlin-app-variants/Controls.kt +0 -62
  587. package/kotlin/fixtures/kotlin-app-variants/Drag.kt +0 -56
  588. package/kotlin/fixtures/kotlin-app-variants/Draw.kt +0 -74
  589. package/kotlin/fixtures/kotlin-app-variants/Drawables.kt +0 -53
  590. package/kotlin/fixtures/kotlin-app-variants/Focus.kt +0 -62
  591. package/kotlin/fixtures/kotlin-app-variants/Form.kt +0 -47
  592. package/kotlin/fixtures/kotlin-app-variants/Icons.kt +0 -59
  593. package/kotlin/fixtures/kotlin-app-variants/Ime.kt +0 -53
  594. package/kotlin/fixtures/kotlin-app-variants/Lists.kt +0 -57
  595. package/kotlin/fixtures/kotlin-app-variants/Nav.kt +0 -47
  596. package/kotlin/fixtures/kotlin-app-variants/Note.kt +0 -40
  597. package/kotlin/fixtures/kotlin-app-variants/Overlays.kt +0 -56
  598. package/kotlin/fixtures/kotlin-app-variants/Pan.kt +0 -38
  599. package/kotlin/fixtures/kotlin-app-variants/Pickers.kt +0 -44
  600. package/kotlin/fixtures/kotlin-app-variants/Press.kt +0 -43
  601. package/kotlin/fixtures/kotlin-app-variants/Scroll.kt +0 -63
  602. package/kotlin/fixtures/kotlin-app-variants/Sheet.kt +0 -43
  603. package/kotlin/fixtures/kotlin-app-variants/Strings.kt +0 -49
  604. package/kotlin/fixtures/kotlin-app-variants/Tabs.kt +0 -47
  605. package/kotlin/fixtures/kotlin-app-variants/TextWidth.kt +0 -45
  606. package/kotlin/fixtures/kotlin-app-variants/TransientInsets.kt +0 -50
  607. package/kotlin/fixtures/kotlin-app-variants/Transition.kt +0 -69
  608. package/kotlin/fixtures/kotlin-app-variants/ViewConfig.kt +0 -22
  609. package/kotlin/fixtures/kotlin-app-variants/Widgets.kt +0 -67
  610. package/kotlin/fixtures/runtime-state/RuntimeState.kt +0 -200
  611. package/kotlin/fork/README.md +0 -97
  612. package/kotlin/fork/build.sh +0 -176
  613. package/kotlin/fork/compose-worker-globals.patch +0 -1247
  614. package/kotlin/fork/fork.json +0 -46
  615. package/kotlin/fork/publish.ts +0 -99
  616. package/kotlin/fork/skia-android-shaping.patch +0 -189
  617. package/kotlin/fork/skiko-local.init.gradle +0 -10
  618. package/kotlin/fork/skiko-worker-clock.patch +0 -122
@@ -1,67 +1,120 @@
1
- import { execFileSync } from 'node:child_process'
1
+ import {
2
+ spawn,
3
+ spawnSync,
4
+ type ChildProcess,
5
+ type ChildProcessByStdio,
6
+ type SpawnOptions,
7
+ } from 'node:child_process'
2
8
  import { createHash, randomUUID } from 'node:crypto'
3
9
  import {
4
10
  linkSync,
5
11
  mkdirSync,
12
+ readdirSync,
6
13
  readFileSync,
7
- renameSync,
8
14
  rmSync,
9
15
  writeFileSync,
10
16
  } from 'node:fs'
11
17
  import path from 'node:path'
12
18
  import { rnxHomeDir } from './home-paths'
19
+ import { terminateProcessGroup } from './process-group'
20
+ import type { Readable, Writable } from 'node:stream'
13
21
 
14
22
  const POLL_MS = 250
23
+ // ps derives a start time from the boot time, which drifts by a second or two
24
+ // on linux; a reused pid starts later than this.
25
+ const START_TOLERANCE_MS = 2_000
15
26
 
16
- interface Holder {
27
+ interface ProcessRow {
17
28
  pid: number
18
- start: string | null
29
+ pgid: number
30
+ zombie: boolean
31
+ start: number
19
32
  }
20
33
 
21
- // a pid alone is reused; the start time names the process that wrote the lock.
22
- function processStart(pid: number): string | null {
23
- try {
24
- return (
25
- execFileSync('ps', ['-o', 'lstart=', '-p', String(pid)], {
26
- encoding: 'utf8',
27
- stdio: ['ignore', 'pipe', 'ignore'],
28
- }).trim() || null
34
+ interface Identity {
35
+ pid: number
36
+ start: number
37
+ }
38
+
39
+ interface Generation {
40
+ number: number
41
+ holder: Identity
42
+ released: boolean
43
+ }
44
+
45
+ function errorCode(error: unknown): string | undefined {
46
+ return error instanceof Error && 'code' in error && typeof error.code === 'string'
47
+ ? error.code
48
+ : undefined
49
+ }
50
+
51
+ // ps prints start times without a zone, so every reader asks for utc: a
52
+ // holder and a waiter then agree whatever their own time zones are.
53
+ function parseStart(text: string): number {
54
+ const start = Date.parse(`${text} UTC`)
55
+ if (Number.isNaN(start)) throw new Error(`unreadable process start time "${text}"`)
56
+ return start
57
+ }
58
+
59
+ // the whole table in one read. an unreadable table throws: a lock that cannot
60
+ // tell whether its holder is gone must not guess.
61
+ function processTable(): ProcessRow[] {
62
+ const result = spawnSync('ps', ['-A', '-o', 'pid=,pgid=,stat=,lstart='], {
63
+ encoding: 'utf8',
64
+ env: { ...process.env, LC_ALL: 'C', TZ: 'UTC' },
65
+ stdio: ['ignore', 'pipe', 'pipe'],
66
+ timeout: 10_000,
67
+ killSignal: 'SIGKILL',
68
+ })
69
+ if (result.error || result.status !== 0) {
70
+ throw new Error(
71
+ `swift root lock cannot read the process table: ${
72
+ result.error?.message || result.stderr.trim() || `ps exited ${result.status}`
73
+ }`,
29
74
  )
30
- } catch {
31
- return null
32
75
  }
76
+ return result.stdout
77
+ .split('\n')
78
+ .filter((line) => line.trim())
79
+ .map((line) => {
80
+ const match = /^\s*(\d+)\s+(\d+)\s+(\S+)\s+(.+?)\s*$/.exec(line)
81
+ if (!match)
82
+ throw new Error(`swift root lock cannot parse a process table row: ${line}`)
83
+ return {
84
+ pid: Number(match[1]),
85
+ pgid: Number(match[2]),
86
+ zombie: match[3]!.startsWith('Z'),
87
+ start: parseStart(match[4]!),
88
+ }
89
+ })
33
90
  }
34
91
 
35
- function parseHolder(text: string): Holder | null {
36
- try {
37
- const value: unknown = JSON.parse(text)
38
- if (
39
- value &&
40
- typeof value === 'object' &&
41
- 'pid' in value &&
42
- typeof value.pid === 'number' &&
43
- 'start' in value &&
44
- (typeof value.start === 'string' || value.start === null)
45
- )
46
- return { pid: value.pid, start: value.start }
47
- } catch {}
48
- return null
92
+ function sameProcess(row: ProcessRow, identity: Identity): boolean {
93
+ return (
94
+ row.pid === identity.pid && Math.abs(row.start - identity.start) <= START_TOLERANCE_MS
95
+ )
49
96
  }
50
97
 
51
- function readLock(lock: string): string | null {
52
- try {
53
- return readFileSync(lock, 'utf8')
54
- } catch (error) {
55
- if (error instanceof Error && 'code' in error && error.code === 'ENOENT') return null
56
- throw error
57
- }
98
+ function ownIdentity(pid: number): Identity {
99
+ const row = processTable().find(
100
+ (candidate) => candidate.pid === pid && !candidate.zombie,
101
+ )
102
+ if (!row) throw new Error(`swift root lock cannot find process ${pid}`)
103
+ return { pid, start: row.start }
58
104
  }
59
105
 
60
- function holderAlive(text: string): boolean {
61
- const holder = parseHolder(text)
62
- if (!holder) return false
63
- const start = processStart(holder.pid)
64
- return start !== null && start === holder.start
106
+ function parseIdentity(text: string): Identity {
107
+ const value: unknown = JSON.parse(text)
108
+ if (
109
+ value &&
110
+ typeof value === 'object' &&
111
+ 'pid' in value &&
112
+ typeof value.pid === 'number' &&
113
+ 'start' in value &&
114
+ typeof value.start === 'number'
115
+ )
116
+ return { pid: value.pid, start: value.start }
117
+ throw new Error(`swift root lock record is not a process identity: ${text}`)
65
118
  }
66
119
 
67
120
  function pause(ms: number, signal?: AbortSignal): Promise<void> {
@@ -76,78 +129,174 @@ function pause(ms: number, signal?: AbortSignal): Promise<void> {
76
129
  })
77
130
  }
78
131
 
132
+ const name = (number: number, suffix: string) =>
133
+ `${String(number).padStart(12, '0')}.${suffix}`
134
+
135
+ function generationNumbers(directory: string): number[] {
136
+ const numbers = new Set<number>()
137
+ for (const entry of readdirSync(directory)) {
138
+ const match = /^(\d{12})\./.exec(entry)
139
+ if (match) numbers.add(Number(match[1]))
140
+ }
141
+ return [...numbers].sort((a, b) => a - b)
142
+ }
143
+
144
+ function readGeneration(directory: string, number: number): Generation | null {
145
+ let owner: string
146
+ try {
147
+ owner = readFileSync(path.join(directory, name(number, 'owner')), 'utf8')
148
+ } catch (error) {
149
+ // a newer holder cleaned this generation after it was listed.
150
+ if (errorCode(error) === 'ENOENT') return null
151
+ throw error
152
+ }
153
+ return {
154
+ number,
155
+ holder: parseIdentity(owner),
156
+ released: readdirSync(directory).includes(name(number, 'released')),
157
+ }
158
+ }
159
+
160
+ // children are registered before they run and only while the holder lives, so
161
+ // reading them after the holder is seen dead lists every one it started.
162
+ function readChildren(directory: string, number: number): Identity[] {
163
+ const prefix = name(number, 'child.')
164
+ return readdirSync(directory)
165
+ .filter((entry) => entry.startsWith(prefix))
166
+ .map((entry) => parseIdentity(readFileSync(path.join(directory, entry), 'utf8')))
167
+ }
168
+
169
+ // a child leads its own session, so its group is its pid; a group id stays
170
+ // taken while any member lives, so a leader started later is another process.
171
+ function groupAlive(table: ProcessRow[], leader: Identity): boolean {
172
+ const row = table.find((candidate) => candidate.pid === leader.pid)
173
+ if (row && !sameProcess(row, leader)) return false
174
+ return table.some((candidate) => candidate.pgid === leader.pid && !candidate.zombie)
175
+ }
176
+
177
+ /** compiler processes whose lifetime the root lock covers. */
178
+ export interface SwiftRootLease {
179
+ /** starts `command` in its own process group, recorded under the lock before
180
+ * it runs, so the root stays held while that group lives even if this
181
+ * process dies. */
182
+ spawn(
183
+ command: string,
184
+ args: string[],
185
+ options: SpawnOptions,
186
+ ): ChildProcessByStdio<Writable, Readable, Readable>
187
+ }
188
+
79
189
  /** runs `work` as the only process using a swift build root. the in-process
80
190
  * queue orders one process's requests; two processes sharing a root each
81
191
  * rewrite its sources and manifest, and swiftpm's own build lock only orders
82
192
  * the builds, so a build can compile the other process's sources and then
83
- * read back that process's executable. the lock lives beside the root's
84
- * tree, never inside it: a write sweeps every file of the tree it does not
85
- * name. a lock whose owner process is gone is taken over. */
193
+ * read back that process's executable.
194
+ *
195
+ * holders are numbered. the newest generation holds the root; claiming the
196
+ * next number is one exclusive link, so exactly one claimant wins and no
197
+ * record is ever moved or replaced. a generation is free once its holder
198
+ * released it, or once its holder process and every compiler group it
199
+ * recorded are gone. an unreadable process table or an unkillable compiler
200
+ * keeps the root held. the lock lives beside the root's tree, never inside
201
+ * it: a write sweeps every file of the tree it does not name. */
86
202
  export async function withSwiftRootLock<T>(
87
203
  root: string,
88
- work: () => Promise<T>,
204
+ work: (lease: SwiftRootLease) => Promise<T>,
89
205
  signal?: AbortSignal,
90
206
  ): Promise<T> {
91
- const directory = path.join(rnxHomeDir(), 'cache', 'swift-root-locks')
92
- mkdirSync(directory, { recursive: true })
93
- const lock = path.join(
94
- directory,
95
- `${createHash('sha256').update(root).digest('hex').slice(0, 32)}.lock`,
207
+ const directory = path.join(
208
+ rnxHomeDir(),
209
+ 'cache',
210
+ 'swift-root-locks',
211
+ createHash('sha256').update(root).digest('hex').slice(0, 32),
96
212
  )
213
+ mkdirSync(directory, { recursive: true })
97
214
  const token = randomUUID()
98
- const owner = JSON.stringify({
99
- pid: process.pid,
100
- start: processStart(process.pid),
101
- token,
102
- })
103
- const pending = `${lock}.${token}`
104
- // the owner record is complete before the lock path exists, so a waiter
105
- // never reads a half-written lock.
106
- writeFileSync(pending, owner)
107
- try {
108
- for (;;) {
109
- signal?.throwIfAborted()
110
- try {
111
- linkSync(pending, lock)
112
- break
113
- } catch (error) {
114
- if (!(error instanceof Error && 'code' in error && error.code === 'EEXIST'))
115
- throw error
215
+ const owner = JSON.stringify(ownIdentity(process.pid))
216
+ const pending = path.join(directory, `pending.${token}`)
217
+ let held = 0
218
+ for (;;) {
219
+ signal?.throwIfAborted()
220
+ const newest = generationNumbers(directory).at(-1) ?? 0
221
+ const current = newest > 0 ? readGeneration(directory, newest) : null
222
+ if (newest > 0 && !current) continue
223
+ if (current && !current.released) {
224
+ const table = processTable()
225
+ if (table.some((row) => !row.zombie && sameProcess(row, current.holder))) {
226
+ await pause(POLL_MS, signal)
227
+ continue
116
228
  }
117
- const held = readLock(lock)
118
- if (held === null) continue
119
- if (holderAlive(held)) {
229
+ const children = readChildren(directory, newest)
230
+ if (children.some((child) => groupAlive(table, child))) {
120
231
  await pause(POLL_MS, signal)
121
232
  continue
122
233
  }
123
- // take over by moving the dead record aside. a different record in the
124
- // moved file means a new owner landed first; put it back.
125
- const dead = `${lock}.dead-${token}`
234
+ }
235
+ // the record is complete before it takes the number, so a waiter never
236
+ // reads half a record.
237
+ writeFileSync(pending, owner)
238
+ try {
239
+ linkSync(pending, path.join(directory, name(newest + 1, 'owner')))
240
+ } catch (error) {
241
+ if (errorCode(error) === 'EEXIST') continue
242
+ throw error
243
+ } finally {
244
+ rmSync(pending, { force: true })
245
+ }
246
+ // a claimant that listed the directory before older generations were
247
+ // cleaned can take a number below the newest; it never held the root.
248
+ const numbers = generationNumbers(directory)
249
+ if (numbers.at(-1) !== newest + 1) {
250
+ rmSync(path.join(directory, name(newest + 1, 'owner')), { force: true })
251
+ continue
252
+ }
253
+ held = newest + 1
254
+ for (const number of numbers)
255
+ if (number < held)
256
+ for (const entry of readdirSync(directory))
257
+ if (entry.startsWith(name(number, '')))
258
+ rmSync(path.join(directory, entry), { force: true })
259
+ break
260
+ }
261
+ const children: ChildProcess[] = []
262
+ const lease: SwiftRootLease = {
263
+ spawn(command, args, options) {
264
+ // the child waits for its registration before it runs, and exits without
265
+ // running if this process dies first.
266
+ const child = spawn(
267
+ '/bin/sh',
268
+ ['-c', 'IFS= read -r go || exit 1; exec "$@" </dev/null', 'sh', command, ...args],
269
+ { ...options, detached: true, stdio: ['pipe', 'pipe', 'pipe'] },
270
+ )
271
+ child.stdin!.on('error', () => {})
272
+ children.push(child)
126
273
  try {
127
- renameSync(lock, dead)
274
+ if (child.pid === undefined) {
275
+ child.once('error', () => {})
276
+ throw new Error(`could not start ${command}`)
277
+ }
278
+ const childPending = `${pending}.child.${child.pid}`
279
+ try {
280
+ // publish a complete identity before opening the compiler gate. a
281
+ // crash or failed write leaves only an ignored pending file.
282
+ writeFileSync(childPending, JSON.stringify(ownIdentity(child.pid)))
283
+ linkSync(childPending, path.join(directory, name(held, `child.${child.pid}`)))
284
+ } finally {
285
+ rmSync(childPending, { force: true })
286
+ }
128
287
  } catch (error) {
129
- if (error instanceof Error && 'code' in error && error.code === 'ENOENT') continue
288
+ child.stdin!.destroy()
130
289
  throw error
131
290
  }
132
- try {
133
- if (readLock(dead) !== held) {
134
- try {
135
- linkSync(dead, lock)
136
- } catch (error) {
137
- if (!(error instanceof Error && 'code' in error && error.code === 'EEXIST'))
138
- throw error
139
- }
140
- }
141
- } finally {
142
- rmSync(dead, { force: true })
143
- }
144
- }
145
- } finally {
146
- rmSync(pending, { force: true })
291
+ child.stdin!.end('go\n')
292
+ return child
293
+ },
147
294
  }
148
295
  try {
149
- return await work()
296
+ return await work(lease)
150
297
  } finally {
151
- if (readLock(lock) === owner) rmSync(lock, { force: true })
298
+ // a compiler that outlives its caller would still read the root.
299
+ await Promise.all(children.map((child) => terminateProcessGroup(child, 'SIGKILL', 0)))
300
+ writeFileSync(path.join(directory, name(held, 'released')), '')
152
301
  }
153
302
  }
@@ -25,6 +25,8 @@ import {
25
25
  isSwiftMetalLibrarySources,
26
26
  type SwiftMetalLibrarySource,
27
27
  type SwiftResourceBundle,
28
+ type SwiftNativeTarget,
29
+ type SwiftObjCPeerStartup,
28
30
  } from './swiftContract'
29
31
 
30
32
  export const SWIFT_COMPILE_PATH = '/api/swift-compile'
@@ -234,6 +236,8 @@ export interface SwiftCompileContext {
234
236
 
235
237
  export type SwiftCompileSubmit = (work: {
236
238
  files: Record<string, string>
239
+ nativeTargets?: SwiftNativeTarget[]
240
+ objcPeerStartup?: SwiftObjCPeerStartup
237
241
  metalSources?: Record<string, string>
238
242
  /** the bundle pack; absent means the project packs none. */
239
243
  resources?: Record<string, string>
@@ -399,6 +403,8 @@ export async function compileSwiftProject(
399
403
  submit: SwiftCompileSubmit,
400
404
  work: {
401
405
  files: Record<string, string>
406
+ nativeTargets?: SwiftNativeTarget[]
407
+ objcPeerStartup?: SwiftObjCPeerStartup
402
408
  metalSources?: Record<string, string>
403
409
  resources?: Record<string, string>
404
410
  /** project-relative resource paths used to associate implicit resources with targets. */
@@ -22,6 +22,105 @@ export interface SwiftObjCPeerClass {
22
22
  header: string
23
23
  }
24
24
 
25
+ /** generated registration source whose call must precede the application entry. */
26
+ export interface SwiftObjCPeerStartup {
27
+ registration: string
28
+ }
29
+
30
+ export function isSwiftObjCPeerStartup(value: unknown): value is SwiftObjCPeerStartup {
31
+ return (
32
+ value !== null &&
33
+ typeof value === 'object' &&
34
+ 'registration' in value &&
35
+ isSwiftResourcePath(value.registration) &&
36
+ value.registration.endsWith('.swift') &&
37
+ Object.keys(value).length === 1
38
+ )
39
+ }
40
+
41
+ export const SWIFT_NATIVE_INPUT_ROOT = '$(PEACH_INPUT_ROOT)'
42
+ export const SWIFT_NATIVE_SDK_INCLUDE = '$(PEACH_SDK_INCLUDE)'
43
+
44
+ export interface SwiftObjCImplementationPlan {
45
+ owner: string
46
+ registeredClasses: string[]
47
+ units: string[]
48
+ }
49
+
50
+ export interface SwiftProjectPreparation {
51
+ headerProducers: string[]
52
+ objcImplementations?: SwiftObjCImplementationPlan
53
+ }
54
+
55
+ /** project-relative original clang inputs; no host paths cross the compile boundary. */
56
+ export interface SwiftNativeTarget {
57
+ name: string
58
+ deploymentTarget: string | null
59
+ headers: string[]
60
+ publicHeaders: string[]
61
+ bridgingHeader: string | null
62
+ prefixHeader: string | null
63
+ headerSearchPaths: string[]
64
+ frameworkSearchPaths: string[]
65
+ flags: string[]
66
+ cxxFlags: string[]
67
+ fileFlags: Record<string, string[]>
68
+ sourceDirectories: Record<string, string>
69
+ }
70
+
71
+ export function isSwiftNativeTargets(value: unknown): value is SwiftNativeTarget[] {
72
+ const strings = (value: unknown): value is string[] =>
73
+ Array.isArray(value) &&
74
+ value.every((item: unknown) => typeof item === 'string' && !item.includes('\0'))
75
+ const paths = (value: unknown): value is string[] =>
76
+ strings(value) && value.every(isSwiftResourcePath)
77
+ return (
78
+ Array.isArray(value) &&
79
+ value.length <= 128 &&
80
+ value.every((target: unknown) => {
81
+ if (!target || typeof target !== 'object') return false
82
+ const field = (name: string): unknown => Reflect.get(target, name)
83
+ const nullablePath = (name: string) =>
84
+ field(name) === null || isSwiftResourcePath(field(name))
85
+ const perFile = field('fileFlags')
86
+ const directories = field('sourceDirectories')
87
+ const searches = field('headerSearchPaths')
88
+ const frameworks = field('frameworkSearchPaths')
89
+ const deployment = field('deploymentTarget')
90
+ return (
91
+ typeof field('name') === 'string' &&
92
+ /^[A-Za-z_]\w*$/.test(String(field('name'))) &&
93
+ (deployment === null ||
94
+ (typeof deployment === 'string' && /^\d+(?:\.\d+){0,2}$/.test(deployment))) &&
95
+ paths(field('headers')) &&
96
+ paths(field('publicHeaders')) &&
97
+ nullablePath('bridgingHeader') &&
98
+ nullablePath('prefixHeader') &&
99
+ strings(searches) &&
100
+ searches.every((item) => item === '.' || isSwiftResourcePath(item)) &&
101
+ strings(frameworks) &&
102
+ frameworks.every((item) => item === '.' || isSwiftResourcePath(item)) &&
103
+ strings(field('flags')) &&
104
+ strings(field('cxxFlags')) &&
105
+ !!perFile &&
106
+ typeof perFile === 'object' &&
107
+ !Array.isArray(perFile) &&
108
+ Object.entries(perFile).every(
109
+ ([file, flags]) => isSwiftResourcePath(file) && strings(flags),
110
+ ) &&
111
+ !!directories &&
112
+ typeof directories === 'object' &&
113
+ !Array.isArray(directories) &&
114
+ Object.entries(directories).every(
115
+ ([file, directory]) =>
116
+ isSwiftResourcePath(file) &&
117
+ (directory === '.' || isSwiftResourcePath(directory)),
118
+ )
119
+ )
120
+ })
121
+ )
122
+ }
123
+
25
124
  export interface SwiftObjCImplementationPreparation {
26
125
  receipt: string
27
126
  objects: { target: string; source: string; file: string }[]
@@ -43,7 +43,12 @@ export function filterTargetNodes<
43
43
  )
44
44
  return false
45
45
  if (!regex) return matcher.type !== 'text' || node.text === matcher.value
46
- const matches = (value: unknown) => typeof value === 'string' && regex.test(value)
46
+ // detox iOS compares its first regex match's range with the entire value.
47
+ const matches = (value: unknown) => {
48
+ if (typeof value !== 'string') return false
49
+ const match = regex.exec(value)
50
+ return match !== null && match.index === 0 && match[0].length === value.length
51
+ }
47
52
  if (matcher.type === 'id') return matches(node.testID) || matches(node.id)
48
53
  if (matcher.type === 'text') return matches(node.text)
49
54
  return matches(node.accessibilityLabel || (node.accessible ? node.text : null))
@@ -1,3 +1,4 @@
1
+ import crypto from 'crypto'
1
2
  // peach vite plugin — use in any vite project to get react-native resolution,
2
3
  // native dep stubbing, and external app support.
3
4
  //
@@ -7,8 +8,6 @@
7
8
  //
8
9
  // // with external app:
9
10
  // export default defineConfig({ plugins: [sootsim({ app: '~/my-rn-app' })] })
10
-
11
- import crypto from 'crypto'
12
11
  import fs from 'fs'
13
12
  import { createRequire } from 'module'
14
13
  import { runInNewContext, Script } from 'node:vm'
@@ -19,6 +18,12 @@ import { minifySync, transformSync } from 'rolldown/utils'
19
18
  import { type Plugin, transformWithOxc } from 'vite'
20
19
  import { resolveOneNativeBackend } from '../../contrast-bundler/src/oneFramework.ts'
21
20
  import { transformFlowSource } from '../../peach-compat/src/flow-strip.ts'
21
+ import { getCliRuntime } from './cli-runtime.ts'
22
+ import {
23
+ isEngineReactImporter,
24
+ isWorkerReactBridgeImporter,
25
+ keepsRealReact,
26
+ } from './react-bridge-importers.ts'
22
27
  import { renderWorkerSystemChunk } from './worker-system-chunks.ts'
23
28
 
24
29
  declare module '@babel/core' {
@@ -41,12 +46,6 @@ import {
41
46
  compatStubsForBuildResolver,
42
47
  reactNativeDeepStubsForBuildResolver,
43
48
  } from '../../peach-compat/src/stub-manifest.ts'
44
- import { WEBVIEW_SAME_ORIGIN_BOOTSTRAP_SOURCE } from '../../peach-engine/src/components/native-ui/webview-frame-bridge.ts'
45
- import {
46
- isExpoHostSocketModule,
47
- isReactNativeEnvironmentSetupModule,
48
- } from '../../peach-engine/src/guest-module-overrides.ts'
49
- import { readPeachWarmManifest } from '../../peach-engine/src/peach-warm-manifest.ts'
50
49
  import {
51
50
  assertPeachPortEnvironment,
52
51
  resolveSootsimBridgePort,
@@ -420,9 +419,9 @@ export function sootsim(options: SootSimOptions = {}): Plugin[] {
420
419
  function hostEnvironmentBootstrapRedirect(): Plugin {
421
420
  const target = '\0peach:host-environment-bootstrap'
422
421
  const isHostBootstrap = (id: string) =>
423
- isExpoHostSocketModule(id) ||
422
+ getCliRuntime().guest_module_overrides.isExpoHostSocketModule(id) ||
424
423
  ((id.startsWith('react-native/') || id.includes('/react-native/')) &&
425
- isReactNativeEnvironmentSetupModule(id))
424
+ getCliRuntime().guest_module_overrides.isReactNativeEnvironmentSetupModule(id))
426
425
  return {
427
426
  name: 'peach-host-environment-bootstrap',
428
427
  enforce: 'pre',
@@ -546,7 +545,7 @@ function warmManifestJsonPlugin(): Plugin {
546
545
  const filename = id.slice(marker.length, -3)
547
546
  this.addWatchFile(filename)
548
547
  const value: unknown = JSON.parse(fs.readFileSync(filename, 'utf8'))
549
- const manifest = readPeachWarmManifest(value)
548
+ const manifest = getCliRuntime().peach_warm_manifest.readPeachWarmManifest(value)
550
549
  const entries = [
551
550
  manifest.home,
552
551
  ...Object.values(manifest.launches),
@@ -1805,21 +1804,11 @@ function reactBridgePlugin(): Plugin {
1805
1804
  if ((options as { scan?: boolean })?.scan || options?.ssr) return null
1806
1805
 
1807
1806
  // only redirect imports from peachsim, peach-engine, peach-compat, and react-reconciler
1808
- const shouldRedirect =
1809
- importer.includes('/peachsim/src/') ||
1810
- importer.includes('/peach-engine/src/') ||
1811
- importer.includes('/peach-compat/src/') ||
1812
- importer.includes('/peach-compat/dist-pressability/') ||
1813
- importer.includes('/peach-kit/src/') ||
1814
- importer.includes('react-reconciler')
1807
+ const shouldRedirect = isEngineReactImporter(importer)
1815
1808
 
1816
1809
  if (!shouldRedirect) return null
1817
1810
 
1818
- // don't redirect react-bridge's own import of react (avoid infinite loop)
1819
- if (importer.includes('react-bridge')) return null
1820
-
1821
- // stub-registry needs the real React (with __CLIENT_INTERNALS) for bundle stubs
1822
- if (importer.includes('stub-registry')) return null
1811
+ if (keepsRealReact(importer)) return null
1823
1812
 
1824
1813
  redirectCount++
1825
1814
  if (redirectCount <= 10) {
@@ -1851,28 +1840,13 @@ export function workerReactBridgePlugin(): Plugin {
1851
1840
  // skip during dep scanning / SSR
1852
1841
  if ((options as { scan?: boolean })?.scan || options?.ssr) return null
1853
1842
 
1854
- // don't redirect react-bridge's own import of react (avoid infinite loop)
1855
- if (importer.includes('react-bridge')) return null
1856
-
1857
- // stub-registry needs the real React (with __CLIENT_INTERNALS) for bundle stubs
1858
- if (importer.includes('stub-registry')) return null
1859
-
1860
1843
  // redirect react imports from peachsim, peach-engine, peach-compat, react-reconciler,
1861
1844
  // and any pure-JS RN-ecosystem package the bundle pulls in. without this
1862
1845
  // redirect, packages like react-native-drawer-layout / use-latest-callback
1863
1846
  // call into a separate React instance than the renderer/bridge does, so
1864
1847
  // their useRef/useEffect refs collide with the engine's hooks state and
1865
1848
  // we hit "Maximum update depth exceeded" infinite-loop renders.
1866
- const shouldRedirect =
1867
- importer.includes('/peachsim/src/') ||
1868
- importer.includes('/peach-engine/src/') ||
1869
- importer.includes('/peach-compat/src/') ||
1870
- importer.includes('/peach-compat/dist-pressability/') ||
1871
- importer.includes('/peach-kit/src/') ||
1872
- importer.includes('react-reconciler') ||
1873
- importer.includes('/node_modules/')
1874
-
1875
- if (!shouldRedirect) return null
1849
+ if (!isWorkerReactBridgeImporter(importer)) return null
1876
1850
 
1877
1851
  return { id: reactBridgePath, external: false }
1878
1852
  },
@@ -2719,7 +2693,7 @@ export function expoDomComponentsPlugin(
2719
2693
  window.process.env = window.process.env || {};
2720
2694
  window.process.env.NODE_ENV = window.process.env.NODE_ENV || 'development';
2721
2695
  window.process.env.EXPO_OS = 'web';
2722
- ${WEBVIEW_SAME_ORIGIN_BOOTSTRAP_SOURCE}
2696
+ ${getCliRuntime().components_native_ui_webview_frame_bridge.WEBVIEW_SAME_ORIGIN_BOOTSTRAP_SOURCE}
2723
2697
  (function () {
2724
2698
  // metro-style require shim for expo's dom closure: classic scripts
2725
2699
  // run before module imports evaluate, so this covers eval-time
@@ -1,8 +1,8 @@
1
1
  import fs from 'node:fs'
2
2
  import { createRequire } from 'node:module'
3
3
  import { Worker } from 'node:worker_threads'
4
- import { PAGE_DELIVERED_CHUNKS_NAME_SUFFIX } from '../../peach-engine/src/render-worker/boot-worker-kickoff.ts'
5
4
  import { isRecord } from './is-record'
5
+ import { PAGE_DELIVERED_CHUNKS_NAME_SUFFIX } from './workerChunkContract.ts'
6
6
 
7
7
  const require = createRequire(import.meta.url)
8
8
  const systemRuntime = fs.readFileSync(require.resolve('systemjs/dist/s.min.js'), 'utf8')
@@ -0,0 +1,5 @@
1
+ // the kickoff ends the name of each worker it starts with this suffix. that
2
+ // worker's loader then links each Home chunk from the body the kickoff posts
3
+ // (`peach-chunk-list`, then one `peach-chunk-body` per url) instead of
4
+ // downloading it again (worker-system-chunks.ts).
5
+ export const PAGE_DELIVERED_CHUNKS_NAME_SUFFIX = ':page-chunks'