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
@@ -5,8 +5,8 @@
5
5
  // when active changes, so one loaded shell cannot mix runtime chunk trees.
6
6
  //
7
7
  // usage in metro.config.js:
8
- // const { withRNX } = require('peachsim/metro')
9
- // module.exports = withRNX(getDefaultConfig(__dirname))
8
+ // const { withPeach } = require('peachsim/metro')
9
+ // module.exports = withPeach(getDefaultConfig(__dirname))
10
10
 
11
11
  import fs from 'fs'
12
12
  import { createRequire } from 'module'
@@ -21,8 +21,8 @@ import {
21
21
  import {
22
22
  appendRNXMetroModuleIdentityFooter,
23
23
  RNX_METRO_MODULE_IDENTITY_VERSION,
24
- toRNXDevelopmentBundleUrl,
25
- toRNXProductionBundleUrl,
24
+ toPeachDevelopmentBundleUrl,
25
+ toPeachProductionBundleUrl,
26
26
  type RNXMetroModuleIdentityMetadata,
27
27
  } from './metro-production-bundle'
28
28
  import {
@@ -30,6 +30,7 @@ import {
30
30
  extractNativeAppIdentityFromFiles,
31
31
  insertNativeAppIdentityFooter,
32
32
  } from './native-app-identity'
33
+ import { readNativeAppIdentityFromProject } from './native-app-identity-project'
33
34
  import { readNativeFirebaseConfig } from './native-firebase-config'
34
35
  import {
35
36
  insertNativeFirebaseFooter,
@@ -44,8 +45,8 @@ import {
44
45
  SOOTSIM_RUNTIME_MISSING_MESSAGE,
45
46
  } from './runtime-assets'
46
47
 
47
- const prefix = '/__soot'
48
- export { toRNXDevelopmentBundleUrl, toRNXProductionBundleUrl }
48
+ const prefix = '/__peachsim'
49
+ export { toPeachDevelopmentBundleUrl, toPeachProductionBundleUrl }
49
50
 
50
51
  type MetroSerializerModule = {
51
52
  path: string
@@ -64,6 +65,7 @@ type MetroSerializerGraph = {
64
65
  }
65
66
 
66
67
  type MetroSerializerOptions = {
68
+ asyncRequireModulePath: string
67
69
  createModuleId?: (modulePath: string) => number
68
70
  dev?: boolean
69
71
  [key: string]: unknown
@@ -107,8 +109,9 @@ function readCallableMetroExport(
107
109
  return (...args) => Reflect.apply(callable, undefined, args)
108
110
  }
109
111
 
110
- function createMetroDefaultSerializer(projectRoot: string): MetroSerializer {
111
- const projectRequire = createRequire(path.join(projectRoot, 'package.json'))
112
+ function createMetroDefaultSerializer(asyncRequireModulePath: string): MetroSerializer {
113
+ // metro supplies this absolute runtime path from its resolved configuration.
114
+ const projectRequire = createRequire(asyncRequireModulePath)
112
115
  const metroRoot = path.dirname(projectRequire.resolve('metro/package.json'))
113
116
  const baseJSBundle = readCallableMetroExport(
114
117
  projectRequire(path.join(metroRoot, 'src/DeltaBundler/Serializers/baseJSBundle.js')),
@@ -195,7 +198,10 @@ function appendRNXModulePaths(
195
198
  : { ...result, code: appendRNXMetroModuleIdentityFooter(result.code, identity) }
196
199
  }
197
200
 
198
- export function withRNX<T extends Record<string, unknown>>(config: T): T {
201
+ export function withPeach<T extends Record<string, unknown>>(
202
+ config: T,
203
+ options: { iosTarget?: string } = {},
204
+ ): T {
199
205
  const cfgProjectRoot = (config as MetroConfigWithServer).projectRoot || process.cwd()
200
206
  const configuredBundleUrl = '/index.bundle?platform=ios&dev=true&hot=true&minify=false'
201
207
 
@@ -225,7 +231,9 @@ export function withRNX<T extends Record<string, unknown>>(config: T): T {
225
231
  ) => {
226
232
  const serializer =
227
233
  existingSerializer ||
228
- (defaultSerializer ||= createMetroDefaultSerializer(cfgProjectRoot))
234
+ (defaultSerializer ||= createMetroDefaultSerializer(
235
+ serializerOptions.asyncRequireModulePath,
236
+ ))
229
237
  const result = await serializer(entryPoint, preModules, graph, serializerOptions)
230
238
  let annotated = appendRNXModulePaths(
231
239
  result,
@@ -236,23 +244,38 @@ export function withRNX<T extends Record<string, unknown>>(config: T): T {
236
244
  const iosRoot = path.join(cfgProjectRoot, 'ios')
237
245
  const bundlePlatform = graph.transformOptions?.platform
238
246
  if (canExtractNativeAppIdentity(bundlePlatform) && fs.existsSync(iosRoot)) {
239
- const files: Record<string, string> = {}
240
- for (const entry of fs.readdirSync(iosRoot, { withFileTypes: true })) {
241
- if (!entry.isDirectory() || entry.name === 'Pods') continue
242
- const names = entry.name.endsWith('.xcodeproj')
243
- ? ['project.pbxproj']
244
- : ['Info.plist', 'AppDelegate.swift', 'AppDelegate.mm', 'AppDelegate.m']
245
- for (const name of names) {
246
- const relative = `ios/${entry.name}/${name}`
247
- const file = path.join(cfgProjectRoot, relative)
248
- if (fs.existsSync(file)) files[relative] = fs.readFileSync(file, 'utf8')
249
- }
250
- }
251
- const identity = extractNativeAppIdentityFromFiles(
252
- files,
247
+ let identity = readNativeAppIdentityFromProject(
248
+ cfgProjectRoot,
253
249
  bundlePlatform,
254
250
  parsePlistSource,
251
+ options.iosTarget,
255
252
  )
253
+ if (!identity) {
254
+ const files: Record<string, string> = {}
255
+ for (const entry of fs.readdirSync(iosRoot, { withFileTypes: true })) {
256
+ if (entry.name === 'Pods') continue
257
+ if (entry.isDirectory()) {
258
+ const names = entry.name.endsWith('.xcodeproj')
259
+ ? ['project.pbxproj']
260
+ : ['Info.plist', 'AppDelegate.swift', 'AppDelegate.mm', 'AppDelegate.m']
261
+ for (const name of names) {
262
+ const relative = `ios/${entry.name}/${name}`
263
+ const file = path.join(cfgProjectRoot, relative)
264
+ if (fs.existsSync(file)) files[relative] = fs.readFileSync(file, 'utf8')
265
+ }
266
+ } else if (/AppDelegate\.(?:swift|mm|m)$/.test(entry.name)) {
267
+ const relative = `ios/${entry.name}`
268
+ const file = path.join(cfgProjectRoot, relative)
269
+ if (fs.existsSync(file)) files[relative] = fs.readFileSync(file, 'utf8')
270
+ }
271
+ }
272
+ identity = extractNativeAppIdentityFromFiles(
273
+ files,
274
+ bundlePlatform,
275
+ parsePlistSource,
276
+ options.iosTarget,
277
+ )
278
+ }
256
279
  if (identity) {
257
280
  annotated =
258
281
  typeof annotated === 'string'
@@ -272,6 +295,7 @@ export function withRNX<T extends Record<string, unknown>>(config: T): T {
272
295
  readNativeFirebaseConfig(
273
296
  cfgProjectRoot,
274
297
  typeof bundlePlatform === 'string' ? [bundlePlatform] : undefined,
298
+ options.iosTarget,
275
299
  ),
276
300
  )
277
301
  if (firebase)
@@ -349,7 +373,11 @@ export function withRNX<T extends Record<string, unknown>>(config: T): T {
349
373
  res.setHeader('Content-Type', 'application/json')
350
374
  res.setHeader('Cache-Control', 'no-store')
351
375
  res.setHeader('Access-Control-Allow-Origin', '*')
352
- res.end(JSON.stringify(readNativeFirebaseConfig(cfgProjectRoot)))
376
+ res.end(
377
+ JSON.stringify(
378
+ readNativeFirebaseConfig(cfgProjectRoot, undefined, options.iosTarget),
379
+ ),
380
+ )
353
381
  } catch (error) {
354
382
  res.statusCode = 400
355
383
  res.end(
@@ -388,7 +416,7 @@ export function withRNX<T extends Record<string, unknown>>(config: T): T {
388
416
  }
389
417
  }
390
418
 
391
- // /__soot/* — serve runtime assets
419
+ // /__peachsim/* — serve runtime assets
392
420
  if (pathname.startsWith(prefix + '/')) {
393
421
  const fullPath = resolveRuntimeFilePath(
394
422
  runtimeRoot,
@@ -400,7 +428,7 @@ export function withRNX<T extends Record<string, unknown>>(config: T): T {
400
428
  }
401
429
  }
402
430
 
403
- // serve HTML shell for /__soot and extensionless in-shell routes.
431
+ // serve HTML shell for /__peachsim and extensionless in-shell routes.
404
432
  if (
405
433
  pathname === prefix ||
406
434
  pathname === prefix + '/' ||
@@ -450,4 +478,4 @@ function resolveMetroPort(server: MetroConfigWithServer['server']): number {
450
478
  return port
451
479
  }
452
480
 
453
- export default withRNX
481
+ export default withPeach
@@ -28,7 +28,7 @@ export interface RNXMetroModuleIdentity extends RNXMetroModuleIdentityMetadata {
28
28
  // nothing about resolution changes, so these are plain Metro production
29
29
  // options and the artifact is byte-identical to what the app ships apart
30
30
  // from the identity footer the plugin's serializer appends.
31
- export function toRNXProductionBundleUrl(bundleUrl: string): string {
31
+ export function toPeachProductionBundleUrl(bundleUrl: string): string {
32
32
  const relative = bundleUrl.startsWith('/')
33
33
  const url = new URL(bundleUrl, 'http://peachsim.local')
34
34
  url.searchParams.set('dev', 'false')
@@ -42,7 +42,7 @@ export function toRNXProductionBundleUrl(bundleUrl: string): string {
42
42
  * module names, and its source map. `hot` stays false because the artifact is
43
43
  * immutable once produced.
44
44
  */
45
- export function toRNXDevelopmentBundleUrl(bundleUrl: string): string {
45
+ export function toPeachDevelopmentBundleUrl(bundleUrl: string): string {
46
46
  const relative = bundleUrl.startsWith('/')
47
47
  const url = new URL(bundleUrl, 'http://peachsim.local')
48
48
  url.searchParams.set('dev', 'true')
@@ -0,0 +1,190 @@
1
+ import fs from 'node:fs'
2
+ import path from 'node:path'
3
+ import {
4
+ canExtractNativeAppIdentity,
5
+ type NativeAppIdentity,
6
+ type NativeAppIdentityPlatform,
7
+ } from './native-app-identity'
8
+ import { parsePlistSource } from './plist'
9
+ import {
10
+ listXcodeAppTargets,
11
+ readXcodeAppTarget,
12
+ type XcodeAppTarget,
13
+ } from './xcode-project'
14
+
15
+ function isRecord(value: unknown): value is Record<string, unknown> {
16
+ return typeof value === 'object' && value !== null && !Array.isArray(value)
17
+ }
18
+
19
+ function nonEmptyString(value: unknown): string | undefined {
20
+ return typeof value === 'string' && value.length > 0 ? value : undefined
21
+ }
22
+
23
+ export function readNativeAppIdentityFromXcodeTarget(
24
+ app: XcodeAppTarget,
25
+ parseInfoPlist: (source: string) => unknown = parsePlistSource,
26
+ ): NativeAppIdentity {
27
+ const dictionary = parseInfoPlist(app.infoPlist)
28
+ if (!isRecord(dictionary)) throw new Error('native app Info.plist is not a dictionary')
29
+ const settings = app.settings
30
+
31
+ const bundleIdentifier =
32
+ nonEmptyString(dictionary.CFBundleIdentifier) ??
33
+ nonEmptyString(settings?.('PRODUCT_BUNDLE_IDENTIFIER'))
34
+ if (!bundleIdentifier) throw new Error('native app has no bundle identifier')
35
+
36
+ const appVersion =
37
+ nonEmptyString(dictionary.CFBundleShortVersionString) ??
38
+ nonEmptyString(settings?.('MARKETING_VERSION'))
39
+ const buildVersion =
40
+ nonEmptyString(dictionary.CFBundleVersion) ??
41
+ nonEmptyString(settings?.('CURRENT_PROJECT_VERSION'))
42
+ if (!appVersion || !buildVersion) {
43
+ throw new Error('native app has no version or build version')
44
+ }
45
+
46
+ const bundleName =
47
+ nonEmptyString(dictionary.CFBundleName) ??
48
+ nonEmptyString(settings?.('PRODUCT_NAME')) ??
49
+ app.name
50
+ const applicationDisplayName = nonEmptyString(dictionary.CFBundleDisplayName)
51
+ const applicationName = applicationDisplayName ?? bundleName
52
+
53
+ const declaredBackgroundColor = dictionary.RCTRootViewBackgroundColor
54
+ const rootViewBackgroundColor =
55
+ typeof declaredBackgroundColor === 'number' &&
56
+ Number.isInteger(declaredBackgroundColor)
57
+ ? declaredBackgroundColor
58
+ : undefined
59
+
60
+ const alternateIconNames = new Set<string>()
61
+ const icons = dictionary.CFBundleIcons
62
+ const alternates = isRecord(icons) ? icons.CFBundleAlternateIcons : undefined
63
+ if (isRecord(alternates)) {
64
+ for (const name of Object.keys(alternates)) {
65
+ if (name) alternateIconNames.add(name)
66
+ }
67
+ }
68
+ const alternateSetting =
69
+ settings?.('ASSETCATALOG_COMPILER_ALTERNATE_APPICON_NAMES') ?? ''
70
+ for (const match of alternateSetting
71
+ .replace(/\\"/g, '"')
72
+ .matchAll(/"([^"]*)"|([^\s(),]+)/g)) {
73
+ const val = match[1] ?? match[2]
74
+ if (val) alternateIconNames.add(val)
75
+ }
76
+
77
+ const permissionUsageDescriptions: Record<string, unknown> = {}
78
+ for (const [key, value] of Object.entries(dictionary)) {
79
+ if (
80
+ !/^NS.*UsageDescription$/.test(key) &&
81
+ key !== 'NSLocationTemporaryUsageDescriptionDictionary'
82
+ ) {
83
+ continue
84
+ }
85
+ permissionUsageDescriptions[key] = value
86
+ }
87
+
88
+ const querySchemes = dictionary.LSApplicationQueriesSchemes
89
+ const urlQuerySchemes = Array.isArray(querySchemes) ? querySchemes : []
90
+
91
+ const intentIds = dictionary.OneAppIntentIdentifiers
92
+ const appIntentIdentifiers =
93
+ Array.isArray(intentIds) && intentIds.every((v) => typeof v === 'string')
94
+ ? intentIds
95
+ : []
96
+
97
+ const backgroundIds = dictionary.BGTaskSchedulerPermittedIdentifiers
98
+ const backgroundTaskIdentifiers =
99
+ Array.isArray(backgroundIds) && backgroundIds.every((v) => typeof v === 'string')
100
+ ? backgroundIds
101
+ : []
102
+
103
+ const declaredModes = dictionary.UIBackgroundModes
104
+ const backgroundModes =
105
+ Array.isArray(declaredModes) && declaredModes.every((v) => typeof v === 'string')
106
+ ? declaredModes
107
+ : []
108
+
109
+ const supportedInterfaceOrientations =
110
+ Array.isArray(dictionary.UISupportedInterfaceOrientations) &&
111
+ dictionary.UISupportedInterfaceOrientations.every((v) => typeof v === 'string')
112
+ ? dictionary.UISupportedInterfaceOrientations
113
+ : []
114
+
115
+ const ipadSupportedInterfaceOrientations =
116
+ Array.isArray(dictionary['UISupportedInterfaceOrientations~ipad']) &&
117
+ dictionary['UISupportedInterfaceOrientations~ipad'].every(
118
+ (v) => typeof v === 'string',
119
+ )
120
+ ? dictionary['UISupportedInterfaceOrientations~ipad']
121
+ : []
122
+
123
+ const defaultScreenOrientationMask = nonEmptyString(
124
+ dictionary.EXDefaultScreenOrientationMask,
125
+ )
126
+ const shareIntoAppGroupId = nonEmptyString(dictionary.ExpoShareIntoAppGroupId)
127
+
128
+ return {
129
+ applicationName,
130
+ ...(applicationDisplayName ? { applicationDisplayName } : {}),
131
+ ...(rootViewBackgroundColor !== undefined ? { rootViewBackgroundColor } : {}),
132
+ bundleName,
133
+ appVersion,
134
+ buildVersion,
135
+ bundleIdentifier,
136
+ platform: 'ios',
137
+ supportedInterfaceOrientations,
138
+ ipadSupportedInterfaceOrientations,
139
+ ...(defaultScreenOrientationMask ? { defaultScreenOrientationMask } : {}),
140
+ alternateIconNames: [...alternateIconNames],
141
+ permissionUsageDescriptions,
142
+ urlQuerySchemes,
143
+ ...(shareIntoAppGroupId ? { shareIntoAppGroupId } : {}),
144
+ backgroundTaskIdentifiers,
145
+ backgroundModes,
146
+ appIntentIdentifiers,
147
+ }
148
+ }
149
+
150
+ export function readNativeAppIdentityFromProject(
151
+ projectRoot: string,
152
+ platform: unknown,
153
+ parseInfoPlist: (source: string) => unknown = parsePlistSource,
154
+ iosTarget?: string,
155
+ ): NativeAppIdentity | null {
156
+ if (!canExtractNativeAppIdentity(platform)) return null
157
+ const iosRoot = path.join(projectRoot, 'ios')
158
+ if (!fs.existsSync(iosRoot)) return null
159
+ const projects = fs
160
+ .readdirSync(iosRoot, { withFileTypes: true })
161
+ .filter((entry) => entry.isDirectory() && entry.name.endsWith('.xcodeproj'))
162
+ if (projects.length === 0) return null
163
+ if (projects.length > 1 && !iosTarget) {
164
+ throw new Error('native app identity requires a selected Xcode project')
165
+ }
166
+ let project = projects[0]!
167
+ if (iosTarget && projects.length > 1) {
168
+ const matches = projects.filter((entry) =>
169
+ listXcodeAppTargets(path.join(iosRoot, entry.name)).includes(iosTarget),
170
+ )
171
+ if (matches.length === 0) {
172
+ throw new Error(`native app identity has no application target ${iosTarget}`)
173
+ }
174
+ if (matches.length > 1) {
175
+ throw new Error(
176
+ `native app identity target ${iosTarget} is ambiguous across ${matches.map((entry) => entry.name).join(', ')}`,
177
+ )
178
+ }
179
+ project = matches[0]!
180
+ }
181
+ const xcodeproj = path.join(iosRoot, project.name)
182
+ const appTargets = listXcodeAppTargets(xcodeproj)
183
+ if (!iosTarget && appTargets.length > 1) {
184
+ throw new Error('native app identity requires a selected app target')
185
+ }
186
+ const app = readXcodeAppTarget(xcodeproj, iosTarget ?? appTargets[0], 'Release', {
187
+ requireSources: false,
188
+ })
189
+ return readNativeAppIdentityFromXcodeTarget(app, parseInfoPlist)
190
+ }