peachsim 0.1.939 → 0.1.1399

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 (396) hide show
  1. package/README.md +28 -22
  2. package/cli/app-catalog.ts +29 -14
  3. package/cli/app-fonts.ts +5 -3
  4. package/cli/bridge-flow-runner.ts +40 -29
  5. package/cli/cloud-client.ts +57 -21
  6. package/cli/cloud-test-tunnel.ts +12 -18
  7. package/cli/commands/agent.ts +1 -1
  8. package/cli/commands/app-fonts.ts +3 -3
  9. package/cli/commands/assert.ts +8 -8
  10. package/cli/commands/auth.ts +8 -3
  11. package/cli/commands/box/bundle-plane.ts +13 -1
  12. package/cli/commands/box.ts +16 -5
  13. package/cli/commands/compat.ts +1 -1
  14. package/cli/commands/config.ts +2 -2
  15. package/cli/commands/control.ts +125 -71
  16. package/cli/commands/cpu-profile.ts +45 -1
  17. package/cli/commands/daemon.ts +131 -33
  18. package/cli/commands/debug.ts +24 -17
  19. package/cli/commands/desktop.ts +7 -1
  20. package/cli/commands/detect.ts +101 -0
  21. package/cli/commands/detox.ts +6 -6
  22. package/cli/commands/device.ts +12 -12
  23. package/cli/commands/electron.ts +32 -14
  24. package/cli/commands/flow.ts +49 -41
  25. package/cli/commands/guest-host.ts +39 -1
  26. package/cli/commands/inspect/core.ts +14 -8
  27. package/cli/commands/inspect/list.ts +1 -1
  28. package/cli/commands/inspect/settle.ts +5 -3
  29. package/cli/commands/inspect/settling.ts +229 -44
  30. package/cli/commands/inspect/wait-idle.ts +3 -2
  31. package/cli/commands/inspect.ts +105 -93
  32. package/cli/commands/install-cli.ts +36 -15
  33. package/cli/commands/install-desktop.ts +68 -195
  34. package/cli/commands/kotlin.ts +6 -5
  35. package/cli/commands/login.ts +5 -5
  36. package/cli/commands/maestro-compare.ts +554 -0
  37. package/cli/commands/maestro-generate.ts +6 -3
  38. package/cli/commands/maestro.ts +22 -0
  39. package/cli/commands/mode.ts +2 -2
  40. package/cli/commands/no-bridge-hint.ts +6 -2
  41. package/cli/commands/platform.ts +35 -6
  42. package/cli/commands/preview.ts +6 -0
  43. package/cli/commands/project-report.ts +10 -12
  44. package/cli/commands/record.ts +37 -37
  45. package/cli/commands/runtime.ts +9 -9
  46. package/cli/commands/screenshot-layers.ts +4 -4
  47. package/cli/commands/screenshot-mode.ts +2 -2
  48. package/cli/commands/screenshot.ts +8 -8
  49. package/cli/commands/screenshots-capture.ts +2 -2
  50. package/cli/commands/serve.ts +9 -12
  51. package/cli/commands/setup.ts +29 -14
  52. package/cli/commands/shell-boolean-mode.ts +2 -2
  53. package/cli/commands/show-touches-mode.ts +2 -2
  54. package/cli/commands/skills.ts +11 -11
  55. package/cli/commands/swift.ts +29 -11
  56. package/cli/commands/telemetry.ts +2 -2
  57. package/cli/commands/test.ts +5 -0
  58. package/cli/commands/three-mode.ts +3 -3
  59. package/cli/commands/timeline.ts +4 -4
  60. package/cli/commands/upgrade.ts +2 -2
  61. package/cli/commands/upload.ts +15 -15
  62. package/cli/commands/what-happened.ts +2 -2
  63. package/cli/current-sim.ts +6 -3
  64. package/cli/desktop-companion.ts +55 -149
  65. package/cli/dev-build-freshness.ts +2 -2
  66. package/cli/drivers/desktop.ts +17 -9
  67. package/cli/drivers/electron.ts +1 -2
  68. package/cli/drivers/playwright-sim-host.ts +11 -2
  69. package/cli/drivers/playwright.ts +35 -2
  70. package/cli/drivers/types.ts +8 -0
  71. package/cli/maestro-compare.ts +670 -0
  72. package/cli/outbound-endpoints.ts +46 -8
  73. package/cli/recording-access.ts +6 -6
  74. package/cli/run-registry.ts +1 -1
  75. package/cli/runtime-compat.ts +5 -1
  76. package/cli/send-to-box.ts +3 -3
  77. package/cli/shell-init.ts +2 -1
  78. package/cli/ws-bridge.ts +9 -5
  79. package/detox/element-types.ts +1 -0
  80. package/detox/gestures.ts +3 -3
  81. package/detox/index.ts +67 -38
  82. package/detox/navigation-lifecycle.ts +9 -6
  83. package/detox/proof-frame.cjs +6 -4
  84. package/dist-lib/agent-daemon-client.cjs +1 -1
  85. package/dist-lib/agent-events.cjs +1 -1
  86. package/dist-lib/attached-projects.cjs +1 -1
  87. package/dist-lib/auth/shared-session.cjs +1 -1
  88. package/dist-lib/backend-origin.cjs +1 -1
  89. package/dist-lib/beta.cjs +1 -1
  90. package/dist-lib/beta.mjs +1 -1
  91. package/dist-lib/bridge-constants.cjs +1 -1
  92. package/dist-lib/bridge-contract-input.cjs +42 -17
  93. package/dist-lib/bridge-contract-input.mjs +41 -16
  94. package/dist-lib/bridge-contract.cjs +1 -4
  95. package/dist-lib/bridge-contract.mjs +1 -3
  96. package/dist-lib/bundle-channel.cjs +2918 -550
  97. package/dist-lib/capture-contract.cjs +65 -24
  98. package/dist-lib/capture-contract.mjs +63 -24
  99. package/dist-lib/cloud-contract.cjs +2 -2
  100. package/dist-lib/cloud-contract.mjs +2 -2
  101. package/dist-lib/cloud-test-args.cjs +1 -1
  102. package/dist-lib/cloud-test-args.mjs +1 -1
  103. package/dist-lib/cloud.cjs +3 -3
  104. package/dist-lib/cloud.mjs +3 -3
  105. package/dist-lib/config.cjs +15 -5
  106. package/dist-lib/config.mjs +154 -0
  107. package/dist-lib/detox/index.cjs +495 -139
  108. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  109. package/dist-lib/expo-swift-bundle.cjs +1168 -238
  110. package/dist-lib/expo-swift-metadata.cjs +34 -23
  111. package/dist-lib/expo-swift-metadata.mjs +32 -23
  112. package/dist-lib/home-paths.cjs +2 -2
  113. package/dist-lib/host/bridge-host.cjs +2938 -654
  114. package/dist-lib/host/fetch-proxy-handler.cjs +14 -1
  115. package/dist-lib/host/fetch-proxy-overrides.cjs +7 -1
  116. package/dist-lib/host/fetch-proxy-overrides.mjs +5 -1
  117. package/dist-lib/host/replacement-module-handler.cjs +2 -2
  118. package/dist-lib/host/websocket-proxy.cjs +1 -1
  119. package/dist-lib/index.cjs +999 -353
  120. package/dist-lib/jump-to-source-babel.cjs +1 -1
  121. package/dist-lib/jump-to-source-native.cjs +1 -1
  122. package/dist-lib/kotlin-host.cjs +332 -19
  123. package/dist-lib/menu.cjs +1 -1
  124. package/dist-lib/menu.mjs +1 -1
  125. package/dist-lib/metro-fingerprint-registry.cjs +1 -1
  126. package/dist-lib/metro-fingerprint-registry.mjs +1 -1
  127. package/dist-lib/metro-production-bundle.cjs +7 -7
  128. package/dist-lib/metro-production-bundle.mjs +5 -5
  129. package/dist-lib/metro.cjs +688 -250
  130. package/dist-lib/native-app-identity-project.cjs +2647 -0
  131. package/dist-lib/native-app-identity-project.mjs +1257 -0
  132. package/dist-lib/native-app-identity.cjs +325 -25
  133. package/dist-lib/native-app-identity.mjs +323 -25
  134. package/dist-lib/native-firebase-metadata.cjs +1 -1
  135. package/dist-lib/native-firebase-metadata.mjs +1 -1
  136. package/dist-lib/plist.cjs +1 -1
  137. package/dist-lib/plist.mjs +1 -1
  138. package/dist-lib/profiles.cjs +1 -1
  139. package/dist-lib/public-brand.cjs +1 -1
  140. package/dist-lib/react-native-host-modules.cjs +5 -1
  141. package/dist-lib/react-native-host-modules.mjs +5 -1
  142. package/dist-lib/scripts/dev-server-scanner.cjs +57 -32
  143. package/dist-lib/sdk.cjs +231 -51
  144. package/dist-lib/sdk.mjs +231 -51
  145. package/dist-lib/skills.cjs +4107 -1374
  146. package/dist-lib/swift-compile.cjs +290 -30
  147. package/dist-lib/swift-compile.mjs +290 -30
  148. package/dist-lib/swift-package.cjs +143 -12
  149. package/dist-lib/swift-package.mjs +137 -11
  150. package/dist-lib/swift-submit.cjs +47 -5
  151. package/dist-lib/swift-submit.mjs +42 -5
  152. package/dist-lib/swift-toolchain.cjs +7 -2
  153. package/dist-lib/swift.cjs +1 -1
  154. package/dist-lib/vite-swift.cjs +1392 -458
  155. package/dist-lib/vite.cjs +13 -17
  156. package/dist-lib/worklet-executable.cjs +248 -33
  157. package/dist-lib/worklet-executable.mjs +248 -33
  158. package/install.sh +10 -1
  159. package/kotlin/{AppSources → AndroidViewSources}/android/content/res/Resources.kt +9 -9
  160. package/kotlin/AndroidViewSources/android/graphics/Canvas.kt +20 -0
  161. package/kotlin/AndroidViewSources/android/view/View.kt +211 -0
  162. package/kotlin/AndroidViewSources/android/widget/FrameLayout.kt +61 -0
  163. package/kotlin/AndroidViewSources/android/widget/LinearLayout.kt +49 -0
  164. package/kotlin/AppSources/android/view/Window.kt +36 -0
  165. package/kotlin/AppSources/android/view/WindowInsets.kt +9 -0
  166. package/kotlin/AppSources/android/view/WindowInsetsController.kt +5 -0
  167. package/kotlin/AppSources/android/window/OnBackInvokedDispatcher.kt +48 -0
  168. package/kotlin/AppSources/androidx/activity/OnBackPressedDispatcher.kt +20 -5
  169. package/kotlin/AppSources/androidx/compose/foundation/layout/WindowInsets.kt +15 -0
  170. package/kotlin/AppSources/androidx/compose/ui/platform/ComposeView.kt +2 -1
  171. package/kotlin/AppSources/dev/peach/app/PeachApp.kt +42 -50
  172. package/kotlin/ComposeSources/PeachComposeHost.kt +200 -84
  173. package/kotlin/ExpoComposeSources/PeachAndroidView.kt +87 -0
  174. package/kotlin/ExpoComposeSources/PeachExpoViewMount.kt +24 -0
  175. package/kotlin/ExpoComposeSources/dev/peach/expo/PeachExpoCompose.kt +28 -0
  176. package/kotlin/ExpoComposeSources/expo/modules/kotlin/views/ExpoComposeView.kt +70 -0
  177. package/kotlin/ExpoSources/dev/peach/expo/PeachExpoRuntime.kt +513 -0
  178. package/kotlin/ExpoSources/dev/peach/expo/PeachExpoTypes.kt +173 -0
  179. package/kotlin/ExpoSources/expo/modules/kotlin/AppContext.kt +20 -0
  180. package/kotlin/ExpoSources/expo/modules/kotlin/Promise.kt +19 -0
  181. package/kotlin/ExpoSources/expo/modules/kotlin/classcomponent/ClassComponentBuilder.kt +198 -0
  182. package/kotlin/ExpoSources/expo/modules/kotlin/exception/CodedException.kt +126 -0
  183. package/kotlin/ExpoSources/expo/modules/kotlin/functions/Functions.kt +132 -0
  184. package/kotlin/ExpoSources/expo/modules/kotlin/jni/JavaScriptTypedArray.kt +81 -0
  185. package/kotlin/ExpoSources/expo/modules/kotlin/modules/Module.kt +98 -0
  186. package/kotlin/ExpoSources/expo/modules/kotlin/objects/ObjectDefinitionBuilder.kt +236 -0
  187. package/kotlin/ExpoSources/expo/modules/kotlin/records/Record.kt +12 -0
  188. package/kotlin/ExpoSources/expo/modules/kotlin/runtime/Runtime.kt +9 -0
  189. package/kotlin/ExpoSources/expo/modules/kotlin/sharedobjects/SharedObject.kt +50 -0
  190. package/kotlin/ExpoSources/expo/modules/kotlin/sharedobjects/SharedObjectRegistry.kt +57 -0
  191. package/kotlin/ExpoSources/expo/modules/kotlin/sharedobjects/SharedRef.kt +19 -0
  192. package/kotlin/ExpoSources/expo/modules/kotlin/typedarray/ConcreteTypedArrays.kt +158 -0
  193. package/kotlin/ExpoSources/expo/modules/kotlin/typedarray/GenericTypedArray.kt +8 -0
  194. package/kotlin/ExpoSources/expo/modules/kotlin/typedarray/TypedArray.kt +29 -0
  195. package/kotlin/ExpoSources/expo/modules/kotlin/typedarray/TypedArrayIterator.kt +9 -0
  196. package/kotlin/ExpoSources/expo/modules/kotlin/types/AnyType.kt +155 -0
  197. package/kotlin/ExpoSources/expo/modules/kotlin/types/Either.kt +91 -0
  198. package/kotlin/ExpoSources/expo/modules/kotlin/types/Enumerable.kt +6 -0
  199. package/kotlin/ExpoSources/expo/modules/kotlin/viewevent/ViewEvent.kt +54 -0
  200. package/kotlin/ExpoSources/expo/modules/kotlin/views/ExpoView.kt +23 -0
  201. package/kotlin/ExpoSources/expo/modules/kotlin/views/ViewDefinitionBuilder.kt +71 -0
  202. package/kotlin/ExpoSources/expo/modules/kotlin/views/ViewProps.kt +35 -0
  203. package/kotlin/README.md +13 -3
  204. package/kotlin/Sources/android/os/Build.kt +17 -0
  205. package/kotlin/Sources/android/os/Handler.kt +35 -0
  206. package/kotlin/Sources/android/os/Looper.kt +17 -0
  207. package/kotlin/Sources/android/os/MessageQueue.kt +56 -0
  208. package/kotlin/Sources/android/os/SystemClock.kt +14 -0
  209. package/kotlin/Sources/android/util/Log.kt +64 -0
  210. package/kotlin/Sources/java/security/MessageDigest.kt +114 -0
  211. package/kotlin/Sources/kotlin/text/StringFormat.kt +9 -0
  212. package/kotlin/Sources/org/json/JSON.kt +44 -0
  213. package/kotlin/fixtures/counter/Counter.d.kt.ts +1 -0
  214. package/kotlin/fixtures/counter/Counter.kt +10 -3
  215. package/kotlin/fixtures/counter/CounterApp.native.tsx +1 -1
  216. package/kotlin/fixtures/counter/vite.config.ts +2 -2
  217. package/kotlin/fixtures/headless-counter/Headless.kt +7 -6
  218. package/kotlin/fixtures/import-animation/Animation.d.kt.ts +7 -0
  219. package/kotlin/fixtures/import-animation/Animation.kt +80 -0
  220. package/kotlin/fixtures/import-animation/ImportAnimation.native.tsx +13 -0
  221. package/kotlin/fixtures/import-animation/README.md +24 -0
  222. package/kotlin/fixtures/import-animation/app/_layout.tsx +4 -0
  223. package/kotlin/fixtures/import-animation/app/index+spa.tsx +1 -0
  224. package/kotlin/fixtures/import-animation/app/routes.d.ts +18 -0
  225. package/kotlin/fixtures/import-animation/package.json +23 -0
  226. package/kotlin/fixtures/import-animation/tsconfig.json +20 -0
  227. package/kotlin/fixtures/import-animation/vite.config.ts +20 -0
  228. package/kotlin/fixtures/import-editor/Editor.d.kt.ts +7 -0
  229. package/kotlin/fixtures/import-editor/Editor.kt +59 -0
  230. package/kotlin/fixtures/import-editor/ImportEditor.native.tsx +23 -0
  231. package/kotlin/fixtures/import-editor/README.md +27 -0
  232. package/kotlin/fixtures/import-editor/app/_layout.tsx +4 -0
  233. package/kotlin/fixtures/import-editor/app/index+spa.tsx +1 -0
  234. package/kotlin/fixtures/import-editor/package.json +23 -0
  235. package/kotlin/fixtures/import-editor/tsconfig.json +20 -0
  236. package/kotlin/fixtures/import-editor/vite.config.ts +20 -0
  237. package/kotlin/fixtures/import-effects/Effects.d.kt.ts +7 -0
  238. package/kotlin/fixtures/import-effects/Effects.kt +87 -0
  239. package/kotlin/fixtures/import-effects/ImportEffects.native.tsx +13 -0
  240. package/kotlin/fixtures/import-effects/README.md +19 -0
  241. package/kotlin/fixtures/import-effects/app/_layout.tsx +4 -0
  242. package/kotlin/fixtures/import-effects/app/index+spa.tsx +1 -0
  243. package/kotlin/fixtures/import-effects/package.json +23 -0
  244. package/kotlin/fixtures/import-effects/tsconfig.json +20 -0
  245. package/kotlin/fixtures/import-effects/vite.config.ts +20 -0
  246. package/kotlin/fixtures/import-layout/ImportLayout.native.tsx +13 -0
  247. package/kotlin/fixtures/import-layout/Layout.d.kt.ts +7 -0
  248. package/kotlin/fixtures/import-layout/Layout.kt +72 -0
  249. package/kotlin/fixtures/import-layout/README.md +24 -0
  250. package/kotlin/fixtures/import-layout/app/_layout.tsx +4 -0
  251. package/kotlin/fixtures/import-layout/app/index+spa.tsx +1 -0
  252. package/kotlin/fixtures/import-layout/package.json +23 -0
  253. package/kotlin/fixtures/import-layout/tsconfig.json +20 -0
  254. package/kotlin/fixtures/import-layout/vite.config.ts +20 -0
  255. package/kotlin/fixtures/import-navigation/ImportNavigation.native.tsx +18 -0
  256. package/kotlin/fixtures/import-navigation/Navigation.d.kt.ts +7 -0
  257. package/kotlin/fixtures/import-navigation/Navigation.kt +104 -0
  258. package/kotlin/fixtures/import-navigation/README.md +31 -0
  259. package/kotlin/fixtures/import-navigation/app/_layout.tsx +4 -0
  260. package/kotlin/fixtures/import-navigation/app/index+spa.tsx +1 -0
  261. package/kotlin/fixtures/import-navigation/package.json +23 -0
  262. package/kotlin/fixtures/import-navigation/tsconfig.json +20 -0
  263. package/kotlin/fixtures/import-navigation/vite.config.ts +20 -0
  264. package/kotlin/fixtures/import-overlays/ImportOverlays.native.tsx +29 -0
  265. package/kotlin/fixtures/import-overlays/Overlays.d.kt.ts +7 -0
  266. package/kotlin/fixtures/import-overlays/Overlays.kt +93 -0
  267. package/kotlin/fixtures/import-overlays/README.md +34 -0
  268. package/kotlin/fixtures/import-overlays/app/_layout.tsx +4 -0
  269. package/kotlin/fixtures/import-overlays/app/index+spa.tsx +1 -0
  270. package/kotlin/fixtures/import-overlays/package.json +23 -0
  271. package/kotlin/fixtures/import-overlays/tsconfig.json +20 -0
  272. package/kotlin/fixtures/import-overlays/vite.config.ts +20 -0
  273. package/kotlin/fixtures/import-scroll/ImportScroll.native.tsx +13 -0
  274. package/kotlin/fixtures/import-scroll/README.md +23 -0
  275. package/kotlin/fixtures/import-scroll/Scroll.d.kt.ts +7 -0
  276. package/kotlin/fixtures/import-scroll/Scroll.kt +91 -0
  277. package/kotlin/fixtures/import-scroll/app/_layout.tsx +4 -0
  278. package/kotlin/fixtures/import-scroll/app/index+spa.tsx +1 -0
  279. package/kotlin/fixtures/import-scroll/package.json +23 -0
  280. package/kotlin/fixtures/import-scroll/tsconfig.json +20 -0
  281. package/kotlin/fixtures/import-scroll/vite.config.ts +20 -0
  282. package/kotlin/fixtures/import-selection/ImportSelection.native.tsx +44 -0
  283. package/kotlin/fixtures/import-selection/README.md +32 -0
  284. package/kotlin/fixtures/import-selection/Selection.d.kt.ts +8 -0
  285. package/kotlin/fixtures/import-selection/Selection.kt +78 -0
  286. package/kotlin/fixtures/import-selection/app/_layout.tsx +4 -0
  287. package/kotlin/fixtures/import-selection/app/index+spa.tsx +1 -0
  288. package/kotlin/fixtures/import-selection/package.json +23 -0
  289. package/kotlin/fixtures/import-selection/tsconfig.json +20 -0
  290. package/kotlin/fixtures/import-selection/vite.config.ts +20 -0
  291. package/kotlin/fixtures/import-surfaces/ImportSurfaces.native.tsx +13 -0
  292. package/kotlin/fixtures/import-surfaces/README.md +22 -0
  293. package/kotlin/fixtures/import-surfaces/Surfaces.d.kt.ts +7 -0
  294. package/kotlin/fixtures/import-surfaces/Surfaces.kt +64 -0
  295. package/kotlin/fixtures/import-surfaces/app/_layout.tsx +4 -0
  296. package/kotlin/fixtures/import-surfaces/app/index+spa.tsx +1 -0
  297. package/kotlin/fixtures/import-surfaces/package.json +23 -0
  298. package/kotlin/fixtures/import-surfaces/tsconfig.json +20 -0
  299. package/kotlin/fixtures/import-surfaces/vite.config.ts +20 -0
  300. package/kotlin/fixtures/import-values/ImportValues.native.tsx +35 -0
  301. package/kotlin/fixtures/import-values/README.md +23 -0
  302. package/kotlin/fixtures/import-values/Values.d.kt.ts +11 -0
  303. package/kotlin/fixtures/import-values/Values.kt +66 -0
  304. package/kotlin/fixtures/import-values/app/_layout.tsx +4 -0
  305. package/kotlin/fixtures/import-values/app/index+spa.tsx +1 -0
  306. package/kotlin/fixtures/import-values/package.json +23 -0
  307. package/kotlin/fixtures/import-values/tsconfig.json +20 -0
  308. package/kotlin/fixtures/import-values/vite.config.ts +20 -0
  309. package/kotlin/fixtures/kotlin-app-variants/BarBehavior.kt +38 -0
  310. package/kotlin/fixtures/kotlin-app-variants/BarVisibility.kt +36 -0
  311. package/kotlin/fixtures/kotlin-app-variants/Ime.kt +3 -1
  312. package/kotlin/fixtures/kotlin-app-variants/TransientInsets.kt +50 -0
  313. package/kotlin/fork/NOTICE +6 -1
  314. package/kotlin/fork/README.md +15 -7
  315. package/kotlin/fork/build.sh +2 -0
  316. package/kotlin/fork/compose-worker-globals.patch +186 -4
  317. package/kotlin/fork/fork.json +2 -2
  318. package/kotlin/fork/skiko-worker-clock.patch +12 -0
  319. package/kotlin/toolchain.json +12 -12
  320. package/kotlin/tools/expo-types.main.kts +115 -0
  321. package/package.json +17 -23
  322. package/scripts/dev-server-scanner.ts +92 -66
  323. package/skills/contrast/SKILL.md +2 -2
  324. package/skills/peach-debug/SKILL.md +1 -1
  325. package/skills/peach-perf/SKILL.md +1 -1
  326. package/skills/peach-setup/SKILL.md +2 -1
  327. package/skills/peach-test/SKILL.md +8 -0
  328. package/src/assetCatalogContract.ts +43 -1
  329. package/src/bridge-contract-input.ts +46 -19
  330. package/src/bridge-contract.ts +0 -1
  331. package/src/bundle-channel.mjs +197 -84
  332. package/src/bundleGlobalFooter.ts +38 -0
  333. package/src/capture-contract.ts +107 -33
  334. package/src/cloud-contract.ts +5 -1
  335. package/src/cloud.ts +5 -2
  336. package/src/config.ts +22 -3
  337. package/src/configured-bundle-producer.ts +1 -1
  338. package/src/desktop-host-delivery.ts +95 -1
  339. package/src/expo-kotlin-bundle.ts +29 -0
  340. package/src/expo-kotlin-host.ts +201 -0
  341. package/src/expo-swift-host.ts +96 -76
  342. package/src/expoKotlinContract.ts +70 -0
  343. package/src/expoSwiftContract.ts +4 -25
  344. package/src/home-paths.ts +7 -4
  345. package/src/host/bridge-host.ts +23 -3
  346. package/src/host/fetch-proxy-handler.ts +13 -0
  347. package/src/host/fetch-proxy-overrides.ts +11 -0
  348. package/src/host/replacement-module-handler.ts +5 -2
  349. package/src/index.ts +3 -1
  350. package/src/kotlin-host.ts +463 -19
  351. package/src/metro-plugin.ts +56 -28
  352. package/src/metro-production-bundle.ts +2 -2
  353. package/src/native-app-identity-project.ts +190 -0
  354. package/src/native-app-identity.ts +398 -34
  355. package/src/native-firebase-config.ts +69 -15
  356. package/src/native-seam-manifest.ts +6 -0
  357. package/src/one-widget-discovery.ts +2 -1
  358. package/src/openstep-plist.ts +107 -0
  359. package/src/react-native-host-modules.ts +4 -0
  360. package/src/runtime-assets.ts +2 -2
  361. package/src/sim-client.ts +2 -2
  362. package/src/swift-binary-modules.ts +3 -1
  363. package/src/swift-compile.ts +286 -38
  364. package/src/swift-distribution-contract.ts +4 -0
  365. package/src/swift-distribution.lock.json +123 -12
  366. package/src/swift-distribution.ts +7 -3
  367. package/src/swift-host.ts +298 -83
  368. package/src/swift-package-manifest.ts +29 -2
  369. package/src/swift-package.ts +180 -10
  370. package/src/swift-packages.ts +4 -0
  371. package/src/swift-standin-emit.ts +4 -1
  372. package/src/swift-standins.ts +274 -15
  373. package/src/swift-submit.ts +62 -7
  374. package/src/swift-toolchain.ts +6 -1
  375. package/src/swiftContract.ts +126 -3
  376. package/src/vite-plugin-one.ts +13 -16
  377. package/src/vite-plugin-swift.ts +4 -5
  378. package/src/vite-plugin.ts +360 -144
  379. package/src/vite.d.ts +1 -1
  380. package/src/worker-system-chunks.ts +221 -0
  381. package/src/worklet-executable.ts +348 -38
  382. package/src/worklets-babel.ts +1 -1
  383. package/src/xcode-project.ts +243 -127
  384. package/dist-lib/agent-identity.cjs +0 -39
  385. package/dist-lib/agent-sessions.cjs +0 -760
  386. package/dist-lib/cli-constants.cjs +0 -32
  387. package/dist-lib/render-mode.cjs +0 -44
  388. package/kotlin/AppSources/android/view/View.kt +0 -74
  389. package/kotlin/AppSources/android/widget/FrameLayout.kt +0 -6
  390. package/src/render-mode.ts +0 -15
  391. /package/kotlin/{AppSources → AndroidViewSources}/android/content/Context.kt +0 -0
  392. /package/kotlin/{AppSources → AndroidViewSources}/android/content/res/Configuration.kt +0 -0
  393. /package/kotlin/{AppSources → AndroidViewSources}/android/graphics/Color.kt +0 -0
  394. /package/kotlin/{AppSources → AndroidViewSources}/android/util/DisplayMetrics.kt +0 -0
  395. /package/kotlin/{AppSources → AndroidViewSources}/dev/peach/app/JavaFormat.kt +0 -0
  396. /package/kotlin/{AppSources → Sources}/java/lang/Runnable.kt +0 -0
@@ -1,7 +1,8 @@
1
1
  // read native default initialization inputs before the guest Firebase SDK starts.
2
2
  // expose only FirebaseOptions, never a partner-specific extra configuration.
3
+ import { spawnSync } from 'node:child_process'
3
4
  import fs from 'node:fs'
4
- import { createRequire } from 'node:module'
5
+ import os from 'node:os'
5
6
  import path from 'node:path'
6
7
  import { isRecord } from './is-record'
7
8
  import { parsePlistSource } from './plist'
@@ -10,6 +11,7 @@ import { listXcodeAppTargets, readXcodeAppTarget } from './xcode-project'
10
11
  export function readNativeFirebaseConfig(
11
12
  projectRoot: string,
12
13
  platforms: readonly string[] = ['ios', 'android'],
14
+ iosTarget?: string,
13
15
  ) {
14
16
  const result: Record<string, unknown> = {}
15
17
  let config: Record<string, unknown> = {}
@@ -30,15 +32,45 @@ export function readNativeFirebaseConfig(
30
32
  'app.config.mjs',
31
33
  ].some((name) => fs.existsSync(path.join(projectRoot, name)))
32
34
  if (staticExpo || dynamicExpo) {
33
- const require = createRequire(path.join(projectRoot, 'package.json'))
34
- const configModule: unknown = require('@expo/config')
35
- if (!isRecord(configModule) || typeof configModule.getConfig !== 'function')
36
- throw new Error('Expo native configuration is unavailable.')
37
- const resolved: unknown = Reflect.apply(configModule.getConfig, configModule, [
38
- projectRoot,
39
- { skipSDKVersionRequirement: true },
40
- ])
41
- config = isRecord(resolved) && isRecord(resolved.exp) ? resolved.exp : {}
35
+ // expo's synchronous ESM/TypeScript loader requires Node's module evaluator.
36
+ // a private result file keeps authored console output off the configuration wire.
37
+ const directory = fs.mkdtempSync(path.join(os.tmpdir(), 'peach-expo-config-'))
38
+ const resultPath = path.join(directory, 'config.json')
39
+ try {
40
+ const child = spawnSync(
41
+ 'node',
42
+ [
43
+ '--input-type=commonjs',
44
+ '-e',
45
+ `const { createRequire } = require('node:module');
46
+ const { writeFileSync } = require('node:fs');
47
+ const { join } = require('node:path');
48
+ const root = process.argv[1];
49
+ const { getConfig } = createRequire(join(root, 'package.json'))('@expo/config');
50
+ const result = JSON.stringify(getConfig(root, { skipSDKVersionRequirement: true }).exp);
51
+ if (Buffer.byteLength(result) > 1024 * 1024) throw new Error('Expo native configuration exceeds 1 MiB.');
52
+ writeFileSync(process.argv[2], result, { mode: 0o600 });`,
53
+ path.resolve(projectRoot),
54
+ resultPath,
55
+ ],
56
+ {
57
+ cwd: projectRoot,
58
+ encoding: 'utf8',
59
+ stdio: ['ignore', 'ignore', 'pipe'],
60
+ timeout: 30_000,
61
+ maxBuffer: 1024 * 1024,
62
+ },
63
+ )
64
+ if (child.error) throw child.error
65
+ if (child.status !== 0)
66
+ throw new Error(child.stderr || 'Expo native configuration evaluation failed.')
67
+ const resolved: unknown = JSON.parse(fs.readFileSync(resultPath, 'utf8'))
68
+ if (!isRecord(resolved))
69
+ throw new Error('Expo native configuration is unavailable.')
70
+ config = resolved
71
+ } finally {
72
+ fs.rmSync(directory, { recursive: true, force: true })
73
+ }
42
74
  }
43
75
  const ios = config.ios
44
76
  if (
@@ -55,10 +87,17 @@ export function readNativeFirebaseConfig(
55
87
  if (projects.length === 1) {
56
88
  const xcodeproj = path.join(iosRoot, projects[0].name)
57
89
  const appTargets = listXcodeAppTargets(xcodeproj)
58
- if (appTargets.length > 1)
90
+ if (!iosTarget && appTargets.length > 1)
59
91
  throw new Error('native Firebase configuration requires a selected app target')
60
- if (appTargets.length === 1) {
61
- const app = readXcodeAppTarget(xcodeproj, appTargets[0])
92
+ if (iosTarget || appTargets.length === 1) {
93
+ const app = readXcodeAppTarget(
94
+ xcodeproj,
95
+ iosTarget ?? appTargets[0],
96
+ undefined,
97
+ {
98
+ requireSources: false,
99
+ },
100
+ )
62
101
  const delegates = app.allSources.filter((file) =>
63
102
  /^AppDelegate\.(swift|mm|m)$/.test(path.basename(file)),
64
103
  )
@@ -69,7 +108,7 @@ export function readNativeFirebaseConfig(
69
108
  token.startsWith('"') ? '""' : token.replace(/[^\n]/g, ' '),
70
109
  )
71
110
  const launch =
72
- /(?:\bfunc\s+application\s*\([\s\S]*?didFinishLaunchingWithOptions[\s\S]*?\)\s*->\s*Bool|^-\s*\(BOOL\)\s*application\s*:[\s\S]*?didFinishLaunchingWithOptions[^\{]*)\s*\{/m.exec(
111
+ /(?:\bfunc\s+application\s*\([\s\S]*?didFinishLaunchingWithOptions[\s\S]*?\)\s*->\s*Bool|^-\s*\(BOOL\)\s*application\s*:[\s\S]*?didFinishLaunchingWithOptions[^{]*)\s*\{/m.exec(
73
112
  source,
74
113
  )
75
114
  if (!launch) return false
@@ -86,9 +125,24 @@ export function readNativeFirebaseConfig(
86
125
  if (token === '}') depth -= 1
87
126
  if (depth === 0) return false
88
127
  }
128
+ let conditionalDepth = 0
129
+ for (const directive of before.matchAll(
130
+ /^\s*#\s*(if|ifdef|ifndef|elseif|elif|else|endif)\b/gm,
131
+ )) {
132
+ const kind = directive[1]
133
+ if (kind === 'if' || kind === 'ifdef' || kind === 'ifndef') {
134
+ conditionalDepth += 1
135
+ } else if (conditionalDepth === 0) {
136
+ conditionalDepth = -1
137
+ break
138
+ } else if (kind === 'endif') {
139
+ conditionalDepth -= 1
140
+ }
141
+ }
89
142
  if (
90
143
  depth !== 1 ||
91
- /\b(?:return|throw)\b|^\s*#(?:if|elseif|else)/m.test(before)
144
+ conditionalDepth !== 0 ||
145
+ /\b(?:return|throw)\b/.test(before)
92
146
  )
93
147
  throw new Error(
94
148
  'native Firebase initialization must be unconditional in the app launch method',
@@ -148,6 +148,12 @@ export const NATIVE_SEAM_MANIFEST: NativeSeamEntry[] = [
148
148
  notes:
149
149
  'ASAuthorizationAppleIDButton native view — render the system button surface while upstream AppleAuthenticationButton.tsx remains unchanged',
150
150
  },
151
+ {
152
+ pkg: 'expo-asset',
153
+ seamBasenames: ['resolveAssetSource'],
154
+ target: path.resolve(NATIVE_SEAMS_DIR, '../rn-libraries/resolveAssetSource.ts'),
155
+ notes: 'the native Image resolver and transformer registration share one owner',
156
+ },
151
157
  {
152
158
  pkg: '@bam.tech/react-native-image-resizer',
153
159
  // a Metro bundle reaches the same seam through the ImageResizer
@@ -3,9 +3,10 @@ import type { ConfiguredOneWidget } from './oneWidgetContract'
3
3
 
4
4
  export async function readConfiguredOneWidget(
5
5
  bundleUrl: string,
6
+ fetchScan: (url: string, init: RequestInit) => Promise<Response> = fetch,
6
7
  ): Promise<ConfiguredOneWidget | null> {
7
8
  try {
8
- const response = await fetch(new URL('/__server-scan', bundleUrl).href, {
9
+ const response = await fetchScan(new URL('/__server-scan', bundleUrl).href, {
9
10
  signal: AbortSignal.timeout(30_000),
10
11
  })
11
12
  if (!response.ok || !response.headers.get('content-type')?.includes('json'))
@@ -0,0 +1,107 @@
1
+ export type PlistValue = string | PlistValue[] | { [key: string]: PlistValue }
2
+ export type PlistDict = { [key: string]: PlistValue }
3
+
4
+ export const isDict = (value: PlistValue | undefined): value is PlistDict =>
5
+ typeof value === 'object' && value !== null && !Array.isArray(value)
6
+
7
+ export const str = (value: PlistValue | undefined): string | undefined =>
8
+ typeof value === 'string' ? value : undefined
9
+
10
+ export const list = (value: PlistValue | undefined): string[] =>
11
+ Array.isArray(value)
12
+ ? value.filter((item): item is string => typeof item === 'string')
13
+ : []
14
+
15
+ // project.pbxproj is an old-style (openstep) property list: dictionaries,
16
+ // arrays and strings, with c comments. node's plist package reads only xml.
17
+ export function parseOpenStepPlist(text: string): PlistValue {
18
+ let i = 0
19
+ const fail = (message: string): never => {
20
+ const line = text.slice(0, i).split('\n').length
21
+ throw new Error(`project.pbxproj line ${line}: ${message}`)
22
+ }
23
+ const skip = () => {
24
+ for (;;) {
25
+ const ch = text[i]
26
+ if (ch === ' ' || ch === '\t' || ch === '\n' || ch === '\r') i++
27
+ else if (ch === '/' && text[i + 1] === '*') {
28
+ const end = text.indexOf('*/', i + 2)
29
+ if (end < 0) fail('unterminated comment')
30
+ i = end + 2
31
+ } else if (ch === '/' && text[i + 1] === '/') {
32
+ const end = text.indexOf('\n', i)
33
+ i = end < 0 ? text.length : end + 1
34
+ } else return
35
+ }
36
+ }
37
+ const quoted = (): string => {
38
+ i++
39
+ let out = ''
40
+ for (;;) {
41
+ const ch = text[i++]
42
+ if (ch === undefined) fail('unterminated string')
43
+ if (ch === '"') return out
44
+ if (ch !== '\\') {
45
+ out += ch
46
+ continue
47
+ }
48
+ const next = text[i++]
49
+ if (next === 'n') out += '\n'
50
+ else if (next === 't') out += '\t'
51
+ else if (next === 'r') out += '\r'
52
+ else if (next === 'U') {
53
+ out += String.fromCharCode(parseInt(text.slice(i, i + 4), 16))
54
+ i += 4
55
+ } else out += next
56
+ }
57
+ }
58
+ const value = (): PlistValue => {
59
+ skip()
60
+ const ch = text[i]
61
+ if (ch === '{') {
62
+ i++
63
+ const dict: PlistDict = {}
64
+ for (;;) {
65
+ skip()
66
+ if (text[i] === '}') {
67
+ i++
68
+ return dict
69
+ }
70
+ const key = value()
71
+ if (typeof key !== 'string') fail('dictionary key is not a string')
72
+ skip()
73
+ if (text[i++] !== '=') fail('expected =')
74
+ // two objects under one id leave every reference to it ambiguous
75
+ if (Object.hasOwn(dict, key as string)) fail(`duplicate key ${key}`)
76
+ dict[key as string] = value()
77
+ skip()
78
+ if (text[i++] !== ';') fail('expected ;')
79
+ }
80
+ }
81
+ if (ch === '(') {
82
+ i++
83
+ const list: PlistValue[] = []
84
+ for (;;) {
85
+ skip()
86
+ if (text[i] === ')') {
87
+ i++
88
+ return list
89
+ }
90
+ list.push(value())
91
+ skip()
92
+ if (text[i] === ',') i++
93
+ else if (text[i] !== ')') fail('expected , or )')
94
+ }
95
+ }
96
+ if (ch === '"') return quoted()
97
+ const start = i
98
+ while (i < text.length && /[A-Za-z0-9_$+/:.\-<>]/.test(text[i]!)) i++
99
+ if (i === start) fail(`unexpected ${JSON.stringify(ch ?? 'end of file')}`)
100
+ return text.slice(start, i)
101
+ }
102
+ if (text.startsWith('// !$*UTF8*$!')) i = text.indexOf('\n') + 1
103
+ const root = value()
104
+ skip()
105
+ if (i !== text.length) fail('trailing content')
106
+ return root
107
+ }
@@ -6,6 +6,10 @@
6
6
  * preserves upstream platform, style, event-emitter, and TurboModule behavior.
7
7
  */
8
8
  export const REACT_NATIVE_PASSTHROUGH_SPECIFIERS: readonly string[] = [
9
+ // sdk 58 reads these upstream getters and wraps the original metro logger.
10
+ 'react-native/unstable-internals-do-not-use',
11
+ 'react-native/src/unstable-internals-do-not-use',
12
+ 'react-native/Libraries/Utilities/HMRClient',
9
13
  'react-native/Libraries/vendor/emitter',
10
14
  'react-native/Libraries/Components/View/ReactNativeStyleAttributes',
11
15
  'react-native/Libraries/StyleSheet',
@@ -16,12 +16,12 @@ export const SOOTSIM_RUNTIME_MISSING_MESSAGE =
16
16
  //
17
17
  // there is exactly one rule for which engine gets served: INSIDE the Contrast
18
18
  // monorepo dev checkout the fresh dev-stack build (public/sootsim, kept current
19
- // by `bun dev`'s watch:sootsim) IS the engine; OUTSIDE it (a published CLI in a
19
+ // by `bun dev`'s watch:peach) IS the engine; OUTSIDE it (a published CLI in a
20
20
  // user's project, or an isolated home) the installed runtime IS. this is a mode
21
21
  // boundary, not a preference or a runtime fallback chain — the check is
22
22
  // structural (the monorepo layout is present next to this module) and
23
23
  // deterministic (the dev build's files exist). it exists because the daemon and
24
- // the /__soot plugin otherwise serve ~/.peach/runtimes/<active>, a PUBLISHED
24
+ // the /__peachsim plugin otherwise serve ~/.peach/runtimes/<active>, a PUBLISHED
25
25
  // runtime that `bun dev` never refreshes, so local engine edits are invisible
26
26
  // until a manual publish — the silent trap that cost a full night of
27
27
  // already-fixed bugs re-reproducing.
package/src/sim-client.ts CHANGED
@@ -196,11 +196,11 @@ const TARGET_SEARCH_PARAMS = [
196
196
  export function buildSimOpenUrl(currentUrl: string, target: number | string): string {
197
197
  const url = new URL(currentUrl)
198
198
  for (const param of TARGET_SEARCH_PARAMS) url.searchParams.delete(param)
199
- // shell route grammar: an optional /__soot prefix, then /rn, /rn/<port>, or
199
+ // shell route grammar: an optional /__peachsim prefix, then /rn, /rn/<port>, or
200
200
  // /app/<name>. the current route is replaced wholesale, keeping the prefix.
201
201
  const pathname = url.pathname.replace(/\/+$/, '') || '/'
202
202
  const prefix =
203
- pathname === '/__soot' || pathname.startsWith('/__soot/') ? '/__soot' : ''
203
+ pathname === '/__peachsim' || pathname.startsWith('/__peachsim/') ? '/__peachsim' : ''
204
204
  const normalized = String(target).trim()
205
205
  if (/^\d+$/.test(normalized)) {
206
206
  // `/rn/<port>` — the shell's own connect route resolves the metro bundle
@@ -23,9 +23,11 @@ function frameworkModules(paths: string[]): string[] {
23
23
  return [...modules].sort()
24
24
  }
25
25
 
26
+ // byte offsets index the archive itself: a host that gzips range responses
27
+ // (dl.google.com) otherwise answers with offsets into its compressed copy.
26
28
  async function range(url: string, spec: string) {
27
29
  const response = await fetch(url, {
28
- headers: { range: `bytes=${spec}` },
30
+ headers: { range: `bytes=${spec}`, 'accept-encoding': 'identity' },
29
31
  signal: AbortSignal.timeout(20_000),
30
32
  })
31
33
  const match = /^bytes (\d+)-\d+\/(\d+)$/.exec(