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 __create = Object.create;
@@ -229,7 +229,10 @@ var MANIFEST_DECLARATIONS = [
229
229
  function manifestCalls(manifest, kinds) {
230
230
  const code = manifest.replace(/\/\*[\s\S]*?\*\//g, "").replace(/(^|[^:"])\/\/[^\n]*/g, "$1");
231
231
  const calls = [];
232
- const pattern = new RegExp(`\\.(${MANIFEST_DECLARATIONS.join("|")})\\s*\\(`, "g");
232
+ const pattern = new RegExp(
233
+ `(?:\\.(${MANIFEST_DECLARATIONS.join("|")})|\\b(Package))\\s*\\(`,
234
+ "g"
235
+ );
233
236
  let match;
234
237
  while ((match = pattern.exec(code)) !== null) {
235
238
  let depth = 1;
@@ -259,19 +262,56 @@ function manifestCalls(manifest, kinds) {
259
262
  }
260
263
  i++;
261
264
  }
262
- if (kinds.includes(match[1]))
263
- calls.push({ kind: match[1], flat, call: code.slice(start, i) });
265
+ const kind = match[1] ?? match[2];
266
+ if (kinds.includes(kind)) calls.push({ kind, flat, call: code.slice(start, i) });
267
+ else if (kind === "Package") {
268
+ calls.push(...manifestCalls(code.slice(start, i - 1), kinds));
269
+ }
264
270
  pattern.lastIndex = i;
265
271
  }
266
272
  return calls;
267
273
  }
274
+ function splitManifestArguments(source) {
275
+ const arguments_ = [];
276
+ let start = 0;
277
+ let parentheses = 0;
278
+ let brackets = 0;
279
+ let braces = 0;
280
+ let inString = false;
281
+ let escaped = false;
282
+ for (let index = 0; index < source.length; index++) {
283
+ const character = source[index];
284
+ if (inString) {
285
+ if (escaped) escaped = false;
286
+ else if (character === "\\") escaped = true;
287
+ else if (character === '"') inString = false;
288
+ } else if (character === '"') inString = true;
289
+ else if (character === "(") parentheses++;
290
+ else if (character === ")") parentheses--;
291
+ else if (character === "[") brackets++;
292
+ else if (character === "]") brackets--;
293
+ else if (character === "{") braces++;
294
+ else if (character === "}") braces--;
295
+ else if (character === "," && parentheses === 0 && brackets === 0 && braces === 0) {
296
+ arguments_.push(source.slice(start, index).trim());
297
+ start = index + 1;
298
+ }
299
+ }
300
+ const final = source.slice(start).trim();
301
+ if (final) arguments_.push(final);
302
+ return arguments_;
303
+ }
268
304
  function swiftManifestTargets(manifest, resourcePaths = []) {
269
305
  const implicitResources = swiftImplicitResourcePaths(resourcePaths);
270
306
  const targets = [];
271
- for (const { kind, flat, call } of manifestCalls(manifest, [
272
- "executableTarget",
273
- "target"
274
- ])) {
307
+ const declarations = manifestCalls(manifest, ["executableTarget", "target"]);
308
+ const targetNames = new Set(
309
+ declarations.flatMap(({ flat }) => {
310
+ const name = /\bname\s*:\s*"([^"]+)"/.exec(flat)?.[1];
311
+ return name ? [name] : [];
312
+ })
313
+ );
314
+ for (const { kind, flat, call } of declarations) {
275
315
  const executable = kind === "executableTarget";
276
316
  const name = /\bname\s*:\s*"([^"]+)"/.exec(flat)?.[1];
277
317
  if (!name) continue;
@@ -281,6 +321,12 @@ function swiftManifestTargets(manifest, resourcePaths = []) {
281
321
  /\.swiftLanguageMode\(\s*\.v(\d+)\s*\)/.exec(call)?.[1] ?? "5"
282
322
  );
283
323
  const mainActorIsolation = /\.defaultIsolation\(\s*MainActor\.self\s*\)/.test(call);
324
+ const cxxInterop = /\.interoperabilityMode\(\s*\.Cxx\s*\)/.test(
325
+ call.replace(/"(?:\\.|[^"\\])*"/g, "")
326
+ );
327
+ const defines = [
328
+ ...call.matchAll(/\.define\(\s*"([A-Za-z_][A-Za-z0-9_]*)"\s*\)/g)
329
+ ].map((match) => match[1]);
284
330
  const excluded = [
285
331
  ...(/\bexclude\s*:\s*\[([^\]]*)\]/.exec(flat)?.[1] ?? "").matchAll(/"([^"]+)"/g)
286
332
  ].map((match) => match[1].replace(/^\.\//, "").replace(/\/+$/, ""));
@@ -294,20 +340,60 @@ function swiftManifestTargets(manifest, resourcePaths = []) {
294
340
  return false;
295
341
  return true;
296
342
  });
343
+ const targetArguments = splitManifestArguments(call.slice(0, -1));
344
+ const dependencyArgument = targetArguments.find(
345
+ (argument) => /^dependencies\s*:/.test(argument)
346
+ );
347
+ const dependencyList = dependencyArgument?.replace(/^dependencies\s*:\s*/, "").trim();
348
+ const dependencyNames = /* @__PURE__ */ new Set();
349
+ if (dependencyList?.startsWith("[") && dependencyList.endsWith("]")) {
350
+ for (const dependency of splitManifestArguments(dependencyList.slice(1, -1))) {
351
+ const dependencyName = /^"([^"]+)"$/.exec(dependency)?.[1] ?? /^\.(?:target|byName)\s*\(\s*name\s*:\s*"([^"]+)"/.exec(dependency)?.[1];
352
+ if (dependencyName && targetNames.has(dependencyName))
353
+ dependencyNames.add(dependencyName);
354
+ }
355
+ }
356
+ const dependencies = [...dependencyNames].map((name2) => ({
357
+ kind: "target",
358
+ name: name2
359
+ }));
297
360
  targets.push({
298
361
  name,
299
362
  path: targetPath,
300
363
  executable,
301
364
  languageMode,
302
365
  mainActorIsolation,
303
- resources
366
+ ...cxxInterop ? { cxxInterop: true } : {},
367
+ ...defines.length === 0 ? {} : { defines },
368
+ resources,
369
+ ...dependencies.length === 0 ? {} : { dependencies },
370
+ ...excluded.length === 0 ? {} : { exclude: excluded }
304
371
  });
305
372
  }
306
373
  return targets;
307
374
  }
375
+ function swiftManifestCxxLanguageStandard(manifest) {
376
+ const declaration = manifestCalls(manifest, ["Package"])[0];
377
+ if (!declaration) return void 0;
378
+ const code = declaration.flat.replace(/"(?:\\.|[^"\\])*"/g, "");
379
+ return /\bcxxLanguageStandard\s*:\s*\.(\w+)/.exec(code)?.[1];
380
+ }
308
381
  function swiftPackagePartition(manifest, resourcePaths = []) {
309
382
  const targets = swiftManifestTargets(manifest, resourcePaths);
310
- return targets.length === 1 && targets[0].executable && targets[0].path === "." ? [] : targets;
383
+ 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;
384
+ }
385
+
386
+ // src/swiftContract.ts
387
+ function isSwiftResourcePath(value) {
388
+ return typeof value === "string" && value.length <= 4096 && !value.startsWith("/") && !value.includes("\\") && !value.includes("\0") && value.split("/").every((part) => part !== "" && part !== "." && part !== "..");
389
+ }
390
+ function isSwiftBundlePath(value) {
391
+ return typeof value === "string" && (value === "." || isSwiftResourcePath(value) && /\.(bundle|framework)$/.test(value));
392
+ }
393
+ function isSwiftResourceBundles(value) {
394
+ return Array.isArray(value) && value.length <= 128 && value.every(
395
+ (bundle) => typeof bundle === "object" && bundle !== null && typeof bundle.target === "string" && /^[A-Za-z_][A-Za-z0-9_-]*$/.test(bundle.target) && (bundle.sourcePath === "." || isSwiftResourcePath(bundle.sourcePath)) && isSwiftBundlePath(bundle.path)
396
+ ) && new Set(value.map((bundle) => bundle.target)).size === value.length && new Set(value.map((bundle) => bundle.path)).size === value.length;
311
397
  }
312
398
 
313
399
  // src/swift-compile.ts
@@ -340,6 +426,7 @@ function swiftModuleInputFiles(root) {
340
426
  "Package.swift",
341
427
  "scripts/contrast-app-Package.swift",
342
428
  "scripts/build-distribution.ts",
429
+ "scripts/distribution-clang.ts",
343
430
  "scripts/build-distribution-plugins.sh",
344
431
  "scripts/build-preview-plugin.sh",
345
432
  "toolchain.json"
@@ -364,6 +451,10 @@ function swiftMacroPlugins(moduleRoot) {
364
451
  stale: false
365
452
  };
366
453
  const dir = import_node_path2.default.join(moduleRoot, ".build/host/RnxPreviewMacros");
454
+ const release = JSON.parse(
455
+ (0, import_node_fs2.readFileSync)(import_node_path2.default.join(moduleRoot, "toolchain.json"), "utf8")
456
+ ).release;
457
+ const compilerStamp = import_node_path2.default.join(dir, "compiler-release");
367
458
  const ext = process.platform === "darwin" ? "dylib" : "so";
368
459
  const plugins = [
369
460
  {
@@ -377,12 +468,12 @@ function swiftMacroPlugins(moduleRoot) {
377
468
  ];
378
469
  return {
379
470
  libraries: plugins.map(({ library }) => library),
380
- stale: plugins.some(
471
+ stale: !(0, import_node_fs2.existsSync)(compilerStamp) || (0, import_node_fs2.readFileSync)(compilerStamp, "utf8").trim() !== release || plugins.some(
381
472
  ({ library, source }) => !(0, import_node_fs2.existsSync)(library) || (0, import_node_fs2.statSync)(source).mtimeMs > (0, import_node_fs2.statSync)(library).mtimeMs
382
473
  )
383
474
  };
384
475
  }
385
- async function ensureMacroPlugins(moduleRoot, toolchainBin) {
476
+ async function ensureMacroPlugins(moduleRoot, toolchainBin, release) {
386
477
  const { libraries, stale } = swiftMacroPlugins(moduleRoot);
387
478
  if (stale) {
388
479
  await run2("sh", [
@@ -390,6 +481,11 @@ async function ensureMacroPlugins(moduleRoot, toolchainBin) {
390
481
  toolchainBin,
391
482
  libraries[0]
392
483
  ]);
484
+ (0, import_node_fs2.writeFileSync)(
485
+ import_node_path2.default.join(import_node_path2.default.dirname(libraries[0]), "compiler-release"),
486
+ `${release}
487
+ `
488
+ );
393
489
  }
394
490
  return libraries;
395
491
  }
@@ -455,6 +551,7 @@ var OPTIONAL_FRAMEWORK_DEPENDENCIES = {
455
551
  TikTokBusinessSDK: [],
456
552
  nSure: [],
457
553
  Statsig: [],
554
+ TOCropViewController: [],
458
555
  RiveRuntime: ["MetalKit"],
459
556
  MetalKit: [],
460
557
  DatadogCore: [],
@@ -469,6 +566,7 @@ var OPTIONAL_FRAMEWORK_DEPENDENCIES = {
469
566
  Intercom: [],
470
567
  FirebaseCore: [],
471
568
  FirebaseSharedSwift: ["FirebaseCore"],
569
+ FirebaseRemoteConfig: ["FirebaseCore", "FirebaseSharedSwift"],
472
570
  FirebaseFirestoreInternal: ["FirebaseCore"],
473
571
  FirebaseAnalytics: ["FirebaseCore"],
474
572
  FirebaseAppCheck: ["FirebaseCore"],
@@ -476,6 +574,7 @@ var OPTIONAL_FRAMEWORK_DEPENDENCIES = {
476
574
  FirebaseCrashlytics: ["FirebaseCore"],
477
575
  FirebaseFirestore: ["FirebaseCore", "FirebaseSharedSwift", "FirebaseFirestoreInternal"],
478
576
  FirebaseStorage: ["FirebaseCore"],
577
+ GoogleMobileAds: [],
479
578
  FBAudienceNetwork: []
480
579
  };
481
580
  var OPTIONAL_FRAMEWORKS = new Set(Object.keys(OPTIONAL_FRAMEWORK_DEPENDENCIES));
@@ -619,7 +718,11 @@ function swiftTargetDependencies(files, targets) {
619
718
  const siblings = /* @__PURE__ */ new Map();
620
719
  for (const target of targets) {
621
720
  const prefix = target.path === "." ? "" : `${target.path}/`;
622
- const deps = /* @__PURE__ */ new Set();
721
+ const deps = new Set(
722
+ (target.dependencies ?? []).flatMap(
723
+ (dependency) => dependency.kind === "target" && dependency.name !== target.name && names.has(dependency.name) ? [dependency.name] : []
724
+ )
725
+ );
623
726
  for (const [file, contents] of Object.entries(files)) {
624
727
  if (file === "Package.swift" || !file.startsWith(prefix)) continue;
625
728
  if (targets.some(
@@ -643,17 +746,17 @@ var FOUNDATION_IMPLICIT_MODULES = [
643
746
  "PeachObjC",
644
747
  "Dispatch",
645
748
  "FoundationNetworking",
646
- "WASILibc",
647
- "wasi_pthread"
749
+ "PeachFoundationCombine",
750
+ "Darwin"
648
751
  ];
649
752
  var FOUNDATION_IMPLICIT_FLAGS = FOUNDATION_IMPLICIT_MODULES.map(
650
753
  (module2) => `, "-Xfrontend", "-import-module", "-Xfrontend", "${module2}"`
651
754
  ).join("");
652
755
  var ONE_IMPLICIT_FLAGS = ', "-Xfrontend", "-import-module", "-Xfrontend", "One"';
653
- var MULTI_MANIFEST_VERSION = 12;
756
+ var MULTI_MANIFEST_VERSION = 18;
654
757
  function swiftArtifactHash(input, release, moduleRoot) {
655
758
  const hash = (0, import_node_crypto2.createHash)("sha256");
656
- hash.update(`swift-compile/v20
759
+ hash.update(`swift-compile/v23
657
760
  ${release}
658
761
  `);
659
762
  if (input.oneModule) hash.update("one-module\n");
@@ -662,6 +765,13 @@ ${release}
662
765
  hash.update((0, import_node_crypto2.createHash)("sha256").update(file).digest());
663
766
  hash.update((0, import_node_crypto2.createHash)("sha256").update(input.files[file]).digest());
664
767
  }
768
+ for (const file of Object.keys(input.metalSources ?? {}).sort()) {
769
+ hash.update("metal-source\n");
770
+ hash.update((0, import_node_crypto2.createHash)("sha256").update(file).digest());
771
+ hash.update(
772
+ (0, import_node_crypto2.createHash)("sha256").update(input.metalSources?.[file] ?? "").digest()
773
+ );
774
+ }
665
775
  for (const base of Object.keys(input.resources ?? {}).sort()) {
666
776
  hash.update((0, import_node_crypto2.createHash)("sha256").update(base).digest());
667
777
  hash.update(
@@ -679,6 +789,19 @@ ${release}
679
789
  hash.update("resource-path\n");
680
790
  hash.update((0, import_node_crypto2.createHash)("sha256").update(file).digest());
681
791
  }
792
+ hash.update(
793
+ JSON.stringify(
794
+ [...input.resourceBundles ?? []].sort((a, b) => a.target.localeCompare(b.target))
795
+ )
796
+ );
797
+ for (const target of Object.keys(input.libraries ?? {}).sort()) {
798
+ hash.update(`library
799
+ ${target}
800
+ `);
801
+ hash.update(
802
+ (0, import_node_crypto2.createHash)("sha256").update(input.libraries?.[target] ?? "").digest()
803
+ );
804
+ }
682
805
  const targets = compileTargets(input);
683
806
  if (targets.length > 0) {
684
807
  hash.update(`swift-multi/v${MULTI_MANIFEST_VERSION}
@@ -714,10 +837,22 @@ function emitSwiftPackageManifest(args) {
714
837
  if (!executable) throw new Error("swift-compile: no executable target to emit");
715
838
  const stanza = (target) => {
716
839
  const isolation = target.mainActorIsolation ? " .defaultIsolation(MainActor.self)," : "";
840
+ const interoperability = target.cxxInterop ? " .interoperabilityMode(.Cxx)," : "";
841
+ const defines = (target.defines ?? []).map((name) => ` .define(${JSON.stringify(name)}),`).join("");
717
842
  const imports = distribution ? `, "-I", ${JSON.stringify(import_node_path2.default.join(moduleRoot, "modules"))}` : "";
718
- const swiftSettings = `swiftSettings: [.swiftLanguageMode(.v${target.languageMode}),${isolation} .unsafeFlags(["-Osize"${FOUNDATION_IMPLICIT_FLAGS}${oneModule ? ONE_IMPLICIT_FLAGS : ""}${imports}])]`;
843
+ const native = args.native?.get(target.name);
844
+ const nativeImports = (siblings.get(target.name) ?? []).filter((name) => args.native?.has(name)).map(
845
+ (name) => `, "-Xfrontend", "-import-module", "-Xfrontend", ${JSON.stringify(name)}`
846
+ ).join("");
847
+ const header = args.headerDirectory && [...args.native?.values() ?? []].some(
848
+ (value) => value.late.producers.includes(target.name)
849
+ ) ? `, "-emit-objc-header-path", ${JSON.stringify(import_node_path2.default.join(args.headerDirectory, `${target.name}-Swift.h`))}` : "";
850
+ const swiftSettings = `swiftSettings: [.swiftLanguageMode(.v${target.languageMode}),${isolation}${interoperability}${defines} .unsafeFlags(["-Osize"${FOUNDATION_IMPLICIT_FLAGS}${oneModule ? ONE_IMPLICIT_FLAGS : ""}${imports}${nativeImports}${header}])]`;
719
851
  const deps = [
720
- ...distribution ? [] : [
852
+ ...target.executable ? [...args.native?.values() ?? []].map(
853
+ (value) => JSON.stringify(value.late.name)
854
+ ) : [],
855
+ ...distribution || native ? [] : [
721
856
  '.product(name: "SwiftUI", package: "sootsim-swift")',
722
857
  ...oneModule ? [ONE_PRODUCT] : [],
723
858
  ...spriteKit ? [SPRITEKIT_PRODUCT] : []
@@ -738,13 +873,15 @@ function emitSwiftPackageManifest(args) {
738
873
  "-Xlinker", "--export-if-defined=__main_argc_argv"${library},
739
874
  ]),
740
875
  .unsafeFlags(["-Xlinker", "--strip-all"], .when(configuration: .release)),
741
- ]` : "";
876
+ ]` : args.libraries?.has(target.name) ? `,
877
+ linkerSettings: [.unsafeFlags([${JSON.stringify(args.libraries.get(target.name))}])]` : "";
742
878
  return [
743
879
  ` ${kind}(`,
744
880
  ` name: "${target.name}",`,
745
881
  ` dependencies: [${deps}],`,
746
882
  ` path: "${target.path}",`,
747
- ` ${swiftSettings}${link}`,
883
+ ...native ? [` exclude: ${JSON.stringify(native.lateSources)},`] : [],
884
+ ` ${native ? "cxxSettings: []" : swiftSettings}${link}`,
748
885
  ` ),`
749
886
  ].join("\n");
750
887
  };
@@ -759,7 +896,16 @@ function emitSwiftPackageManifest(args) {
759
896
  ` dependencies: [${distribution ? "" : `.package(path: "${moduleRoot}")`}],`,
760
897
  " targets: [",
761
898
  ...targets.map(stanza),
762
- " ]",
899
+ ...[...args.native?.entries() ?? []].flatMap(([name, native]) => [
900
+ ` .target(name: ${JSON.stringify(native.late.name)},`,
901
+ ` dependencies: ${JSON.stringify([name, ...native.late.producers])},`,
902
+ ` path: ${JSON.stringify(native.path)},`,
903
+ ` sources: ${JSON.stringify(native.lateSources)},`,
904
+ ` publicHeadersPath: "include",`,
905
+ ` cxxSettings: [.unsafeFlags(["-fno-cxx-modules", "-I", ${JSON.stringify(native.includeDirectory)}, "-I", ${JSON.stringify(args.headerDirectory)}])]),`
906
+ ]),
907
+ args.cxxLanguageStandard ? ` ],
908
+ cxxLanguageStandard: .${args.cxxLanguageStandard}` : " ]",
763
909
  ")",
764
910
  ""
765
911
  ].join("\n");
@@ -776,9 +922,10 @@ function syncSwiftTree(base, files) {
776
922
  };
777
923
  walk(base);
778
924
  for (const [full, contents] of files) {
779
- if ((0, import_node_fs2.existsSync)(full) && (0, import_node_fs2.readFileSync)(full, "utf8") === contents) continue;
925
+ if ((0, import_node_fs2.existsSync)(full) && (typeof contents === "string" ? (0, import_node_fs2.readFileSync)(full, "utf8") === contents : (0, import_node_fs2.readFileSync)(full).equals(contents)))
926
+ continue;
780
927
  (0, import_node_fs2.mkdirSync)(import_node_path2.default.dirname(full), { recursive: true });
781
- (0, import_node_fs2.writeFileSync)(full, contents, "utf8");
928
+ (0, import_node_fs2.writeFileSync)(full, contents);
782
929
  }
783
930
  }
784
931
  var DIRECTIVE = /^[ \t]*#(?:if|elseif)\b/;
@@ -1896,6 +2043,8 @@ function prepareSwiftDependency(source, destination) {
1896
2043
  copy(source, destination, true);
1897
2044
  }
1898
2045
  function writeSwiftProject(layout, input, moduleRoot) {
2046
+ if (input.resourceBundles !== void 0 && !isSwiftResourceBundles(input.resourceBundles))
2047
+ throw new Error("swift compile input has invalid target bundle assignments");
1899
2048
  const resourceTargets = swiftManifestTargets(
1900
2049
  input.files["Package.swift"] ?? "",
1901
2050
  input.resourcePaths
@@ -1912,6 +2061,80 @@ function writeSwiftProject(layout, input, moduleRoot) {
1912
2061
  }
1913
2062
  ] : compileTargets(input);
1914
2063
  const files = /* @__PURE__ */ new Map();
2064
+ const native = /* @__PURE__ */ new Map();
2065
+ const headerDirectory = import_node_path2.default.join(layout.root, ".build", "peach-cxx-headers");
2066
+ for (const target of targets) {
2067
+ const prefix = target.path === "." ? "" : `${target.path}/`;
2068
+ const entries = Object.entries(input.files).filter(
2069
+ ([file]) => file.startsWith(prefix) && !targets.some(
2070
+ (candidate) => candidate.name !== target.name && candidate.path !== "." && candidate.path.startsWith(prefix) && file.startsWith(`${candidate.path}/`)
2071
+ )
2072
+ );
2073
+ if (entries.some(([file]) => file.endsWith(".swift"))) continue;
2074
+ const units = entries.filter(([file]) => /\.(?:c|cc|cpp|cxx|m|mm)$/.test(file));
2075
+ if (units.length === 0) continue;
2076
+ const includes = `${prefix}include/`;
2077
+ const consumers = /* @__PURE__ */ new Map();
2078
+ const reverse = /* @__PURE__ */ new Map();
2079
+ for (const [file, contents] of entries) {
2080
+ const producers = /* @__PURE__ */ new Set();
2081
+ const source = contents.replace(/\/\*[\s\S]*?\*\//g, "");
2082
+ for (const match of source.matchAll(/^\s*#\s*include\s*[<"]([^>"]+)[>"]/gm)) {
2083
+ const include = match[1];
2084
+ const producer = /(?:^|\/)([^/]+)-Swift\.h$/.exec(include)?.[1];
2085
+ if (producer && targets.some((value) => value.name === producer))
2086
+ producers.add(producer);
2087
+ const local = [
2088
+ import_node_path2.default.posix.join(import_node_path2.default.posix.dirname(file), include),
2089
+ `${includes}${include}`
2090
+ ].find((candidate) => input.files[candidate] !== void 0);
2091
+ if (local) {
2092
+ reverse.set(local, [...reverse.get(local) ?? [], file]);
2093
+ }
2094
+ }
2095
+ consumers.set(file, producers);
2096
+ }
2097
+ const queue = [...consumers.keys()].filter((file) => consumers.get(file).size > 0);
2098
+ for (let index = 0; index < queue.length; index++) {
2099
+ const file = queue[index];
2100
+ for (const parent of reverse.get(file) ?? []) {
2101
+ const inherited = consumers.get(parent);
2102
+ const before = inherited.size;
2103
+ for (const producer of consumers.get(file)) inherited.add(producer);
2104
+ if (before !== inherited.size) queue.push(parent);
2105
+ }
2106
+ }
2107
+ const late = units.filter(([file]) => consumers.get(file).size > 0);
2108
+ if (late.length === 0) continue;
2109
+ native.set(target.name, {
2110
+ path: target.path,
2111
+ includeDirectory: import_node_path2.default.join(layout.root, includes),
2112
+ lateSources: late.map(([file]) => file.slice(prefix.length)),
2113
+ late: {
2114
+ name: `${target.name}SwiftImplementation`,
2115
+ producers: [
2116
+ ...new Set(late.flatMap(([file]) => [...consumers.get(file)]))
2117
+ ].sort()
2118
+ }
2119
+ });
2120
+ if (input.files[`${includes}module.modulemap`] !== void 0) continue;
2121
+ const roots = entries.filter(
2122
+ ([file]) => file.startsWith(includes) && /\.(?:h|hpp|hh|hxx)$/.test(file) && consumers.get(file).size === 0
2123
+ );
2124
+ files.set(
2125
+ import_node_path2.default.join(layout.root, includes, "module.modulemap"),
2126
+ [
2127
+ `module ${target.name} {`,
2128
+ ...roots.map(
2129
+ ([file]) => ` header ${JSON.stringify(file.slice(includes.length))}`
2130
+ ),
2131
+ " export *",
2132
+ "}",
2133
+ ""
2134
+ ].join("\n")
2135
+ );
2136
+ }
2137
+ if (native.size > 0) (0, import_node_fs2.mkdirSync)(headerDirectory, { recursive: true });
1915
2138
  const modulePlan = (0, import_node_crypto2.createHash)("sha256").update(
1916
2139
  swiftModuleInputFiles(moduleRoot).join("\n")
1917
2140
  );
@@ -1920,7 +2143,11 @@ function writeSwiftProject(layout, input, moduleRoot) {
1920
2143
  }
1921
2144
  const resourcePlan = (0, import_node_crypto2.createHash)("sha256").update(
1922
2145
  JSON.stringify(
1923
- resourceTargets.filter((target) => target.resources).map((target) => [target.name, target.path])
2146
+ resourceTargets.filter((target) => target.resources).map((target) => [
2147
+ target.name,
2148
+ target.path,
2149
+ input.resourceBundles?.find((bundle) => bundle.target === target.name)?.path
2150
+ ])
1924
2151
  )
1925
2152
  ).digest("hex").slice(0, 16);
1926
2153
  const moduleFiles = `
@@ -1980,6 +2207,12 @@ function writeSwiftProject(layout, input, moduleRoot) {
1980
2207
  files.set(import_node_path2.default.join(layout.root, "Package.swift"), manifest + moduleFiles);
1981
2208
  } else {
1982
2209
  const base = layout.multi ? layout.root : layout.sources;
2210
+ const libraries = /* @__PURE__ */ new Map();
2211
+ for (const [target, data] of Object.entries(input.libraries ?? {})) {
2212
+ const file = import_node_path2.default.join(layout.root, ".peach-libraries", `lib${target}.a`);
2213
+ files.set(file, Buffer.from(data, "base64"));
2214
+ libraries.set(target, file);
2215
+ }
1983
2216
  for (const [file, contents] of Object.entries(input.files)) {
1984
2217
  if (file === "Package.swift") continue;
1985
2218
  files.set(
@@ -1991,6 +2224,11 @@ function writeSwiftProject(layout, input, moduleRoot) {
1991
2224
  import_node_path2.default.join(layout.root, "Package.swift"),
1992
2225
  emitSwiftPackageManifest({
1993
2226
  targets,
2227
+ native,
2228
+ headerDirectory: native.size > 0 ? headerDirectory : void 0,
2229
+ cxxLanguageStandard: swiftManifestCxxLanguageStandard(
2230
+ input.files["Package.swift"] ?? ""
2231
+ ),
1994
2232
  siblings: swiftTargetDependencies(
1995
2233
  input.files,
1996
2234
  layout.multi ? targets : targets.map((target) => ({ ...target, path: "." }))
@@ -1998,12 +2236,20 @@ function writeSwiftProject(layout, input, moduleRoot) {
1998
2236
  moduleRoot,
1999
2237
  oneModule: input.oneModule,
2000
2238
  spriteKit: importsSpriteKit(input.files),
2001
- distribution: distribution ?? void 0
2239
+ distribution: distribution ?? void 0,
2240
+ libraries
2002
2241
  }) + moduleFiles
2003
2242
  );
2004
2243
  }
2005
2244
  for (const target of resourceTargets) {
2006
2245
  if (!target.resources) continue;
2246
+ const bundle = input.resourceBundles?.find(
2247
+ (candidate) => candidate.target === target.name
2248
+ );
2249
+ if (!bundle || bundle.sourcePath !== target.path)
2250
+ throw new Error(
2251
+ `swift resource target ${target.name} has no matching bundle assignment`
2252
+ );
2007
2253
  const directory = layout.multi ? import_node_path2.default.join(layout.root, target.path) : layout.sources;
2008
2254
  files.set(
2009
2255
  import_node_path2.default.join(directory, "ResourceBundleAccessor.generated.swift"),
@@ -2011,7 +2257,11 @@ function writeSwiftProject(layout, input, moduleRoot) {
2011
2257
  "import Foundation",
2012
2258
  "",
2013
2259
  "extension Foundation.Bundle {",
2014
- " static let module: Bundle = Bundle.main",
2260
+ bundle.path === "." ? " static let module: Bundle = Bundle.main" : ` static let module: Bundle = {
2261
+ let url = Bundle.main.bundleURL.appendingPathComponent(${JSON.stringify(bundle.path)})
2262
+ guard let bundle = Bundle(url: url) else { fatalError("resource bundle is missing: ${bundle.target}") }
2263
+ return bundle
2264
+ }()`,
2015
2265
  "}",
2016
2266
  ""
2017
2267
  ].join("\n")
@@ -2079,7 +2329,7 @@ function compileSwiftProjectUnit(input, options) {
2079
2329
  };
2080
2330
  const hash = swiftArtifactHash(input, options.release, moduleRoot);
2081
2331
  return serialize(root, async () => {
2082
- if (process.platform === "darwin" && process.env.TM_SESSION && process.env.CI !== "true" && process.env.CONTRAST_HEAVY_ADMITTED !== "1" && moduleRoot === import_node_path2.default.resolve(__sootsim_import_meta_dirname, "../../sootsim-swift") && !swiftDistributionAt(moduleRoot)) {
2332
+ if (process.platform === "darwin" && process.env.TM_SESSION && process.env.CI !== "true" && moduleRoot === import_node_path2.default.resolve(__sootsim_import_meta_dirname, "../../sootsim-swift") && !swiftDistributionAt(moduleRoot)) {
2083
2333
  const requestRoot = (0, import_node_fs2.mkdtempSync)(import_node_path2.default.join(root, ".builder-request-"));
2084
2334
  const output = import_node_path2.default.join(requestRoot, "output");
2085
2335
  const request = import_node_path2.default.join(requestRoot, "request.json");
@@ -2104,7 +2354,11 @@ function compileSwiftProjectUnit(input, options) {
2104
2354
  "--output",
2105
2355
  output
2106
2356
  ],
2107
- { cwd: repo, timeout: options.timeoutMs, maxBuffer: 64 * 1024 * 1024 }
2357
+ {
2358
+ cwd: repo,
2359
+ timeout: options.timeoutMs,
2360
+ maxBuffer: 64 * 1024 * 1024
2361
+ }
2108
2362
  );
2109
2363
  pending.child.stdout?.on("data", (bytes2) => process.stdout.write(bytes2));
2110
2364
  pending.child.stderr?.on("data", (bytes2) => process.stderr.write(bytes2));
@@ -2136,7 +2390,11 @@ function compileSwiftProjectUnit(input, options) {
2136
2390
  `swift-compile: no swift.org toolchain at ${options.toolchainBin}; install ${options.release} and its matching wasm sdk`
2137
2391
  );
2138
2392
  }
2139
- const macroPlugins = await ensureMacroPlugins(moduleRoot, options.toolchainBin);
2393
+ const macroPlugins = await ensureMacroPlugins(
2394
+ moduleRoot,
2395
+ options.toolchainBin,
2396
+ options.release
2397
+ );
2140
2398
  const sdk = swiftModuleSdk(moduleRoot).wasmSdkId;
2141
2399
  const icu = swiftIcuAsset(options.toolchainBin, sdk);
2142
2400
  try {
@@ -2144,6 +2402,8 @@ function compileSwiftProjectUnit(input, options) {
2144
2402
  swift,
2145
2403
  [
2146
2404
  "build",
2405
+ "--build-system",
2406
+ "native",
2147
2407
  "-j",
2148
2408
  BUILD_JOBS,
2149
2409
  "--package-path",