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
 
3
3
  // src/swift-compile.ts
4
4
  import { execFile as execFile2, execFileSync } from "node:child_process";
@@ -175,7 +175,10 @@ var MANIFEST_DECLARATIONS = [
175
175
  function manifestCalls(manifest, kinds) {
176
176
  const code = manifest.replace(/\/\*[\s\S]*?\*\//g, "").replace(/(^|[^:"])\/\/[^\n]*/g, "$1");
177
177
  const calls = [];
178
- const pattern = new RegExp(`\\.(${MANIFEST_DECLARATIONS.join("|")})\\s*\\(`, "g");
178
+ const pattern = new RegExp(
179
+ `(?:\\.(${MANIFEST_DECLARATIONS.join("|")})|\\b(Package))\\s*\\(`,
180
+ "g"
181
+ );
179
182
  let match;
180
183
  while ((match = pattern.exec(code)) !== null) {
181
184
  let depth = 1;
@@ -205,19 +208,56 @@ function manifestCalls(manifest, kinds) {
205
208
  }
206
209
  i++;
207
210
  }
208
- if (kinds.includes(match[1]))
209
- calls.push({ kind: match[1], flat, call: code.slice(start, i) });
211
+ const kind = match[1] ?? match[2];
212
+ if (kinds.includes(kind)) calls.push({ kind, flat, call: code.slice(start, i) });
213
+ else if (kind === "Package") {
214
+ calls.push(...manifestCalls(code.slice(start, i - 1), kinds));
215
+ }
210
216
  pattern.lastIndex = i;
211
217
  }
212
218
  return calls;
213
219
  }
220
+ function splitManifestArguments(source) {
221
+ const arguments_ = [];
222
+ let start = 0;
223
+ let parentheses = 0;
224
+ let brackets = 0;
225
+ let braces = 0;
226
+ let inString = false;
227
+ let escaped = false;
228
+ for (let index = 0; index < source.length; index++) {
229
+ const character = source[index];
230
+ if (inString) {
231
+ if (escaped) escaped = false;
232
+ else if (character === "\\") escaped = true;
233
+ else if (character === '"') inString = false;
234
+ } else if (character === '"') inString = true;
235
+ else if (character === "(") parentheses++;
236
+ else if (character === ")") parentheses--;
237
+ else if (character === "[") brackets++;
238
+ else if (character === "]") brackets--;
239
+ else if (character === "{") braces++;
240
+ else if (character === "}") braces--;
241
+ else if (character === "," && parentheses === 0 && brackets === 0 && braces === 0) {
242
+ arguments_.push(source.slice(start, index).trim());
243
+ start = index + 1;
244
+ }
245
+ }
246
+ const final = source.slice(start).trim();
247
+ if (final) arguments_.push(final);
248
+ return arguments_;
249
+ }
214
250
  function swiftManifestTargets(manifest, resourcePaths = []) {
215
251
  const implicitResources = swiftImplicitResourcePaths(resourcePaths);
216
252
  const targets = [];
217
- for (const { kind, flat, call } of manifestCalls(manifest, [
218
- "executableTarget",
219
- "target"
220
- ])) {
253
+ const declarations = manifestCalls(manifest, ["executableTarget", "target"]);
254
+ const targetNames = new Set(
255
+ declarations.flatMap(({ flat }) => {
256
+ const name = /\bname\s*:\s*"([^"]+)"/.exec(flat)?.[1];
257
+ return name ? [name] : [];
258
+ })
259
+ );
260
+ for (const { kind, flat, call } of declarations) {
221
261
  const executable = kind === "executableTarget";
222
262
  const name = /\bname\s*:\s*"([^"]+)"/.exec(flat)?.[1];
223
263
  if (!name) continue;
@@ -227,6 +267,12 @@ function swiftManifestTargets(manifest, resourcePaths = []) {
227
267
  /\.swiftLanguageMode\(\s*\.v(\d+)\s*\)/.exec(call)?.[1] ?? "5"
228
268
  );
229
269
  const mainActorIsolation = /\.defaultIsolation\(\s*MainActor\.self\s*\)/.test(call);
270
+ const cxxInterop = /\.interoperabilityMode\(\s*\.Cxx\s*\)/.test(
271
+ call.replace(/"(?:\\.|[^"\\])*"/g, "")
272
+ );
273
+ const defines = [
274
+ ...call.matchAll(/\.define\(\s*"([A-Za-z_][A-Za-z0-9_]*)"\s*\)/g)
275
+ ].map((match) => match[1]);
230
276
  const excluded = [
231
277
  ...(/\bexclude\s*:\s*\[([^\]]*)\]/.exec(flat)?.[1] ?? "").matchAll(/"([^"]+)"/g)
232
278
  ].map((match) => match[1].replace(/^\.\//, "").replace(/\/+$/, ""));
@@ -240,20 +286,60 @@ function swiftManifestTargets(manifest, resourcePaths = []) {
240
286
  return false;
241
287
  return true;
242
288
  });
289
+ const targetArguments = splitManifestArguments(call.slice(0, -1));
290
+ const dependencyArgument = targetArguments.find(
291
+ (argument) => /^dependencies\s*:/.test(argument)
292
+ );
293
+ const dependencyList = dependencyArgument?.replace(/^dependencies\s*:\s*/, "").trim();
294
+ const dependencyNames = /* @__PURE__ */ new Set();
295
+ if (dependencyList?.startsWith("[") && dependencyList.endsWith("]")) {
296
+ for (const dependency of splitManifestArguments(dependencyList.slice(1, -1))) {
297
+ const dependencyName = /^"([^"]+)"$/.exec(dependency)?.[1] ?? /^\.(?:target|byName)\s*\(\s*name\s*:\s*"([^"]+)"/.exec(dependency)?.[1];
298
+ if (dependencyName && targetNames.has(dependencyName))
299
+ dependencyNames.add(dependencyName);
300
+ }
301
+ }
302
+ const dependencies = [...dependencyNames].map((name2) => ({
303
+ kind: "target",
304
+ name: name2
305
+ }));
243
306
  targets.push({
244
307
  name,
245
308
  path: targetPath,
246
309
  executable,
247
310
  languageMode,
248
311
  mainActorIsolation,
249
- resources
312
+ ...cxxInterop ? { cxxInterop: true } : {},
313
+ ...defines.length === 0 ? {} : { defines },
314
+ resources,
315
+ ...dependencies.length === 0 ? {} : { dependencies },
316
+ ...excluded.length === 0 ? {} : { exclude: excluded }
250
317
  });
251
318
  }
252
319
  return targets;
253
320
  }
321
+ function swiftManifestCxxLanguageStandard(manifest) {
322
+ const declaration = manifestCalls(manifest, ["Package"])[0];
323
+ if (!declaration) return void 0;
324
+ const code = declaration.flat.replace(/"(?:\\.|[^"\\])*"/g, "");
325
+ return /\bcxxLanguageStandard\s*:\s*\.(\w+)/.exec(code)?.[1];
326
+ }
254
327
  function swiftPackagePartition(manifest, resourcePaths = []) {
255
328
  const targets = swiftManifestTargets(manifest, resourcePaths);
256
- return targets.length === 1 && targets[0].executable && targets[0].path === "." ? [] : targets;
329
+ 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;
330
+ }
331
+
332
+ // src/swiftContract.ts
333
+ function isSwiftResourcePath(value) {
334
+ return typeof value === "string" && value.length <= 4096 && !value.startsWith("/") && !value.includes("\\") && !value.includes("\0") && value.split("/").every((part) => part !== "" && part !== "." && part !== "..");
335
+ }
336
+ function isSwiftBundlePath(value) {
337
+ return typeof value === "string" && (value === "." || isSwiftResourcePath(value) && /\.(bundle|framework)$/.test(value));
338
+ }
339
+ function isSwiftResourceBundles(value) {
340
+ return Array.isArray(value) && value.length <= 128 && value.every(
341
+ (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)
342
+ ) && new Set(value.map((bundle) => bundle.target)).size === value.length && new Set(value.map((bundle) => bundle.path)).size === value.length;
257
343
  }
258
344
 
259
345
  // src/swift-compile.ts
@@ -286,6 +372,7 @@ function swiftModuleInputFiles(root) {
286
372
  "Package.swift",
287
373
  "scripts/contrast-app-Package.swift",
288
374
  "scripts/build-distribution.ts",
375
+ "scripts/distribution-clang.ts",
289
376
  "scripts/build-distribution-plugins.sh",
290
377
  "scripts/build-preview-plugin.sh",
291
378
  "toolchain.json"
@@ -310,6 +397,10 @@ function swiftMacroPlugins(moduleRoot) {
310
397
  stale: false
311
398
  };
312
399
  const dir = path2.join(moduleRoot, ".build/host/RnxPreviewMacros");
400
+ const release = JSON.parse(
401
+ readFileSync2(path2.join(moduleRoot, "toolchain.json"), "utf8")
402
+ ).release;
403
+ const compilerStamp = path2.join(dir, "compiler-release");
313
404
  const ext = process.platform === "darwin" ? "dylib" : "so";
314
405
  const plugins = [
315
406
  {
@@ -323,12 +414,12 @@ function swiftMacroPlugins(moduleRoot) {
323
414
  ];
324
415
  return {
325
416
  libraries: plugins.map(({ library }) => library),
326
- stale: plugins.some(
417
+ stale: !existsSync(compilerStamp) || readFileSync2(compilerStamp, "utf8").trim() !== release || plugins.some(
327
418
  ({ library, source }) => !existsSync(library) || statSync(source).mtimeMs > statSync(library).mtimeMs
328
419
  )
329
420
  };
330
421
  }
331
- async function ensureMacroPlugins(moduleRoot, toolchainBin) {
422
+ async function ensureMacroPlugins(moduleRoot, toolchainBin, release) {
332
423
  const { libraries, stale } = swiftMacroPlugins(moduleRoot);
333
424
  if (stale) {
334
425
  await run2("sh", [
@@ -336,6 +427,11 @@ async function ensureMacroPlugins(moduleRoot, toolchainBin) {
336
427
  toolchainBin,
337
428
  libraries[0]
338
429
  ]);
430
+ writeFileSync(
431
+ path2.join(path2.dirname(libraries[0]), "compiler-release"),
432
+ `${release}
433
+ `
434
+ );
339
435
  }
340
436
  return libraries;
341
437
  }
@@ -401,6 +497,7 @@ var OPTIONAL_FRAMEWORK_DEPENDENCIES = {
401
497
  TikTokBusinessSDK: [],
402
498
  nSure: [],
403
499
  Statsig: [],
500
+ TOCropViewController: [],
404
501
  RiveRuntime: ["MetalKit"],
405
502
  MetalKit: [],
406
503
  DatadogCore: [],
@@ -415,6 +512,7 @@ var OPTIONAL_FRAMEWORK_DEPENDENCIES = {
415
512
  Intercom: [],
416
513
  FirebaseCore: [],
417
514
  FirebaseSharedSwift: ["FirebaseCore"],
515
+ FirebaseRemoteConfig: ["FirebaseCore", "FirebaseSharedSwift"],
418
516
  FirebaseFirestoreInternal: ["FirebaseCore"],
419
517
  FirebaseAnalytics: ["FirebaseCore"],
420
518
  FirebaseAppCheck: ["FirebaseCore"],
@@ -422,6 +520,7 @@ var OPTIONAL_FRAMEWORK_DEPENDENCIES = {
422
520
  FirebaseCrashlytics: ["FirebaseCore"],
423
521
  FirebaseFirestore: ["FirebaseCore", "FirebaseSharedSwift", "FirebaseFirestoreInternal"],
424
522
  FirebaseStorage: ["FirebaseCore"],
523
+ GoogleMobileAds: [],
425
524
  FBAudienceNetwork: []
426
525
  };
427
526
  var OPTIONAL_FRAMEWORKS = new Set(Object.keys(OPTIONAL_FRAMEWORK_DEPENDENCIES));
@@ -565,7 +664,11 @@ function swiftTargetDependencies(files, targets) {
565
664
  const siblings = /* @__PURE__ */ new Map();
566
665
  for (const target of targets) {
567
666
  const prefix = target.path === "." ? "" : `${target.path}/`;
568
- const deps = /* @__PURE__ */ new Set();
667
+ const deps = new Set(
668
+ (target.dependencies ?? []).flatMap(
669
+ (dependency) => dependency.kind === "target" && dependency.name !== target.name && names.has(dependency.name) ? [dependency.name] : []
670
+ )
671
+ );
569
672
  for (const [file, contents] of Object.entries(files)) {
570
673
  if (file === "Package.swift" || !file.startsWith(prefix)) continue;
571
674
  if (targets.some(
@@ -589,17 +692,17 @@ var FOUNDATION_IMPLICIT_MODULES = [
589
692
  "PeachObjC",
590
693
  "Dispatch",
591
694
  "FoundationNetworking",
592
- "WASILibc",
593
- "wasi_pthread"
695
+ "PeachFoundationCombine",
696
+ "Darwin"
594
697
  ];
595
698
  var FOUNDATION_IMPLICIT_FLAGS = FOUNDATION_IMPLICIT_MODULES.map(
596
699
  (module) => `, "-Xfrontend", "-import-module", "-Xfrontend", "${module}"`
597
700
  ).join("");
598
701
  var ONE_IMPLICIT_FLAGS = ', "-Xfrontend", "-import-module", "-Xfrontend", "One"';
599
- var MULTI_MANIFEST_VERSION = 12;
702
+ var MULTI_MANIFEST_VERSION = 18;
600
703
  function swiftArtifactHash(input, release, moduleRoot) {
601
704
  const hash = createHash2("sha256");
602
- hash.update(`swift-compile/v20
705
+ hash.update(`swift-compile/v23
603
706
  ${release}
604
707
  `);
605
708
  if (input.oneModule) hash.update("one-module\n");
@@ -608,6 +711,13 @@ ${release}
608
711
  hash.update(createHash2("sha256").update(file).digest());
609
712
  hash.update(createHash2("sha256").update(input.files[file]).digest());
610
713
  }
714
+ for (const file of Object.keys(input.metalSources ?? {}).sort()) {
715
+ hash.update("metal-source\n");
716
+ hash.update(createHash2("sha256").update(file).digest());
717
+ hash.update(
718
+ createHash2("sha256").update(input.metalSources?.[file] ?? "").digest()
719
+ );
720
+ }
611
721
  for (const base of Object.keys(input.resources ?? {}).sort()) {
612
722
  hash.update(createHash2("sha256").update(base).digest());
613
723
  hash.update(
@@ -625,6 +735,19 @@ ${release}
625
735
  hash.update("resource-path\n");
626
736
  hash.update(createHash2("sha256").update(file).digest());
627
737
  }
738
+ hash.update(
739
+ JSON.stringify(
740
+ [...input.resourceBundles ?? []].sort((a, b) => a.target.localeCompare(b.target))
741
+ )
742
+ );
743
+ for (const target of Object.keys(input.libraries ?? {}).sort()) {
744
+ hash.update(`library
745
+ ${target}
746
+ `);
747
+ hash.update(
748
+ createHash2("sha256").update(input.libraries?.[target] ?? "").digest()
749
+ );
750
+ }
628
751
  const targets = compileTargets(input);
629
752
  if (targets.length > 0) {
630
753
  hash.update(`swift-multi/v${MULTI_MANIFEST_VERSION}
@@ -660,10 +783,22 @@ function emitSwiftPackageManifest(args) {
660
783
  if (!executable) throw new Error("swift-compile: no executable target to emit");
661
784
  const stanza = (target) => {
662
785
  const isolation = target.mainActorIsolation ? " .defaultIsolation(MainActor.self)," : "";
786
+ const interoperability = target.cxxInterop ? " .interoperabilityMode(.Cxx)," : "";
787
+ const defines = (target.defines ?? []).map((name) => ` .define(${JSON.stringify(name)}),`).join("");
663
788
  const imports = distribution ? `, "-I", ${JSON.stringify(path2.join(moduleRoot, "modules"))}` : "";
664
- const swiftSettings = `swiftSettings: [.swiftLanguageMode(.v${target.languageMode}),${isolation} .unsafeFlags(["-Osize"${FOUNDATION_IMPLICIT_FLAGS}${oneModule ? ONE_IMPLICIT_FLAGS : ""}${imports}])]`;
789
+ const native = args.native?.get(target.name);
790
+ const nativeImports = (siblings.get(target.name) ?? []).filter((name) => args.native?.has(name)).map(
791
+ (name) => `, "-Xfrontend", "-import-module", "-Xfrontend", ${JSON.stringify(name)}`
792
+ ).join("");
793
+ const header = args.headerDirectory && [...args.native?.values() ?? []].some(
794
+ (value) => value.late.producers.includes(target.name)
795
+ ) ? `, "-emit-objc-header-path", ${JSON.stringify(path2.join(args.headerDirectory, `${target.name}-Swift.h`))}` : "";
796
+ const swiftSettings = `swiftSettings: [.swiftLanguageMode(.v${target.languageMode}),${isolation}${interoperability}${defines} .unsafeFlags(["-Osize"${FOUNDATION_IMPLICIT_FLAGS}${oneModule ? ONE_IMPLICIT_FLAGS : ""}${imports}${nativeImports}${header}])]`;
665
797
  const deps = [
666
- ...distribution ? [] : [
798
+ ...target.executable ? [...args.native?.values() ?? []].map(
799
+ (value) => JSON.stringify(value.late.name)
800
+ ) : [],
801
+ ...distribution || native ? [] : [
667
802
  '.product(name: "SwiftUI", package: "sootsim-swift")',
668
803
  ...oneModule ? [ONE_PRODUCT] : [],
669
804
  ...spriteKit ? [SPRITEKIT_PRODUCT] : []
@@ -684,13 +819,15 @@ function emitSwiftPackageManifest(args) {
684
819
  "-Xlinker", "--export-if-defined=__main_argc_argv"${library},
685
820
  ]),
686
821
  .unsafeFlags(["-Xlinker", "--strip-all"], .when(configuration: .release)),
687
- ]` : "";
822
+ ]` : args.libraries?.has(target.name) ? `,
823
+ linkerSettings: [.unsafeFlags([${JSON.stringify(args.libraries.get(target.name))}])]` : "";
688
824
  return [
689
825
  ` ${kind}(`,
690
826
  ` name: "${target.name}",`,
691
827
  ` dependencies: [${deps}],`,
692
828
  ` path: "${target.path}",`,
693
- ` ${swiftSettings}${link}`,
829
+ ...native ? [` exclude: ${JSON.stringify(native.lateSources)},`] : [],
830
+ ` ${native ? "cxxSettings: []" : swiftSettings}${link}`,
694
831
  ` ),`
695
832
  ].join("\n");
696
833
  };
@@ -705,7 +842,16 @@ function emitSwiftPackageManifest(args) {
705
842
  ` dependencies: [${distribution ? "" : `.package(path: "${moduleRoot}")`}],`,
706
843
  " targets: [",
707
844
  ...targets.map(stanza),
708
- " ]",
845
+ ...[...args.native?.entries() ?? []].flatMap(([name, native]) => [
846
+ ` .target(name: ${JSON.stringify(native.late.name)},`,
847
+ ` dependencies: ${JSON.stringify([name, ...native.late.producers])},`,
848
+ ` path: ${JSON.stringify(native.path)},`,
849
+ ` sources: ${JSON.stringify(native.lateSources)},`,
850
+ ` publicHeadersPath: "include",`,
851
+ ` cxxSettings: [.unsafeFlags(["-fno-cxx-modules", "-I", ${JSON.stringify(native.includeDirectory)}, "-I", ${JSON.stringify(args.headerDirectory)}])]),`
852
+ ]),
853
+ args.cxxLanguageStandard ? ` ],
854
+ cxxLanguageStandard: .${args.cxxLanguageStandard}` : " ]",
709
855
  ")",
710
856
  ""
711
857
  ].join("\n");
@@ -722,9 +868,10 @@ function syncSwiftTree(base, files) {
722
868
  };
723
869
  walk(base);
724
870
  for (const [full, contents] of files) {
725
- if (existsSync(full) && readFileSync2(full, "utf8") === contents) continue;
871
+ if (existsSync(full) && (typeof contents === "string" ? readFileSync2(full, "utf8") === contents : readFileSync2(full).equals(contents)))
872
+ continue;
726
873
  mkdirSync(path2.dirname(full), { recursive: true });
727
- writeFileSync(full, contents, "utf8");
874
+ writeFileSync(full, contents);
728
875
  }
729
876
  }
730
877
  var DIRECTIVE = /^[ \t]*#(?:if|elseif)\b/;
@@ -1842,6 +1989,8 @@ function prepareSwiftDependency(source, destination) {
1842
1989
  copy(source, destination, true);
1843
1990
  }
1844
1991
  function writeSwiftProject(layout, input, moduleRoot) {
1992
+ if (input.resourceBundles !== void 0 && !isSwiftResourceBundles(input.resourceBundles))
1993
+ throw new Error("swift compile input has invalid target bundle assignments");
1845
1994
  const resourceTargets = swiftManifestTargets(
1846
1995
  input.files["Package.swift"] ?? "",
1847
1996
  input.resourcePaths
@@ -1858,6 +2007,80 @@ function writeSwiftProject(layout, input, moduleRoot) {
1858
2007
  }
1859
2008
  ] : compileTargets(input);
1860
2009
  const files = /* @__PURE__ */ new Map();
2010
+ const native = /* @__PURE__ */ new Map();
2011
+ const headerDirectory = path2.join(layout.root, ".build", "peach-cxx-headers");
2012
+ for (const target of targets) {
2013
+ const prefix = target.path === "." ? "" : `${target.path}/`;
2014
+ const entries = Object.entries(input.files).filter(
2015
+ ([file]) => file.startsWith(prefix) && !targets.some(
2016
+ (candidate) => candidate.name !== target.name && candidate.path !== "." && candidate.path.startsWith(prefix) && file.startsWith(`${candidate.path}/`)
2017
+ )
2018
+ );
2019
+ if (entries.some(([file]) => file.endsWith(".swift"))) continue;
2020
+ const units = entries.filter(([file]) => /\.(?:c|cc|cpp|cxx|m|mm)$/.test(file));
2021
+ if (units.length === 0) continue;
2022
+ const includes = `${prefix}include/`;
2023
+ const consumers = /* @__PURE__ */ new Map();
2024
+ const reverse = /* @__PURE__ */ new Map();
2025
+ for (const [file, contents] of entries) {
2026
+ const producers = /* @__PURE__ */ new Set();
2027
+ const source = contents.replace(/\/\*[\s\S]*?\*\//g, "");
2028
+ for (const match of source.matchAll(/^\s*#\s*include\s*[<"]([^>"]+)[>"]/gm)) {
2029
+ const include = match[1];
2030
+ const producer = /(?:^|\/)([^/]+)-Swift\.h$/.exec(include)?.[1];
2031
+ if (producer && targets.some((value) => value.name === producer))
2032
+ producers.add(producer);
2033
+ const local = [
2034
+ path2.posix.join(path2.posix.dirname(file), include),
2035
+ `${includes}${include}`
2036
+ ].find((candidate) => input.files[candidate] !== void 0);
2037
+ if (local) {
2038
+ reverse.set(local, [...reverse.get(local) ?? [], file]);
2039
+ }
2040
+ }
2041
+ consumers.set(file, producers);
2042
+ }
2043
+ const queue = [...consumers.keys()].filter((file) => consumers.get(file).size > 0);
2044
+ for (let index = 0; index < queue.length; index++) {
2045
+ const file = queue[index];
2046
+ for (const parent of reverse.get(file) ?? []) {
2047
+ const inherited = consumers.get(parent);
2048
+ const before = inherited.size;
2049
+ for (const producer of consumers.get(file)) inherited.add(producer);
2050
+ if (before !== inherited.size) queue.push(parent);
2051
+ }
2052
+ }
2053
+ const late = units.filter(([file]) => consumers.get(file).size > 0);
2054
+ if (late.length === 0) continue;
2055
+ native.set(target.name, {
2056
+ path: target.path,
2057
+ includeDirectory: path2.join(layout.root, includes),
2058
+ lateSources: late.map(([file]) => file.slice(prefix.length)),
2059
+ late: {
2060
+ name: `${target.name}SwiftImplementation`,
2061
+ producers: [
2062
+ ...new Set(late.flatMap(([file]) => [...consumers.get(file)]))
2063
+ ].sort()
2064
+ }
2065
+ });
2066
+ if (input.files[`${includes}module.modulemap`] !== void 0) continue;
2067
+ const roots = entries.filter(
2068
+ ([file]) => file.startsWith(includes) && /\.(?:h|hpp|hh|hxx)$/.test(file) && consumers.get(file).size === 0
2069
+ );
2070
+ files.set(
2071
+ path2.join(layout.root, includes, "module.modulemap"),
2072
+ [
2073
+ `module ${target.name} {`,
2074
+ ...roots.map(
2075
+ ([file]) => ` header ${JSON.stringify(file.slice(includes.length))}`
2076
+ ),
2077
+ " export *",
2078
+ "}",
2079
+ ""
2080
+ ].join("\n")
2081
+ );
2082
+ }
2083
+ if (native.size > 0) mkdirSync(headerDirectory, { recursive: true });
1861
2084
  const modulePlan = createHash2("sha256").update(
1862
2085
  swiftModuleInputFiles(moduleRoot).join("\n")
1863
2086
  );
@@ -1866,7 +2089,11 @@ function writeSwiftProject(layout, input, moduleRoot) {
1866
2089
  }
1867
2090
  const resourcePlan = createHash2("sha256").update(
1868
2091
  JSON.stringify(
1869
- resourceTargets.filter((target) => target.resources).map((target) => [target.name, target.path])
2092
+ resourceTargets.filter((target) => target.resources).map((target) => [
2093
+ target.name,
2094
+ target.path,
2095
+ input.resourceBundles?.find((bundle) => bundle.target === target.name)?.path
2096
+ ])
1870
2097
  )
1871
2098
  ).digest("hex").slice(0, 16);
1872
2099
  const moduleFiles = `
@@ -1926,6 +2153,12 @@ function writeSwiftProject(layout, input, moduleRoot) {
1926
2153
  files.set(path2.join(layout.root, "Package.swift"), manifest + moduleFiles);
1927
2154
  } else {
1928
2155
  const base = layout.multi ? layout.root : layout.sources;
2156
+ const libraries = /* @__PURE__ */ new Map();
2157
+ for (const [target, data] of Object.entries(input.libraries ?? {})) {
2158
+ const file = path2.join(layout.root, ".peach-libraries", `lib${target}.a`);
2159
+ files.set(file, Buffer.from(data, "base64"));
2160
+ libraries.set(target, file);
2161
+ }
1929
2162
  for (const [file, contents] of Object.entries(input.files)) {
1930
2163
  if (file === "Package.swift") continue;
1931
2164
  files.set(
@@ -1937,6 +2170,11 @@ function writeSwiftProject(layout, input, moduleRoot) {
1937
2170
  path2.join(layout.root, "Package.swift"),
1938
2171
  emitSwiftPackageManifest({
1939
2172
  targets,
2173
+ native,
2174
+ headerDirectory: native.size > 0 ? headerDirectory : void 0,
2175
+ cxxLanguageStandard: swiftManifestCxxLanguageStandard(
2176
+ input.files["Package.swift"] ?? ""
2177
+ ),
1940
2178
  siblings: swiftTargetDependencies(
1941
2179
  input.files,
1942
2180
  layout.multi ? targets : targets.map((target) => ({ ...target, path: "." }))
@@ -1944,12 +2182,20 @@ function writeSwiftProject(layout, input, moduleRoot) {
1944
2182
  moduleRoot,
1945
2183
  oneModule: input.oneModule,
1946
2184
  spriteKit: importsSpriteKit(input.files),
1947
- distribution: distribution ?? void 0
2185
+ distribution: distribution ?? void 0,
2186
+ libraries
1948
2187
  }) + moduleFiles
1949
2188
  );
1950
2189
  }
1951
2190
  for (const target of resourceTargets) {
1952
2191
  if (!target.resources) continue;
2192
+ const bundle = input.resourceBundles?.find(
2193
+ (candidate) => candidate.target === target.name
2194
+ );
2195
+ if (!bundle || bundle.sourcePath !== target.path)
2196
+ throw new Error(
2197
+ `swift resource target ${target.name} has no matching bundle assignment`
2198
+ );
1953
2199
  const directory = layout.multi ? path2.join(layout.root, target.path) : layout.sources;
1954
2200
  files.set(
1955
2201
  path2.join(directory, "ResourceBundleAccessor.generated.swift"),
@@ -1957,7 +2203,11 @@ function writeSwiftProject(layout, input, moduleRoot) {
1957
2203
  "import Foundation",
1958
2204
  "",
1959
2205
  "extension Foundation.Bundle {",
1960
- " static let module: Bundle = Bundle.main",
2206
+ bundle.path === "." ? " static let module: Bundle = Bundle.main" : ` static let module: Bundle = {
2207
+ let url = Bundle.main.bundleURL.appendingPathComponent(${JSON.stringify(bundle.path)})
2208
+ guard let bundle = Bundle(url: url) else { fatalError("resource bundle is missing: ${bundle.target}") }
2209
+ return bundle
2210
+ }()`,
1961
2211
  "}",
1962
2212
  ""
1963
2213
  ].join("\n")
@@ -2025,7 +2275,7 @@ function compileSwiftProjectUnit(input, options) {
2025
2275
  };
2026
2276
  const hash = swiftArtifactHash(input, options.release, moduleRoot);
2027
2277
  return serialize(root, async () => {
2028
- if (process.platform === "darwin" && process.env.TM_SESSION && process.env.CI !== "true" && process.env.CONTRAST_HEAVY_ADMITTED !== "1" && moduleRoot === path2.resolve(import.meta.dirname, "../../sootsim-swift") && !swiftDistributionAt(moduleRoot)) {
2278
+ if (process.platform === "darwin" && process.env.TM_SESSION && process.env.CI !== "true" && moduleRoot === path2.resolve(import.meta.dirname, "../../sootsim-swift") && !swiftDistributionAt(moduleRoot)) {
2029
2279
  const requestRoot = mkdtempSync(path2.join(root, ".builder-request-"));
2030
2280
  const output = path2.join(requestRoot, "output");
2031
2281
  const request = path2.join(requestRoot, "request.json");
@@ -2050,7 +2300,11 @@ function compileSwiftProjectUnit(input, options) {
2050
2300
  "--output",
2051
2301
  output
2052
2302
  ],
2053
- { cwd: repo, timeout: options.timeoutMs, maxBuffer: 64 * 1024 * 1024 }
2303
+ {
2304
+ cwd: repo,
2305
+ timeout: options.timeoutMs,
2306
+ maxBuffer: 64 * 1024 * 1024
2307
+ }
2054
2308
  );
2055
2309
  pending.child.stdout?.on("data", (bytes2) => process.stdout.write(bytes2));
2056
2310
  pending.child.stderr?.on("data", (bytes2) => process.stderr.write(bytes2));
@@ -2082,7 +2336,11 @@ function compileSwiftProjectUnit(input, options) {
2082
2336
  `swift-compile: no swift.org toolchain at ${options.toolchainBin}; install ${options.release} and its matching wasm sdk`
2083
2337
  );
2084
2338
  }
2085
- const macroPlugins = await ensureMacroPlugins(moduleRoot, options.toolchainBin);
2339
+ const macroPlugins = await ensureMacroPlugins(
2340
+ moduleRoot,
2341
+ options.toolchainBin,
2342
+ options.release
2343
+ );
2086
2344
  const sdk = swiftModuleSdk(moduleRoot).wasmSdkId;
2087
2345
  const icu = swiftIcuAsset(options.toolchainBin, sdk);
2088
2346
  try {
@@ -2090,6 +2348,8 @@ function compileSwiftProjectUnit(input, options) {
2090
2348
  swift,
2091
2349
  [
2092
2350
  "build",
2351
+ "--build-system",
2352
+ "native",
2093
2353
  "-j",
2094
2354
  BUILD_JOBS,
2095
2355
  "--package-path",