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,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;
@@ -24,9 +24,14 @@ var swift_package_exports = {};
24
24
  __export(swift_package_exports, {
25
25
  isSwiftManifestFile: () => isSwiftManifestFile,
26
26
  swiftImplicitResourcePaths: () => swiftImplicitResourcePaths,
27
+ swiftManifestCxxLanguageStandard: () => swiftManifestCxxLanguageStandard,
27
28
  swiftManifestTargets: () => swiftManifestTargets,
29
+ swiftMetalSourceFiles: () => swiftMetalSourceFiles,
28
30
  swiftPackageIdentity: () => swiftPackageIdentity,
29
- swiftPackagePartition: () => swiftPackagePartition
31
+ swiftPackagePartition: () => swiftPackagePartition,
32
+ swiftResourceBundleForFile: () => swiftResourceBundleForFile,
33
+ swiftResourceBundleInfoPlist: () => swiftResourceBundleInfoPlist,
34
+ swiftResourceBundles: () => swiftResourceBundles
30
35
  });
31
36
  module.exports = __toCommonJS(swift_package_exports);
32
37
  function isSwiftManifestFile(file) {
@@ -55,7 +60,10 @@ var MANIFEST_DECLARATIONS = [
55
60
  function manifestCalls(manifest, kinds) {
56
61
  const code = manifest.replace(/\/\*[\s\S]*?\*\//g, "").replace(/(^|[^:"])\/\/[^\n]*/g, "$1");
57
62
  const calls = [];
58
- const pattern = new RegExp(`\\.(${MANIFEST_DECLARATIONS.join("|")})\\s*\\(`, "g");
63
+ const pattern = new RegExp(
64
+ `(?:\\.(${MANIFEST_DECLARATIONS.join("|")})|\\b(Package))\\s*\\(`,
65
+ "g"
66
+ );
59
67
  let match;
60
68
  while ((match = pattern.exec(code)) !== null) {
61
69
  let depth = 1;
@@ -85,22 +93,59 @@ function manifestCalls(manifest, kinds) {
85
93
  }
86
94
  i++;
87
95
  }
88
- if (kinds.includes(match[1]))
89
- calls.push({ kind: match[1], flat, call: code.slice(start, i) });
96
+ const kind = match[1] ?? match[2];
97
+ if (kinds.includes(kind)) calls.push({ kind, flat, call: code.slice(start, i) });
98
+ else if (kind === "Package") {
99
+ calls.push(...manifestCalls(code.slice(start, i - 1), kinds));
100
+ }
90
101
  pattern.lastIndex = i;
91
102
  }
92
103
  return calls;
93
104
  }
105
+ function splitManifestArguments(source) {
106
+ const arguments_ = [];
107
+ let start = 0;
108
+ let parentheses = 0;
109
+ let brackets = 0;
110
+ let braces = 0;
111
+ let inString = false;
112
+ let escaped = false;
113
+ for (let index = 0; index < source.length; index++) {
114
+ const character = source[index];
115
+ if (inString) {
116
+ if (escaped) escaped = false;
117
+ else if (character === "\\") escaped = true;
118
+ else if (character === '"') inString = false;
119
+ } else if (character === '"') inString = true;
120
+ else if (character === "(") parentheses++;
121
+ else if (character === ")") parentheses--;
122
+ else if (character === "[") brackets++;
123
+ else if (character === "]") brackets--;
124
+ else if (character === "{") braces++;
125
+ else if (character === "}") braces--;
126
+ else if (character === "," && parentheses === 0 && brackets === 0 && braces === 0) {
127
+ arguments_.push(source.slice(start, index).trim());
128
+ start = index + 1;
129
+ }
130
+ }
131
+ const final = source.slice(start).trim();
132
+ if (final) arguments_.push(final);
133
+ return arguments_;
134
+ }
94
135
  function swiftPackageIdentity(url) {
95
136
  return (url.split("/").pop() ?? url).replace(/\.git$/, "").toLowerCase();
96
137
  }
97
138
  function swiftManifestTargets(manifest, resourcePaths = []) {
98
139
  const implicitResources = swiftImplicitResourcePaths(resourcePaths);
99
140
  const targets = [];
100
- for (const { kind, flat, call } of manifestCalls(manifest, [
101
- "executableTarget",
102
- "target"
103
- ])) {
141
+ const declarations = manifestCalls(manifest, ["executableTarget", "target"]);
142
+ const targetNames = new Set(
143
+ declarations.flatMap(({ flat }) => {
144
+ const name = /\bname\s*:\s*"([^"]+)"/.exec(flat)?.[1];
145
+ return name ? [name] : [];
146
+ })
147
+ );
148
+ for (const { kind, flat, call } of declarations) {
104
149
  const executable = kind === "executableTarget";
105
150
  const name = /\bname\s*:\s*"([^"]+)"/.exec(flat)?.[1];
106
151
  if (!name) continue;
@@ -110,6 +155,12 @@ function swiftManifestTargets(manifest, resourcePaths = []) {
110
155
  /\.swiftLanguageMode\(\s*\.v(\d+)\s*\)/.exec(call)?.[1] ?? "5"
111
156
  );
112
157
  const mainActorIsolation = /\.defaultIsolation\(\s*MainActor\.self\s*\)/.test(call);
158
+ const cxxInterop = /\.interoperabilityMode\(\s*\.Cxx\s*\)/.test(
159
+ call.replace(/"(?:\\.|[^"\\])*"/g, "")
160
+ );
161
+ const defines = [
162
+ ...call.matchAll(/\.define\(\s*"([A-Za-z_][A-Za-z0-9_]*)"\s*\)/g)
163
+ ].map((match) => match[1]);
113
164
  const excluded = [
114
165
  ...(/\bexclude\s*:\s*\[([^\]]*)\]/.exec(flat)?.[1] ?? "").matchAll(/"([^"]+)"/g)
115
166
  ].map((match) => match[1].replace(/^\.\//, "").replace(/\/+$/, ""));
@@ -123,26 +174,106 @@ function swiftManifestTargets(manifest, resourcePaths = []) {
123
174
  return false;
124
175
  return true;
125
176
  });
177
+ const targetArguments = splitManifestArguments(call.slice(0, -1));
178
+ const dependencyArgument = targetArguments.find(
179
+ (argument) => /^dependencies\s*:/.test(argument)
180
+ );
181
+ const dependencyList = dependencyArgument?.replace(/^dependencies\s*:\s*/, "").trim();
182
+ const dependencyNames = /* @__PURE__ */ new Set();
183
+ if (dependencyList?.startsWith("[") && dependencyList.endsWith("]")) {
184
+ for (const dependency of splitManifestArguments(dependencyList.slice(1, -1))) {
185
+ const dependencyName = /^"([^"]+)"$/.exec(dependency)?.[1] ?? /^\.(?:target|byName)\s*\(\s*name\s*:\s*"([^"]+)"/.exec(dependency)?.[1];
186
+ if (dependencyName && targetNames.has(dependencyName))
187
+ dependencyNames.add(dependencyName);
188
+ }
189
+ }
190
+ const dependencies = [...dependencyNames].map((name2) => ({
191
+ kind: "target",
192
+ name: name2
193
+ }));
126
194
  targets.push({
127
195
  name,
128
196
  path: targetPath,
129
197
  executable,
130
198
  languageMode,
131
199
  mainActorIsolation,
132
- resources
200
+ ...cxxInterop ? { cxxInterop: true } : {},
201
+ ...defines.length === 0 ? {} : { defines },
202
+ resources,
203
+ ...dependencies.length === 0 ? {} : { dependencies },
204
+ ...excluded.length === 0 ? {} : { exclude: excluded }
133
205
  });
134
206
  }
135
207
  return targets;
136
208
  }
209
+ function swiftManifestCxxLanguageStandard(manifest) {
210
+ const declaration = manifestCalls(manifest, ["Package"])[0];
211
+ if (!declaration) return void 0;
212
+ const code = declaration.flat.replace(/"(?:\\.|[^"\\])*"/g, "");
213
+ return /\bcxxLanguageStandard\s*:\s*\.(\w+)/.exec(code)?.[1];
214
+ }
215
+ function swiftResourceBundles(files, resourcePaths = []) {
216
+ const manifest = files["Package.swift"] ?? "";
217
+ const targets = swiftManifestTargets(manifest, resourcePaths).filter(
218
+ (target) => target.resources
219
+ );
220
+ if (targets.length === 0) return [];
221
+ const declaration = manifestCalls(manifest, ["Package"])[0];
222
+ const packageName = declaration && /\bname\s*:\s*"([^"/\\]+)"/.exec(declaration.flat)?.[1];
223
+ if (!packageName)
224
+ throw new Error("swift resource bundles require the original package name");
225
+ return targets.map((target) => ({
226
+ target: target.name,
227
+ sourcePath: target.path,
228
+ path: `${packageName}_${target.name}.bundle`
229
+ }));
230
+ }
231
+ function swiftResourceBundleForFile(bundles, file) {
232
+ let owner;
233
+ for (const bundle of bundles) {
234
+ const prefix = bundle.sourcePath === "." ? "" : `${bundle.sourcePath}/`;
235
+ if (file.startsWith(prefix) && (!owner || bundle.sourcePath.length > owner.sourcePath.length))
236
+ owner = bundle;
237
+ }
238
+ return owner;
239
+ }
240
+ function swiftResourceBundleInfoPlist(bundle) {
241
+ const name = bundle.path.split("/").pop().replace(/\.(bundle|framework)$/, "");
242
+ const escaped = name.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;");
243
+ return `<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><dict><key>CFBundleName</key><string>${escaped}</string><key>CFBundlePackageType</key><string>${bundle.path.endsWith(".framework") ? "FMWK" : "BNDL"}</string></dict></plist>`;
244
+ }
245
+ function swiftMetalSourceFiles(files) {
246
+ const sources = Object.entries(files).filter(([file]) => file.endsWith(".metal"));
247
+ if (sources.length === 0) return {};
248
+ const targets = swiftManifestTargets(files["Package.swift"] ?? "");
249
+ return Object.fromEntries(
250
+ sources.filter(([file]) => {
251
+ if (targets.length === 0) return true;
252
+ return targets.some((target) => {
253
+ const prefix = target.path === "." ? "" : `${target.path}/`;
254
+ if (!file.startsWith(prefix)) return false;
255
+ const relative = file.slice(prefix.length);
256
+ return !(target.exclude ?? []).some(
257
+ (excluded) => relative === excluded || relative.startsWith(`${excluded}/`)
258
+ );
259
+ });
260
+ })
261
+ );
262
+ }
137
263
  function swiftPackagePartition(manifest, resourcePaths = []) {
138
264
  const targets = swiftManifestTargets(manifest, resourcePaths);
139
- return targets.length === 1 && targets[0].executable && targets[0].path === "." ? [] : targets;
265
+ return targets.length === 1 && targets[0].executable && targets[0].path === "." && targets[0].languageMode === 5 && !targets[0].mainActorIsolation && !targets[0].defines?.length && !targets[0].cxxInterop && !swiftManifestCxxLanguageStandard(manifest) ? [] : targets;
140
266
  }
141
267
  // Annotate the CommonJS export names for ESM import in node:
142
268
  0 && (module.exports = {
143
269
  isSwiftManifestFile,
144
270
  swiftImplicitResourcePaths,
271
+ swiftManifestCxxLanguageStandard,
145
272
  swiftManifestTargets,
273
+ swiftMetalSourceFiles,
146
274
  swiftPackageIdentity,
147
- swiftPackagePartition
275
+ swiftPackagePartition,
276
+ swiftResourceBundleForFile,
277
+ swiftResourceBundleInfoPlist,
278
+ swiftResourceBundles
148
279
  });
@@ -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/swift-package.ts
4
4
  function isSwiftManifestFile(file) {
@@ -27,7 +27,10 @@ var MANIFEST_DECLARATIONS = [
27
27
  function manifestCalls(manifest, kinds) {
28
28
  const code = manifest.replace(/\/\*[\s\S]*?\*\//g, "").replace(/(^|[^:"])\/\/[^\n]*/g, "$1");
29
29
  const calls = [];
30
- const pattern = new RegExp(`\\.(${MANIFEST_DECLARATIONS.join("|")})\\s*\\(`, "g");
30
+ const pattern = new RegExp(
31
+ `(?:\\.(${MANIFEST_DECLARATIONS.join("|")})|\\b(Package))\\s*\\(`,
32
+ "g"
33
+ );
31
34
  let match;
32
35
  while ((match = pattern.exec(code)) !== null) {
33
36
  let depth = 1;
@@ -57,22 +60,59 @@ function manifestCalls(manifest, kinds) {
57
60
  }
58
61
  i++;
59
62
  }
60
- if (kinds.includes(match[1]))
61
- calls.push({ kind: match[1], flat, call: code.slice(start, i) });
63
+ const kind = match[1] ?? match[2];
64
+ if (kinds.includes(kind)) calls.push({ kind, flat, call: code.slice(start, i) });
65
+ else if (kind === "Package") {
66
+ calls.push(...manifestCalls(code.slice(start, i - 1), kinds));
67
+ }
62
68
  pattern.lastIndex = i;
63
69
  }
64
70
  return calls;
65
71
  }
72
+ function splitManifestArguments(source) {
73
+ const arguments_ = [];
74
+ let start = 0;
75
+ let parentheses = 0;
76
+ let brackets = 0;
77
+ let braces = 0;
78
+ let inString = false;
79
+ let escaped = false;
80
+ for (let index = 0; index < source.length; index++) {
81
+ const character = source[index];
82
+ if (inString) {
83
+ if (escaped) escaped = false;
84
+ else if (character === "\\") escaped = true;
85
+ else if (character === '"') inString = false;
86
+ } else if (character === '"') inString = true;
87
+ else if (character === "(") parentheses++;
88
+ else if (character === ")") parentheses--;
89
+ else if (character === "[") brackets++;
90
+ else if (character === "]") brackets--;
91
+ else if (character === "{") braces++;
92
+ else if (character === "}") braces--;
93
+ else if (character === "," && parentheses === 0 && brackets === 0 && braces === 0) {
94
+ arguments_.push(source.slice(start, index).trim());
95
+ start = index + 1;
96
+ }
97
+ }
98
+ const final = source.slice(start).trim();
99
+ if (final) arguments_.push(final);
100
+ return arguments_;
101
+ }
66
102
  function swiftPackageIdentity(url) {
67
103
  return (url.split("/").pop() ?? url).replace(/\.git$/, "").toLowerCase();
68
104
  }
69
105
  function swiftManifestTargets(manifest, resourcePaths = []) {
70
106
  const implicitResources = swiftImplicitResourcePaths(resourcePaths);
71
107
  const targets = [];
72
- for (const { kind, flat, call } of manifestCalls(manifest, [
73
- "executableTarget",
74
- "target"
75
- ])) {
108
+ const declarations = manifestCalls(manifest, ["executableTarget", "target"]);
109
+ const targetNames = new Set(
110
+ declarations.flatMap(({ flat }) => {
111
+ const name = /\bname\s*:\s*"([^"]+)"/.exec(flat)?.[1];
112
+ return name ? [name] : [];
113
+ })
114
+ );
115
+ for (const { kind, flat, call } of declarations) {
76
116
  const executable = kind === "executableTarget";
77
117
  const name = /\bname\s*:\s*"([^"]+)"/.exec(flat)?.[1];
78
118
  if (!name) continue;
@@ -82,6 +122,12 @@ function swiftManifestTargets(manifest, resourcePaths = []) {
82
122
  /\.swiftLanguageMode\(\s*\.v(\d+)\s*\)/.exec(call)?.[1] ?? "5"
83
123
  );
84
124
  const mainActorIsolation = /\.defaultIsolation\(\s*MainActor\.self\s*\)/.test(call);
125
+ const cxxInterop = /\.interoperabilityMode\(\s*\.Cxx\s*\)/.test(
126
+ call.replace(/"(?:\\.|[^"\\])*"/g, "")
127
+ );
128
+ const defines = [
129
+ ...call.matchAll(/\.define\(\s*"([A-Za-z_][A-Za-z0-9_]*)"\s*\)/g)
130
+ ].map((match) => match[1]);
85
131
  const excluded = [
86
132
  ...(/\bexclude\s*:\s*\[([^\]]*)\]/.exec(flat)?.[1] ?? "").matchAll(/"([^"]+)"/g)
87
133
  ].map((match) => match[1].replace(/^\.\//, "").replace(/\/+$/, ""));
@@ -95,25 +141,105 @@ function swiftManifestTargets(manifest, resourcePaths = []) {
95
141
  return false;
96
142
  return true;
97
143
  });
144
+ const targetArguments = splitManifestArguments(call.slice(0, -1));
145
+ const dependencyArgument = targetArguments.find(
146
+ (argument) => /^dependencies\s*:/.test(argument)
147
+ );
148
+ const dependencyList = dependencyArgument?.replace(/^dependencies\s*:\s*/, "").trim();
149
+ const dependencyNames = /* @__PURE__ */ new Set();
150
+ if (dependencyList?.startsWith("[") && dependencyList.endsWith("]")) {
151
+ for (const dependency of splitManifestArguments(dependencyList.slice(1, -1))) {
152
+ const dependencyName = /^"([^"]+)"$/.exec(dependency)?.[1] ?? /^\.(?:target|byName)\s*\(\s*name\s*:\s*"([^"]+)"/.exec(dependency)?.[1];
153
+ if (dependencyName && targetNames.has(dependencyName))
154
+ dependencyNames.add(dependencyName);
155
+ }
156
+ }
157
+ const dependencies = [...dependencyNames].map((name2) => ({
158
+ kind: "target",
159
+ name: name2
160
+ }));
98
161
  targets.push({
99
162
  name,
100
163
  path: targetPath,
101
164
  executable,
102
165
  languageMode,
103
166
  mainActorIsolation,
104
- resources
167
+ ...cxxInterop ? { cxxInterop: true } : {},
168
+ ...defines.length === 0 ? {} : { defines },
169
+ resources,
170
+ ...dependencies.length === 0 ? {} : { dependencies },
171
+ ...excluded.length === 0 ? {} : { exclude: excluded }
105
172
  });
106
173
  }
107
174
  return targets;
108
175
  }
176
+ function swiftManifestCxxLanguageStandard(manifest) {
177
+ const declaration = manifestCalls(manifest, ["Package"])[0];
178
+ if (!declaration) return void 0;
179
+ const code = declaration.flat.replace(/"(?:\\.|[^"\\])*"/g, "");
180
+ return /\bcxxLanguageStandard\s*:\s*\.(\w+)/.exec(code)?.[1];
181
+ }
182
+ function swiftResourceBundles(files, resourcePaths = []) {
183
+ const manifest = files["Package.swift"] ?? "";
184
+ const targets = swiftManifestTargets(manifest, resourcePaths).filter(
185
+ (target) => target.resources
186
+ );
187
+ if (targets.length === 0) return [];
188
+ const declaration = manifestCalls(manifest, ["Package"])[0];
189
+ const packageName = declaration && /\bname\s*:\s*"([^"/\\]+)"/.exec(declaration.flat)?.[1];
190
+ if (!packageName)
191
+ throw new Error("swift resource bundles require the original package name");
192
+ return targets.map((target) => ({
193
+ target: target.name,
194
+ sourcePath: target.path,
195
+ path: `${packageName}_${target.name}.bundle`
196
+ }));
197
+ }
198
+ function swiftResourceBundleForFile(bundles, file) {
199
+ let owner;
200
+ for (const bundle of bundles) {
201
+ const prefix = bundle.sourcePath === "." ? "" : `${bundle.sourcePath}/`;
202
+ if (file.startsWith(prefix) && (!owner || bundle.sourcePath.length > owner.sourcePath.length))
203
+ owner = bundle;
204
+ }
205
+ return owner;
206
+ }
207
+ function swiftResourceBundleInfoPlist(bundle) {
208
+ const name = bundle.path.split("/").pop().replace(/\.(bundle|framework)$/, "");
209
+ const escaped = name.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;");
210
+ return `<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><dict><key>CFBundleName</key><string>${escaped}</string><key>CFBundlePackageType</key><string>${bundle.path.endsWith(".framework") ? "FMWK" : "BNDL"}</string></dict></plist>`;
211
+ }
212
+ function swiftMetalSourceFiles(files) {
213
+ const sources = Object.entries(files).filter(([file]) => file.endsWith(".metal"));
214
+ if (sources.length === 0) return {};
215
+ const targets = swiftManifestTargets(files["Package.swift"] ?? "");
216
+ return Object.fromEntries(
217
+ sources.filter(([file]) => {
218
+ if (targets.length === 0) return true;
219
+ return targets.some((target) => {
220
+ const prefix = target.path === "." ? "" : `${target.path}/`;
221
+ if (!file.startsWith(prefix)) return false;
222
+ const relative = file.slice(prefix.length);
223
+ return !(target.exclude ?? []).some(
224
+ (excluded) => relative === excluded || relative.startsWith(`${excluded}/`)
225
+ );
226
+ });
227
+ })
228
+ );
229
+ }
109
230
  function swiftPackagePartition(manifest, resourcePaths = []) {
110
231
  const targets = swiftManifestTargets(manifest, resourcePaths);
111
- return targets.length === 1 && targets[0].executable && targets[0].path === "." ? [] : targets;
232
+ return targets.length === 1 && targets[0].executable && targets[0].path === "." && targets[0].languageMode === 5 && !targets[0].mainActorIsolation && !targets[0].defines?.length && !targets[0].cxxInterop && !swiftManifestCxxLanguageStandard(manifest) ? [] : targets;
112
233
  }
113
234
  export {
114
235
  isSwiftManifestFile,
115
236
  swiftImplicitResourcePaths,
237
+ swiftManifestCxxLanguageStandard,
116
238
  swiftManifestTargets,
239
+ swiftMetalSourceFiles,
117
240
  swiftPackageIdentity,
118
- swiftPackagePartition
241
+ swiftPackagePartition,
242
+ swiftResourceBundleForFile,
243
+ swiftResourceBundleInfoPlist,
244
+ swiftResourceBundles
119
245
  };
@@ -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;
@@ -26,6 +26,9 @@ __export(swift_submit_exports, {
26
26
  MAX_SWIFT_COMPILE_IMAGES: () => MAX_SWIFT_COMPILE_IMAGES,
27
27
  MAX_SWIFT_COMPILE_IMAGE_BYTES: () => MAX_SWIFT_COMPILE_IMAGE_BYTES,
28
28
  MAX_SWIFT_COMPILE_IMAGE_TOTAL_BYTES: () => MAX_SWIFT_COMPILE_IMAGE_TOTAL_BYTES,
29
+ MAX_SWIFT_COMPILE_METAL_BYTES: () => MAX_SWIFT_COMPILE_METAL_BYTES,
30
+ MAX_SWIFT_COMPILE_METAL_FILES: () => MAX_SWIFT_COMPILE_METAL_FILES,
31
+ MAX_SWIFT_COMPILE_METAL_TOTAL_BYTES: () => MAX_SWIFT_COMPILE_METAL_TOTAL_BYTES,
29
32
  MAX_SWIFT_COMPILE_RESOURCES: () => MAX_SWIFT_COMPILE_RESOURCES,
30
33
  MAX_SWIFT_COMPILE_RESOURCE_BYTES: () => MAX_SWIFT_COMPILE_RESOURCE_BYTES,
31
34
  MAX_SWIFT_COMPILE_RESOURCE_TOTAL_BYTES: () => MAX_SWIFT_COMPILE_RESOURCE_TOTAL_BYTES,
@@ -40,6 +43,26 @@ __export(swift_submit_exports, {
40
43
  swiftNativeEntry: () => swiftNativeEntry
41
44
  });
42
45
  module.exports = __toCommonJS(swift_submit_exports);
46
+
47
+ // src/swiftContract.ts
48
+ function isSwiftResourcePath(value) {
49
+ return typeof value === "string" && value.length <= 4096 && !value.startsWith("/") && !value.includes("\\") && !value.includes("\0") && value.split("/").every((part) => part !== "" && part !== "." && part !== "..");
50
+ }
51
+ function isSwiftBundlePath(value) {
52
+ return typeof value === "string" && (value === "." || isSwiftResourcePath(value) && /\.(bundle|framework)$/.test(value));
53
+ }
54
+ function isSwiftMetalSources(value) {
55
+ return typeof value === "object" && value !== null && !Array.isArray(value) && Object.entries(value).every(
56
+ ([file, source]) => file.endsWith(".metal") && isSwiftResourcePath(file) && typeof source === "object" && source !== null && !Array.isArray(source) && "url" in source && typeof source.url === "string" && "sha256" in source && typeof source.sha256 === "string" && /^[a-f0-9]{64}$/.test(source.sha256)
57
+ );
58
+ }
59
+ function isSwiftMetalLibrarySources(value) {
60
+ return isSwiftMetalSources(value) && Object.values(value).every(
61
+ (source) => "bundlePath" in source && isSwiftBundlePath(source.bundlePath)
62
+ );
63
+ }
64
+
65
+ // src/swift-submit.ts
43
66
  var SWIFT_COMPILE_PATH = "/api/swift-compile";
44
67
  var SWIFT_PACKAGE_PATH = "/__peach/swift-package/";
45
68
  var SWIFT_HMR_PATH = "/__peach/swift-hmr";
@@ -48,18 +71,22 @@ var MAX_SWIFT_COMPILE_SOURCE_BYTES = 2 * 1024 * 1024;
48
71
  var MAX_SWIFT_COMPILE_RESOURCES = 128;
49
72
  var MAX_SWIFT_COMPILE_RESOURCE_BYTES = 2 * 1024 * 1024;
50
73
  var MAX_SWIFT_COMPILE_RESOURCE_TOTAL_BYTES = 8 * 1024 * 1024;
74
+ var MAX_SWIFT_COMPILE_METAL_FILES = 128;
75
+ var MAX_SWIFT_COMPILE_METAL_BYTES = 2 * 1024 * 1024;
76
+ var MAX_SWIFT_COMPILE_METAL_TOTAL_BYTES = 8 * 1024 * 1024;
51
77
  var MAX_SWIFT_COMPILE_IMAGES = 128;
52
78
  var MAX_SWIFT_COMPILE_IMAGE_BYTES = 4 * 1024 * 1024;
53
79
  var MAX_SWIFT_COMPILE_IMAGE_TOTAL_BYTES = 16 * 1024 * 1024;
54
- var SWIFT_HOST_ABI = 24;
80
+ var SWIFT_HOST_ABI = 41;
55
81
  var POLL_INTERVAL_MS = 1500;
56
82
  function swiftNativeEntry(native, file) {
57
83
  return {
58
84
  packageId: native.packageId,
59
85
  contractHash: native.hash,
60
86
  modules: Object.fromEntries(
61
- (native.files[file] ?? []).map((name) => [name, native.modules[name] ?? []])
87
+ (native.files[file] ?? []).filter((name) => Object.hasOwn(native.modules, name)).map((name) => [name, native.modules[name]])
62
88
  ),
89
+ views: (native.files[file] ?? []).filter((name) => Object.hasOwn(native.views, name)),
63
90
  defaultView: native.defaultViewFiles.includes(file)
64
91
  };
65
92
  }
@@ -106,7 +133,11 @@ function isRecord(value) {
106
133
  return typeof value === "object" && value !== null && !Array.isArray(value);
107
134
  }
108
135
  function isSwiftNativeModules(value) {
109
- return isRecord(value) && typeof value.packageId === "string" && typeof value.hash === "string" && isRecord(value.files) && isRecord(value.modules) && [...Object.values(value.files), ...Object.values(value.modules)].every(
136
+ return isRecord(value) && typeof value.packageId === "string" && typeof value.hash === "string" && isRecord(value.files) && isRecord(value.modules) && isRecord(value.views) && [
137
+ ...Object.values(value.files),
138
+ ...Object.values(value.modules),
139
+ ...Object.values(value.views)
140
+ ].every(
110
141
  (names) => Array.isArray(names) && names.every((name) => typeof name === "string")
111
142
  ) && Array.isArray(value.defaultViewFiles) && value.defaultViewFiles.every((file) => typeof file === "string");
112
143
  }
@@ -114,7 +145,7 @@ function isSwiftCompileOutcome(value) {
114
145
  if (!isRecord(value)) return false;
115
146
  switch (value.status) {
116
147
  case "published":
117
- return typeof value.artifactUrl === "string" && typeof value.icuUrl === "string" && typeof value.hash === "string" && /^[a-f0-9]{64}$/.test(value.hash) && (value.imageUrls === void 0 || isRecord(value.imageUrls) && Object.values(value.imageUrls).every((url) => typeof url === "string")) && (value.native === void 0 || isSwiftNativeModules(value.native));
148
+ return typeof value.artifactUrl === "string" && typeof value.icuUrl === "string" && typeof value.hash === "string" && /^[a-f0-9]{64}$/.test(value.hash) && (value.imageUrls === void 0 || isRecord(value.imageUrls) && Object.values(value.imageUrls).every((url) => typeof url === "string")) && (value.metalSources === void 0 || isSwiftMetalLibrarySources(value.metalSources)) && (value.native === void 0 || isSwiftNativeModules(value.native));
118
149
  case "compiling":
119
150
  return typeof value.hash === "string" && /^[a-f0-9]{64}$/.test(value.hash);
120
151
  case "refused":
@@ -149,6 +180,14 @@ async function compileSwiftProject(submit, work, origin, signal) {
149
180
  hash: outcome.hash,
150
181
  icuUrl: compileAssetUrl(outcome.icuUrl, origin),
151
182
  ...outcome.imageUrls === void 0 ? {} : { imageUrls: resolveImageUrls(outcome.imageUrls, origin) },
183
+ ...outcome.metalSources === void 0 ? {} : {
184
+ metalSources: Object.fromEntries(
185
+ Object.entries(outcome.metalSources).map(([file, source]) => [
186
+ file,
187
+ { ...source, url: compileAssetUrl(source.url, origin) }
188
+ ])
189
+ )
190
+ },
152
191
  ...outcome.native === void 0 ? {} : { native: outcome.native }
153
192
  };
154
193
  case "compiling":
@@ -182,6 +221,9 @@ async function compileSwiftProject(submit, work, origin, signal) {
182
221
  MAX_SWIFT_COMPILE_IMAGES,
183
222
  MAX_SWIFT_COMPILE_IMAGE_BYTES,
184
223
  MAX_SWIFT_COMPILE_IMAGE_TOTAL_BYTES,
224
+ MAX_SWIFT_COMPILE_METAL_BYTES,
225
+ MAX_SWIFT_COMPILE_METAL_FILES,
226
+ MAX_SWIFT_COMPILE_METAL_TOTAL_BYTES,
185
227
  MAX_SWIFT_COMPILE_RESOURCES,
186
228
  MAX_SWIFT_COMPILE_RESOURCE_BYTES,
187
229
  MAX_SWIFT_COMPILE_RESOURCE_TOTAL_BYTES,
@@ -1,4 +1,22 @@
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/swiftContract.ts
4
+ function isSwiftResourcePath(value) {
5
+ return typeof value === "string" && value.length <= 4096 && !value.startsWith("/") && !value.includes("\\") && !value.includes("\0") && value.split("/").every((part) => part !== "" && part !== "." && part !== "..");
6
+ }
7
+ function isSwiftBundlePath(value) {
8
+ return typeof value === "string" && (value === "." || isSwiftResourcePath(value) && /\.(bundle|framework)$/.test(value));
9
+ }
10
+ function isSwiftMetalSources(value) {
11
+ return typeof value === "object" && value !== null && !Array.isArray(value) && Object.entries(value).every(
12
+ ([file, source]) => file.endsWith(".metal") && isSwiftResourcePath(file) && typeof source === "object" && source !== null && !Array.isArray(source) && "url" in source && typeof source.url === "string" && "sha256" in source && typeof source.sha256 === "string" && /^[a-f0-9]{64}$/.test(source.sha256)
13
+ );
14
+ }
15
+ function isSwiftMetalLibrarySources(value) {
16
+ return isSwiftMetalSources(value) && Object.values(value).every(
17
+ (source) => "bundlePath" in source && isSwiftBundlePath(source.bundlePath)
18
+ );
19
+ }
2
20
 
3
21
  // src/swift-submit.ts
4
22
  var SWIFT_COMPILE_PATH = "/api/swift-compile";
@@ -9,18 +27,22 @@ var MAX_SWIFT_COMPILE_SOURCE_BYTES = 2 * 1024 * 1024;
9
27
  var MAX_SWIFT_COMPILE_RESOURCES = 128;
10
28
  var MAX_SWIFT_COMPILE_RESOURCE_BYTES = 2 * 1024 * 1024;
11
29
  var MAX_SWIFT_COMPILE_RESOURCE_TOTAL_BYTES = 8 * 1024 * 1024;
30
+ var MAX_SWIFT_COMPILE_METAL_FILES = 128;
31
+ var MAX_SWIFT_COMPILE_METAL_BYTES = 2 * 1024 * 1024;
32
+ var MAX_SWIFT_COMPILE_METAL_TOTAL_BYTES = 8 * 1024 * 1024;
12
33
  var MAX_SWIFT_COMPILE_IMAGES = 128;
13
34
  var MAX_SWIFT_COMPILE_IMAGE_BYTES = 4 * 1024 * 1024;
14
35
  var MAX_SWIFT_COMPILE_IMAGE_TOTAL_BYTES = 16 * 1024 * 1024;
15
- var SWIFT_HOST_ABI = 24;
36
+ var SWIFT_HOST_ABI = 41;
16
37
  var POLL_INTERVAL_MS = 1500;
17
38
  function swiftNativeEntry(native, file) {
18
39
  return {
19
40
  packageId: native.packageId,
20
41
  contractHash: native.hash,
21
42
  modules: Object.fromEntries(
22
- (native.files[file] ?? []).map((name) => [name, native.modules[name] ?? []])
43
+ (native.files[file] ?? []).filter((name) => Object.hasOwn(native.modules, name)).map((name) => [name, native.modules[name]])
23
44
  ),
45
+ views: (native.files[file] ?? []).filter((name) => Object.hasOwn(native.views, name)),
24
46
  defaultView: native.defaultViewFiles.includes(file)
25
47
  };
26
48
  }
@@ -67,7 +89,11 @@ function isRecord(value) {
67
89
  return typeof value === "object" && value !== null && !Array.isArray(value);
68
90
  }
69
91
  function isSwiftNativeModules(value) {
70
- return isRecord(value) && typeof value.packageId === "string" && typeof value.hash === "string" && isRecord(value.files) && isRecord(value.modules) && [...Object.values(value.files), ...Object.values(value.modules)].every(
92
+ return isRecord(value) && typeof value.packageId === "string" && typeof value.hash === "string" && isRecord(value.files) && isRecord(value.modules) && isRecord(value.views) && [
93
+ ...Object.values(value.files),
94
+ ...Object.values(value.modules),
95
+ ...Object.values(value.views)
96
+ ].every(
71
97
  (names) => Array.isArray(names) && names.every((name) => typeof name === "string")
72
98
  ) && Array.isArray(value.defaultViewFiles) && value.defaultViewFiles.every((file) => typeof file === "string");
73
99
  }
@@ -75,7 +101,7 @@ function isSwiftCompileOutcome(value) {
75
101
  if (!isRecord(value)) return false;
76
102
  switch (value.status) {
77
103
  case "published":
78
- return typeof value.artifactUrl === "string" && typeof value.icuUrl === "string" && typeof value.hash === "string" && /^[a-f0-9]{64}$/.test(value.hash) && (value.imageUrls === void 0 || isRecord(value.imageUrls) && Object.values(value.imageUrls).every((url) => typeof url === "string")) && (value.native === void 0 || isSwiftNativeModules(value.native));
104
+ return typeof value.artifactUrl === "string" && typeof value.icuUrl === "string" && typeof value.hash === "string" && /^[a-f0-9]{64}$/.test(value.hash) && (value.imageUrls === void 0 || isRecord(value.imageUrls) && Object.values(value.imageUrls).every((url) => typeof url === "string")) && (value.metalSources === void 0 || isSwiftMetalLibrarySources(value.metalSources)) && (value.native === void 0 || isSwiftNativeModules(value.native));
79
105
  case "compiling":
80
106
  return typeof value.hash === "string" && /^[a-f0-9]{64}$/.test(value.hash);
81
107
  case "refused":
@@ -110,6 +136,14 @@ async function compileSwiftProject(submit, work, origin, signal) {
110
136
  hash: outcome.hash,
111
137
  icuUrl: compileAssetUrl(outcome.icuUrl, origin),
112
138
  ...outcome.imageUrls === void 0 ? {} : { imageUrls: resolveImageUrls(outcome.imageUrls, origin) },
139
+ ...outcome.metalSources === void 0 ? {} : {
140
+ metalSources: Object.fromEntries(
141
+ Object.entries(outcome.metalSources).map(([file, source]) => [
142
+ file,
143
+ { ...source, url: compileAssetUrl(source.url, origin) }
144
+ ])
145
+ )
146
+ },
113
147
  ...outcome.native === void 0 ? {} : { native: outcome.native }
114
148
  };
115
149
  case "compiling":
@@ -142,6 +176,9 @@ export {
142
176
  MAX_SWIFT_COMPILE_IMAGES,
143
177
  MAX_SWIFT_COMPILE_IMAGE_BYTES,
144
178
  MAX_SWIFT_COMPILE_IMAGE_TOTAL_BYTES,
179
+ MAX_SWIFT_COMPILE_METAL_BYTES,
180
+ MAX_SWIFT_COMPILE_METAL_FILES,
181
+ MAX_SWIFT_COMPILE_METAL_TOTAL_BYTES,
145
182
  MAX_SWIFT_COMPILE_RESOURCES,
146
183
  MAX_SWIFT_COMPILE_RESOURCE_BYTES,
147
184
  MAX_SWIFT_COMPILE_RESOURCE_TOTAL_BYTES,