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,4 +1,96 @@
1
- /*! rnx v0.1.939 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! peach v0.1.1399 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
+
3
+ // src/openstep-plist.ts
4
+ function parseOpenStepPlist(text) {
5
+ let i = 0;
6
+ const fail = (message) => {
7
+ const line = text.slice(0, i).split("\n").length;
8
+ throw new Error(`project.pbxproj line ${line}: ${message}`);
9
+ };
10
+ const skip = () => {
11
+ for (; ; ) {
12
+ const ch = text[i];
13
+ if (ch === " " || ch === " " || ch === "\n" || ch === "\r") i++;
14
+ else if (ch === "/" && text[i + 1] === "*") {
15
+ const end = text.indexOf("*/", i + 2);
16
+ if (end < 0) fail("unterminated comment");
17
+ i = end + 2;
18
+ } else if (ch === "/" && text[i + 1] === "/") {
19
+ const end = text.indexOf("\n", i);
20
+ i = end < 0 ? text.length : end + 1;
21
+ } else return;
22
+ }
23
+ };
24
+ const quoted = () => {
25
+ i++;
26
+ let out = "";
27
+ for (; ; ) {
28
+ const ch = text[i++];
29
+ if (ch === void 0) fail("unterminated string");
30
+ if (ch === '"') return out;
31
+ if (ch !== "\\") {
32
+ out += ch;
33
+ continue;
34
+ }
35
+ const next = text[i++];
36
+ if (next === "n") out += "\n";
37
+ else if (next === "t") out += " ";
38
+ else if (next === "r") out += "\r";
39
+ else if (next === "U") {
40
+ out += String.fromCharCode(parseInt(text.slice(i, i + 4), 16));
41
+ i += 4;
42
+ } else out += next;
43
+ }
44
+ };
45
+ const value = () => {
46
+ skip();
47
+ const ch = text[i];
48
+ if (ch === "{") {
49
+ i++;
50
+ const dict = {};
51
+ for (; ; ) {
52
+ skip();
53
+ if (text[i] === "}") {
54
+ i++;
55
+ return dict;
56
+ }
57
+ const key = value();
58
+ if (typeof key !== "string") fail("dictionary key is not a string");
59
+ skip();
60
+ if (text[i++] !== "=") fail("expected =");
61
+ if (Object.hasOwn(dict, key)) fail(`duplicate key ${key}`);
62
+ dict[key] = value();
63
+ skip();
64
+ if (text[i++] !== ";") fail("expected ;");
65
+ }
66
+ }
67
+ if (ch === "(") {
68
+ i++;
69
+ const list = [];
70
+ for (; ; ) {
71
+ skip();
72
+ if (text[i] === ")") {
73
+ i++;
74
+ return list;
75
+ }
76
+ list.push(value());
77
+ skip();
78
+ if (text[i] === ",") i++;
79
+ else if (text[i] !== ")") fail("expected , or )");
80
+ }
81
+ }
82
+ if (ch === '"') return quoted();
83
+ const start = i;
84
+ while (i < text.length && /[A-Za-z0-9_$+/:.\-<>]/.test(text[i])) i++;
85
+ if (i === start) fail(`unexpected ${JSON.stringify(ch ?? "end of file")}`);
86
+ return text.slice(start, i);
87
+ };
88
+ if (text.startsWith("// !$*UTF8*$!")) i = text.indexOf("\n") + 1;
89
+ const root = value();
90
+ skip();
91
+ if (i !== text.length) fail("trailing content");
92
+ return root;
93
+ }
2
94
 
3
95
  // src/native-app-identity.ts
4
96
  var NATIVE_APP_IDENTITY_PREFIX = "globalThis.__sootsimNativeAppIdentity=";
@@ -12,13 +104,40 @@ function nonEmptyString(value) {
12
104
  }
13
105
  function isNativeAppIdentity(value) {
14
106
  if (!isRecord(value)) return false;
107
+ const oneUpdates = value.oneUpdates;
108
+ if (oneUpdates !== void 0 && (!isRecord(oneUpdates) || typeof oneUpdates.enabled !== "boolean" || oneUpdates.url !== null && typeof oneUpdates.url !== "string" || oneUpdates.runtimeVersion !== null && typeof oneUpdates.runtimeVersion !== "string" || oneUpdates.embeddedManifestJson !== null && typeof oneUpdates.embeddedManifestJson !== "string" || oneUpdates.enabled && (typeof oneUpdates.url !== "string" || oneUpdates.url.length === 0 || typeof oneUpdates.runtimeVersion !== "string" || oneUpdates.runtimeVersion.length === 0))) {
109
+ return false;
110
+ }
15
111
  const descriptions = value.permissionUsageDescriptions;
16
112
  if (descriptions !== void 0 && !isRecord(descriptions)) return false;
17
113
  if (value.urlQuerySchemes !== void 0 && !Array.isArray(value.urlQuerySchemes))
18
114
  return false;
19
115
  if (value.appIntentIdentifiers !== void 0 && (!Array.isArray(value.appIntentIdentifiers) || !value.appIntentIdentifiers.every((identifier) => typeof identifier === "string")))
20
116
  return false;
117
+ if (value.backgroundTaskIdentifiers !== void 0 && (!Array.isArray(value.backgroundTaskIdentifiers) || !value.backgroundTaskIdentifiers.every(
118
+ (identifier) => typeof identifier === "string"
119
+ )))
120
+ return false;
121
+ if (value.backgroundModes !== void 0 && (!Array.isArray(value.backgroundModes) || !value.backgroundModes.every((mode) => typeof mode === "string")))
122
+ return false;
123
+ if (value.shareIntoAppGroupId !== void 0 && typeof value.shareIntoAppGroupId !== "string")
124
+ return false;
125
+ if (value.applicationDisplayName !== void 0 && typeof value.applicationDisplayName !== "string")
126
+ return false;
127
+ if (value.rootViewBackgroundColor !== void 0 && (typeof value.rootViewBackgroundColor !== "number" || !Number.isInteger(value.rootViewBackgroundColor)))
128
+ return false;
129
+ for (const orientations of [
130
+ value.supportedInterfaceOrientations,
131
+ value.ipadSupportedInterfaceOrientations
132
+ ]) {
133
+ if (orientations !== void 0 && (!Array.isArray(orientations) || !orientations.every((orientation) => typeof orientation === "string")))
134
+ return false;
135
+ }
136
+ if (value.defaultScreenOrientationMask !== void 0 && typeof value.defaultScreenOrientationMask !== "string")
137
+ return false;
21
138
  const platform = value.platform;
139
+ if (value.alternateIconNames !== void 0 && (!Array.isArray(value.alternateIconNames) || !value.alternateIconNames.every((name) => typeof name === "string")))
140
+ return false;
22
141
  if (platform !== "ios" && platform !== "android") return false;
23
142
  const applicationName = value.applicationName;
24
143
  if (applicationName !== null && nonEmptyString(applicationName) === null) return false;
@@ -38,16 +157,39 @@ function readNativeAppIdentity(value) {
38
157
  }
39
158
  return {
40
159
  applicationName: value.applicationName,
160
+ ...value.applicationDisplayName === void 0 ? {} : { applicationDisplayName: value.applicationDisplayName },
161
+ ...value.rootViewBackgroundColor === void 0 ? {} : { rootViewBackgroundColor: value.rootViewBackgroundColor },
41
162
  ...value.bundleName === void 0 ? {} : { bundleName: value.bundleName },
42
163
  appVersion: value.appVersion,
43
164
  buildVersion: value.buildVersion,
44
165
  bundleIdentifier: value.bundleIdentifier,
45
166
  platform: value.platform,
167
+ ...value.alternateIconNames === void 0 ? {} : { alternateIconNames: [...value.alternateIconNames] },
46
168
  ...value.permissionUsageDescriptions === void 0 ? {} : {
47
169
  permissionUsageDescriptions: { ...value.permissionUsageDescriptions }
48
170
  },
49
171
  ...value.appIntentIdentifiers === void 0 ? {} : { appIntentIdentifiers: [...value.appIntentIdentifiers] },
50
- ...value.urlQuerySchemes === void 0 ? {} : { urlQuerySchemes: [...value.urlQuerySchemes] }
172
+ ...value.backgroundTaskIdentifiers === void 0 ? {} : { backgroundTaskIdentifiers: [...value.backgroundTaskIdentifiers] },
173
+ ...value.supportedInterfaceOrientations === void 0 ? {} : {
174
+ supportedInterfaceOrientations: [...value.supportedInterfaceOrientations]
175
+ },
176
+ ...value.ipadSupportedInterfaceOrientations === void 0 ? {} : {
177
+ ipadSupportedInterfaceOrientations: [
178
+ ...value.ipadSupportedInterfaceOrientations
179
+ ]
180
+ },
181
+ ...value.defaultScreenOrientationMask === void 0 ? {} : { defaultScreenOrientationMask: value.defaultScreenOrientationMask },
182
+ ...value.backgroundModes === void 0 ? {} : { backgroundModes: [...value.backgroundModes] },
183
+ ...value.shareIntoAppGroupId === void 0 ? {} : { shareIntoAppGroupId: value.shareIntoAppGroupId },
184
+ ...value.urlQuerySchemes === void 0 ? {} : { urlQuerySchemes: [...value.urlQuerySchemes] },
185
+ ...value.oneUpdates === void 0 ? {} : {
186
+ oneUpdates: {
187
+ enabled: value.oneUpdates.enabled,
188
+ url: value.oneUpdates.url,
189
+ runtimeVersion: value.oneUpdates.runtimeVersion,
190
+ embeddedManifestJson: value.oneUpdates.embeddedManifestJson
191
+ }
192
+ }
51
193
  };
52
194
  }
53
195
  function createNativeAppIdentityHeader(identity) {
@@ -75,7 +217,10 @@ function readNativeAppIdentityFromBundle(source, header) {
75
217
  }
76
218
  const identity = readNativeAppIdentity(value);
77
219
  if (!identity) throw new Error("native app identity response header is malformed");
78
- if (footer && !equalIdentityValues(identity, readNativeAppIdentity(footer))) {
220
+ const footerIdentity = footer ? readNativeAppIdentity(footer) : null;
221
+ const headerBase = { ...identity, oneUpdates: void 0 };
222
+ const footerBase = footerIdentity && { ...footerIdentity, oneUpdates: void 0 };
223
+ if (footerIdentity && !equalIdentityValues(headerBase, footerBase)) {
79
224
  throw new Error("native app identity response header conflicts with bundle footer");
80
225
  }
81
226
  return identity;
@@ -90,7 +235,9 @@ function getAppliedNativeAppIdentity() {
90
235
  return isNativeAppIdentity(value) ? value : null;
91
236
  }
92
237
  function createNativeAppIdentityFooter(identity) {
93
- const payload = JSON.stringify(identity).replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029").replace(/<\//g, "<\\/");
238
+ const footerIdentity = { ...identity };
239
+ delete footerIdentity.oneUpdates;
240
+ const payload = JSON.stringify(footerIdentity).replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029").replace(/<\//g, "<\\/");
94
241
  return `
95
242
  ${NATIVE_APP_IDENTITY_PREFIX}${payload};`;
96
243
  }
@@ -115,6 +262,9 @@ function readNativeAppIdentityFooter(source) {
115
262
  if (!isNativeAppIdentity(parsed)) {
116
263
  throw new Error("native app identity footer is malformed");
117
264
  }
265
+ if (parsed.oneUpdates !== void 0) {
266
+ throw new Error("native app identity footer cannot contain one updates receipt");
267
+ }
118
268
  return parsed;
119
269
  }
120
270
  function detachNativeAppIdentityFooter(source) {
@@ -218,30 +368,119 @@ function appTargetReleaseSettings(pbxproj, targetName, infoPlistRelativePath) {
218
368
  (candidate) => candidate.name === "Release" && named(candidate.settings)
219
369
  )?.settings ?? null;
220
370
  }
221
- function nativeAppIdentityFromIos(files, parseInfoPlist) {
371
+ function nativeAppIdentityFromIos(files, parseInfoPlist, iosTarget) {
222
372
  const pbxprojPath = Object.keys(files).find(
223
373
  (path) => /(?:^|\/)ios\/[^/]+\.xcodeproj\/project\.pbxproj$/.test(path)
224
- );
374
+ ) ?? Object.keys(files).find(
375
+ (path) => /(?:^|\/)[^/]+\.xcodeproj\/project\.pbxproj$/.test(path)
376
+ ) ?? Object.keys(files).find((path) => /(?:^|\/)project\.pbxproj$/.test(path));
225
377
  if (!pbxprojPath) return null;
226
378
  const pbxproj = files[pbxprojPath];
227
- const applicationTargets = new Set(
228
- [
229
- ...pbxproj.matchAll(
230
- /isa = PBXNativeTarget;[^}]*?name = "?([^";]+)"?;[^}]*?productType = "com\.apple\.product-type\.application";/g
231
- )
232
- ].map((match) => match[1])
379
+ let objects = {};
380
+ try {
381
+ const parsed = parseOpenStepPlist(pbxproj);
382
+ if (isRecord(parsed)) {
383
+ objects = isRecord(parsed.objects) ? parsed.objects : parsed;
384
+ }
385
+ } catch {
386
+ }
387
+ const targets = [];
388
+ for (const [id, obj] of Object.entries(objects)) {
389
+ if (isRecord(obj) && obj.isa === "PBXNativeTarget" && typeof obj.name === "string") {
390
+ targets.push({
391
+ id,
392
+ name: obj.name,
393
+ productType: typeof obj.productType === "string" ? obj.productType : void 0,
394
+ buildConfigurationList: typeof obj.buildConfigurationList === "string" ? obj.buildConfigurationList : void 0
395
+ });
396
+ }
397
+ }
398
+ const applicationTargetNames = new Set(
399
+ targets.filter((t) => t.productType === "com.apple.product-type.application").map((t) => t.name)
233
400
  );
234
- const appDelegatePattern = /(?:^|\/)ios\/([^/]+)\/AppDelegate\.(?:swift|mm|m)$/;
235
- const targetName = Object.keys(files).filter((path) => !path.includes("/Pods/")).map((path) => path.match(appDelegatePattern)?.[1]).find((name) => name !== void 0 && applicationTargets.has(name)) ?? null;
236
- if (!targetName) return null;
237
- const plist = files[`ios/${targetName}/Info.plist`];
401
+ if (applicationTargetNames.size === 0) {
402
+ for (const match of pbxproj.matchAll(
403
+ /isa = PBXNativeTarget;[^}]*?name = "?([^";]+)"?;[^}]*?productType = "com\.apple\.product-type\.application";/g
404
+ )) {
405
+ applicationTargetNames.add(match[1]);
406
+ }
407
+ }
408
+ let targetName = null;
409
+ if (iosTarget) {
410
+ if (applicationTargetNames.has(iosTarget)) {
411
+ targetName = iosTarget;
412
+ } else {
413
+ return null;
414
+ }
415
+ } else if (applicationTargetNames.size === 1) {
416
+ targetName = [...applicationTargetNames][0];
417
+ } else if (applicationTargetNames.size > 1) {
418
+ const appDelegatePattern = /(?:^|\/)ios\/([^/]+)\/AppDelegate\.(?:swift|mm|m)$/;
419
+ const delegateTargets = Object.keys(files).filter((path) => !path.includes("/Pods/")).map((path) => path.match(appDelegatePattern)?.[1]).filter(
420
+ (name) => typeof name === "string" && applicationTargetNames.has(name)
421
+ );
422
+ if (delegateTargets.length === 1) {
423
+ targetName = delegateTargets[0];
424
+ } else {
425
+ return null;
426
+ }
427
+ } else {
428
+ return null;
429
+ }
430
+ const selectedTarget = targets.find((t) => t.name === targetName);
431
+ const settings = {
432
+ TARGET_NAME: targetName,
433
+ PRODUCT_NAME: targetName
434
+ };
435
+ for (const obj of Object.values(objects)) {
436
+ if (isRecord(obj) && obj.isa === "PBXProject" && typeof obj.buildConfigurationList === "string") {
437
+ const listObj = objects[obj.buildConfigurationList];
438
+ if (isRecord(listObj) && Array.isArray(listObj.buildConfigurations)) {
439
+ for (const configId of listObj.buildConfigurations) {
440
+ if (typeof configId === "string") {
441
+ const configObj = objects[configId];
442
+ if (isRecord(configObj) && configObj.name === "Release" && isRecord(configObj.buildSettings)) {
443
+ for (const [k, v] of Object.entries(configObj.buildSettings)) {
444
+ if (typeof v === "string") settings[k] = v;
445
+ }
446
+ }
447
+ }
448
+ }
449
+ }
450
+ }
451
+ }
452
+ if (selectedTarget?.buildConfigurationList) {
453
+ const listObj = objects[selectedTarget.buildConfigurationList];
454
+ if (isRecord(listObj) && Array.isArray(listObj.buildConfigurations)) {
455
+ for (const configId of listObj.buildConfigurations) {
456
+ if (typeof configId === "string") {
457
+ const configObj = objects[configId];
458
+ if (isRecord(configObj) && configObj.name === "Release" && isRecord(configObj.buildSettings)) {
459
+ for (const [k, v] of Object.entries(configObj.buildSettings)) {
460
+ if (typeof v === "string") settings[k] = v;
461
+ }
462
+ }
463
+ }
464
+ }
465
+ }
466
+ } else {
467
+ const legacy = appTargetReleaseSettings(
468
+ pbxproj,
469
+ targetName,
470
+ `${targetName}/Info.plist`
471
+ );
472
+ if (legacy) Object.assign(settings, legacy);
473
+ }
474
+ let plist;
475
+ const infoPlistPath = settings.INFOPLIST_FILE;
476
+ if (infoPlistPath) {
477
+ const normalized = infoPlistPath.replace(/^"|"$/g, "");
478
+ plist = files[`ios/${normalized}`] ?? files[normalized] ?? Object.entries(files).find(([k]) => k.endsWith(`/${normalized}`))?.[1];
479
+ }
480
+ if (!plist) {
481
+ plist = files[`ios/${targetName}/Info.plist`] ?? files[`${targetName}/Info.plist`] ?? Object.entries(files).find(([k]) => k.endsWith(`/${targetName}/Info.plist`))?.[1];
482
+ }
238
483
  if (!plist) return null;
239
- const settings = appTargetReleaseSettings(
240
- pbxproj,
241
- targetName,
242
- `${targetName}/Info.plist`
243
- );
244
- if (!settings) return null;
245
484
  const bundleIdentifier = identityFieldFrom(
246
485
  settings,
247
486
  plistString(plist, "CFBundleIdentifier"),
@@ -268,8 +507,57 @@ function nativeAppIdentityFromIos(files, parseInfoPlist) {
268
507
  const applicationName = identityFieldFrom(settings, plistString(plist, "CFBundleDisplayName"), void 0) ?? bundleName;
269
508
  const dictionary = parseInfoPlist(plist);
270
509
  if (!isRecord(dictionary)) throw new Error("native app Info.plist is not a dictionary");
510
+ const declaredDisplayName = dictionary.CFBundleDisplayName;
511
+ const applicationDisplayName = typeof declaredDisplayName === "string" ? resolveBuildSetting(declaredDisplayName, settings) : void 0;
512
+ if (applicationDisplayName === null)
513
+ throw new Error("native app Info.plist CFBundleDisplayName is unresolved");
514
+ const declaredBackgroundColor = dictionary.RCTRootViewBackgroundColor;
515
+ const rootViewBackgroundColor = typeof declaredBackgroundColor === "number" && Number.isInteger(declaredBackgroundColor) ? declaredBackgroundColor : void 0;
516
+ const icons = dictionary.CFBundleIcons;
517
+ const alternates = isRecord(icons) ? icons.CFBundleAlternateIcons : void 0;
518
+ const alternateIconNames = /* @__PURE__ */ new Set();
519
+ for (const name of isRecord(alternates) ? Object.keys(alternates) : []) {
520
+ const resolved = resolveBuildSetting(name, settings);
521
+ if (resolved === null) throw new Error("native alternate icon name is unresolved");
522
+ alternateIconNames.add(resolved);
523
+ }
524
+ const alternateSetting = resolveBuildSetting(
525
+ settings.ASSETCATALOG_COMPILER_ALTERNATE_APPICON_NAMES ?? "",
526
+ settings
527
+ );
528
+ if (alternateSetting === null)
529
+ throw new Error("native alternate icon setting is unresolved");
530
+ for (const match of alternateSetting.replace(/\\"/g, '"').matchAll(/"([^"]*)"|([^\s(),]+)/g)) {
531
+ alternateIconNames.add(match[1] ?? match[2]);
532
+ }
271
533
  const intentIds = dictionary.OneAppIntentIdentifiers;
272
534
  const appIntentIdentifiers = Array.isArray(intentIds) && intentIds.every((value) => typeof value === "string") ? intentIds.map((value) => resolveBuildSetting(value, settings)) : [];
535
+ const backgroundIds = dictionary.BGTaskSchedulerPermittedIdentifiers;
536
+ const backgroundTaskIdentifiers = Array.isArray(backgroundIds) && backgroundIds.every((value) => typeof value === "string") ? backgroundIds.map((value) => resolveBuildSetting(value, settings)) : [];
537
+ const declaredModes = dictionary.UIBackgroundModes;
538
+ const backgroundModes = Array.isArray(declaredModes) && declaredModes.every((value) => typeof value === "string") ? declaredModes.map((value) => resolveBuildSetting(value, settings)) : [];
539
+ const screenOrientationLists = [
540
+ "UISupportedInterfaceOrientations",
541
+ "UISupportedInterfaceOrientations~ipad"
542
+ ].map((key) => {
543
+ const list = dictionary[key];
544
+ if (!Array.isArray(list) || !list.every((value) => typeof value === "string"))
545
+ return [];
546
+ return list.map((value) => {
547
+ const resolved = resolveBuildSetting(value, settings);
548
+ if (resolved === null) throw new Error(`native app Info.plist ${key} is unresolved`);
549
+ return resolved;
550
+ });
551
+ });
552
+ const [supportedInterfaceOrientations, ipadSupportedInterfaceOrientations] = screenOrientationLists;
553
+ const declaredDefaultOrientationMask = dictionary.EXDefaultScreenOrientationMask;
554
+ const defaultScreenOrientationMask = typeof declaredDefaultOrientationMask === "string" ? resolveBuildSetting(declaredDefaultOrientationMask, settings) : void 0;
555
+ if (defaultScreenOrientationMask === null)
556
+ throw new Error("native app Info.plist EXDefaultScreenOrientationMask is unresolved");
557
+ const declaredShareGroup = dictionary.ExpoShareIntoAppGroupId;
558
+ const shareIntoAppGroupId = typeof declaredShareGroup === "string" ? resolveBuildSetting(declaredShareGroup, settings) : void 0;
559
+ if (shareIntoAppGroupId === null)
560
+ throw new Error("native app Info.plist ExpoShareIntoAppGroupId is unresolved");
273
561
  const querySchemes = dictionary.LSApplicationQueriesSchemes;
274
562
  if (querySchemes !== void 0 && !Array.isArray(querySchemes)) {
275
563
  throw new Error("native app Info.plist LSApplicationQueriesSchemes is not an array");
@@ -283,7 +571,8 @@ function nativeAppIdentityFromIos(files, parseInfoPlist) {
283
571
  });
284
572
  const permissionUsageDescriptions = {};
285
573
  for (const [key, value] of Object.entries(dictionary)) {
286
- if (!/^NS.*UsageDescription$/.test(key)) continue;
574
+ if (!/^NS.*UsageDescription$/.test(key) && key !== "NSLocationTemporaryUsageDescriptionDictionary")
575
+ continue;
287
576
  if (typeof value !== "string") {
288
577
  permissionUsageDescriptions[key] = value;
289
578
  continue;
@@ -304,21 +593,30 @@ function nativeAppIdentityFromIos(files, parseInfoPlist) {
304
593
  }
305
594
  return {
306
595
  applicationName,
596
+ ...applicationDisplayName === void 0 ? {} : { applicationDisplayName },
597
+ ...rootViewBackgroundColor === void 0 ? {} : { rootViewBackgroundColor },
307
598
  bundleName,
308
599
  appVersion,
309
600
  buildVersion,
310
601
  bundleIdentifier,
311
602
  platform: "ios",
603
+ supportedInterfaceOrientations,
604
+ ipadSupportedInterfaceOrientations,
605
+ ...defaultScreenOrientationMask === void 0 ? {} : { defaultScreenOrientationMask },
606
+ alternateIconNames: [...alternateIconNames],
312
607
  permissionUsageDescriptions,
313
608
  urlQuerySchemes,
609
+ ...shareIntoAppGroupId === void 0 ? {} : { shareIntoAppGroupId },
610
+ backgroundTaskIdentifiers: backgroundTaskIdentifiers.every((value) => value !== null) ? backgroundTaskIdentifiers : [],
611
+ backgroundModes: backgroundModes.every((value) => value !== null) ? backgroundModes : [],
314
612
  appIntentIdentifiers: appIntentIdentifiers.every((value) => value !== null) ? appIntentIdentifiers : []
315
613
  };
316
614
  }
317
615
  function canExtractNativeAppIdentity(platform) {
318
616
  return platform === "ios";
319
617
  }
320
- function extractNativeAppIdentityFromFiles(files, platform, parseInfoPlist) {
321
- return canExtractNativeAppIdentity(platform) ? nativeAppIdentityFromIos(files, parseInfoPlist) : null;
618
+ function extractNativeAppIdentityFromFiles(files, platform, parseInfoPlist, iosTarget) {
619
+ return canExtractNativeAppIdentity(platform) ? nativeAppIdentityFromIos(files, parseInfoPlist, iosTarget) : null;
322
620
  }
323
621
  export {
324
622
  NATIVE_APP_IDENTITY_HEADER,
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.939 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! peach v0.1.1399 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.939 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! peach v0.1.1399 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
 
3
3
  // src/native-firebase-metadata.ts
4
4
  var PREFIX = "globalThis.__peachNativeFirebaseConfig=";
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.939 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! peach v0.1.1399 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.939 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! peach v0.1.1399 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
 
3
3
  // src/plist.ts
4
4
  import plist from "plist";
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.939 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! peach v0.1.1399 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.939 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! peach v0.1.1399 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.939 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! peach v0.1.1399 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -27,6 +27,10 @@ __export(react_native_host_modules_exports, {
27
27
  });
28
28
  module.exports = __toCommonJS(react_native_host_modules_exports);
29
29
  var REACT_NATIVE_PASSTHROUGH_SPECIFIERS = [
30
+ // sdk 58 reads these upstream getters and wraps the original metro logger.
31
+ "react-native/unstable-internals-do-not-use",
32
+ "react-native/src/unstable-internals-do-not-use",
33
+ "react-native/Libraries/Utilities/HMRClient",
30
34
  "react-native/Libraries/vendor/emitter",
31
35
  "react-native/Libraries/Components/View/ReactNativeStyleAttributes",
32
36
  "react-native/Libraries/StyleSheet",
@@ -1,7 +1,11 @@
1
- /*! rnx v0.1.939 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! peach v0.1.1399 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
 
3
3
  // src/react-native-host-modules.ts
4
4
  var REACT_NATIVE_PASSTHROUGH_SPECIFIERS = [
5
+ // sdk 58 reads these upstream getters and wraps the original metro logger.
6
+ "react-native/unstable-internals-do-not-use",
7
+ "react-native/src/unstable-internals-do-not-use",
8
+ "react-native/Libraries/Utilities/HMRClient",
5
9
  "react-native/Libraries/vendor/emitter",
6
10
  "react-native/Libraries/Components/View/ReactNativeStyleAttributes",
7
11
  "react-native/Libraries/StyleSheet",