peachsim 0.1.1641 → 0.1.1653

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 (618) hide show
  1. package/README.md +12 -0
  2. package/cli/app-bundle-resources.ts +57 -0
  3. package/cli/app-catalog.ts +1 -1
  4. package/cli/app-fonts.ts +11 -80
  5. package/cli/app-splash.ts +18 -12
  6. package/cli/bridge-flow-runner.ts +11 -7
  7. package/cli/cloud-client.ts +10 -13
  8. package/cli/command-registry.ts +13 -4
  9. package/cli/commands/box.ts +4 -4
  10. package/cli/commands/control.ts +105 -53
  11. package/cli/commands/coverage-parser.ts +67 -0
  12. package/cli/commands/coverage.ts +550 -0
  13. package/cli/commands/debug.ts +9 -18
  14. package/cli/commands/desktop.ts +19 -7
  15. package/cli/commands/device.ts +14 -9
  16. package/cli/commands/guest-host.ts +6 -10
  17. package/cli/commands/inspect/core.ts +81 -17
  18. package/cli/commands/inspect.ts +13 -8
  19. package/cli/commands/kotlin.ts +2 -2
  20. package/cli/commands/maestro-compare.ts +1 -1
  21. package/cli/commands/platform.ts +20 -11
  22. package/cli/commands/preview.ts +16 -18
  23. package/cli/commands/runtime.ts +3 -2
  24. package/cli/commands/screenshot-layers.ts +1 -1
  25. package/cli/commands/screenshot.ts +1 -1
  26. package/cli/commands/serve.ts +5 -1
  27. package/cli/commands/support.ts +4 -4
  28. package/cli/commands/three-mode.ts +22 -15
  29. package/cli/commands/upload.ts +44 -45
  30. package/cli/current-sim.ts +38 -0
  31. package/cli/desktop-companion.ts +36 -8
  32. package/cli/device-option.ts +1 -1
  33. package/cli/drivers/playwright.ts +40 -0
  34. package/cli/drivers/types.ts +4 -0
  35. package/cli/help-core.ts +1 -1
  36. package/cli/internal-child.ts +2 -1
  37. package/cli/main.ts +9 -3
  38. package/cli/outbound-endpoints.ts +15 -5
  39. package/cli/output-redaction.ts +39 -14
  40. package/cli/remote-simulators.ts +4 -1
  41. package/cli/scene-video.ts +5 -2
  42. package/cli/send-to-box.ts +7 -10
  43. package/cli/telemetry.ts +1 -1
  44. package/cli/ws-bridge.ts +8 -1
  45. package/detox/attempt-events.cjs +3 -1
  46. package/detox/attempt-events.d.cts +1 -1
  47. package/detox/expectations.ts +108 -99
  48. package/detox/frame-offset.d.mts +6 -0
  49. package/detox/frame-offset.mjs +35 -0
  50. package/detox/gestures.ts +6 -18
  51. package/detox/index.ts +169 -101
  52. package/detox/jest-preset.cjs +1 -3
  53. package/detox/jest-transform.cjs +4 -0
  54. package/detox/matchers.ts +3 -0
  55. package/detox/motion-change.cjs +52 -118
  56. package/detox/motion-change.d.cts +6 -27
  57. package/detox/motion-leg-starts.cjs +20 -0
  58. package/detox/motion-leg-starts.d.cts +8 -0
  59. package/dist-lib/agent-daemon-client.cjs +1 -1
  60. package/dist-lib/agent-events.cjs +1 -1
  61. package/dist-lib/attached-projects.cjs +1 -1
  62. package/dist-lib/auth/shared-session.cjs +1 -1
  63. package/dist-lib/backend-origin.cjs +3 -3
  64. package/dist-lib/beta.cjs +1 -1
  65. package/dist-lib/beta.mjs +1 -1
  66. package/dist-lib/bridge-constants.cjs +1 -1
  67. package/dist-lib/bridge-contract-input.cjs +65 -1
  68. package/dist-lib/bridge-contract-input.mjs +63 -1
  69. package/dist-lib/bridge-contract.cjs +19 -1
  70. package/dist-lib/bridge-contract.mjs +17 -1
  71. package/dist-lib/bundle-channel.cjs +38332 -14940
  72. package/dist-lib/capture-contract.cjs +1 -1
  73. package/dist-lib/capture-contract.mjs +1 -1
  74. package/dist-lib/cloud-contract.cjs +1 -1
  75. package/dist-lib/cloud-contract.mjs +1 -1
  76. package/dist-lib/cloud-test-args.cjs +1 -1
  77. package/dist-lib/cloud-test-args.mjs +1 -1
  78. package/dist-lib/cloud.cjs +1 -1
  79. package/dist-lib/cloud.mjs +1 -1
  80. package/dist-lib/config.cjs +1 -1
  81. package/dist-lib/config.mjs +5 -3
  82. package/dist-lib/detox/index.cjs +1247 -4511
  83. package/dist-lib/detox/jest-preset.cjs +1 -3
  84. package/dist-lib/detox/jest-transform.cjs +4 -0
  85. package/dist-lib/dev-bundle-resolution.cjs +28 -24
  86. package/dist-lib/expo-swift-bundle.cjs +35243 -13172
  87. package/dist-lib/expo-swift-metadata.cjs +1 -1
  88. package/dist-lib/expo-swift-metadata.mjs +1 -1
  89. package/dist-lib/home-paths.cjs +1 -1
  90. package/dist-lib/host/bridge-host.cjs +45285 -63163
  91. package/dist-lib/host/fetch-proxy-handler.cjs +3544 -11
  92. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  93. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  94. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  95. package/dist-lib/host/websocket-proxy.cjs +1 -1
  96. package/dist-lib/index.cjs +1997 -2069
  97. package/dist-lib/jump-to-source-babel.cjs +1 -1
  98. package/dist-lib/jump-to-source-native.cjs +1 -1
  99. package/dist-lib/kotlin-host.cjs +2 -2
  100. package/dist-lib/menu.cjs +14 -6
  101. package/dist-lib/menu.mjs +14 -6
  102. package/dist-lib/metro-fingerprint-registry.cjs +1 -1
  103. package/dist-lib/metro-fingerprint-registry.mjs +1 -1
  104. package/dist-lib/metro-production-bundle.cjs +1 -1
  105. package/dist-lib/metro-production-bundle.mjs +1 -1
  106. package/dist-lib/metro.cjs +468 -563
  107. package/dist-lib/native-app-identity-project.cjs +128 -292
  108. package/dist-lib/native-app-identity-project.mjs +1262 -51
  109. package/dist-lib/native-app-identity.cjs +8 -3
  110. package/dist-lib/native-app-identity.mjs +8 -3
  111. package/dist-lib/native-firebase-metadata.cjs +1 -1
  112. package/dist-lib/native-firebase-metadata.mjs +1 -1
  113. package/dist-lib/plist.cjs +2 -244
  114. package/dist-lib/plist.mjs +1 -1
  115. package/dist-lib/profiles.cjs +1 -1
  116. package/dist-lib/public-brand.cjs +1 -1
  117. package/dist-lib/public-origins-lib-esm.json +290 -0
  118. package/dist-lib/public-origins-lib-static.json +1 -0
  119. package/dist-lib/public-origins-lib.json +1852 -0
  120. package/dist-lib/react-native-host-modules.cjs +1 -1
  121. package/dist-lib/react-native-host-modules.mjs +1 -1
  122. package/dist-lib/scripts/dev-server-scanner.cjs +14 -253
  123. package/dist-lib/sdk.cjs +84 -16
  124. package/dist-lib/sdk.mjs +82 -15
  125. package/dist-lib/skills.cjs +51248 -75450
  126. package/dist-lib/swift-compile.cjs +26154 -1245
  127. package/dist-lib/swift-compile.mjs +26151 -1230
  128. package/dist-lib/swift-package.cjs +79 -1
  129. package/dist-lib/swift-package.mjs +75 -1
  130. package/dist-lib/swift-submit.cjs +1 -1
  131. package/dist-lib/swift-submit.mjs +1 -1
  132. package/dist-lib/swift-toolchain.cjs +1 -1
  133. package/dist-lib/swift.cjs +1 -1
  134. package/dist-lib/vite-swift.cjs +34394 -12323
  135. package/dist-lib/vite.cjs +373 -298
  136. package/dist-lib/worklet-executable.cjs +1 -1
  137. package/dist-lib/worklet-executable.mjs +1 -1
  138. package/dist-types/packages/peach-compat/src/engine-config.d.ts +2 -0
  139. package/dist-types/packages/peach-compat/src/stubs/form-sheet-spring.d.ts +9 -0
  140. package/dist-types/packages/peach-compat/src/stubs/native-evaluation-lease.d.ts +47 -0
  141. package/dist-types/packages/peach-compat/src/stubs/native-seams/react-native-cookies.d.ts +113 -0
  142. package/dist-types/packages/peach-compat/src/stubs/native-seams/react-native-gesture-handler.d.ts +154 -0
  143. package/dist-types/packages/peach-compat/src/stubs/screen-transition-math.d.ts +756 -0
  144. package/dist-types/packages/peach-compat/src/stubs/transition-scalar.d.ts +25 -0
  145. package/dist-types/packages/peach-engine/src/billing/plans.d.ts +64 -0
  146. package/dist-types/packages/peach-engine/src/browser-page-target.d.ts +2 -0
  147. package/dist-types/packages/peach-engine/src/bundle-platform-url.d.ts +3 -0
  148. package/dist-types/packages/peach-engine/src/capture/browser-accessibility-host.d.ts +3 -0
  149. package/dist-types/packages/peach-engine/src/capture/browser-composite.d.ts +55 -0
  150. package/dist-types/packages/peach-engine/src/capture/browserAccessibilityContract.d.ts +27 -0
  151. package/dist-types/packages/peach-engine/src/capture/nativeScreenCaptureContract.d.ts +22 -0
  152. package/dist-types/packages/peach-engine/src/cli-companion.d.ts +36 -0
  153. package/dist-types/packages/peach-engine/src/components/native-ui/webview-frame-bridge.d.ts +34 -0
  154. package/dist-types/packages/peach-engine/src/config.d.ts +5 -0
  155. package/dist-types/packages/peach-engine/src/engine/android-stretch-effect.d.ts +57 -0
  156. package/dist-types/packages/peach-engine/src/engine/animated-driven-style.d.ts +47 -0
  157. package/dist-types/packages/peach-engine/src/engine/animated-value.d.ts +5 -0
  158. package/dist-types/packages/peach-engine/src/engine/animated.d.ts +195 -0
  159. package/dist-types/packages/peach-engine/src/engine/animation-clockContract.d.ts +15 -0
  160. package/dist-types/packages/peach-engine/src/engine/animation-graph.d.ts +148 -0
  161. package/dist-types/packages/peach-engine/src/engine/app-catalog-wire.d.ts +10 -0
  162. package/dist-types/packages/peach-engine/src/engine/app-font-registry.d.ts +87 -0
  163. package/dist-types/packages/peach-engine/src/engine/attributed-paragraph-paint.d.ts +7 -0
  164. package/dist-types/packages/peach-engine/src/engine/attributed-paragraph.d.ts +123 -0
  165. package/dist-types/packages/peach-engine/src/engine/audioContract.d.ts +16 -0
  166. package/dist-types/packages/peach-engine/src/engine/canvaskit-api.d.ts +93 -0
  167. package/dist-types/packages/peach-engine/src/engine/canvaskit-renderer.d.ts +216 -0
  168. package/dist-types/packages/peach-engine/src/engine/config-plugin-fonts.d.ts +40 -0
  169. package/dist-types/packages/peach-engine/src/engine/config-plugin-splash.d.ts +25 -0
  170. package/dist-types/packages/peach-engine/src/engine/cull-visibility.d.ts +44 -0
  171. package/dist-types/packages/peach-engine/src/engine/damage-rect.d.ts +19 -0
  172. package/dist-types/packages/peach-engine/src/engine/engine-resource.d.ts +6 -0
  173. package/dist-types/packages/peach-engine/src/engine/expo-manifest.d.ts +5 -0
  174. package/dist-types/packages/peach-engine/src/engine/fiber-debug-metadata.d.ts +30 -0
  175. package/dist-types/packages/peach-engine/src/engine/font-config.d.ts +139 -0
  176. package/dist-types/packages/peach-engine/src/engine/generated/sf-pro-font.d.ts +1 -0
  177. package/dist-types/packages/peach-engine/src/engine/glass-material.d.ts +31 -0
  178. package/dist-types/packages/peach-engine/src/engine/host-composite.d.ts +100 -0
  179. package/dist-types/packages/peach-engine/src/engine/hosted-semantics.d.ts +49 -0
  180. package/dist-types/packages/peach-engine/src/engine/image-audit.d.ts +70 -0
  181. package/dist-types/packages/peach-engine/src/engine/image-loader.d.ts +350 -0
  182. package/dist-types/packages/peach-engine/src/engine/inspect-info.d.ts +27 -0
  183. package/dist-types/packages/peach-engine/src/engine/inspect-outline.d.ts +14 -0
  184. package/dist-types/packages/peach-engine/src/engine/inspect-visibility.d.ts +33 -0
  185. package/dist-types/packages/peach-engine/src/engine/ios-fast-scroll.d.ts +16 -0
  186. package/dist-types/packages/peach-engine/src/engine/layout-sab.d.ts +43 -0
  187. package/dist-types/packages/peach-engine/src/engine/liquid-glass-rect.d.ts +23 -0
  188. package/dist-types/packages/peach-engine/src/engine/liquid-glass-shaders.d.ts +9 -0
  189. package/dist-types/packages/peach-engine/src/engine/liquid-glass.d.ts +283 -0
  190. package/dist-types/packages/peach-engine/src/engine/live-object-counts.d.ts +6 -0
  191. package/dist-types/packages/peach-engine/src/engine/lottie-runtime.d.ts +32 -0
  192. package/dist-types/packages/peach-engine/src/engine/lottie-types.d.ts +138 -0
  193. package/dist-types/packages/peach-engine/src/engine/memory-counts.d.ts +27 -0
  194. package/dist-types/packages/peach-engine/src/engine/metalDirectContract.d.ts +108 -0
  195. package/dist-types/packages/peach-engine/src/engine/metalShaderContract.d.ts +217 -0
  196. package/dist-types/packages/peach-engine/src/engine/native-animation-driver.d.ts +112 -0
  197. package/dist-types/packages/peach-engine/src/engine/native-animation-graph.d.ts +62 -0
  198. package/dist-types/packages/peach-engine/src/engine/native-layout.d.ts +133 -0
  199. package/dist-types/packages/peach-engine/src/engine/native-resources.d.ts +26 -0
  200. package/dist-types/packages/peach-engine/src/engine/nativeReanimatedContract.d.ts +25 -0
  201. package/dist-types/packages/peach-engine/src/engine/nativeReplayContract.d.ts +64 -0
  202. package/dist-types/packages/peach-engine/src/engine/node.d.ts +589 -0
  203. package/dist-types/packages/peach-engine/src/engine/paint-boundary-types.d.ts +112 -0
  204. package/dist-types/packages/peach-engine/src/engine/paint-boundary.d.ts +57 -0
  205. package/dist-types/packages/peach-engine/src/engine/portalContract.d.ts +21 -0
  206. package/dist-types/packages/peach-engine/src/engine/portals.d.ts +20 -0
  207. package/dist-types/packages/peach-engine/src/engine/render-damage.d.ts +107 -0
  208. package/dist-types/packages/peach-engine/src/engine/riveContract.d.ts +420 -0
  209. package/dist-types/packages/peach-engine/src/engine/rn-spring.d.ts +51 -0
  210. package/dist-types/packages/peach-engine/src/engine/scene-table.d.ts +379 -0
  211. package/dist-types/packages/peach-engine/src/engine/scroll-momentum-math.d.ts +152 -0
  212. package/dist-types/packages/peach-engine/src/engine/scroll-pan-contacts.d.ts +10 -0
  213. package/dist-types/packages/peach-engine/src/engine/scroll-platform.d.ts +75 -0
  214. package/dist-types/packages/peach-engine/src/engine/scroll-range.d.ts +14 -0
  215. package/dist-types/packages/peach-engine/src/engine/scroll-velocity.d.ts +14 -0
  216. package/dist-types/packages/peach-engine/src/engine/scroll.d.ts +320 -0
  217. package/dist-types/packages/peach-engine/src/engine/signal.d.ts +7 -0
  218. package/dist-types/packages/peach-engine/src/engine/snapshot-cache-policy.d.ts +6 -0
  219. package/dist-types/packages/peach-engine/src/engine/svg-geometry.d.ts +41 -0
  220. package/dist-types/packages/peach-engine/src/engine/text-attachment-paragraphs.d.ts +10 -0
  221. package/dist-types/packages/peach-engine/src/engine/text-decoration.d.ts +11 -0
  222. package/dist-types/packages/peach-engine/src/engine/text-line-break.d.ts +22 -0
  223. package/dist-types/packages/peach-engine/src/engine/text-paint-receipt.d.ts +98 -0
  224. package/dist-types/packages/peach-engine/src/engine/text-paragraph.d.ts +11 -0
  225. package/dist-types/packages/peach-engine/src/engine/text-paragraphContract.d.ts +34 -0
  226. package/dist-types/packages/peach-engine/src/engine/text-transform.d.ts +1 -0
  227. package/dist-types/packages/peach-engine/src/engine/types.d.ts +657 -0
  228. package/dist-types/packages/peach-engine/src/engine/visible-frame.d.ts +54 -0
  229. package/dist-types/packages/peach-engine/src/engine/webrtcContract.d.ts +74 -0
  230. package/dist-types/packages/peach-engine/src/graphite-stats-fields.d.ts +184 -0
  231. package/dist-types/packages/peach-engine/src/guest-import-meta.d.ts +12 -0
  232. package/dist-types/packages/peach-engine/src/guest-module-overrides.d.ts +7 -0
  233. package/dist-types/packages/peach-engine/src/ios/app-card-types.d.ts +7 -0
  234. package/dist-types/packages/peach-engine/src/ios/apps/canvas-map-data.d.ts +177 -0
  235. package/dist-types/packages/peach-engine/src/ios/aux-home-scene.d.ts +54 -0
  236. package/dist-types/packages/peach-engine/src/ios/chrome-metrics.d.ts +47 -0
  237. package/dist-types/packages/peach-engine/src/ios/constants.d.ts +21 -0
  238. package/dist-types/packages/peach-engine/src/ios/duo-housing.d.ts +37 -0
  239. package/dist-types/packages/peach-engine/src/ios/home/types.d.ts +29 -0
  240. package/dist-types/packages/peach-engine/src/ios/home-app-catalog.d.ts +43 -0
  241. package/dist-types/packages/peach-engine/src/ios/photo-store.d.ts +73 -0
  242. package/dist-types/packages/peach-engine/src/ios/photoLibraryContract.d.ts +166 -0
  243. package/dist-types/packages/peach-engine/src/ios/shell-controller-types.d.ts +21 -0
  244. package/dist-types/packages/peach-engine/src/ios/shell-transition-debug.d.ts +18 -0
  245. package/dist-types/packages/peach-engine/src/metro-asset-path.d.ts +21 -0
  246. package/dist-types/packages/peach-engine/src/metro-fingerprint-registry-client.d.ts +11 -0
  247. package/dist-types/packages/peach-engine/src/metro-fingerprint.d.ts +38 -0
  248. package/dist-types/packages/peach-engine/src/native-preview-bundle.d.ts +44 -0
  249. package/dist-types/packages/peach-engine/src/observability/types.d.ts +74 -0
  250. package/dist-types/packages/peach-engine/src/peach-warm-manifest.d.ts +32 -0
  251. package/dist-types/packages/peach-engine/src/permissions/app-settings-client.d.ts +25 -0
  252. package/dist-types/packages/peach-engine/src/permissions/system-permission-types.d.ts +20 -0
  253. package/dist-types/packages/peach-engine/src/platform/android-back-panel.d.ts +131 -0
  254. package/dist-types/packages/peach-engine/src/platform/android-gesture-exclusion.d.ts +28 -0
  255. package/dist-types/packages/peach-engine/src/platform/android-predictive-back.d.ts +33 -0
  256. package/dist-types/packages/peach-engine/src/platform/system-bars-state.d.ts +14 -0
  257. package/dist-types/packages/peach-engine/src/playwright-sim-host.d.ts +1 -0
  258. package/dist-types/packages/peach-engine/src/preview/bundle-layout.d.ts +8 -0
  259. package/dist-types/packages/peach-engine/src/preview/bundle-variantContract.d.ts +24 -0
  260. package/dist-types/packages/peach-engine/src/preview/capture-bundle.d.ts +26 -0
  261. package/dist-types/packages/peach-engine/src/preview/compress-node.d.ts +2 -0
  262. package/dist-types/packages/peach-engine/src/preview/compress.d.ts +2 -0
  263. package/dist-types/packages/peach-engine/src/preview/presigned-upload.d.ts +60 -0
  264. package/dist-types/packages/peach-engine/src/preview/trace.d.ts +144 -0
  265. package/dist-types/packages/peach-engine/src/preview/upload-protocol.d.ts +152 -0
  266. package/dist-types/packages/peach-engine/src/profiler/animation-recording-loader.d.ts +1 -0
  267. package/dist-types/packages/peach-engine/src/profiler/profile-trace.d.ts +4 -0
  268. package/dist-types/packages/peach-engine/src/react-bridge.d.ts +3 -0
  269. package/dist-types/packages/peach-engine/src/react-native/AppState.d.ts +45 -0
  270. package/dist-types/packages/peach-engine/src/react-native/Appearance.d.ts +34 -0
  271. package/dist-types/packages/peach-engine/src/react-native/framework-colors-data.d.ts +2 -0
  272. package/dist-types/packages/peach-engine/src/react-native/host-services.d.ts +42 -0
  273. package/dist-types/packages/peach-engine/src/react-native/layout-animation.d.ts +22 -0
  274. package/dist-types/packages/peach-engine/src/react-native/platform-colors.d.ts +17 -0
  275. package/dist-types/packages/peach-engine/src/remote-stream/client-config.d.ts +10 -0
  276. package/dist-types/packages/peach-engine/src/remote-stream/cloud-display.d.ts +58 -0
  277. package/dist-types/packages/peach-engine/src/remote-stream/scene-recording.d.ts +45 -0
  278. package/dist-types/packages/peach-engine/src/render-worker/animated-drive-output.d.ts +35 -0
  279. package/dist-types/packages/peach-engine/src/render-worker/app-load.d.ts +16 -0
  280. package/dist-types/packages/peach-engine/src/render-worker/aux-surface-types.d.ts +2 -0
  281. package/dist-types/packages/peach-engine/src/render-worker/canvaskit-shared.d.ts +42 -0
  282. package/dist-types/packages/peach-engine/src/render-worker/canvaskit-webgpu.d.ts +434 -0
  283. package/dist-types/packages/peach-engine/src/render-worker/canvaskit-worker-init.d.ts +12 -0
  284. package/dist-types/packages/peach-engine/src/render-worker/compositor-backend.d.ts +31 -0
  285. package/dist-types/packages/peach-engine/src/render-worker/compositor-gpu.d.ts +202 -0
  286. package/dist-types/packages/peach-engine/src/render-worker/compositor-protocol.d.ts +1945 -0
  287. package/dist-types/packages/peach-engine/src/render-worker/compositor-runtime/scroll-drag-resample.d.ts +44 -0
  288. package/dist-types/packages/peach-engine/src/render-worker/css-keyframes-drive.d.ts +36 -0
  289. package/dist-types/packages/peach-engine/src/render-worker/edit-menu-geometry.d.ts +8 -0
  290. package/dist-types/packages/peach-engine/src/render-worker/engine-resource-relay.d.ts +21 -0
  291. package/dist-types/packages/peach-engine/src/render-worker/expo-widgetContract.d.ts +16 -0
  292. package/dist-types/packages/peach-engine/src/render-worker/gesture-seam-protocol.d.ts +152 -0
  293. package/dist-types/packages/peach-engine/src/render-worker/graph-linked-value.d.ts +29 -0
  294. package/dist-types/packages/peach-engine/src/render-worker/graphite-pipeline-compiler-contract.d.ts +49 -0
  295. package/dist-types/packages/peach-engine/src/render-worker/graphite-pipeline-compiler.d.ts +12 -0
  296. package/dist-types/packages/peach-engine/src/render-worker/host-service-protocol.d.ts +756 -0
  297. package/dist-types/packages/peach-engine/src/render-worker/image-lifecycle-event.d.ts +22 -0
  298. package/dist-types/packages/peach-engine/src/render-worker/image-pixel-contract.d.ts +48 -0
  299. package/dist-types/packages/peach-engine/src/render-worker/live-frame-mirror.d.ts +34 -0
  300. package/dist-types/packages/peach-engine/src/render-worker/map-command-channel.d.ts +189 -0
  301. package/dist-types/packages/peach-engine/src/render-worker/mapNativeContract.d.ts +101 -0
  302. package/dist-types/packages/peach-engine/src/render-worker/native-dynamic-synchronizable.d.ts +22 -0
  303. package/dist-types/packages/peach-engine/src/render-worker/native-menu-gesture.d.ts +9 -0
  304. package/dist-types/packages/peach-engine/src/render-worker/native-ui-commandContract.d.ts +23 -0
  305. package/dist-types/packages/peach-engine/src/render-worker/native-ui-protocol.d.ts +1087 -0
  306. package/dist-types/packages/peach-engine/src/render-worker/native-widgetContract.d.ts +100 -0
  307. package/dist-types/packages/peach-engine/src/render-worker/nativeAnimMirrorContract.d.ts +174 -0
  308. package/dist-types/packages/peach-engine/src/render-worker/nativeSyncReplyContract.d.ts +11 -0
  309. package/dist-types/packages/peach-engine/src/render-worker/one-native-contentContract.d.ts +54 -0
  310. package/dist-types/packages/peach-engine/src/render-worker/pointerSampleContract.d.ts +14 -0
  311. package/dist-types/packages/peach-engine/src/render-worker/protocol.d.ts +880 -0
  312. package/dist-types/packages/peach-engine/src/render-worker/reanimated-css-contract.d.ts +63 -0
  313. package/dist-types/packages/peach-engine/src/render-worker/reanimated-readiness.d.ts +29 -0
  314. package/dist-types/packages/peach-engine/src/render-worker/resilient-frame-clock.d.ts +22 -0
  315. package/dist-types/packages/peach-engine/src/render-worker/retained-app-load.d.ts +20 -0
  316. package/dist-types/packages/peach-engine/src/render-worker/screen-edge-swipe-commit-protocol.d.ts +1 -0
  317. package/dist-types/packages/peach-engine/src/render-worker/screen-form-sheet-commit-protocol.d.ts +26 -0
  318. package/dist-types/packages/peach-engine/src/render-worker/scroll-mirror-tenant.d.ts +37 -0
  319. package/dist-types/packages/peach-engine/src/render-worker/scroll-mirror.d.ts +164 -0
  320. package/dist-types/packages/peach-engine/src/render-worker/shell-event-registry.d.ts +119 -0
  321. package/dist-types/packages/peach-engine/src/render-worker/shell-gesture-regions.d.ts +41 -0
  322. package/dist-types/packages/peach-engine/src/render-worker/shell-protocol.d.ts +603 -0
  323. package/dist-types/packages/peach-engine/src/render-worker/shell-scene-schema.d.ts +101 -0
  324. package/dist-types/packages/peach-engine/src/render-worker/shell-tree-inline-sources.d.ts +13 -0
  325. package/dist-types/packages/peach-engine/src/render-worker/shell-tree-wire.d.ts +87 -0
  326. package/dist-types/packages/peach-engine/src/render-worker/test-bridge-protocol.d.ts +47 -0
  327. package/dist-types/packages/peach-engine/src/render-worker/text-inputContract.d.ts +93 -0
  328. package/dist-types/packages/peach-engine/src/render-worker/tree-sync-port.d.ts +102 -0
  329. package/dist-types/packages/peach-engine/src/render-worker/webgpu-frame-transaction.d.ts +292 -0
  330. package/dist-types/packages/peach-engine/src/render-worker/webgpu-readback-scheduler.d.ts +107 -0
  331. package/dist-types/packages/peach-engine/src/render-worker/webview-capture-protocol.d.ts +16 -0
  332. package/dist-types/packages/peach-engine/src/render-worker/worker-input-runtime.d.ts +211 -0
  333. package/dist-types/packages/peach-engine/src/render-worker/worker-storage.d.ts +33 -0
  334. package/dist-types/packages/peach-engine/src/render-worker/worklet-runtime.d.ts +987 -0
  335. package/dist-types/packages/peach-engine/src/render-worker/worklet-sab.d.ts +24 -0
  336. package/dist-types/packages/peach-engine/src/rolldown-bundle-inventory.d.ts +84 -0
  337. package/dist-types/packages/peach-engine/src/rolldown-production-fingerprint.d.ts +31 -0
  338. package/dist-types/packages/peach-engine/src/screenshots/timeline-assets.d.ts +10 -0
  339. package/dist-types/packages/peach-engine/src/screenshots/tokens.d.ts +9 -0
  340. package/dist-types/packages/peach-engine/src/settings/devices.d.ts +70 -0
  341. package/dist-types/packages/peach-engine/src/settings/duo-fold-bus.d.ts +87 -0
  342. package/dist-types/packages/peach-engine/src/settings/interface-rotation.d.ts +30 -0
  343. package/dist-types/packages/peach-engine/src/settings/react-native-configuration.d.ts +12 -0
  344. package/dist-types/packages/peach-engine/src/settings/scene-geometryContract.d.ts +40 -0
  345. package/dist-types/packages/peach-engine/src/settings/store.d.ts +37 -0
  346. package/dist-types/packages/peach-engine/src/shell-events.d.ts +203 -0
  347. package/dist-types/packages/peach-engine/src/shell-intent.d.ts +68 -0
  348. package/dist-types/packages/peach-engine/src/sootsim-event.d.ts +35 -0
  349. package/dist-types/packages/peach-engine/src/top-overlay-state.d.ts +5 -0
  350. package/dist-types/packages/peach-engine/src/web-authentication-automation-host.d.ts +2 -0
  351. package/dist-types/packages/peach-engine/src/webAuthenticationContract.d.ts +34 -0
  352. package/dist-types/packages/peach-engine/src/webview-automation-host.d.ts +180 -0
  353. package/dist-types/packages/peach-engine/src/wireframe-mode.d.ts +16 -0
  354. package/dist-types/packages/peach-globals/src/frameBreakdownContract.d.ts +16 -0
  355. package/dist-types/packages/peach-globals/src/index.d.ts +3311 -0
  356. package/dist-types/packages/peach-globals/src/nativeSurfaceContract.d.ts +76 -0
  357. package/dist-types/packages/peach-globals/src/pointerSourceEventContract.d.ts +8 -0
  358. package/dist-types/packages/peach-globals/src/profileTrace.d.ts +11 -0
  359. package/dist-types/packages/peach-globals/src/profilerContract.d.ts +223 -0
  360. package/dist-types/packages/peach-kit/src/capabilities.d.ts +721 -0
  361. package/dist-types/packages/peach-kit/src/internal.d.ts +4 -0
  362. package/dist-types/packages/peach-kit/src/materials/types.d.ts +27 -0
  363. package/dist-types/packages/peach-kit/src/materials/uikit-blur-material.d.ts +14 -0
  364. package/dist-types/packages/peach-kit/src/navigation-types.d.ts +11 -0
  365. package/dist-types/packages/peach-kit/src/react-bridge.d.ts +53 -0
  366. package/dist-types/packages/peach-kit/src/runtime.d.ts +26 -0
  367. package/dist-types/packages/peach-kit/src/ui/hosting-safe-area.d.ts +24 -0
  368. package/dist-types/packages/peach-kit/src/ui/popover-placement.d.ts +53 -0
  369. package/dist-types/packages/peach-kit/src/ui/presentationContract.d.ts +17 -0
  370. package/kotlin/ComposeSources/PeachComposeHost.kt +1 -1
  371. package/kotlin/JniSources/com/facebook/jni/HybridData.kt +0 -2
  372. package/kotlin/JniSources/dev/peach/jni/NativeBindings.kt +0 -2
  373. package/kotlin/JniTransportSources/dev/peach/jni/integration/JniTransport.kt +0 -2
  374. package/kotlin/README.md +6 -0
  375. package/package.json +22 -2
  376. package/runtime-companion.json +1 -0
  377. package/skills/contrast/SKILL.md +1 -0
  378. package/src/appBundleResourcesContract.ts +51 -0
  379. package/src/assetCatalogContract.ts +21 -0
  380. package/src/backend-origin.ts +3 -1
  381. package/src/bridge-contract-input.ts +84 -0
  382. package/src/bridge-contract.ts +35 -3
  383. package/src/browser-launch-policy.ts +1 -0
  384. package/src/bundle-channel.mjs +4 -2
  385. package/src/cli-runtime.ts +55 -0
  386. package/src/crash-fingerprint.ts +26 -0
  387. package/src/dev-bundle-resolution.ts +50 -23
  388. package/src/device-catalog.ts +1159 -0
  389. package/src/host/bridge-host.ts +20 -37
  390. package/src/host/browser-pointer.ts +71 -0
  391. package/src/host/dev-server-package-versions.ts +23 -0
  392. package/src/host/fetch-proxy-handler.ts +17 -4
  393. package/src/host/staged-host-files.ts +28 -4
  394. package/src/installed-package-versions.ts +142 -38
  395. package/src/kotlin-host.ts +1 -1
  396. package/src/launchMetadataContract.ts +1 -0
  397. package/src/menu.ts +12 -4
  398. package/src/metro-plugin.ts +4 -4
  399. package/src/metro-project-root.ts +68 -0
  400. package/src/native-app-identity-project.ts +47 -38
  401. package/src/nitro-adapter.lock.json +26 -0
  402. package/src/nitro-adapter.ts +103 -0
  403. package/src/nitro-bundle.ts +24 -10
  404. package/src/nitro-compile.ts +33 -51
  405. package/src/nitro-source.ts +177 -96
  406. package/src/nitroAdapterContract.ts +217 -0
  407. package/src/nitroContract.ts +24 -11
  408. package/src/process-group.ts +41 -34
  409. package/src/react-bridge-importers.ts +28 -0
  410. package/src/reactNativeConfigurationContract.ts +36 -0
  411. package/src/runtime-assets.ts +7 -2
  412. package/src/runtime-delivery.ts +8 -7
  413. package/src/runtimePlatformContract.ts +70 -0
  414. package/src/screenshots/frame-compose.ts +42 -43
  415. package/src/screenshots/org-deck.ts +9 -4
  416. package/src/screenshots/preset-names.ts +29 -0
  417. package/src/screenshots/registry.ts +5 -5
  418. package/src/screenshots/schema.ts +1 -1
  419. package/src/screenshots/screenshotContract.ts +971 -0
  420. package/src/settings-flags.ts +107 -0
  421. package/src/settingsContract.ts +609 -0
  422. package/src/storageSnapshotContract.ts +344 -0
  423. package/src/stub-pattern-matcher.ts +550 -0
  424. package/src/swift-compile.ts +926 -47
  425. package/src/swift-compiler-digest.ts +17 -3
  426. package/src/swift-distribution.lock.json +49 -22
  427. package/src/swift-host.ts +167 -52
  428. package/src/swift-objc-compile.ts +86 -26
  429. package/src/swift-objc-export.ts +532 -0
  430. package/src/swift-objc-import.ts +769 -0
  431. package/src/swift-objc-metadata.ts +285 -10
  432. package/src/swift-objc-sdk.ts +13970 -158
  433. package/src/swift-objc-standin.ts +137 -1
  434. package/src/swift-package.ts +94 -0
  435. package/src/swift-packages.ts +5 -5
  436. package/src/swift-root-lock.ts +241 -92
  437. package/src/swift-submit.ts +6 -0
  438. package/src/swiftContract.ts +99 -0
  439. package/src/target-matcher.ts +6 -1
  440. package/src/vite-plugin.ts +14 -40
  441. package/src/worker-system-chunks.ts +1 -1
  442. package/src/workerChunkContract.ts +5 -0
  443. package/src/worklets-babel.ts +24 -5
  444. package/src/xcode-project.ts +103 -11
  445. package/src/xcode-target-members.ts +10 -3
  446. package/cli/drivers/playwright-sim-host.ts +0 -825
  447. package/kotlin/fixtures/counter/Counter.d.kt.ts +0 -17
  448. package/kotlin/fixtures/counter/Counter.kt +0 -51
  449. package/kotlin/fixtures/counter/CounterApp.native.tsx +0 -61
  450. package/kotlin/fixtures/counter/CounterApp.tsx +0 -3
  451. package/kotlin/fixtures/counter/CounterScreen.d.kt.ts +0 -8
  452. package/kotlin/fixtures/counter/CounterScreen.kt +0 -56
  453. package/kotlin/fixtures/counter/app/_layout.tsx +0 -4
  454. package/kotlin/fixtures/counter/app/index+spa.tsx +0 -1
  455. package/kotlin/fixtures/counter/app/routes.d.ts +0 -18
  456. package/kotlin/fixtures/counter/package.json +0 -20
  457. package/kotlin/fixtures/counter/tsconfig.json +0 -19
  458. package/kotlin/fixtures/counter/vite.config.ts +0 -20
  459. package/kotlin/fixtures/headless-counter/Headless.kt +0 -234
  460. package/kotlin/fixtures/import-animation/Animation.d.kt.ts +0 -7
  461. package/kotlin/fixtures/import-animation/Animation.kt +0 -80
  462. package/kotlin/fixtures/import-animation/ImportAnimation.native.tsx +0 -13
  463. package/kotlin/fixtures/import-animation/README.md +0 -24
  464. package/kotlin/fixtures/import-animation/app/_layout.tsx +0 -4
  465. package/kotlin/fixtures/import-animation/app/index+spa.tsx +0 -1
  466. package/kotlin/fixtures/import-animation/app/routes.d.ts +0 -18
  467. package/kotlin/fixtures/import-animation/package.json +0 -23
  468. package/kotlin/fixtures/import-animation/tsconfig.json +0 -20
  469. package/kotlin/fixtures/import-animation/vite.config.ts +0 -20
  470. package/kotlin/fixtures/import-drawing/Drawing.d.kt.ts +0 -7
  471. package/kotlin/fixtures/import-drawing/Drawing.kt +0 -101
  472. package/kotlin/fixtures/import-drawing/ImportDrawing.native.tsx +0 -18
  473. package/kotlin/fixtures/import-drawing/README.md +0 -34
  474. package/kotlin/fixtures/import-drawing/app/_layout.tsx +0 -4
  475. package/kotlin/fixtures/import-drawing/app/index+spa.tsx +0 -1
  476. package/kotlin/fixtures/import-drawing/package.json +0 -23
  477. package/kotlin/fixtures/import-drawing/tsconfig.json +0 -20
  478. package/kotlin/fixtures/import-drawing/vite.config.ts +0 -20
  479. package/kotlin/fixtures/import-editor/Editor.d.kt.ts +0 -7
  480. package/kotlin/fixtures/import-editor/Editor.kt +0 -59
  481. package/kotlin/fixtures/import-editor/ImportEditor.native.tsx +0 -23
  482. package/kotlin/fixtures/import-editor/README.md +0 -27
  483. package/kotlin/fixtures/import-editor/app/_layout.tsx +0 -4
  484. package/kotlin/fixtures/import-editor/app/index+spa.tsx +0 -1
  485. package/kotlin/fixtures/import-editor/package.json +0 -23
  486. package/kotlin/fixtures/import-editor/tsconfig.json +0 -20
  487. package/kotlin/fixtures/import-editor/vite.config.ts +0 -20
  488. package/kotlin/fixtures/import-effects/Effects.d.kt.ts +0 -7
  489. package/kotlin/fixtures/import-effects/Effects.kt +0 -87
  490. package/kotlin/fixtures/import-effects/ImportEffects.native.tsx +0 -13
  491. package/kotlin/fixtures/import-effects/README.md +0 -19
  492. package/kotlin/fixtures/import-effects/app/_layout.tsx +0 -4
  493. package/kotlin/fixtures/import-effects/app/index+spa.tsx +0 -1
  494. package/kotlin/fixtures/import-effects/package.json +0 -23
  495. package/kotlin/fixtures/import-effects/tsconfig.json +0 -20
  496. package/kotlin/fixtures/import-effects/vite.config.ts +0 -20
  497. package/kotlin/fixtures/import-layout/ImportLayout.native.tsx +0 -13
  498. package/kotlin/fixtures/import-layout/Layout.d.kt.ts +0 -7
  499. package/kotlin/fixtures/import-layout/Layout.kt +0 -72
  500. package/kotlin/fixtures/import-layout/README.md +0 -24
  501. package/kotlin/fixtures/import-layout/app/_layout.tsx +0 -4
  502. package/kotlin/fixtures/import-layout/app/index+spa.tsx +0 -1
  503. package/kotlin/fixtures/import-layout/package.json +0 -23
  504. package/kotlin/fixtures/import-layout/tsconfig.json +0 -20
  505. package/kotlin/fixtures/import-layout/vite.config.ts +0 -20
  506. package/kotlin/fixtures/import-navigation/ImportNavigation.native.tsx +0 -18
  507. package/kotlin/fixtures/import-navigation/Navigation.d.kt.ts +0 -7
  508. package/kotlin/fixtures/import-navigation/Navigation.kt +0 -104
  509. package/kotlin/fixtures/import-navigation/README.md +0 -31
  510. package/kotlin/fixtures/import-navigation/app/_layout.tsx +0 -4
  511. package/kotlin/fixtures/import-navigation/app/index+spa.tsx +0 -1
  512. package/kotlin/fixtures/import-navigation/package.json +0 -23
  513. package/kotlin/fixtures/import-navigation/tsconfig.json +0 -20
  514. package/kotlin/fixtures/import-navigation/vite.config.ts +0 -20
  515. package/kotlin/fixtures/import-overlays/ImportOverlays.native.tsx +0 -29
  516. package/kotlin/fixtures/import-overlays/Overlays.d.kt.ts +0 -7
  517. package/kotlin/fixtures/import-overlays/Overlays.kt +0 -93
  518. package/kotlin/fixtures/import-overlays/README.md +0 -34
  519. package/kotlin/fixtures/import-overlays/app/_layout.tsx +0 -4
  520. package/kotlin/fixtures/import-overlays/app/index+spa.tsx +0 -1
  521. package/kotlin/fixtures/import-overlays/package.json +0 -23
  522. package/kotlin/fixtures/import-overlays/tsconfig.json +0 -20
  523. package/kotlin/fixtures/import-overlays/vite.config.ts +0 -20
  524. package/kotlin/fixtures/import-resources/ImportResources.native.tsx +0 -18
  525. package/kotlin/fixtures/import-resources/README.md +0 -26
  526. package/kotlin/fixtures/import-resources/Resources.d.kt.ts +0 -6
  527. package/kotlin/fixtures/import-resources/Resources.kt +0 -72
  528. package/kotlin/fixtures/import-resources/app/_layout.tsx +0 -4
  529. package/kotlin/fixtures/import-resources/app/index+spa.tsx +0 -1
  530. package/kotlin/fixtures/import-resources/package.json +0 -23
  531. package/kotlin/fixtures/import-resources/tsconfig.json +0 -20
  532. package/kotlin/fixtures/import-resources/vite.config.ts +0 -20
  533. package/kotlin/fixtures/import-scroll/ImportNested.native.tsx +0 -10
  534. package/kotlin/fixtures/import-scroll/ImportScroll.native.tsx +0 -13
  535. package/kotlin/fixtures/import-scroll/Nested.d.kt.ts +0 -4
  536. package/kotlin/fixtures/import-scroll/Nested.kt +0 -64
  537. package/kotlin/fixtures/import-scroll/README.md +0 -38
  538. package/kotlin/fixtures/import-scroll/Scroll.d.kt.ts +0 -7
  539. package/kotlin/fixtures/import-scroll/Scroll.kt +0 -91
  540. package/kotlin/fixtures/import-scroll/app/_layout.tsx +0 -4
  541. package/kotlin/fixtures/import-scroll/app/index+spa.tsx +0 -1
  542. package/kotlin/fixtures/import-scroll/app/nested+spa.tsx +0 -1
  543. package/kotlin/fixtures/import-scroll/package.json +0 -23
  544. package/kotlin/fixtures/import-scroll/tsconfig.json +0 -20
  545. package/kotlin/fixtures/import-scroll/vite.config.ts +0 -20
  546. package/kotlin/fixtures/import-selection/ImportSelection.native.tsx +0 -44
  547. package/kotlin/fixtures/import-selection/README.md +0 -32
  548. package/kotlin/fixtures/import-selection/Selection.d.kt.ts +0 -8
  549. package/kotlin/fixtures/import-selection/Selection.kt +0 -78
  550. package/kotlin/fixtures/import-selection/app/_layout.tsx +0 -4
  551. package/kotlin/fixtures/import-selection/app/index+spa.tsx +0 -1
  552. package/kotlin/fixtures/import-selection/package.json +0 -23
  553. package/kotlin/fixtures/import-selection/tsconfig.json +0 -20
  554. package/kotlin/fixtures/import-selection/vite.config.ts +0 -20
  555. package/kotlin/fixtures/import-surfaces/ImportSurfaces.native.tsx +0 -13
  556. package/kotlin/fixtures/import-surfaces/README.md +0 -22
  557. package/kotlin/fixtures/import-surfaces/Surfaces.d.kt.ts +0 -7
  558. package/kotlin/fixtures/import-surfaces/Surfaces.kt +0 -64
  559. package/kotlin/fixtures/import-surfaces/app/_layout.tsx +0 -4
  560. package/kotlin/fixtures/import-surfaces/app/index+spa.tsx +0 -1
  561. package/kotlin/fixtures/import-surfaces/package.json +0 -23
  562. package/kotlin/fixtures/import-surfaces/tsconfig.json +0 -20
  563. package/kotlin/fixtures/import-surfaces/vite.config.ts +0 -20
  564. package/kotlin/fixtures/import-values/ImportValues.native.tsx +0 -61
  565. package/kotlin/fixtures/import-values/README.md +0 -28
  566. package/kotlin/fixtures/import-values/Values.d.kt.ts +0 -15
  567. package/kotlin/fixtures/import-values/Values.kt +0 -84
  568. package/kotlin/fixtures/import-values/app/_layout.tsx +0 -4
  569. package/kotlin/fixtures/import-values/app/index+spa.tsx +0 -1
  570. package/kotlin/fixtures/import-values/package.json +0 -23
  571. package/kotlin/fixtures/import-values/tsconfig.json +0 -20
  572. package/kotlin/fixtures/import-values/vite.config.ts +0 -20
  573. package/kotlin/fixtures/kotlin-app/app/build.gradle.kts +0 -30
  574. package/kotlin/fixtures/kotlin-app/app/src/main/AndroidManifest.xml +0 -13
  575. package/kotlin/fixtures/kotlin-app/app/src/main/java/dev/contrast/kotlinapp/MainActivity.kt +0 -60
  576. package/kotlin/fixtures/kotlin-app/app/src/main/java/dev/contrast/kotlinapp/ProbeApplication.kt +0 -18
  577. package/kotlin/fixtures/kotlin-app/build.gradle.kts +0 -5
  578. package/kotlin/fixtures/kotlin-app/gradle.properties +0 -4
  579. package/kotlin/fixtures/kotlin-app/settings.gradle.kts +0 -4
  580. package/kotlin/fixtures/kotlin-app-variants/Anim.kt +0 -62
  581. package/kotlin/fixtures/kotlin-app-variants/BarBehavior.kt +0 -38
  582. package/kotlin/fixtures/kotlin-app-variants/BarVisibility.kt +0 -36
  583. package/kotlin/fixtures/kotlin-app-variants/Bitmaps.kt +0 -50
  584. package/kotlin/fixtures/kotlin-app-variants/Browse.kt +0 -73
  585. package/kotlin/fixtures/kotlin-app-variants/Colors.kt +0 -41
  586. package/kotlin/fixtures/kotlin-app-variants/Controls.kt +0 -62
  587. package/kotlin/fixtures/kotlin-app-variants/Drag.kt +0 -56
  588. package/kotlin/fixtures/kotlin-app-variants/Draw.kt +0 -74
  589. package/kotlin/fixtures/kotlin-app-variants/Drawables.kt +0 -53
  590. package/kotlin/fixtures/kotlin-app-variants/Focus.kt +0 -62
  591. package/kotlin/fixtures/kotlin-app-variants/Form.kt +0 -47
  592. package/kotlin/fixtures/kotlin-app-variants/Icons.kt +0 -59
  593. package/kotlin/fixtures/kotlin-app-variants/Ime.kt +0 -53
  594. package/kotlin/fixtures/kotlin-app-variants/Lists.kt +0 -57
  595. package/kotlin/fixtures/kotlin-app-variants/Nav.kt +0 -47
  596. package/kotlin/fixtures/kotlin-app-variants/Note.kt +0 -40
  597. package/kotlin/fixtures/kotlin-app-variants/Overlays.kt +0 -56
  598. package/kotlin/fixtures/kotlin-app-variants/Pan.kt +0 -38
  599. package/kotlin/fixtures/kotlin-app-variants/Pickers.kt +0 -44
  600. package/kotlin/fixtures/kotlin-app-variants/Press.kt +0 -43
  601. package/kotlin/fixtures/kotlin-app-variants/Scroll.kt +0 -63
  602. package/kotlin/fixtures/kotlin-app-variants/Sheet.kt +0 -43
  603. package/kotlin/fixtures/kotlin-app-variants/Strings.kt +0 -49
  604. package/kotlin/fixtures/kotlin-app-variants/Tabs.kt +0 -47
  605. package/kotlin/fixtures/kotlin-app-variants/TextWidth.kt +0 -45
  606. package/kotlin/fixtures/kotlin-app-variants/TransientInsets.kt +0 -50
  607. package/kotlin/fixtures/kotlin-app-variants/Transition.kt +0 -69
  608. package/kotlin/fixtures/kotlin-app-variants/ViewConfig.kt +0 -22
  609. package/kotlin/fixtures/kotlin-app-variants/Widgets.kt +0 -67
  610. package/kotlin/fixtures/runtime-state/RuntimeState.kt +0 -200
  611. package/kotlin/fork/README.md +0 -97
  612. package/kotlin/fork/build.sh +0 -176
  613. package/kotlin/fork/compose-worker-globals.patch +0 -1247
  614. package/kotlin/fork/fork.json +0 -46
  615. package/kotlin/fork/publish.ts +0 -99
  616. package/kotlin/fork/skia-android-shaping.patch +0 -189
  617. package/kotlin/fork/skiko-local.init.gradle +0 -10
  618. package/kotlin/fork/skiko-worker-clock.patch +0 -122
@@ -3,11 +3,25 @@ import { readFileSync } from 'node:fs'
3
3
  import path from 'node:path'
4
4
 
5
5
  // the lowering and manifest code in swift-compile.ts and its design-time lowering
6
- // decide the emitted output, so their text addresses every swift artifact. bundled
7
- // builds cannot read these files at runtime, so build-cli injects this digest.
6
+ // decide the emitted output, and the root lock decides whose sources and
7
+ // executable an address names, so their text addresses every swift artifact.
8
+ // bundled builds cannot read these files at runtime, so build-cli injects this
9
+ // digest.
10
+ export const SWIFT_DIGEST_SOURCES = [
11
+ 'swift-compile.ts',
12
+ 'swift-design-time.ts',
13
+ 'swift-root-lock.ts',
14
+ 'swift-objc-export.ts',
15
+ 'swift-objc-import.ts',
16
+ 'swift-objc-metadata.ts',
17
+ 'swiftContract.ts',
18
+ 'swift-objc-standin.ts',
19
+ 'swift-objc-sdk.ts',
20
+ ]
21
+
8
22
  export function swiftCompilerSourceDigest(srcDir: string): string {
9
23
  const hash = createHash('sha256')
10
- for (const file of ['swift-compile.ts', 'swift-design-time.ts']) {
24
+ for (const file of SWIFT_DIGEST_SOURCES) {
11
25
  hash.update(readFileSync(path.join(srcDir, file)))
12
26
  }
13
27
  return hash.digest('hex')
@@ -1,10 +1,10 @@
1
1
  {
2
- "id": "e8dd3a9ff9c4dc74",
2
+ "id": "e3bdd3d8fa4f9993",
3
3
  "release": "swift-6.4.0-RELEASE-custom-0d775d32d7c74eae",
4
- "wasmSdkId": "swift-6.4.0-RELEASE_wasm-peach-21f60db0",
5
- "wasmSdkUrl": "https://r2.sootsim.com/swift-wasm-sdk/swift-6.4.0-RELEASE_wasm-peach-21f60db0.artifactbundle.tar.gz",
6
- "wasmSdkChecksum": "7b7573fd23120549fc928581a42968676f5f00f9ef63e5618032a6928a724e16",
7
- "source": "693296741f3865605388c21ee7e220cb0b6ccaa3",
4
+ "wasmSdkId": "swift-6.4.0-RELEASE_wasm-peach-f02bd198",
5
+ "wasmSdkUrl": "https://r2.sootsim.com/swift-wasm-sdk/swift-6.4.0-RELEASE_wasm-peach-f02bd198.artifactbundle.tar.gz",
6
+ "wasmSdkChecksum": "1e19ea768fd4e821aae34b8966c4ddcee45615c4b3cf018979b061aee2fb5504",
7
+ "source": "5791eeff9ca9c054514aeb4a6599e1de8e1e4711",
8
8
  "targets": [
9
9
  "ImagePlayground",
10
10
  "QuickLookThumbnailing",
@@ -164,14 +164,33 @@
164
164
  "PeachBox2D"
165
165
  ],
166
166
  "systemEnvironment": {
167
- "scenePhase": ["string:active", "string:inactive", "string:background"],
168
- "deviceModel": ["string"],
169
- "systemName": ["string"],
170
- "systemVersion": ["string"],
171
- "colorScheme": ["string:light", "string:dark"],
172
- "semanticColors": ["object"],
173
- "imageAssets": ["object"],
174
- "locale": ["string"],
167
+ "scenePhase": [
168
+ "string:active",
169
+ "string:inactive",
170
+ "string:background"
171
+ ],
172
+ "deviceModel": [
173
+ "string"
174
+ ],
175
+ "systemName": [
176
+ "string"
177
+ ],
178
+ "systemVersion": [
179
+ "string"
180
+ ],
181
+ "colorScheme": [
182
+ "string:light",
183
+ "string:dark"
184
+ ],
185
+ "semanticColors": [
186
+ "object"
187
+ ],
188
+ "imageAssets": [
189
+ "object"
190
+ ],
191
+ "locale": [
192
+ "string"
193
+ ],
175
194
  "dynamicTypeSize": [
176
195
  "string:xSmall",
177
196
  "string:small",
@@ -186,22 +205,30 @@
186
205
  "string:accessibility4",
187
206
  "string:accessibility5"
188
207
  ],
189
- "horizontalSizeClass": ["string:compact", "string:regular"],
190
- "verticalSizeClass": ["string:compact", "string:regular"],
191
- "accessibilityReduceMotion": ["bool"]
208
+ "horizontalSizeClass": [
209
+ "string:compact",
210
+ "string:regular"
211
+ ],
212
+ "verticalSizeClass": [
213
+ "string:compact",
214
+ "string:regular"
215
+ ],
216
+ "accessibilityReduceMotion": [
217
+ "bool"
218
+ ]
192
219
  },
193
220
  "hosts": {
194
221
  "darwin-arm64": {
195
- "sha256": "0e06928cd63077f30226a27b2a3e92e89bdcaaf2fcd57fcac6a38a8465ee6865",
196
- "size": 71438614
222
+ "sha256": "278cf5301795dd1e9f0f044bdb4e079b45ab4eb72a6e72331b06916115e34902",
223
+ "size": 71532233
197
224
  },
198
225
  "linux-x64": {
199
- "sha256": "baae9a89308dfde3cc47366ab4163369ac8537274361d10381004f006a965afa",
200
- "size": 71444190
226
+ "sha256": "920c6fe08ba45930880fee133a3cb85b310d713a4d60404f29d03555d3df879c",
227
+ "size": 71538725
201
228
  },
202
229
  "linux-arm64": {
203
- "sha256": "422e2fbd6f65a8aebe0456e9becc2a6a28505825457c9758e8275f35e2fe63f1",
204
- "size": 71442522
230
+ "sha256": "d3a3421e0c80cc698869bc39dd538d42b0e053db02526d3f5f22acf8e7c6dca9",
231
+ "size": 71536749
205
232
  }
206
233
  }
207
234
  }
package/src/swift-host.ts CHANGED
@@ -30,7 +30,7 @@ import {
30
30
  } from './swift-compile'
31
31
  import { designTimeValues } from './swift-design-time'
32
32
  import { swiftDistributionRoot, swiftModuleToolchain } from './swift-distribution'
33
- import { compileXcodeObjCImplementations } from './swift-objc-compile'
33
+ import { xcodeObjCInputs } from './swift-objc-compile'
34
34
  import {
35
35
  swiftImplicitResourcePaths,
36
36
  swiftMetalSourceFiles,
@@ -78,6 +78,7 @@ import {
78
78
  type SwiftImageUpload,
79
79
  type SwiftNativeModules,
80
80
  } from './swift-submit'
81
+ import { SWIFT_NATIVE_INPUT_ROOT, SWIFT_NATIVE_SDK_INCLUDE } from './swiftContract'
81
82
  import {
82
83
  enclosingXcodeWorkspace,
83
84
  readXcodeAppTarget,
@@ -92,20 +93,17 @@ import type {
92
93
  import type { PeachConfig } from './config'
93
94
  import type { SwiftCompileInput, SwiftIcuAsset } from './swift-compile'
94
95
  import type { SwiftStandinBehaviors } from './swift-standin-emit'
95
- import type { SwiftMetalLibrarySource, SwiftResourceBundle } from './swiftContract'
96
+ import type {
97
+ SwiftMetalLibrarySource,
98
+ SwiftNativeTarget,
99
+ SwiftResourceBundle,
100
+ } from './swiftContract'
96
101
  import type { ServerResponse } from 'node:http'
97
102
 
98
103
  const ARTIFACT_PATH = '/__peach/swift/'
99
104
  const RESOURCE_PATH = '/__peach/swift-res/'
100
105
  const ICU_PATH = '/__peach/swift-icu/'
101
- const SKIP_SOURCE_DIRS = new Set([
102
- 'node_modules',
103
- 'ios',
104
- 'android',
105
- 'dist',
106
- 'types',
107
- 'build',
108
- ])
106
+ const SKIP_SOURCE_DIRS = new Set(['node_modules', 'dist', 'types', 'build'])
109
107
  const NATIVE_DESCRIPTOR = '.one-native-source.json'
110
108
  const NATIVE_GLUE = '.one-native-source.swift.txt'
111
109
 
@@ -350,13 +348,6 @@ function swiftPackages(
350
348
  }
351
349
  entry.packages = cached
352
350
  }
353
- if (
354
- entry.moduleRoot &&
355
- [app, ...app.frameworks].some((target) =>
356
- target.allSources.some((file) => /\.mm?$/.test(file)),
357
- )
358
- )
359
- compileXcodeObjCImplementations(app, cached.binaries, entry.moduleRoot)
360
351
  // a reached binary target with stand-ins for every module it ships
361
352
  // resolves as provided, so what depends on it compiles; the rest keep
362
353
  // their reason with why no stand-in was built. surfaces peach already
@@ -364,31 +355,33 @@ function swiftPackages(
364
355
  // module.
365
356
  // a framework the project vendors links straight into its target, so it
366
357
  // stands in the same way a package's binary target does.
367
- const vendored = app.binaryFrameworks.flatMap(({ name, path: dir }) =>
368
- dir
369
- ? [
370
- {
371
- target: name,
372
- source: 'the project',
373
- url: null,
374
- checksum: null,
375
- dir,
376
- reached: true,
377
- } satisfies SwiftPackageBinary,
378
- ]
379
- : [],
358
+ const vendored: SwiftPackageBinary[] = app.binaryFrameworks.flatMap(
359
+ ({ name, path: dir }) =>
360
+ dir
361
+ ? [
362
+ {
363
+ target: name,
364
+ source: 'the project',
365
+ url: null,
366
+ checksum: null,
367
+ dir,
368
+ reached: true,
369
+ } satisfies SwiftPackageBinary,
370
+ ]
371
+ : [],
380
372
  )
381
373
  const reached = [...cached.binaries.filter((binary) => binary.reached), ...vendored]
382
- if (entry.moduleRoot && entry.provided && reached.length > 0) {
374
+ const artifacts = reached.filter((binary) => binary.publicHeaders === undefined)
375
+ if (entry.moduleRoot && entry.provided && artifacts.length > 0) {
383
376
  const resolved = swiftModuleToolchain(entry.moduleRoot)
384
377
  const toolchain = {
385
378
  moduleRoot: entry.moduleRoot,
386
379
  toolchainBin: resolved.toolchainBin,
387
380
  release: resolved.release,
388
381
  }
389
- const generation = standinGenerationInputs(reached, toolchain, entry.behavior)
382
+ const generation = standinGenerationInputs(artifacts, toolchain, entry.behavior)
390
383
  if (cached.standinKey !== generation) {
391
- const built = swiftStandins(reached, toolchain, entry.provided, entry.behavior)
384
+ const built = swiftStandins(artifacts, toolchain, entry.provided, entry.behavior)
392
385
  cached.packages = resolveSwiftPackages({
393
386
  rootDir: app.rootDir,
394
387
  resolved: app.packageResolved,
@@ -427,7 +420,11 @@ const XCODE_FRAMEWORKS_DIR = '__frameworks__'
427
420
  const XCODE_PACKAGES_DIR = '__packages__'
428
421
 
429
422
  // the compile input key of a root-relative path in an xcode layout.
430
- function xcodeInputKey(layout: XcodeLayout, file: string, relative: string): string {
423
+ function xcodeInputKey(
424
+ layout: Pick<XcodeLayout, 'app' | 'targetDirs'>,
425
+ file: string,
426
+ relative: string,
427
+ ): string {
431
428
  const owner = layout.targetDirs.get(file)
432
429
  if (owner) return path.posix.join(owner, relative)
433
430
  const checkouts = remoteSwiftCheckouts(layout.app.rootDir)
@@ -452,6 +449,8 @@ interface XcodeLayout {
452
449
  /** the input directory each app and framework source compiles under. */
453
450
  targetDirs: Map<string, string>
454
451
  resourceBundles: SwiftResourceBundle[]
452
+ nativeTargets: SwiftNativeTarget[]
453
+ nativeFiles: Map<string, Buffer>
455
454
  files: string[]
456
455
  }
457
456
 
@@ -464,18 +463,7 @@ function xcodeLayout(root: string): XcodeLayout | null {
464
463
  registered.configuration,
465
464
  { prepareGeneratedSources: true },
466
465
  )
467
- const implementations = [app, ...app.frameworks].flatMap((target) =>
468
- target.allSources
469
- .filter((file) => /\.mm?$/i.test(file))
470
- .map((file) => `${target.name}: ${path.relative(app.rootDir, file)}`),
471
- )
472
- if (implementations.length > 0 && !registered.moduleRoot)
473
- throw new Error(
474
- `Peach cannot compile Objective-C implementations in Xcode targets until the runtime and shared Swift object bridge are available:\n${implementations.map((file) => ` ${file}`).join('\n')}`,
475
- )
476
- const appSources = app.allSources.filter(
477
- (file) => file.endsWith('.swift') || file.endsWith('.metal'),
478
- )
466
+ const appSources = app.allSources
479
467
  const files = new Set([
480
468
  ...app.projectFiles,
481
469
  ...app.packageResolved,
@@ -498,7 +486,6 @@ function xcodeLayout(root: string): XcodeLayout | null {
498
486
  path: `Frameworks/${framework.moduleName}.framework`,
499
487
  })
500
488
  for (const file of framework.allSources) {
501
- if (!file.endsWith('.swift') && !file.endsWith('.metal')) continue
502
489
  if (targetDirs.has(file)) continue
503
490
  targetDirs.set(file, dir)
504
491
  files.add(file)
@@ -585,6 +572,118 @@ function xcodeLayout(root: string): XcodeLayout | null {
585
572
  .filter((other) => other.path.startsWith(`${target.path}/`))
586
573
  .map((other) => other.path.slice(target.path.length + 1))
587
574
  }
575
+ const relative = (file: string) =>
576
+ xcodeInputKey(
577
+ { app, targetDirs },
578
+ file,
579
+ path.relative(app.rootDir, file).split(path.sep).join('/') || '.',
580
+ )
581
+ const nativeInputs = xcodeObjCInputs(app, binaries)
582
+ const nativeFiles = nativeInputs.sources
583
+ for (const file of nativeFiles.keys()) files.add(file)
584
+ const nativeHeaders = [...nativeFiles.keys()].filter((file) =>
585
+ /\.(?:h|hh|hpp|hxx|pch|inc|inl|modulemap)$/.test(file),
586
+ )
587
+ const nativePath = (file: string, directory = app.rootDir) => {
588
+ const absolute = path.resolve(directory, file)
589
+ return absolute === '/usr/include' || absolute.startsWith('/usr/include/')
590
+ ? SWIFT_NATIVE_SDK_INCLUDE + absolute.slice('/usr/include'.length)
591
+ : `${SWIFT_NATIVE_INPUT_ROOT}/${relative(absolute)}`
592
+ }
593
+ const nativeFlags = (flags: string[], directory = app.rootDir) =>
594
+ flags.map((flag, index) => {
595
+ if (
596
+ [
597
+ '-I',
598
+ '-F',
599
+ '-iquote',
600
+ '-isystem',
601
+ '-include',
602
+ '-imacros',
603
+ '-iframework',
604
+ ].includes(flags[index - 1] ?? '')
605
+ )
606
+ return nativePath(flag, directory)
607
+ const joined = /^(-I|-F|-iquote|-isystem|-iframework)(.+)$/.exec(flag)
608
+ return joined ? `${joined[1]}${nativePath(joined[2]!, directory)}` : flag
609
+ })
610
+ const nativeTargets = [app, ...app.frameworks].flatMap(
611
+ (target): SwiftNativeTarget[] => {
612
+ if (!target.objc) return []
613
+ const settings = target.objc
614
+ for (const file of [
615
+ ...settings.headers,
616
+ settings.bridgingHeader,
617
+ settings.prefixHeader,
618
+ ])
619
+ if (file) files.add(file)
620
+ return [
621
+ {
622
+ name: target.moduleName,
623
+ deploymentTarget: target.iosDeploymentTarget,
624
+ headers: [...new Set([...settings.headers, ...nativeHeaders])].map(relative),
625
+ publicHeaders: settings.publicHeaders.map(relative),
626
+ bridgingHeader: settings.bridgingHeader
627
+ ? relative(settings.bridgingHeader)
628
+ : null,
629
+ prefixHeader: settings.prefixHeader ? relative(settings.prefixHeader) : null,
630
+ headerSearchPaths: settings.headerSearchPaths
631
+ .filter(
632
+ (file) => file !== '/usr/include' && !file.startsWith('/usr/include/'),
633
+ )
634
+ .map(relative),
635
+ frameworkSearchPaths: settings.frameworkSearchPaths.map(relative),
636
+ flags: [
637
+ ...nativeFlags(settings.flags),
638
+ ...settings.headerSearchPaths
639
+ .filter(
640
+ (file) => file === '/usr/include' || file.startsWith('/usr/include/'),
641
+ )
642
+ .flatMap((file) => ['-I', nativePath(file)]),
643
+ ],
644
+ cxxFlags: nativeFlags(settings.cxxFlags),
645
+ fileFlags: Object.fromEntries(
646
+ Object.entries(settings.fileFlags).map(([file, flags]) => [
647
+ relative(file),
648
+ nativeFlags(flags),
649
+ ]),
650
+ ),
651
+ sourceDirectories: Object.fromEntries(
652
+ target.allSources
653
+ .filter((file) => /\.(?:c|cc|cpp|cxx|m|mm)$/.test(file))
654
+ .map((file) => [relative(file), relative(path.dirname(file))]),
655
+ ),
656
+ },
657
+ ]
658
+ },
659
+ )
660
+ for (const settings of nativeInputs.targets) {
661
+ if (!settings.publicHeaders) continue
662
+ const target = packages.targets.find((value) => value.name === settings.name)
663
+ if (!target) continue
664
+ nativeTargets.push({
665
+ name: target.name,
666
+ deploymentTarget: settings.deploymentTarget,
667
+ headers: nativeHeaders.map(relative),
668
+ publicHeaders: nativeHeaders
669
+ .filter(
670
+ (file) =>
671
+ file.startsWith(`${settings.publicHeaders}${path.sep}`) &&
672
+ /\.(h|hh|hpp|hxx)$/.test(file),
673
+ )
674
+ .map(relative),
675
+ bridgingHeader: null,
676
+ prefixHeader: null,
677
+ headerSearchPaths: settings.includes.map(relative),
678
+ frameworkSearchPaths: [],
679
+ flags: nativeFlags(settings.flags, target.dir),
680
+ cxxFlags: nativeFlags(settings.cxxFlags, target.dir),
681
+ fileFlags: {},
682
+ sourceDirectories: Object.fromEntries(
683
+ settings.files.map((file) => [relative(file), relative(path.dirname(file))]),
684
+ ),
685
+ })
686
+ }
588
687
  return {
589
688
  app,
590
689
  targets,
@@ -594,6 +693,8 @@ function xcodeLayout(root: string): XcodeLayout | null {
594
693
  projectGaps,
595
694
  targetDirs,
596
695
  resourceBundles,
696
+ nativeTargets,
697
+ nativeFiles,
597
698
  files: [...files].sort(),
598
699
  }
599
700
  }
@@ -668,7 +769,10 @@ function sourceTreeFiles(dir: string, canonicalRoot: string): string[] {
668
769
  (entry.name.startsWith('.') &&
669
770
  entry.name !== NATIVE_DESCRIPTOR &&
670
771
  entry.name !== NATIVE_GLUE) ||
671
- SKIP_SOURCE_DIRS.has(entry.name)
772
+ SKIP_SOURCE_DIRS.has(entry.name) ||
773
+ // platform project wrappers are excluded only at the package root;
774
+ // native target sources can contain upstream ios/android directories.
775
+ (dir === canonicalRoot && (entry.name === 'ios' || entry.name === 'android'))
672
776
  )
673
777
  continue
674
778
  const full = path.join(dir, entry.name)
@@ -1233,13 +1337,20 @@ function packageSources(
1233
1337
  for (const file of sourceFiles(packagePath)) {
1234
1338
  const relative = path.relative(packagePath, file).split(path.sep).join(path.posix.sep)
1235
1339
  if (manifests.has(file)) continue
1236
- files[xcode ? xcodeInputKey(xcode, file, relative) : relative] = readPackageFile(
1237
- packagePath,
1238
- file,
1239
- limits.sourceBytes,
1340
+ files[xcode ? xcodeInputKey(xcode, file, relative) : relative] = (
1341
+ xcode?.nativeFiles.get(file) ??
1342
+ readPackageFile(packagePath, file, limits.sourceBytes)
1240
1343
  ).toString('utf8')
1241
1344
  }
1242
1345
  if (xcode) {
1346
+ for (const [file, contents] of xcode.nativeFiles)
1347
+ files[
1348
+ xcodeInputKey(
1349
+ xcode,
1350
+ file,
1351
+ path.relative(packagePath, file).split(path.sep).join('/'),
1352
+ )
1353
+ ] = contents.toString('utf8')
1243
1354
  files['Package.swift'] = xcodeManifest(xcode)
1244
1355
  for (const standin of xcode.standins)
1245
1356
  for (const [file, text] of Object.entries(standin.files))
@@ -1253,6 +1364,7 @@ function packageSources(
1253
1364
 
1254
1365
  interface SwiftPackageSnapshot {
1255
1366
  files: Record<string, string>
1367
+ nativeTargets?: SwiftNativeTarget[]
1256
1368
  entry: string
1257
1369
  resourcePaths: string[]
1258
1370
  resources: SwiftResourceTable
@@ -1275,6 +1387,7 @@ function packageSnapshot(project: SwiftProject, entry: string): SwiftPackageSnap
1275
1387
  const native = nativeSourceDescriptor(project.packagePath)
1276
1388
  return {
1277
1389
  files,
1390
+ ...(layout?.nativeTargets.length ? { nativeTargets: layout.nativeTargets } : {}),
1278
1391
  entry: layout
1279
1392
  ? xcodeInputKey(layout, path.resolve(project.packagePath, entry), entry)
1280
1393
  : entry,
@@ -1322,6 +1435,7 @@ function packageSnapshot(project: SwiftProject, entry: string): SwiftPackageSnap
1322
1435
  function snapshotCompileInput(snapshot: SwiftPackageSnapshot): SwiftCompileInput {
1323
1436
  const input: SwiftCompileInput = {
1324
1437
  files: snapshot.files,
1438
+ ...(snapshot.nativeTargets ? { nativeTargets: snapshot.nativeTargets } : {}),
1325
1439
  metalSources: snapshot.resources.metalUploads,
1326
1440
  resourcePaths: snapshot.resourcePaths,
1327
1441
  resourceBundles: snapshot.bundleFiles.bundles,
@@ -1647,6 +1761,7 @@ async function compileRemote(
1647
1761
  submit,
1648
1762
  {
1649
1763
  files: snapshot.files,
1764
+ ...(snapshot.nativeTargets ? { nativeTargets: snapshot.nativeTargets } : {}),
1650
1765
  metalSources: snapshot.resources.metalUploads,
1651
1766
  resourcePaths: snapshot.resourcePaths,
1652
1767
  resourceBundles: snapshot.bundleFiles.bundles,
@@ -3,14 +3,14 @@ import { createHash } from 'node:crypto'
3
3
  import fs from 'node:fs'
4
4
  import path from 'node:path'
5
5
  import { cacheDir } from './home-paths'
6
- import { swiftSdkPaths, swiftModuleSdk } from './swift-compile'
6
+ import { swiftSdkPaths, swiftModuleDigest, swiftModuleSdk } from './swift-compile'
7
7
  import { swiftModuleToolchain } from './swift-distribution'
8
8
  import {
9
9
  compileObjcPeerMetadata,
10
10
  ObjcPeerMetadataError,
11
11
  validateObjcPeerClasses,
12
12
  } from './swift-objc-metadata'
13
- import { IOS_SDK_ID, materializeObjcSdk } from './swift-objc-standin'
13
+ import { IOS_SDK_ID, materializeObjcSdk, OBJC_IMPORT_VERSION } from './swift-objc-standin'
14
14
  import { swiftTargetModuleName } from './swift-package'
15
15
  import { swiftPackageManifest, swiftTargetFiles } from './swift-package-manifest'
16
16
  import { remoteSwiftCheckouts, type SwiftPackageBinary } from './swift-packages'
@@ -24,29 +24,24 @@ import type { XcodeAppTarget } from './xcode-project'
24
24
 
25
25
  export class SwiftObjCCompilationError extends Error {}
26
26
 
27
- /** compile original implementations before any header-derived replacement can hide them.
28
- * successful objects still require the canonical framework bridge before linking. */
29
- export function compileXcodeObjCImplementations(
30
- app: XcodeAppTarget,
31
- binaries: readonly SwiftPackageBinary[],
32
- moduleRoot: string,
33
- ): never {
34
- const prepared = prepareXcodeObjCImplementations(app, binaries, moduleRoot)
35
- throw new SwiftObjCCompilationError(
36
- `Objective-C implementations compiled, but linking their original method bodies requires the canonical Swift framework object bridge. No implementation was replaced. Inputs and objects: ${prepared.receipt}`,
37
- )
27
+ // a link's target, or null when the target is proven absent; other failures surface.
28
+ function linkedStat(file: string): fs.Stats | null {
29
+ try {
30
+ return fs.statSync(file)
31
+ } catch (error) {
32
+ if (error instanceof Error && 'code' in error && error.code === 'ENOENT') return null
33
+ throw error
34
+ }
38
35
  }
39
36
 
40
- /** prepares genuine objects without authorizing unsupported framework linkage. */
41
- export function prepareXcodeObjCImplementations(
37
+ const isSdkInclude = (file: string): boolean =>
38
+ file === '/usr/include' || file.startsWith('/usr/include/')
39
+
40
+ /** one original source snapshot serves declaration import and implementation compile. */
41
+ export function xcodeObjCInputs(
42
42
  app: XcodeAppTarget,
43
43
  binaries: readonly SwiftPackageBinary[],
44
- moduleRoot: string,
45
- peers?: readonly SwiftObjCPeerClass[],
46
- ): SwiftObjCImplementationPreparation {
47
- if (peers) validateObjcPeerClasses(peers)
48
- const toolchain = swiftModuleToolchain(moduleRoot)
49
- const sdk = swiftSdkPaths(moduleRoot, toolchain.toolchainBin)
44
+ ) {
50
45
  const sources = new Map<string, Buffer>()
51
46
  const links: Record<string, string> = {}
52
47
  const checkouts = remoteSwiftCheckouts(app.rootDir)
@@ -63,13 +58,24 @@ export function prepareXcodeObjCImplementations(
63
58
  ),
64
59
  )
65
60
  }
61
+ const walked = new Set<string>()
62
+ const ancestors = new Set<string>()
66
63
  const addHeaders = (directory: string): void => {
64
+ // a versioned framework links Headers to a real directory: stage each path it is reached by, once, never around a link cycle.
65
+ const real = fs.realpathSync(directory)
66
+ if (walked.has(directory) || ancestors.has(real)) return
67
+ walked.add(directory)
68
+ ancestors.add(real)
67
69
  for (const entry of fs.readdirSync(directory, { withFileTypes: true })) {
68
- if (entry.isDirectory() && entry.name.startsWith('.')) continue
70
+ if (entry.name.startsWith('.') && !entry.isFile()) continue
69
71
  const file = path.join(directory, entry.name)
70
- if (entry.isDirectory()) addHeaders(file)
72
+ // a link to nothing is never opened by the compiler: a header that is needed fails there as not found.
73
+ const linked = entry.isSymbolicLink() ? linkedStat(file) : null
74
+ if (entry.isSymbolicLink() && !linked) continue
75
+ if (entry.isDirectory() || linked?.isDirectory()) addHeaders(file)
71
76
  else if (/\.(h|hh|hpp|hxx|inc|inl|modulemap)$/.test(entry.name)) add(file, true)
72
77
  }
78
+ ancestors.delete(real)
73
79
  }
74
80
  const targets: {
75
81
  name: string
@@ -152,6 +158,30 @@ export function prepareXcodeObjCImplementations(
152
158
  ),
153
159
  ])
154
160
  add(file, true)
161
+ // search paths name directories of headers the target includes; /usr/include maps to the wasm sysroot.
162
+ for (const directory of [
163
+ ...target.objc.headerSearchPaths,
164
+ ...target.objc.frameworkSearchPaths,
165
+ ])
166
+ if (!isSdkInclude(directory) && fs.existsSync(directory)) addHeaders(directory)
167
+ const flags = [
168
+ ...target.objc.flags,
169
+ ...target.objc.cxxFlags,
170
+ ...Object.values(target.objc.fileFlags).flat(),
171
+ ]
172
+ for (const [index, flag] of flags.entries()) {
173
+ const directory = ['-I', '-F', '-iquote', '-isystem', '-iframework'].includes(
174
+ flags[index - 1] ?? '',
175
+ )
176
+ ? flag
177
+ : /^(-I|-F|-iquote|-isystem|-iframework)(.+)$/.exec(flag)?.[2]
178
+ if (directory) {
179
+ const absolute = path.resolve(app.rootDir, directory)
180
+ if (!isSdkInclude(absolute) && fs.existsSync(absolute)) addHeaders(absolute)
181
+ }
182
+ if (['-include', '-imacros'].includes(flags[index - 1] ?? ''))
183
+ add(path.resolve(app.rootDir, flag), true)
184
+ }
155
185
  targets.push({
156
186
  name: target.moduleName,
157
187
  deploymentTarget: target.iosDeploymentTarget,
@@ -164,17 +194,43 @@ export function prepareXcodeObjCImplementations(
164
194
  fileFlags: target.objc.fileFlags,
165
195
  })
166
196
  }
197
+ return { sources, links, targets }
198
+ }
199
+
200
+ /** prepares genuine objects without authorizing unsupported framework linkage. */
201
+ export function prepareXcodeObjCImplementations(
202
+ app: XcodeAppTarget,
203
+ binaries: readonly SwiftPackageBinary[],
204
+ moduleRoot: string,
205
+ peers?: readonly SwiftObjCPeerClass[],
206
+ ): SwiftObjCImplementationPreparation {
207
+ if (peers) validateObjcPeerClasses(peers)
208
+ const toolchain = swiftModuleToolchain(moduleRoot)
209
+ const sdk = swiftSdkPaths(moduleRoot, toolchain.toolchainBin)
210
+ const { sources, links, targets } = xcodeObjCInputs(app, binaries)
211
+ const checkouts = remoteSwiftCheckouts(app.rootDir)
167
212
  const digest = (bytes: Buffer | string) =>
168
213
  createHash('sha256').update(bytes).digest('hex')
169
214
  const inputs = Object.fromEntries(
170
215
  [...sources].map(([file, bytes]) => [file, digest(bytes)]),
171
216
  )
172
217
  const identity = {
173
- version: 8,
218
+ version: 10,
219
+ importer: OBJC_IMPORT_VERSION,
174
220
  peers,
175
221
  metadataDeploymentTarget: peers ? app.iosDeploymentTarget : undefined,
176
222
  release: toolchain.release,
177
223
  compiler: digest(fs.readFileSync(path.join(toolchain.toolchainBin, 'clang'))),
224
+ ...(peers
225
+ ? {
226
+ extractor: digest(
227
+ fs.readFileSync(
228
+ path.join(toolchain.toolchainBin, 'swift-symbolgraph-extract'),
229
+ ),
230
+ ),
231
+ modules: swiftModuleDigest(moduleRoot).toString('hex'),
232
+ }
233
+ : {}),
178
234
  sdk: swiftModuleSdk(moduleRoot),
179
235
  declarations: IOS_SDK_ID,
180
236
  targets,
@@ -290,8 +346,8 @@ export function prepareXcodeObjCImplementations(
290
346
  return path.join(work, name, relative)
291
347
  }
292
348
  // native SDK include paths select the wasm SDK, never host system headers.
293
- if (file.startsWith('/usr/include/'))
294
- return path.join(sdk.sysroot, 'include', file.slice('/usr/include/'.length))
349
+ if (isSdkInclude(file))
350
+ return path.join(sdk.sysroot, 'include', file.slice('/usr/include'.length))
295
351
  throw new Error(
296
352
  `Objective-C compiler input is outside the project and its pinned packages: ${file}`,
297
353
  )
@@ -402,6 +458,7 @@ export function prepareXcodeObjCImplementations(
402
458
  headerCache: path.join(cacheDir(), 'swift-standins'),
403
459
  toolchainBin: toolchain.toolchainBin,
404
460
  sysroot: sdk.sysroot,
461
+ stdlib: path.join(moduleRoot, 'ios-simulator-stdlib'),
405
462
  minimum: minimumFor({
406
463
  name: app.moduleName,
407
464
  deploymentTarget: app.iosDeploymentTarget,
@@ -458,6 +515,9 @@ export function prepareXcodeObjCImplementations(
458
515
  : []),
459
516
  '-F',
460
517
  path.join(headers, 'System/Library/Frameworks'),
518
+ // the extension headers include the installed libc before adding darwin declarations.
519
+ '-isystem',
520
+ path.join(headers, 'wasm/include'),
461
521
  // installed libc and objc runtime headers own the target ABI.
462
522
  '-idirafter',
463
523
  path.join(headers, 'usr/include'),