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
@@ -27,6 +27,13 @@ export type SwiftManifestTargetType = (typeof TARGET_TYPES)[number]
27
27
  const isTargetType = (value: string | undefined): value is SwiftManifestTargetType =>
28
28
  TARGET_TYPES.some((type) => type === value)
29
29
 
30
+ /** a swift condition a target defines on ios, and the swiftpm build
31
+ * configuration it needs (null applies in both). */
32
+ export interface SwiftManifestDefine {
33
+ name: string
34
+ configuration: 'debug' | 'release' | null
35
+ }
36
+
30
37
  export interface SwiftManifestTarget {
31
38
  name: string
32
39
  type: SwiftManifestTargetType
@@ -40,6 +47,7 @@ export interface SwiftManifestTarget {
40
47
  dependencies: SwiftTargetDependency[]
41
48
  languageMode: number
42
49
  mainActorIsolation: boolean
50
+ defines: SwiftManifestDefine[]
43
51
  /** true when the target declares `resources:`. */
44
52
  declaresResources: boolean
45
53
  /** a binary target's archive url; a local one's artifact is `dir`. */
@@ -49,6 +57,7 @@ export interface SwiftManifestTarget {
49
57
  }
50
58
 
51
59
  export interface SwiftPackageManifest {
60
+ name: string
52
61
  dir: string
53
62
  /** library product name to the targets it vends. */
54
63
  products: Map<string, string[]>
@@ -240,13 +249,28 @@ export function swiftPackageManifest(dir: string): SwiftPackageManifest {
240
249
  }
241
250
  let languageMode = packageMode
242
251
  let mainActorIsolation = false
252
+ const defines: SwiftManifestDefine[] = []
243
253
  for (const setting of array(target.settings)) {
244
- const settingKind = record(record(setting).kind)
254
+ const { kind: rawKind, tool, condition } = record(setting)
255
+ const settingKind = record(rawKind)
245
256
  const mode = string(record(settingKind.swiftLanguageMode)._0)
246
257
  if (mode)
247
258
  languageMode = Math.max(5, Number(/^(\d+)/.exec(mode)?.[1] ?? languageMode))
248
259
  if (string(record(settingKind.defaultIsolation)._0) === 'MainActor')
249
260
  mainActorIsolation = true
261
+ const define = string(record(settingKind.define)._0)
262
+ if (
263
+ define &&
264
+ string(tool) === 'swift' &&
265
+ /^[A-Za-z_][A-Za-z0-9_]*$/.test(define) &&
266
+ linksOnIOS(condition, traits)
267
+ ) {
268
+ const config = string(record(condition).config)
269
+ defines.push({
270
+ name: define,
271
+ configuration: config === 'debug' || config === 'release' ? config : null,
272
+ })
273
+ }
250
274
  }
251
275
  targets.set(name, {
252
276
  name,
@@ -260,12 +284,15 @@ export function swiftPackageManifest(dir: string): SwiftPackageManifest {
260
284
  dependencies,
261
285
  languageMode,
262
286
  mainActorIsolation,
287
+ defines,
263
288
  declaresResources: array(target.resources).length > 0,
264
289
  url: string(target.url) ?? null,
265
290
  checksum: string(target.checksum) ?? null,
266
291
  })
267
292
  }
268
- const manifest = { dir, products, targets, packages }
293
+ const name = string(raw.name)
294
+ if (!name) throw new Error(`swiftpm returned no package name for ${dir}`)
295
+ const manifest = { name, dir, products, targets, packages }
269
296
  evaluated.set(key, manifest)
270
297
  return manifest
271
298
  }
@@ -1,3 +1,5 @@
1
+ import type { SwiftResourceBundle } from './swiftContract'
2
+
1
3
  /** one SwiftPM target a sent root manifest declares. */
2
4
  export interface SwiftPackageTarget {
3
5
  /** the target name, as `import <name>` spells it. */
@@ -10,8 +12,16 @@ export interface SwiftPackageTarget {
10
12
  languageMode: number
11
13
  /** true when the target declares `.defaultIsolation(MainActor.self)`. */
12
14
  mainActorIsolation: boolean
15
+ /** true when the target declares unconditional C++ interoperability. */
16
+ cxxInterop?: boolean
17
+ /** compilation conditions the target declares unconditionally with `.define`. */
18
+ defines?: string[]
13
19
  /** true when declared or implicit resources give the target `Bundle.module`. */
14
20
  resources: boolean
21
+ /** declared dependencies on other targets in the same package. */
22
+ dependencies?: SwiftTargetDependency[]
23
+ /** explicit target-relative exclusions retained for resource discovery. */
24
+ exclude?: string[]
15
25
  }
16
26
 
17
27
  /** whether a project-relative key is a SwiftPM manifest, not a source. */
@@ -65,7 +75,10 @@ function manifestCalls(manifest: string, kinds: readonly string[]): ManifestCall
65
75
  const calls: ManifestCall[] = []
66
76
  // every declaration kind is scanned, so a `.target(name:)` dependency
67
77
  // nested in an unrequested `.testTarget(` is skipped as part of it
68
- const pattern = new RegExp(`\\.(${MANIFEST_DECLARATIONS.join('|')})\\s*\\(`, 'g')
78
+ const pattern = new RegExp(
79
+ `(?:\\.(${MANIFEST_DECLARATIONS.join('|')})|\\b(Package))\\s*\\(`,
80
+ 'g',
81
+ )
69
82
  let match: RegExpExecArray | null
70
83
  while ((match = pattern.exec(code)) !== null) {
71
84
  let depth = 1
@@ -95,14 +108,49 @@ function manifestCalls(manifest: string, kinds: readonly string[]): ManifestCall
95
108
  }
96
109
  i++
97
110
  }
98
- if (kinds.includes(match[1]!))
99
- calls.push({ kind: match[1]!, flat, call: code.slice(start, i) })
111
+ const kind = match[1] ?? match[2]!
112
+ if (kinds.includes(kind)) calls.push({ kind, flat, call: code.slice(start, i) })
113
+ else if (kind === 'Package') {
114
+ // target declarations are arguments of the root Package call.
115
+ calls.push(...manifestCalls(code.slice(start, i - 1), kinds))
116
+ }
100
117
  // declarations never nest, so a call inside one is part of it
101
118
  pattern.lastIndex = i
102
119
  }
103
120
  return calls
104
121
  }
105
122
 
123
+ function splitManifestArguments(source: string): string[] {
124
+ const arguments_: string[] = []
125
+ let start = 0
126
+ let parentheses = 0
127
+ let brackets = 0
128
+ let braces = 0
129
+ let inString = false
130
+ let escaped = false
131
+ for (let index = 0; index < source.length; index++) {
132
+ const character = source[index]
133
+ if (inString) {
134
+ if (escaped) escaped = false
135
+ else if (character === '\\') escaped = true
136
+ else if (character === '"') inString = false
137
+ } else if (character === '"') inString = true
138
+ else if (character === '(') parentheses++
139
+ else if (character === ')') parentheses--
140
+ else if (character === '[') brackets++
141
+ else if (character === ']') brackets--
142
+ else if (character === '{') braces++
143
+ else if (character === '}') braces--
144
+ else if (character === ',' && parentheses === 0 && brackets === 0 && braces === 0) {
145
+ arguments_.push(source.slice(start, index).trim())
146
+ start = index + 1
147
+ }
148
+ }
149
+ const final = source.slice(start).trim()
150
+ if (final) arguments_.push(final)
151
+ return arguments_
152
+ }
153
+
106
154
  /** a target dependency: a target of the same package, or another package's product. */
107
155
  export type SwiftTargetDependency =
108
156
  | { kind: 'target'; name: string }
@@ -129,10 +177,14 @@ export function swiftManifestTargets(
129
177
  ): SwiftPackageTarget[] {
130
178
  const implicitResources = swiftImplicitResourcePaths(resourcePaths)
131
179
  const targets: SwiftPackageTarget[] = []
132
- for (const { kind, flat, call } of manifestCalls(manifest, [
133
- 'executableTarget',
134
- 'target',
135
- ])) {
180
+ const declarations = manifestCalls(manifest, ['executableTarget', 'target'])
181
+ const targetNames = new Set(
182
+ declarations.flatMap(({ flat }) => {
183
+ const name = /\bname\s*:\s*"([^"]+)"/.exec(flat)?.[1]
184
+ return name ? [name] : []
185
+ }),
186
+ )
187
+ for (const { kind, flat, call } of declarations) {
136
188
  const executable = kind === 'executableTarget'
137
189
  const name = /\bname\s*:\s*"([^"]+)"/.exec(flat)?.[1]
138
190
  if (!name) continue
@@ -147,6 +199,12 @@ export function swiftManifestTargets(
147
199
  /\.swiftLanguageMode\(\s*\.v(\d+)\s*\)/.exec(call)?.[1] ?? '5',
148
200
  )
149
201
  const mainActorIsolation = /\.defaultIsolation\(\s*MainActor\.self\s*\)/.test(call)
202
+ const cxxInterop = /\.interoperabilityMode\(\s*\.Cxx\s*\)/.test(
203
+ call.replace(/"(?:\\.|[^"\\])*"/g, ''),
204
+ )
205
+ const defines = [
206
+ ...call.matchAll(/\.define\(\s*"([A-Za-z_][A-Za-z0-9_]*)"\s*\)/g),
207
+ ].map((match) => match[1]!)
150
208
  const excluded = [
151
209
  ...(/\bexclude\s*:\s*\[([^\]]*)\]/.exec(flat)?.[1] ?? '').matchAll(/"([^"]+)"/g),
152
210
  ].map((match) => match[1].replace(/^\.\//, '').replace(/\/+$/, ''))
@@ -164,29 +222,141 @@ export function swiftManifestTargets(
164
222
  return false
165
223
  return true
166
224
  })
225
+ const targetArguments = splitManifestArguments(call.slice(0, -1))
226
+ const dependencyArgument = targetArguments.find((argument) =>
227
+ /^dependencies\s*:/.test(argument),
228
+ )
229
+ const dependencyList = dependencyArgument?.replace(/^dependencies\s*:\s*/, '').trim()
230
+ const dependencyNames = new Set<string>()
231
+ if (dependencyList?.startsWith('[') && dependencyList.endsWith(']')) {
232
+ for (const dependency of splitManifestArguments(dependencyList.slice(1, -1))) {
233
+ const dependencyName =
234
+ /^"([^"]+)"$/.exec(dependency)?.[1] ??
235
+ /^\.(?:target|byName)\s*\(\s*name\s*:\s*"([^"]+)"/.exec(dependency)?.[1]
236
+ if (dependencyName && targetNames.has(dependencyName))
237
+ dependencyNames.add(dependencyName)
238
+ }
239
+ }
240
+ const dependencies: SwiftTargetDependency[] = [...dependencyNames].map((name) => ({
241
+ kind: 'target',
242
+ name,
243
+ }))
167
244
  targets.push({
168
245
  name,
169
246
  path: targetPath,
170
247
  executable,
171
248
  languageMode,
172
249
  mainActorIsolation,
250
+ ...(cxxInterop ? { cxxInterop: true } : {}),
251
+ ...(defines.length === 0 ? {} : { defines }),
173
252
  resources,
253
+ ...(dependencies.length === 0 ? {} : { dependencies }),
254
+ ...(excluded.length === 0 ? {} : { exclude: excluded }),
174
255
  })
175
256
  }
176
257
  return targets
177
258
  }
178
259
 
260
+ /** the root package's declared C++ language standard. */
261
+ export function swiftManifestCxxLanguageStandard(manifest: string): string | undefined {
262
+ const declaration = manifestCalls(manifest, ['Package'])[0]
263
+ if (!declaration) return undefined
264
+ const code = declaration.flat.replace(/"(?:\\.|[^"\\])*"/g, '')
265
+ return /\bcxxLanguageStandard\s*:\s*\.(\w+)/.exec(code)?.[1]
266
+ }
267
+
268
+ /** target resource bundles in the original package, before source rewriting. */
269
+ export function swiftResourceBundles(
270
+ files: Record<string, string>,
271
+ resourcePaths: readonly string[] = [],
272
+ ): SwiftResourceBundle[] {
273
+ const manifest = files['Package.swift'] ?? ''
274
+ const targets = swiftManifestTargets(manifest, resourcePaths).filter(
275
+ (target) => target.resources,
276
+ )
277
+ if (targets.length === 0) return []
278
+ const declaration = manifestCalls(manifest, ['Package'])[0]
279
+ const packageName =
280
+ declaration && /\bname\s*:\s*"([^"/\\]+)"/.exec(declaration.flat)?.[1]
281
+ if (!packageName)
282
+ throw new Error('swift resource bundles require the original package name')
283
+ return targets.map((target) => ({
284
+ target: target.name,
285
+ sourcePath: target.path,
286
+ path: `${packageName}_${target.name}.bundle`,
287
+ }))
288
+ }
289
+
290
+ /** the one resource target owning a canonical compile-input file. */
291
+ export function swiftResourceBundleForFile(
292
+ bundles: readonly SwiftResourceBundle[],
293
+ file: string,
294
+ ): SwiftResourceBundle | undefined {
295
+ let owner: SwiftResourceBundle | undefined
296
+ for (const bundle of bundles) {
297
+ const prefix = bundle.sourcePath === '.' ? '' : `${bundle.sourcePath}/`
298
+ if (
299
+ file.startsWith(prefix) &&
300
+ (!owner || bundle.sourcePath.length > owner.sourcePath.length)
301
+ )
302
+ owner = bundle
303
+ }
304
+ return owner
305
+ }
306
+
307
+ /** the marker Foundation needs to open a copied resource bundle. */
308
+ export function swiftResourceBundleInfoPlist(bundle: SwiftResourceBundle): string {
309
+ const name = bundle.path
310
+ .split('/')
311
+ .pop()!
312
+ .replace(/\.(bundle|framework)$/, '')
313
+ const escaped = name
314
+ .replaceAll('&', '&amp;')
315
+ .replaceAll('<', '&lt;')
316
+ .replaceAll('>', '&gt;')
317
+ return `<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><dict><key>CFBundleName</key><string>${escaped}</string><key>CFBundlePackageType</key><string>${bundle.path.endsWith('.framework') ? 'FMWK' : 'BNDL'}</string></dict></plist>`
318
+ }
319
+
320
+ /** original metal sources that belong to the package's declared targets. */
321
+ export function swiftMetalSourceFiles(
322
+ files: Record<string, string>,
323
+ ): Record<string, string> {
324
+ const sources = Object.entries(files).filter(([file]) => file.endsWith('.metal'))
325
+ if (sources.length === 0) return {}
326
+ const targets = swiftManifestTargets(files['Package.swift'] ?? '')
327
+ return Object.fromEntries(
328
+ sources.filter(([file]) => {
329
+ if (targets.length === 0) return true
330
+ return targets.some((target) => {
331
+ const prefix = target.path === '.' ? '' : `${target.path}/`
332
+ if (!file.startsWith(prefix)) return false
333
+ const relative = file.slice(prefix.length)
334
+ return !(target.exclude ?? []).some(
335
+ (excluded) => relative === excluded || relative.startsWith(`${excluded}/`),
336
+ )
337
+ })
338
+ }),
339
+ )
340
+ }
341
+
179
342
  /**
180
343
  * the target partition a root manifest declares for the compile. a single
181
- * executable target at the package root (`path: "."`) holds the whole project,
182
- * which is the compiler's single-target shape, so it declares no partition.
344
+ * executable target at the package root (`path: "."`) holds the whole project and
345
+ * can use the compiler's single-target template only with its default settings.
183
346
  */
184
347
  export function swiftPackagePartition(
185
348
  manifest: string,
186
349
  resourcePaths: readonly string[] = [],
187
350
  ): SwiftPackageTarget[] {
188
351
  const targets = swiftManifestTargets(manifest, resourcePaths)
189
- return targets.length === 1 && targets[0].executable && targets[0].path === '.'
352
+ return targets.length === 1 &&
353
+ targets[0].executable &&
354
+ targets[0].path === '.' &&
355
+ targets[0].languageMode === 5 &&
356
+ !targets[0].mainActorIsolation &&
357
+ !targets[0].defines?.length &&
358
+ !targets[0].cxxInterop &&
359
+ !swiftManifestCxxLanguageStandard(manifest)
190
360
  ? []
191
361
  : targets
192
362
  }
@@ -18,6 +18,7 @@ import {
18
18
  import {
19
19
  swiftPackageManifest,
20
20
  swiftTargetFiles,
21
+ type SwiftManifestDefine,
21
22
  type SwiftPackageManifest,
22
23
  } from './swift-package-manifest'
23
24
 
@@ -40,6 +41,8 @@ export interface SwiftPackageSourceTarget extends SwiftPackageTarget {
40
41
  /** the package directory, so a manifest edit reaches the compile. */
41
42
  packageDir: string
42
43
  remote: boolean
44
+ /** the conditions its manifest defines, before a build configuration picks them. */
45
+ packageDefines: SwiftManifestDefine[]
43
46
  }
44
47
 
45
48
  /** why a product or module does not compile, and where it comes from. */
@@ -252,6 +255,7 @@ export function resolveSwiftPackages(options: {
252
255
  files,
253
256
  packageDir: pkg.manifest.dir,
254
257
  remote: pkg.remote,
258
+ packageDefines: target.defines,
255
259
  executable: false,
256
260
  languageMode: target.languageMode,
257
261
  mainActorIsolation: target.mainActorIsolation,
@@ -87,6 +87,9 @@ export type StandinResult = {
87
87
  /** bump when emitted source changes: the stand-in cache keys on it. */
88
88
  export const STANDIN_EMIT_VERSION = '5'
89
89
 
90
+ /** the modules every stand-in source imports. */
91
+ export const STANDIN_IMPORTS = ['Foundation', 'UIKit']
92
+
90
93
  const TYPE_KINDS = new Set([
91
94
  'swift.class',
92
95
  'swift.struct',
@@ -912,7 +915,7 @@ export function emitSwiftStandin(
912
915
  emit(`}`)
913
916
  }
914
917
 
915
- const imports = ['Foundation', 'UIKit', ...(options.imports ?? [])]
918
+ const imports = [...STANDIN_IMPORTS, ...(options.imports ?? [])]
916
919
  const banner = [
917
920
  `// stand-in for the binary ${options.module} module, generated from ${options.source}.`,
918
921
  `// do not hand-edit: every body traps because the vendor binary cannot run`,