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
@@ -12,109 +12,22 @@ import plist from 'plist'
12
12
  import { readXcodeJsonProject } from './xcode-json-project'
13
13
  import type { SwiftLinkedProduct } from './swift-packages'
14
14
 
15
- export type PlistValue = string | PlistValue[] | { [key: string]: PlistValue }
16
- export type PlistDict = { [key: string]: PlistValue }
17
-
18
- // project.pbxproj is an old-style (openstep) property list: dictionaries,
19
- // arrays and strings, with c comments. node's plist package reads only xml.
20
- export function parseOpenStepPlist(text: string): PlistValue {
21
- let i = 0
22
- const fail = (message: string): never => {
23
- const line = text.slice(0, i).split('\n').length
24
- throw new Error(`project.pbxproj line ${line}: ${message}`)
25
- }
26
- const skip = () => {
27
- for (;;) {
28
- const ch = text[i]
29
- if (ch === ' ' || ch === '\t' || ch === '\n' || ch === '\r') i++
30
- else if (ch === '/' && text[i + 1] === '*') {
31
- const end = text.indexOf('*/', i + 2)
32
- if (end < 0) fail('unterminated comment')
33
- i = end + 2
34
- } else if (ch === '/' && text[i + 1] === '/') {
35
- const end = text.indexOf('\n', i)
36
- i = end < 0 ? text.length : end + 1
37
- } else return
38
- }
39
- }
40
- const quoted = (): string => {
41
- i++
42
- let out = ''
43
- for (;;) {
44
- const ch = text[i++]
45
- if (ch === undefined) fail('unterminated string')
46
- if (ch === '"') return out
47
- if (ch !== '\\') {
48
- out += ch
49
- continue
50
- }
51
- const next = text[i++]
52
- if (next === 'n') out += '\n'
53
- else if (next === 't') out += '\t'
54
- else if (next === 'r') out += '\r'
55
- else if (next === 'U') {
56
- out += String.fromCharCode(parseInt(text.slice(i, i + 4), 16))
57
- i += 4
58
- } else out += next
59
- }
60
- }
61
- const value = (): PlistValue => {
62
- skip()
63
- const ch = text[i]
64
- if (ch === '{') {
65
- i++
66
- const dict: PlistDict = {}
67
- for (;;) {
68
- skip()
69
- if (text[i] === '}') {
70
- i++
71
- return dict
72
- }
73
- const key = value()
74
- if (typeof key !== 'string') fail('dictionary key is not a string')
75
- skip()
76
- if (text[i++] !== '=') fail('expected =')
77
- dict[key as string] = value()
78
- skip()
79
- if (text[i++] !== ';') fail('expected ;')
80
- }
81
- }
82
- if (ch === '(') {
83
- i++
84
- const list: PlistValue[] = []
85
- for (;;) {
86
- skip()
87
- if (text[i] === ')') {
88
- i++
89
- return list
90
- }
91
- list.push(value())
92
- skip()
93
- if (text[i] === ',') i++
94
- else if (text[i] !== ')') fail('expected , or )')
95
- }
96
- }
97
- if (ch === '"') return quoted()
98
- const start = i
99
- while (i < text.length && /[A-Za-z0-9_$+/:.\-<>]/.test(text[i]!)) i++
100
- if (i === start) fail(`unexpected ${JSON.stringify(ch ?? 'end of file')}`)
101
- return text.slice(start, i)
102
- }
103
- if (text.startsWith('// !$*UTF8*$!')) i = text.indexOf('\n') + 1
104
- const root = value()
105
- skip()
106
- if (i !== text.length) fail('trailing content')
107
- return root
108
- }
109
-
110
- const isDict = (value: PlistValue | undefined): value is PlistDict =>
111
- typeof value === 'object' && value !== null && !Array.isArray(value)
112
- const str = (value: PlistValue | undefined): string | undefined =>
113
- typeof value === 'string' ? value : undefined
114
- const list = (value: PlistValue | undefined): string[] =>
115
- Array.isArray(value)
116
- ? value.filter((item): item is string => typeof item === 'string')
117
- : []
15
+ export {
16
+ parseOpenStepPlist,
17
+ type PlistValue,
18
+ type PlistDict,
19
+ isDict,
20
+ str,
21
+ list,
22
+ } from './openstep-plist'
23
+ import {
24
+ parseOpenStepPlist,
25
+ type PlistValue,
26
+ type PlistDict,
27
+ isDict,
28
+ str,
29
+ list,
30
+ } from './openstep-plist'
118
31
 
119
32
  /** a target whose swift compiles as one module: the app, or a framework it builds. */
120
33
  export interface XcodeModuleTarget {
@@ -123,10 +36,14 @@ export interface XcodeModuleTarget {
123
36
  moduleName: string
124
37
  /** absolute paths of the swift sources that are members of the target. */
125
38
  sources: string[]
39
+ /** the target's compiled sources in every language, swift or not. */
40
+ allSources: string[]
126
41
  /** absolute paths of every resource file the target copies, bundles expanded. */
127
42
  resources: string[]
128
43
  languageMode: number
129
44
  mainActorIsolation: boolean
45
+ /** the compilation conditions the build configuration defines, as `-D` passes them. */
46
+ defines: string[]
130
47
  }
131
48
 
132
49
  /** an application target, resolved to files on disk with everything it builds. */
@@ -136,14 +53,12 @@ export interface XcodeAppTarget extends XcodeModuleTarget {
136
53
  * local package the app builds from: every compile path is relative to it.
137
54
  */
138
55
  rootDir: string
139
- /** every project file (project.pbxproj or project.xcproj) the app's build reads. */
56
+ /** every project file (project.pbxproj or project.xcproj) and xcconfig the app's build reads. */
140
57
  projectFiles: string[]
141
58
  /** the target's processed launch plist, including generated build settings. */
142
59
  infoPlist: string
143
60
  infoPlistFile: string | null
144
61
  appIconName: string
145
- /** the target's compiled sources in every language, swift or not. */
146
- allSources: string[]
147
62
  /**
148
63
  * framework and library targets of any project in the workspace that the
149
64
  * app depends on or links, dependencies first. xcode builds them into one
@@ -160,6 +75,10 @@ export interface XcodeAppTarget extends XcodeModuleTarget {
160
75
  packageResolved: string | null
161
76
  /** every application target in the workspace, for a chooser. */
162
77
  appTargets: string[]
78
+ /** the build configuration every target's settings are read in. */
79
+ configuration: string
80
+ /** target-level build settings query function. */
81
+ settings: (key: string) => string
163
82
  }
164
83
 
165
84
  const APPLICATION = 'com.apple.product-type.application'
@@ -200,9 +119,9 @@ function walkFiles(dir: string): string[] {
200
119
  const isDirectory = (dir: string) => fs.existsSync(dir) && fs.statSync(dir).isDirectory()
201
120
 
202
121
  // an xcconfig's assignments, conditions kept in the key, includes inlined in order.
203
- function readXcconfig(file: string, seen = new Set<string>()): Record<string, string> {
204
- if (seen.has(file) || !fs.existsSync(file)) return {}
205
- seen.add(file)
122
+ function readXcconfig(file: string, read: string[]): Record<string, string> {
123
+ if (read.includes(file) || !fs.existsSync(file)) return {}
124
+ read.push(file)
206
125
  const settings: Record<string, string> = {}
207
126
  for (const raw of fs.readFileSync(file, 'utf8').split('\n')) {
208
127
  const line = raw.replace(/\/\/.*$/, '').trim()
@@ -210,7 +129,7 @@ function readXcconfig(file: string, seen = new Set<string>()): Record<string, st
210
129
  if (include) {
211
130
  Object.assign(
212
131
  settings,
213
- readXcconfig(path.resolve(path.dirname(file), include[1]!), seen),
132
+ readXcconfig(path.resolve(path.dirname(file), include[1]!), read),
214
133
  )
215
134
  continue
216
135
  }
@@ -321,7 +240,7 @@ function workspaceReferences(workspace: string): string[] {
321
240
  export function enclosingXcodeWorkspace(xcodeproj: string): string | null {
322
241
  const project = fs.realpathSync(xcodeproj)
323
242
  for (let dir = path.dirname(project); ; dir = path.dirname(dir)) {
324
- for (const name of fs.readdirSync(dir)) {
243
+ for (const name of fs.readdirSync(dir).sort()) {
325
244
  if (!name.endsWith('.xcworkspace')) continue
326
245
  const workspace = path.join(dir, name)
327
246
  if (!fs.existsSync(path.join(workspace, 'contents.xcworkspacedata'))) continue
@@ -352,7 +271,10 @@ export function findXcodeProject(input: string): string | null {
352
271
  if (resolved.endsWith('.xcodeproj')) return resolved
353
272
  if (!isDirectory(resolved)) return null
354
273
  for (const extension of ['.xcworkspace', '.xcodeproj']) {
355
- const found = fs.readdirSync(resolved).filter((name) => name.endsWith(extension))
274
+ const found = fs
275
+ .readdirSync(resolved)
276
+ .filter((name) => name.endsWith(extension))
277
+ .sort()
356
278
  if (found.length > 1) {
357
279
  throw new Error(
358
280
  `${resolved} holds ${found.length} ${extension} bundles (${found.join(', ')}); pass one`,
@@ -459,24 +381,45 @@ interface TargetRef {
459
381
  target: PlistDict
460
382
  }
461
383
 
462
- // the build settings of one target, evaluated as xcode does: project then
463
- // target level, each an xcconfig under its own settings; `$(inherited)` reads
464
- // the level below and an undefined setting is empty.
384
+ // the configuration a project builds when nothing names one: xcode's run
385
+ // action builds Debug, else the list's default.
386
+ function defaultConfiguration(project: LoadedProject): string {
387
+ const configList = project.object(str(project.project.buildConfigurationList))
388
+ const names = list(configList?.buildConfigurations).flatMap(
389
+ (id) => str(project.object(id)?.name) ?? [],
390
+ )
391
+ return names.includes('Debug')
392
+ ? 'Debug'
393
+ : (str(configList?.defaultConfigurationName) ?? names[0] ?? 'Debug')
394
+ }
395
+
396
+ // the build settings of one target in `configuration`, evaluated as xcode
397
+ // does: project then target level, each an xcconfig under its own settings;
398
+ // `$(inherited)` reads the level below and an undefined setting is empty. a
399
+ // list without that configuration builds its default one.
465
400
  function targetSettings(
466
401
  ref: TargetRef,
402
+ configuration: string,
467
403
  builtins: Record<string, string>,
468
- ): { get: (key: string) => string; keys: Set<string> } {
404
+ ): { get: (key: string) => string; keys: Set<string>; xcconfigs: string[] } {
469
405
  const { project, target } = ref
406
+ const xcconfigs: string[] = []
470
407
  const level = (listId: string | undefined): Record<string, string>[] => {
471
- const configs = list(project.object(listId)?.buildConfigurations).map(project.object)
408
+ const configList = project.object(listId)
409
+ const configs = list(configList?.buildConfigurations).map(project.object)
472
410
  const config =
473
- configs.find((entry) => entry?.name === 'Debug') ?? configs.find(Boolean)
411
+ configs.find((entry) => entry?.name === configuration) ??
412
+ configs.find((entry) => entry?.name === str(configList?.defaultConfigurationName))
474
413
  if (!config) return []
475
- const name = str(config.name) ?? 'Debug'
414
+ const name = str(config.name) ?? configuration
476
415
  const base = str(config.baseConfigurationReference)
477
416
  const own = isDict(config.buildSettings) ? config.buildSettings : {}
417
+ const baseFile = base ? project.resolvePath(base) : null
418
+ const read: string[] = []
419
+ const fromFile = baseFile ? readXcconfig(baseFile, read) : {}
420
+ xcconfigs.push(...read)
478
421
  return [
479
- applyConditions(base ? readXcconfig(project.resolvePath(base) ?? '') : {}, name),
422
+ applyConditions(fromFile, name),
480
423
  applyConditions(
481
424
  Object.fromEntries(
482
425
  Object.entries(own).flatMap(([key, value]) =>
@@ -492,7 +435,7 @@ function targetSettings(
492
435
  ]
493
436
  }
494
437
  const levels = [
495
- builtins,
438
+ { ...builtins, CONFIGURATION: configuration },
496
439
  ...level(str(project.project.buildConfigurationList)),
497
440
  ...level(str(target.buildConfigurationList)),
498
441
  ]
@@ -533,9 +476,36 @@ function targetSettings(
533
476
  return {
534
477
  get: (key) => valueAt(key, levels.length - 1),
535
478
  keys: new Set(levels.flatMap((values) => Object.keys(values))),
479
+ xcconfigs,
536
480
  }
537
481
  }
538
482
 
483
+ // a list-typed build setting's items: whitespace separates them, and quotes
484
+ // or a backslash keep whitespace inside one.
485
+ function settingList(value: string): string[] {
486
+ const items: string[] = []
487
+ for (const [, quoted, plain] of value.matchAll(
488
+ /"((?:\\.|[^"\\])*)"|((?:\\.|[^\s"])+)/g,
489
+ ))
490
+ items.push((quoted ?? plain!).replace(/\\(.)/g, '$1'))
491
+ return items
492
+ }
493
+
494
+ // the conditions swift compiles a target with: its active compilation
495
+ // conditions and each `-D` in its other swift flags, as xcode passes them.
496
+ function compilationConditions(settings: (key: string) => string): string[] {
497
+ const flags = settingList(settings('OTHER_SWIFT_FLAGS'))
498
+ const defined = flags.flatMap((flag, index) =>
499
+ flag === '-D' ? (flags[index + 1] ?? []) : flag.startsWith('-D') ? flag.slice(2) : [],
500
+ )
501
+ return [
502
+ ...new Set([
503
+ ...settingList(settings('SWIFT_ACTIVE_COMPILATION_CONDITIONS')),
504
+ ...defined,
505
+ ]),
506
+ ]
507
+ }
508
+
539
509
  function expand(value: string, lookup: (name: string) => string): string {
540
510
  return value.replace(
541
511
  /\$(?:\(([A-Za-z_][A-Za-z0-9_]*)((?::[^)]*)?)\)|\{([A-Za-z_][A-Za-z0-9_]*)((?::[^}]*)?)\}|([A-Za-z_][A-Za-z0-9_]*))/g,
@@ -551,12 +521,20 @@ function expand(value: string, lookup: (name: string) => string): string {
551
521
  }
552
522
 
553
523
  // the swift sources and resources that are members of a target.
554
- function targetMembers(ref: TargetRef): {
524
+ // run script phases never execute here; their declared swift outputs are
525
+ // compile inputs xcode generates before compiling, so a missing one names
526
+ // the script instead of silently dropping the file.
527
+ function targetMembers(
528
+ ref: TargetRef,
529
+ settings: (key: string) => string,
530
+ options: { requireSources?: boolean } = {},
531
+ ): {
555
532
  sources: string[]
556
533
  resources: string[]
557
534
  allSources: string[]
558
535
  } {
559
536
  const { project, target, id: targetId } = ref
537
+ const targetName = str(target.name) ?? targetId
560
538
  const sources = new Set<string>()
561
539
  const allSources = new Set<string>()
562
540
  const resources = new Set<string>()
@@ -577,6 +555,33 @@ function targetMembers(ref: TargetRef): {
577
555
  const resolved = project.resolvePath(refId)
578
556
  return resolved ? [resolved] : []
579
557
  }
558
+ const scriptForOutput = new Map<string, string>()
559
+ const noteScriptOutput = (raw: string, script: string) => {
560
+ const expanded = expand(raw, settings)
561
+ if (!expanded.endsWith('.swift')) return
562
+ const absolute = path.isAbsolute(expanded)
563
+ ? path.normalize(expanded)
564
+ : path.resolve(project.projectDir, expanded)
565
+ if (!scriptForOutput.has(absolute)) scriptForOutput.set(absolute, script)
566
+ }
567
+ for (const phaseId of list(target.buildPhases)) {
568
+ const phase = project.object(phaseId)
569
+ if (phase?.isa !== 'PBXShellScriptBuildPhase') continue
570
+ const script = str(phase.name) ?? phaseId
571
+ for (const raw of list(phase.outputPaths)) noteScriptOutput(raw, script)
572
+ for (const listPath of list(phase.outputFileListPaths)) {
573
+ const expandedList = expand(listPath, settings)
574
+ const absoluteList = path.isAbsolute(expandedList)
575
+ ? expandedList
576
+ : path.resolve(project.projectDir, expandedList)
577
+ if (!fs.existsSync(absoluteList)) continue
578
+ for (const line of fs.readFileSync(absoluteList, 'utf8').split('\n')) {
579
+ const trimmed = line.trim()
580
+ if (trimmed === '' || trimmed.startsWith('#')) continue
581
+ noteScriptOutput(trimmed, script)
582
+ }
583
+ }
584
+ }
580
585
  for (const phaseId of list(target.buildPhases)) {
581
586
  const phase = project.object(phaseId)
582
587
  if (phase?.isa !== 'PBXSourcesBuildPhase' && phase?.isa !== 'PBXResourcesBuildPhase')
@@ -584,13 +589,32 @@ function targetMembers(ref: TargetRef): {
584
589
  for (const buildFileId of list(phase.files)) {
585
590
  for (const file of fileRefPaths(str(project.object(buildFileId)?.fileRef) ?? '')) {
586
591
  if (phase.isa === 'PBXSourcesBuildPhase') {
587
- if (!fs.existsSync(file)) continue
592
+ if (!fs.existsSync(file)) {
593
+ if (options.requireSources === false) continue
594
+ const script = scriptForOutput.get(path.normalize(file))
595
+ throw new Error(
596
+ script
597
+ ? `${targetName}: missing generated source ${file} (Run Script "${script}" declares it in outputPaths; run the script or check in its output)`
598
+ : `${targetName}: missing source ${file}`,
599
+ )
600
+ }
588
601
  allSources.add(file)
589
602
  if (file.endsWith('.swift')) sources.add(file)
590
603
  } else if (phase.isa === 'PBXResourcesBuildPhase') addResource(file)
591
604
  }
592
605
  }
593
606
  }
607
+ for (const [file, script] of scriptForOutput) {
608
+ if (sources.has(file) || allSources.has(file)) continue
609
+ if (!fs.existsSync(file)) {
610
+ if (options.requireSources === false) continue
611
+ throw new Error(
612
+ `${targetName}: missing generated source ${file} (Run Script "${script}" declares it in outputPaths; run the script or check in its output)`,
613
+ )
614
+ }
615
+ allSources.add(file)
616
+ sources.add(file)
617
+ }
594
618
 
595
619
  // synchronized folders: every file under a folder the target owns is a
596
620
  // member, minus that folder's exceptions for this target; a folder the
@@ -718,13 +742,93 @@ export function listXcodeAppTargets(xcodeprojOrWorkspace: string): string[] {
718
742
  .map((ref) => str(ref.target.name) ?? ref.id)
719
743
  }
720
744
 
745
+ /**
746
+ * the application target and build configuration a scheme runs: its launch
747
+ * action, as xcode's Run builds it. shared schemes and the user's own are
748
+ * found in the workspace and every project it builds.
749
+ */
750
+ export function readXcodeScheme(
751
+ xcodeprojOrWorkspace: string,
752
+ scheme: string,
753
+ ): { target: string; configuration: string } {
754
+ const container = fs.realpathSync(xcodeprojOrWorkspace)
755
+ const { projects } = workspaceProjects(container)
756
+ const containers = [
757
+ ...new Set([container, ...projects.map((project) => project.xcodeproj)]),
758
+ ]
759
+ const found = containers
760
+ .flatMap((dir) =>
761
+ [
762
+ path.join(dir, 'xcshareddata'),
763
+ ...(isDirectory(path.join(dir, 'xcuserdata'))
764
+ ? fs
765
+ .readdirSync(path.join(dir, 'xcuserdata'))
766
+ .sort()
767
+ .map((user) => path.join(dir, 'xcuserdata', user))
768
+ : []),
769
+ ].map((data) => ({
770
+ dir,
771
+ file: path.join(data, 'xcschemes', `${scheme}.xcscheme`),
772
+ })),
773
+ )
774
+ .find((candidate) => fs.existsSync(candidate.file))
775
+ if (!found) {
776
+ const known = containers.flatMap((dir) =>
777
+ fs.existsSync(path.join(dir, 'xcshareddata', 'xcschemes'))
778
+ ? fs
779
+ .readdirSync(path.join(dir, 'xcshareddata', 'xcschemes'))
780
+ .filter((name) => name.endsWith('.xcscheme'))
781
+ .map((name) => name.slice(0, -'.xcscheme'.length))
782
+ .sort()
783
+ : [],
784
+ )
785
+ throw new Error(
786
+ `${path.basename(container)} has no scheme ${scheme}; it shares ${known.join(', ') || 'none'}`,
787
+ )
788
+ }
789
+ const launch = /<LaunchAction\b([^>]*)>([\s\S]*?)<\/LaunchAction>/.exec(
790
+ fs.readFileSync(found.file, 'utf8'),
791
+ )
792
+ const attribute = (text: string, name: string) => {
793
+ const value = new RegExp(`\\b${name}\\s*=\\s*"([^"]*)"`).exec(text)?.[1]
794
+ return value === undefined ? undefined : decodeXml(value)
795
+ }
796
+ const runnable = launch
797
+ ? /<BuildableProductRunnable\b[\s\S]*?<BuildableReference\b([^>]*)>/.exec(launch[2]!)
798
+ : null
799
+ const configuration = launch ? attribute(launch[1]!, 'buildConfiguration') : undefined
800
+ const blueprint = runnable ? attribute(runnable[1]!, 'BlueprintIdentifier') : undefined
801
+ const referenced = runnable ? attribute(runnable[1]!, 'ReferencedContainer') : undefined
802
+ if (!configuration || !blueprint || !referenced?.startsWith('container:')) {
803
+ throw new Error(`scheme ${scheme} runs no application target`)
804
+ }
805
+ // a container path is relative to the directory holding the scheme's container
806
+ const projectPath = path.resolve(
807
+ path.dirname(found.dir),
808
+ referenced.slice('container:'.length),
809
+ )
810
+ const project = projects.find(
811
+ (candidate) =>
812
+ fs.existsSync(projectPath) && candidate.xcodeproj === fs.realpathSync(projectPath),
813
+ )
814
+ const target = project && nativeTargets(project).find((ref) => ref.id === blueprint)
815
+ const name = target && str(target.target.name)
816
+ if (!name) throw new Error(`scheme ${scheme} runs a target no project here declares`)
817
+ return { target: name, configuration }
818
+ }
819
+
721
820
  /**
722
821
  * the application target `targetName` names (or the workspace's only one),
723
822
  * with every framework, library and package it builds: its member files
724
823
  * listed fresh from disk, so a file added to a synchronized folder joins the
725
824
  * target without any project change.
726
825
  */
727
- export function readXcodeAppTarget(input: string, targetName?: string): XcodeAppTarget {
826
+ export function readXcodeAppTarget(
827
+ input: string,
828
+ targetName?: string,
829
+ configurationName?: string,
830
+ options: { requireSources?: boolean } = {},
831
+ ): XcodeAppTarget {
728
832
  // canonical, so every path returned agrees with the host's realpath checks
729
833
  const xcodeprojOrWorkspace = fs.realpathSync(input)
730
834
  const workspace = xcodeprojOrWorkspace.endsWith('.xcworkspace')
@@ -748,6 +852,7 @@ export function readXcodeAppTarget(input: string, targetName?: string): XcodeApp
748
852
  )
749
853
  }
750
854
  const app = named[0]!
855
+ const configuration = configurationName ?? defaultConfiguration(app.project)
751
856
 
752
857
  // dependencies: explicit target dependencies, in this project or another
753
858
  // through a container proxy, and products linked by file name, which xcode
@@ -818,9 +923,14 @@ export function readXcodeAppTarget(input: string, targetName?: string): XcodeApp
818
923
  }
819
924
  visit(app)
820
925
 
926
+ const xcconfigs = new Set<string>()
821
927
  const moduleTarget = (ref: TargetRef) => {
822
928
  const name = str(ref.target.name) ?? ref.id
823
- const { get: settings, keys } = targetSettings(ref, {
929
+ const {
930
+ get: settings,
931
+ keys,
932
+ xcconfigs: read,
933
+ } = targetSettings(ref, configuration, {
824
934
  TARGET_NAME: name,
825
935
  PROJECT_NAME: path.basename(ref.project.xcodeproj, '.xcodeproj'),
826
936
  SRCROOT: ref.project.projectDir,
@@ -828,6 +938,7 @@ export function readXcodeAppTarget(input: string, targetName?: string): XcodeApp
828
938
  PROJECT_DIR: ref.project.projectDir,
829
939
  DEVELOPMENT_LANGUAGE: str(ref.project.project.developmentRegion) ?? 'en',
830
940
  })
941
+ for (const file of read) xcconfigs.add(file)
831
942
  const swiftVersion = Number.parseFloat(settings('SWIFT_VERSION') || '5')
832
943
  return {
833
944
  settings,
@@ -835,9 +946,10 @@ export function readXcodeAppTarget(input: string, targetName?: string): XcodeApp
835
946
  module: {
836
947
  name,
837
948
  moduleName: applyOperator(settings('PRODUCT_MODULE_NAME'), 'c99extidentifier'),
838
- ...targetMembers(ref),
949
+ ...targetMembers(ref, settings, options),
839
950
  languageMode: swiftVersion >= 6 ? 6 : 5,
840
951
  mainActorIsolation: settings('SWIFT_DEFAULT_ACTOR_ISOLATION') === 'MainActor',
952
+ defines: compilationConditions(settings),
841
953
  } satisfies XcodeModuleTarget,
842
954
  }
843
955
  }
@@ -991,7 +1103,9 @@ export function readXcodeAppTarget(input: string, targetName?: string): XcodeApp
991
1103
  ),
992
1104
  ].map((dir) => fs.realpathSync(dir)),
993
1105
  ),
994
- projectFiles: [...new Set(used.map((project) => project.projectFile))].sort(),
1106
+ projectFiles: [
1107
+ ...new Set([...used.map((project) => project.projectFile), ...xcconfigs]),
1108
+ ].sort(),
995
1109
  appIconName: settings('ASSETCATALOG_COMPILER_APPICON_NAME'),
996
1110
  infoPlist: plist.build(info),
997
1111
  infoPlistFile,
@@ -1005,5 +1119,7 @@ export function readXcodeAppTarget(input: string, targetName?: string): XcodeApp
1005
1119
  .sort((left, right) => left.name.localeCompare(right.name)),
1006
1120
  packageResolved: fs.existsSync(resolvedFile) ? resolvedFile : null,
1007
1121
  appTargets: appTargetNames,
1122
+ configuration,
1123
+ settings,
1008
1124
  }
1009
1125
  }
@@ -1,39 +0,0 @@
1
- /*! rnx v0.1.939 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
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
- "use strict";
4
- var __defProp = Object.defineProperty;
5
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
- var __getOwnPropNames = Object.getOwnPropertyNames;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __export = (target, all) => {
9
- for (var name in all)
10
- __defProp(target, name, { get: all[name], enumerable: true });
11
- };
12
- var __copyProps = (to, from, except, desc) => {
13
- if (from && typeof from === "object" || typeof from === "function") {
14
- for (let key of __getOwnPropNames(from))
15
- if (!__hasOwnProp.call(to, key) && key !== except)
16
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
- }
18
- return to;
19
- };
20
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
21
-
22
- // src/agent-identity.ts
23
- var agent_identity_exports = {};
24
- __export(agent_identity_exports, {
25
- agentSessionIdFromCliIdentity: () => agentSessionIdFromCliIdentity
26
- });
27
- module.exports = __toCommonJS(agent_identity_exports);
28
- function agentSessionIdFromCliIdentity(identity) {
29
- if (!identity) return null;
30
- const colon = identity.indexOf(":");
31
- if (colon < 0) return identity.trim() || null;
32
- const source = identity.slice(0, colon);
33
- const value = identity.slice(colon + 1).trim();
34
- return source === "PEACH_CLI_IDENTITY" && value ? value : null;
35
- }
36
- // Annotate the CommonJS export names for ESM import in node:
37
- 0 && (module.exports = {
38
- agentSessionIdFromCliIdentity
39
- });