peachsim 0.1.1644 → 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 (608) hide show
  1. package/README.md +12 -0
  2. package/cli/app-catalog.ts +1 -1
  3. package/cli/app-fonts.ts +11 -80
  4. package/cli/app-splash.ts +18 -12
  5. package/cli/bridge-flow-runner.ts +11 -7
  6. package/cli/cloud-client.ts +10 -13
  7. package/cli/command-registry.ts +13 -4
  8. package/cli/commands/box.ts +4 -4
  9. package/cli/commands/control.ts +93 -53
  10. package/cli/commands/coverage-parser.ts +67 -0
  11. package/cli/commands/coverage.ts +550 -0
  12. package/cli/commands/debug.ts +9 -18
  13. package/cli/commands/desktop.ts +19 -7
  14. package/cli/commands/device.ts +14 -9
  15. package/cli/commands/guest-host.ts +6 -10
  16. package/cli/commands/inspect/core.ts +81 -17
  17. package/cli/commands/inspect.ts +13 -8
  18. package/cli/commands/kotlin.ts +2 -2
  19. package/cli/commands/maestro-compare.ts +1 -1
  20. package/cli/commands/platform.ts +20 -11
  21. package/cli/commands/preview.ts +16 -18
  22. package/cli/commands/runtime.ts +3 -2
  23. package/cli/commands/screenshot-layers.ts +1 -1
  24. package/cli/commands/screenshot.ts +1 -1
  25. package/cli/commands/serve.ts +5 -1
  26. package/cli/commands/support.ts +4 -4
  27. package/cli/commands/three-mode.ts +22 -15
  28. package/cli/commands/upload.ts +44 -45
  29. package/cli/current-sim.ts +38 -0
  30. package/cli/desktop-companion.ts +36 -8
  31. package/cli/device-option.ts +1 -1
  32. package/cli/drivers/playwright.ts +1 -0
  33. package/cli/drivers/types.ts +4 -0
  34. package/cli/help-core.ts +1 -1
  35. package/cli/internal-child.ts +2 -1
  36. package/cli/main.ts +9 -3
  37. package/cli/outbound-endpoints.ts +11 -3
  38. package/cli/output-redaction.ts +39 -14
  39. package/cli/remote-simulators.ts +4 -1
  40. package/cli/scene-video.ts +5 -2
  41. package/cli/send-to-box.ts +7 -10
  42. package/cli/telemetry.ts +1 -1
  43. package/cli/ws-bridge.ts +8 -1
  44. package/detox/attempt-events.cjs +3 -1
  45. package/detox/attempt-events.d.cts +1 -1
  46. package/detox/expectations.ts +108 -99
  47. package/detox/frame-offset.d.mts +6 -0
  48. package/detox/frame-offset.mjs +35 -0
  49. package/detox/gestures.ts +6 -18
  50. package/detox/index.ts +169 -101
  51. package/detox/jest-preset.cjs +1 -3
  52. package/detox/jest-transform.cjs +4 -0
  53. package/detox/matchers.ts +3 -0
  54. package/detox/motion-change.cjs +46 -114
  55. package/detox/motion-change.d.cts +5 -27
  56. package/dist-lib/agent-daemon-client.cjs +1 -1
  57. package/dist-lib/agent-events.cjs +1 -1
  58. package/dist-lib/attached-projects.cjs +1 -1
  59. package/dist-lib/auth/shared-session.cjs +1 -1
  60. package/dist-lib/backend-origin.cjs +1 -1
  61. package/dist-lib/beta.cjs +1 -1
  62. package/dist-lib/beta.mjs +1 -1
  63. package/dist-lib/bridge-constants.cjs +1 -1
  64. package/dist-lib/bridge-contract-input.cjs +65 -1
  65. package/dist-lib/bridge-contract-input.mjs +63 -1
  66. package/dist-lib/bridge-contract.cjs +19 -1
  67. package/dist-lib/bridge-contract.mjs +17 -1
  68. package/dist-lib/bundle-channel.cjs +38091 -14846
  69. package/dist-lib/capture-contract.cjs +1 -1
  70. package/dist-lib/capture-contract.mjs +1 -1
  71. package/dist-lib/cloud-contract.cjs +1 -1
  72. package/dist-lib/cloud-contract.mjs +1 -1
  73. package/dist-lib/cloud-test-args.cjs +1 -1
  74. package/dist-lib/cloud-test-args.mjs +1 -1
  75. package/dist-lib/cloud.cjs +1 -1
  76. package/dist-lib/cloud.mjs +1 -1
  77. package/dist-lib/config.cjs +1 -1
  78. package/dist-lib/config.mjs +5 -3
  79. package/dist-lib/detox/index.cjs +1244 -4509
  80. package/dist-lib/detox/jest-preset.cjs +1 -3
  81. package/dist-lib/detox/jest-transform.cjs +4 -0
  82. package/dist-lib/dev-bundle-resolution.cjs +28 -24
  83. package/dist-lib/expo-swift-bundle.cjs +35049 -13125
  84. package/dist-lib/expo-swift-metadata.cjs +1 -1
  85. package/dist-lib/expo-swift-metadata.mjs +1 -1
  86. package/dist-lib/home-paths.cjs +1 -1
  87. package/dist-lib/host/bridge-host.cjs +45112 -63143
  88. package/dist-lib/host/fetch-proxy-handler.cjs +3544 -11
  89. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  90. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  91. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  92. package/dist-lib/host/websocket-proxy.cjs +1 -1
  93. package/dist-lib/index.cjs +1909 -2029
  94. package/dist-lib/jump-to-source-babel.cjs +1 -1
  95. package/dist-lib/jump-to-source-native.cjs +1 -1
  96. package/dist-lib/kotlin-host.cjs +2 -2
  97. package/dist-lib/menu.cjs +1 -1
  98. package/dist-lib/menu.mjs +1 -1
  99. package/dist-lib/metro-fingerprint-registry.cjs +1 -1
  100. package/dist-lib/metro-fingerprint-registry.mjs +1 -1
  101. package/dist-lib/metro-production-bundle.cjs +1 -1
  102. package/dist-lib/metro-production-bundle.mjs +1 -1
  103. package/dist-lib/metro.cjs +380 -522
  104. package/dist-lib/native-app-identity-project.cjs +39 -252
  105. package/dist-lib/native-app-identity-project.mjs +1174 -11
  106. package/dist-lib/native-app-identity.cjs +8 -3
  107. package/dist-lib/native-app-identity.mjs +8 -3
  108. package/dist-lib/native-firebase-metadata.cjs +1 -1
  109. package/dist-lib/native-firebase-metadata.mjs +1 -1
  110. package/dist-lib/plist.cjs +2 -244
  111. package/dist-lib/plist.mjs +1 -1
  112. package/dist-lib/profiles.cjs +1 -1
  113. package/dist-lib/public-brand.cjs +1 -1
  114. package/dist-lib/public-origins-lib-esm.json +290 -0
  115. package/dist-lib/public-origins-lib-static.json +1 -0
  116. package/dist-lib/public-origins-lib.json +1852 -0
  117. package/dist-lib/react-native-host-modules.cjs +1 -1
  118. package/dist-lib/react-native-host-modules.mjs +1 -1
  119. package/dist-lib/scripts/dev-server-scanner.cjs +14 -253
  120. package/dist-lib/sdk.cjs +83 -16
  121. package/dist-lib/sdk.mjs +81 -15
  122. package/dist-lib/skills.cjs +50546 -75098
  123. package/dist-lib/swift-compile.cjs +25897 -1070
  124. package/dist-lib/swift-compile.mjs +25866 -1033
  125. package/dist-lib/swift-package.cjs +79 -1
  126. package/dist-lib/swift-package.mjs +75 -1
  127. package/dist-lib/swift-submit.cjs +1 -1
  128. package/dist-lib/swift-submit.mjs +1 -1
  129. package/dist-lib/swift-toolchain.cjs +1 -1
  130. package/dist-lib/swift.cjs +1 -1
  131. package/dist-lib/vite-swift.cjs +34273 -12349
  132. package/dist-lib/vite.cjs +373 -298
  133. package/dist-lib/worklet-executable.cjs +1 -1
  134. package/dist-lib/worklet-executable.mjs +1 -1
  135. package/dist-types/packages/peach-compat/src/engine-config.d.ts +2 -0
  136. package/dist-types/packages/peach-compat/src/stubs/form-sheet-spring.d.ts +9 -0
  137. package/dist-types/packages/peach-compat/src/stubs/native-evaluation-lease.d.ts +47 -0
  138. package/dist-types/packages/peach-compat/src/stubs/native-seams/react-native-cookies.d.ts +113 -0
  139. package/dist-types/packages/peach-compat/src/stubs/native-seams/react-native-gesture-handler.d.ts +154 -0
  140. package/dist-types/packages/peach-compat/src/stubs/screen-transition-math.d.ts +756 -0
  141. package/dist-types/packages/peach-compat/src/stubs/transition-scalar.d.ts +25 -0
  142. package/dist-types/packages/peach-engine/src/billing/plans.d.ts +64 -0
  143. package/dist-types/packages/peach-engine/src/browser-page-target.d.ts +2 -0
  144. package/dist-types/packages/peach-engine/src/bundle-platform-url.d.ts +3 -0
  145. package/dist-types/packages/peach-engine/src/capture/browser-accessibility-host.d.ts +3 -0
  146. package/dist-types/packages/peach-engine/src/capture/browser-composite.d.ts +55 -0
  147. package/dist-types/packages/peach-engine/src/capture/browserAccessibilityContract.d.ts +27 -0
  148. package/dist-types/packages/peach-engine/src/capture/nativeScreenCaptureContract.d.ts +22 -0
  149. package/dist-types/packages/peach-engine/src/cli-companion.d.ts +36 -0
  150. package/dist-types/packages/peach-engine/src/components/native-ui/webview-frame-bridge.d.ts +34 -0
  151. package/dist-types/packages/peach-engine/src/config.d.ts +5 -0
  152. package/dist-types/packages/peach-engine/src/engine/android-stretch-effect.d.ts +57 -0
  153. package/dist-types/packages/peach-engine/src/engine/animated-driven-style.d.ts +47 -0
  154. package/dist-types/packages/peach-engine/src/engine/animated-value.d.ts +5 -0
  155. package/dist-types/packages/peach-engine/src/engine/animated.d.ts +195 -0
  156. package/dist-types/packages/peach-engine/src/engine/animation-clockContract.d.ts +15 -0
  157. package/dist-types/packages/peach-engine/src/engine/animation-graph.d.ts +148 -0
  158. package/dist-types/packages/peach-engine/src/engine/app-catalog-wire.d.ts +10 -0
  159. package/dist-types/packages/peach-engine/src/engine/app-font-registry.d.ts +87 -0
  160. package/dist-types/packages/peach-engine/src/engine/attributed-paragraph-paint.d.ts +7 -0
  161. package/dist-types/packages/peach-engine/src/engine/attributed-paragraph.d.ts +123 -0
  162. package/dist-types/packages/peach-engine/src/engine/audioContract.d.ts +16 -0
  163. package/dist-types/packages/peach-engine/src/engine/canvaskit-api.d.ts +93 -0
  164. package/dist-types/packages/peach-engine/src/engine/canvaskit-renderer.d.ts +216 -0
  165. package/dist-types/packages/peach-engine/src/engine/config-plugin-fonts.d.ts +40 -0
  166. package/dist-types/packages/peach-engine/src/engine/config-plugin-splash.d.ts +25 -0
  167. package/dist-types/packages/peach-engine/src/engine/cull-visibility.d.ts +44 -0
  168. package/dist-types/packages/peach-engine/src/engine/damage-rect.d.ts +19 -0
  169. package/dist-types/packages/peach-engine/src/engine/engine-resource.d.ts +6 -0
  170. package/dist-types/packages/peach-engine/src/engine/expo-manifest.d.ts +5 -0
  171. package/dist-types/packages/peach-engine/src/engine/fiber-debug-metadata.d.ts +30 -0
  172. package/dist-types/packages/peach-engine/src/engine/font-config.d.ts +139 -0
  173. package/dist-types/packages/peach-engine/src/engine/generated/sf-pro-font.d.ts +1 -0
  174. package/dist-types/packages/peach-engine/src/engine/glass-material.d.ts +31 -0
  175. package/dist-types/packages/peach-engine/src/engine/host-composite.d.ts +100 -0
  176. package/dist-types/packages/peach-engine/src/engine/hosted-semantics.d.ts +49 -0
  177. package/dist-types/packages/peach-engine/src/engine/image-audit.d.ts +70 -0
  178. package/dist-types/packages/peach-engine/src/engine/image-loader.d.ts +350 -0
  179. package/dist-types/packages/peach-engine/src/engine/inspect-info.d.ts +27 -0
  180. package/dist-types/packages/peach-engine/src/engine/inspect-outline.d.ts +14 -0
  181. package/dist-types/packages/peach-engine/src/engine/inspect-visibility.d.ts +33 -0
  182. package/dist-types/packages/peach-engine/src/engine/ios-fast-scroll.d.ts +16 -0
  183. package/dist-types/packages/peach-engine/src/engine/layout-sab.d.ts +43 -0
  184. package/dist-types/packages/peach-engine/src/engine/liquid-glass-rect.d.ts +23 -0
  185. package/dist-types/packages/peach-engine/src/engine/liquid-glass-shaders.d.ts +9 -0
  186. package/dist-types/packages/peach-engine/src/engine/liquid-glass.d.ts +283 -0
  187. package/dist-types/packages/peach-engine/src/engine/live-object-counts.d.ts +6 -0
  188. package/dist-types/packages/peach-engine/src/engine/lottie-runtime.d.ts +32 -0
  189. package/dist-types/packages/peach-engine/src/engine/lottie-types.d.ts +138 -0
  190. package/dist-types/packages/peach-engine/src/engine/memory-counts.d.ts +27 -0
  191. package/dist-types/packages/peach-engine/src/engine/metalDirectContract.d.ts +108 -0
  192. package/dist-types/packages/peach-engine/src/engine/metalShaderContract.d.ts +217 -0
  193. package/dist-types/packages/peach-engine/src/engine/native-animation-driver.d.ts +112 -0
  194. package/dist-types/packages/peach-engine/src/engine/native-animation-graph.d.ts +62 -0
  195. package/dist-types/packages/peach-engine/src/engine/native-layout.d.ts +133 -0
  196. package/dist-types/packages/peach-engine/src/engine/native-resources.d.ts +26 -0
  197. package/dist-types/packages/peach-engine/src/engine/nativeReanimatedContract.d.ts +25 -0
  198. package/dist-types/packages/peach-engine/src/engine/nativeReplayContract.d.ts +64 -0
  199. package/dist-types/packages/peach-engine/src/engine/node.d.ts +589 -0
  200. package/dist-types/packages/peach-engine/src/engine/paint-boundary-types.d.ts +112 -0
  201. package/dist-types/packages/peach-engine/src/engine/paint-boundary.d.ts +57 -0
  202. package/dist-types/packages/peach-engine/src/engine/portalContract.d.ts +21 -0
  203. package/dist-types/packages/peach-engine/src/engine/portals.d.ts +20 -0
  204. package/dist-types/packages/peach-engine/src/engine/render-damage.d.ts +107 -0
  205. package/dist-types/packages/peach-engine/src/engine/riveContract.d.ts +420 -0
  206. package/dist-types/packages/peach-engine/src/engine/rn-spring.d.ts +51 -0
  207. package/dist-types/packages/peach-engine/src/engine/scene-table.d.ts +379 -0
  208. package/dist-types/packages/peach-engine/src/engine/scroll-momentum-math.d.ts +152 -0
  209. package/dist-types/packages/peach-engine/src/engine/scroll-pan-contacts.d.ts +10 -0
  210. package/dist-types/packages/peach-engine/src/engine/scroll-platform.d.ts +75 -0
  211. package/dist-types/packages/peach-engine/src/engine/scroll-range.d.ts +14 -0
  212. package/dist-types/packages/peach-engine/src/engine/scroll-velocity.d.ts +14 -0
  213. package/dist-types/packages/peach-engine/src/engine/scroll.d.ts +320 -0
  214. package/dist-types/packages/peach-engine/src/engine/signal.d.ts +7 -0
  215. package/dist-types/packages/peach-engine/src/engine/snapshot-cache-policy.d.ts +6 -0
  216. package/dist-types/packages/peach-engine/src/engine/svg-geometry.d.ts +41 -0
  217. package/dist-types/packages/peach-engine/src/engine/text-attachment-paragraphs.d.ts +10 -0
  218. package/dist-types/packages/peach-engine/src/engine/text-decoration.d.ts +11 -0
  219. package/dist-types/packages/peach-engine/src/engine/text-line-break.d.ts +22 -0
  220. package/dist-types/packages/peach-engine/src/engine/text-paint-receipt.d.ts +98 -0
  221. package/dist-types/packages/peach-engine/src/engine/text-paragraph.d.ts +11 -0
  222. package/dist-types/packages/peach-engine/src/engine/text-paragraphContract.d.ts +34 -0
  223. package/dist-types/packages/peach-engine/src/engine/text-transform.d.ts +1 -0
  224. package/dist-types/packages/peach-engine/src/engine/types.d.ts +657 -0
  225. package/dist-types/packages/peach-engine/src/engine/visible-frame.d.ts +54 -0
  226. package/dist-types/packages/peach-engine/src/engine/webrtcContract.d.ts +74 -0
  227. package/dist-types/packages/peach-engine/src/graphite-stats-fields.d.ts +184 -0
  228. package/dist-types/packages/peach-engine/src/guest-import-meta.d.ts +12 -0
  229. package/dist-types/packages/peach-engine/src/guest-module-overrides.d.ts +7 -0
  230. package/dist-types/packages/peach-engine/src/ios/app-card-types.d.ts +7 -0
  231. package/dist-types/packages/peach-engine/src/ios/apps/canvas-map-data.d.ts +177 -0
  232. package/dist-types/packages/peach-engine/src/ios/aux-home-scene.d.ts +54 -0
  233. package/dist-types/packages/peach-engine/src/ios/chrome-metrics.d.ts +47 -0
  234. package/dist-types/packages/peach-engine/src/ios/constants.d.ts +21 -0
  235. package/dist-types/packages/peach-engine/src/ios/duo-housing.d.ts +37 -0
  236. package/dist-types/packages/peach-engine/src/ios/home/types.d.ts +29 -0
  237. package/dist-types/packages/peach-engine/src/ios/home-app-catalog.d.ts +43 -0
  238. package/dist-types/packages/peach-engine/src/ios/photo-store.d.ts +73 -0
  239. package/dist-types/packages/peach-engine/src/ios/photoLibraryContract.d.ts +166 -0
  240. package/dist-types/packages/peach-engine/src/ios/shell-controller-types.d.ts +21 -0
  241. package/dist-types/packages/peach-engine/src/ios/shell-transition-debug.d.ts +18 -0
  242. package/dist-types/packages/peach-engine/src/metro-asset-path.d.ts +21 -0
  243. package/dist-types/packages/peach-engine/src/metro-fingerprint-registry-client.d.ts +11 -0
  244. package/dist-types/packages/peach-engine/src/metro-fingerprint.d.ts +38 -0
  245. package/dist-types/packages/peach-engine/src/native-preview-bundle.d.ts +44 -0
  246. package/dist-types/packages/peach-engine/src/observability/types.d.ts +74 -0
  247. package/dist-types/packages/peach-engine/src/peach-warm-manifest.d.ts +32 -0
  248. package/dist-types/packages/peach-engine/src/permissions/app-settings-client.d.ts +25 -0
  249. package/dist-types/packages/peach-engine/src/permissions/system-permission-types.d.ts +20 -0
  250. package/dist-types/packages/peach-engine/src/platform/android-back-panel.d.ts +131 -0
  251. package/dist-types/packages/peach-engine/src/platform/android-gesture-exclusion.d.ts +28 -0
  252. package/dist-types/packages/peach-engine/src/platform/android-predictive-back.d.ts +33 -0
  253. package/dist-types/packages/peach-engine/src/platform/system-bars-state.d.ts +14 -0
  254. package/dist-types/packages/peach-engine/src/playwright-sim-host.d.ts +1 -0
  255. package/dist-types/packages/peach-engine/src/preview/bundle-layout.d.ts +8 -0
  256. package/dist-types/packages/peach-engine/src/preview/bundle-variantContract.d.ts +24 -0
  257. package/dist-types/packages/peach-engine/src/preview/capture-bundle.d.ts +26 -0
  258. package/dist-types/packages/peach-engine/src/preview/compress-node.d.ts +2 -0
  259. package/dist-types/packages/peach-engine/src/preview/compress.d.ts +2 -0
  260. package/dist-types/packages/peach-engine/src/preview/presigned-upload.d.ts +60 -0
  261. package/dist-types/packages/peach-engine/src/preview/trace.d.ts +144 -0
  262. package/dist-types/packages/peach-engine/src/preview/upload-protocol.d.ts +152 -0
  263. package/dist-types/packages/peach-engine/src/profiler/animation-recording-loader.d.ts +1 -0
  264. package/dist-types/packages/peach-engine/src/profiler/profile-trace.d.ts +4 -0
  265. package/dist-types/packages/peach-engine/src/react-bridge.d.ts +3 -0
  266. package/dist-types/packages/peach-engine/src/react-native/AppState.d.ts +45 -0
  267. package/dist-types/packages/peach-engine/src/react-native/Appearance.d.ts +34 -0
  268. package/dist-types/packages/peach-engine/src/react-native/framework-colors-data.d.ts +2 -0
  269. package/dist-types/packages/peach-engine/src/react-native/host-services.d.ts +42 -0
  270. package/dist-types/packages/peach-engine/src/react-native/layout-animation.d.ts +22 -0
  271. package/dist-types/packages/peach-engine/src/react-native/platform-colors.d.ts +17 -0
  272. package/dist-types/packages/peach-engine/src/remote-stream/client-config.d.ts +10 -0
  273. package/dist-types/packages/peach-engine/src/remote-stream/cloud-display.d.ts +58 -0
  274. package/dist-types/packages/peach-engine/src/remote-stream/scene-recording.d.ts +45 -0
  275. package/dist-types/packages/peach-engine/src/render-worker/animated-drive-output.d.ts +35 -0
  276. package/dist-types/packages/peach-engine/src/render-worker/app-load.d.ts +16 -0
  277. package/dist-types/packages/peach-engine/src/render-worker/aux-surface-types.d.ts +2 -0
  278. package/dist-types/packages/peach-engine/src/render-worker/canvaskit-shared.d.ts +42 -0
  279. package/dist-types/packages/peach-engine/src/render-worker/canvaskit-webgpu.d.ts +434 -0
  280. package/dist-types/packages/peach-engine/src/render-worker/canvaskit-worker-init.d.ts +12 -0
  281. package/dist-types/packages/peach-engine/src/render-worker/compositor-backend.d.ts +31 -0
  282. package/dist-types/packages/peach-engine/src/render-worker/compositor-gpu.d.ts +202 -0
  283. package/dist-types/packages/peach-engine/src/render-worker/compositor-protocol.d.ts +1945 -0
  284. package/dist-types/packages/peach-engine/src/render-worker/compositor-runtime/scroll-drag-resample.d.ts +44 -0
  285. package/dist-types/packages/peach-engine/src/render-worker/css-keyframes-drive.d.ts +36 -0
  286. package/dist-types/packages/peach-engine/src/render-worker/edit-menu-geometry.d.ts +8 -0
  287. package/dist-types/packages/peach-engine/src/render-worker/engine-resource-relay.d.ts +21 -0
  288. package/dist-types/packages/peach-engine/src/render-worker/expo-widgetContract.d.ts +16 -0
  289. package/dist-types/packages/peach-engine/src/render-worker/gesture-seam-protocol.d.ts +152 -0
  290. package/dist-types/packages/peach-engine/src/render-worker/graph-linked-value.d.ts +29 -0
  291. package/dist-types/packages/peach-engine/src/render-worker/graphite-pipeline-compiler-contract.d.ts +49 -0
  292. package/dist-types/packages/peach-engine/src/render-worker/graphite-pipeline-compiler.d.ts +12 -0
  293. package/dist-types/packages/peach-engine/src/render-worker/host-service-protocol.d.ts +756 -0
  294. package/dist-types/packages/peach-engine/src/render-worker/image-lifecycle-event.d.ts +22 -0
  295. package/dist-types/packages/peach-engine/src/render-worker/image-pixel-contract.d.ts +48 -0
  296. package/dist-types/packages/peach-engine/src/render-worker/live-frame-mirror.d.ts +34 -0
  297. package/dist-types/packages/peach-engine/src/render-worker/map-command-channel.d.ts +189 -0
  298. package/dist-types/packages/peach-engine/src/render-worker/mapNativeContract.d.ts +101 -0
  299. package/dist-types/packages/peach-engine/src/render-worker/native-dynamic-synchronizable.d.ts +22 -0
  300. package/dist-types/packages/peach-engine/src/render-worker/native-menu-gesture.d.ts +9 -0
  301. package/dist-types/packages/peach-engine/src/render-worker/native-ui-commandContract.d.ts +23 -0
  302. package/dist-types/packages/peach-engine/src/render-worker/native-ui-protocol.d.ts +1087 -0
  303. package/dist-types/packages/peach-engine/src/render-worker/native-widgetContract.d.ts +100 -0
  304. package/dist-types/packages/peach-engine/src/render-worker/nativeAnimMirrorContract.d.ts +174 -0
  305. package/dist-types/packages/peach-engine/src/render-worker/nativeSyncReplyContract.d.ts +11 -0
  306. package/dist-types/packages/peach-engine/src/render-worker/one-native-contentContract.d.ts +54 -0
  307. package/dist-types/packages/peach-engine/src/render-worker/pointerSampleContract.d.ts +14 -0
  308. package/dist-types/packages/peach-engine/src/render-worker/protocol.d.ts +880 -0
  309. package/dist-types/packages/peach-engine/src/render-worker/reanimated-css-contract.d.ts +63 -0
  310. package/dist-types/packages/peach-engine/src/render-worker/reanimated-readiness.d.ts +29 -0
  311. package/dist-types/packages/peach-engine/src/render-worker/resilient-frame-clock.d.ts +22 -0
  312. package/dist-types/packages/peach-engine/src/render-worker/retained-app-load.d.ts +20 -0
  313. package/dist-types/packages/peach-engine/src/render-worker/screen-edge-swipe-commit-protocol.d.ts +1 -0
  314. package/dist-types/packages/peach-engine/src/render-worker/screen-form-sheet-commit-protocol.d.ts +26 -0
  315. package/dist-types/packages/peach-engine/src/render-worker/scroll-mirror-tenant.d.ts +37 -0
  316. package/dist-types/packages/peach-engine/src/render-worker/scroll-mirror.d.ts +164 -0
  317. package/dist-types/packages/peach-engine/src/render-worker/shell-event-registry.d.ts +119 -0
  318. package/dist-types/packages/peach-engine/src/render-worker/shell-gesture-regions.d.ts +41 -0
  319. package/dist-types/packages/peach-engine/src/render-worker/shell-protocol.d.ts +603 -0
  320. package/dist-types/packages/peach-engine/src/render-worker/shell-scene-schema.d.ts +101 -0
  321. package/dist-types/packages/peach-engine/src/render-worker/shell-tree-inline-sources.d.ts +13 -0
  322. package/dist-types/packages/peach-engine/src/render-worker/shell-tree-wire.d.ts +87 -0
  323. package/dist-types/packages/peach-engine/src/render-worker/test-bridge-protocol.d.ts +47 -0
  324. package/dist-types/packages/peach-engine/src/render-worker/text-inputContract.d.ts +93 -0
  325. package/dist-types/packages/peach-engine/src/render-worker/tree-sync-port.d.ts +102 -0
  326. package/dist-types/packages/peach-engine/src/render-worker/webgpu-frame-transaction.d.ts +292 -0
  327. package/dist-types/packages/peach-engine/src/render-worker/webgpu-readback-scheduler.d.ts +107 -0
  328. package/dist-types/packages/peach-engine/src/render-worker/webview-capture-protocol.d.ts +16 -0
  329. package/dist-types/packages/peach-engine/src/render-worker/worker-input-runtime.d.ts +211 -0
  330. package/dist-types/packages/peach-engine/src/render-worker/worker-storage.d.ts +33 -0
  331. package/dist-types/packages/peach-engine/src/render-worker/worklet-runtime.d.ts +987 -0
  332. package/dist-types/packages/peach-engine/src/render-worker/worklet-sab.d.ts +24 -0
  333. package/dist-types/packages/peach-engine/src/rolldown-bundle-inventory.d.ts +84 -0
  334. package/dist-types/packages/peach-engine/src/rolldown-production-fingerprint.d.ts +31 -0
  335. package/dist-types/packages/peach-engine/src/screenshots/timeline-assets.d.ts +10 -0
  336. package/dist-types/packages/peach-engine/src/screenshots/tokens.d.ts +9 -0
  337. package/dist-types/packages/peach-engine/src/settings/devices.d.ts +70 -0
  338. package/dist-types/packages/peach-engine/src/settings/duo-fold-bus.d.ts +87 -0
  339. package/dist-types/packages/peach-engine/src/settings/interface-rotation.d.ts +30 -0
  340. package/dist-types/packages/peach-engine/src/settings/react-native-configuration.d.ts +12 -0
  341. package/dist-types/packages/peach-engine/src/settings/scene-geometryContract.d.ts +40 -0
  342. package/dist-types/packages/peach-engine/src/settings/store.d.ts +37 -0
  343. package/dist-types/packages/peach-engine/src/shell-events.d.ts +203 -0
  344. package/dist-types/packages/peach-engine/src/shell-intent.d.ts +68 -0
  345. package/dist-types/packages/peach-engine/src/sootsim-event.d.ts +35 -0
  346. package/dist-types/packages/peach-engine/src/top-overlay-state.d.ts +5 -0
  347. package/dist-types/packages/peach-engine/src/web-authentication-automation-host.d.ts +2 -0
  348. package/dist-types/packages/peach-engine/src/webAuthenticationContract.d.ts +34 -0
  349. package/dist-types/packages/peach-engine/src/webview-automation-host.d.ts +180 -0
  350. package/dist-types/packages/peach-engine/src/wireframe-mode.d.ts +16 -0
  351. package/dist-types/packages/peach-globals/src/frameBreakdownContract.d.ts +16 -0
  352. package/dist-types/packages/peach-globals/src/index.d.ts +3311 -0
  353. package/dist-types/packages/peach-globals/src/nativeSurfaceContract.d.ts +76 -0
  354. package/dist-types/packages/peach-globals/src/pointerSourceEventContract.d.ts +8 -0
  355. package/dist-types/packages/peach-globals/src/profileTrace.d.ts +11 -0
  356. package/dist-types/packages/peach-globals/src/profilerContract.d.ts +223 -0
  357. package/dist-types/packages/peach-kit/src/capabilities.d.ts +721 -0
  358. package/dist-types/packages/peach-kit/src/internal.d.ts +4 -0
  359. package/dist-types/packages/peach-kit/src/materials/types.d.ts +27 -0
  360. package/dist-types/packages/peach-kit/src/materials/uikit-blur-material.d.ts +14 -0
  361. package/dist-types/packages/peach-kit/src/navigation-types.d.ts +11 -0
  362. package/dist-types/packages/peach-kit/src/react-bridge.d.ts +53 -0
  363. package/dist-types/packages/peach-kit/src/runtime.d.ts +26 -0
  364. package/dist-types/packages/peach-kit/src/ui/hosting-safe-area.d.ts +24 -0
  365. package/dist-types/packages/peach-kit/src/ui/popover-placement.d.ts +53 -0
  366. package/dist-types/packages/peach-kit/src/ui/presentationContract.d.ts +17 -0
  367. package/kotlin/ComposeSources/PeachComposeHost.kt +1 -1
  368. package/kotlin/JniSources/com/facebook/jni/HybridData.kt +0 -2
  369. package/kotlin/JniSources/dev/peach/jni/NativeBindings.kt +0 -2
  370. package/kotlin/JniTransportSources/dev/peach/jni/integration/JniTransport.kt +0 -2
  371. package/kotlin/README.md +6 -0
  372. package/package.json +22 -2
  373. package/runtime-companion.json +1 -0
  374. package/skills/contrast/SKILL.md +1 -0
  375. package/src/assetCatalogContract.ts +21 -0
  376. package/src/bridge-contract-input.ts +84 -0
  377. package/src/bridge-contract.ts +35 -3
  378. package/src/browser-launch-policy.ts +1 -0
  379. package/src/bundle-channel.mjs +4 -2
  380. package/src/cli-runtime.ts +55 -0
  381. package/src/crash-fingerprint.ts +26 -0
  382. package/src/dev-bundle-resolution.ts +50 -23
  383. package/src/device-catalog.ts +1159 -0
  384. package/src/host/bridge-host.ts +3 -26
  385. package/src/host/browser-pointer.ts +71 -0
  386. package/src/host/dev-server-package-versions.ts +23 -0
  387. package/src/host/fetch-proxy-handler.ts +17 -4
  388. package/src/installed-package-versions.ts +142 -38
  389. package/src/kotlin-host.ts +1 -1
  390. package/src/metro-plugin.ts +4 -4
  391. package/src/metro-project-root.ts +68 -0
  392. package/src/nitro-adapter.lock.json +26 -0
  393. package/src/nitro-adapter.ts +103 -0
  394. package/src/nitro-bundle.ts +24 -10
  395. package/src/nitro-compile.ts +33 -51
  396. package/src/nitro-source.ts +177 -96
  397. package/src/nitroAdapterContract.ts +217 -0
  398. package/src/nitroContract.ts +24 -11
  399. package/src/process-group.ts +41 -34
  400. package/src/react-bridge-importers.ts +28 -0
  401. package/src/reactNativeConfigurationContract.ts +36 -0
  402. package/src/runtime-assets.ts +7 -2
  403. package/src/runtime-delivery.ts +2 -0
  404. package/src/runtimePlatformContract.ts +70 -0
  405. package/src/screenshots/frame-compose.ts +42 -43
  406. package/src/screenshots/org-deck.ts +9 -4
  407. package/src/screenshots/preset-names.ts +29 -0
  408. package/src/screenshots/registry.ts +5 -5
  409. package/src/screenshots/schema.ts +1 -1
  410. package/src/screenshots/screenshotContract.ts +971 -0
  411. package/src/settings-flags.ts +107 -0
  412. package/src/settingsContract.ts +609 -0
  413. package/src/storageSnapshotContract.ts +344 -0
  414. package/src/stub-pattern-matcher.ts +550 -0
  415. package/src/swift-compile.ts +908 -40
  416. package/src/swift-compiler-digest.ts +13 -1
  417. package/src/swift-distribution.lock.json +49 -22
  418. package/src/swift-host.ts +167 -52
  419. package/src/swift-objc-compile.ts +54 -24
  420. package/src/swift-objc-export.ts +532 -0
  421. package/src/swift-objc-import.ts +769 -0
  422. package/src/swift-objc-metadata.ts +285 -10
  423. package/src/swift-objc-sdk.ts +13970 -158
  424. package/src/swift-objc-standin.ts +137 -1
  425. package/src/swift-package.ts +94 -0
  426. package/src/swift-packages.ts +5 -5
  427. package/src/swift-submit.ts +6 -0
  428. package/src/swiftContract.ts +99 -0
  429. package/src/target-matcher.ts +6 -1
  430. package/src/vite-plugin.ts +14 -40
  431. package/src/worker-system-chunks.ts +1 -1
  432. package/src/workerChunkContract.ts +5 -0
  433. package/src/worklets-babel.ts +24 -5
  434. package/src/xcode-project.ts +36 -7
  435. package/src/xcode-target-members.ts +10 -3
  436. package/cli/drivers/playwright-sim-host.ts +0 -825
  437. package/kotlin/fixtures/counter/Counter.d.kt.ts +0 -17
  438. package/kotlin/fixtures/counter/Counter.kt +0 -51
  439. package/kotlin/fixtures/counter/CounterApp.native.tsx +0 -61
  440. package/kotlin/fixtures/counter/CounterApp.tsx +0 -3
  441. package/kotlin/fixtures/counter/CounterScreen.d.kt.ts +0 -8
  442. package/kotlin/fixtures/counter/CounterScreen.kt +0 -56
  443. package/kotlin/fixtures/counter/app/_layout.tsx +0 -4
  444. package/kotlin/fixtures/counter/app/index+spa.tsx +0 -1
  445. package/kotlin/fixtures/counter/app/routes.d.ts +0 -18
  446. package/kotlin/fixtures/counter/package.json +0 -20
  447. package/kotlin/fixtures/counter/tsconfig.json +0 -19
  448. package/kotlin/fixtures/counter/vite.config.ts +0 -20
  449. package/kotlin/fixtures/headless-counter/Headless.kt +0 -234
  450. package/kotlin/fixtures/import-animation/Animation.d.kt.ts +0 -7
  451. package/kotlin/fixtures/import-animation/Animation.kt +0 -80
  452. package/kotlin/fixtures/import-animation/ImportAnimation.native.tsx +0 -13
  453. package/kotlin/fixtures/import-animation/README.md +0 -24
  454. package/kotlin/fixtures/import-animation/app/_layout.tsx +0 -4
  455. package/kotlin/fixtures/import-animation/app/index+spa.tsx +0 -1
  456. package/kotlin/fixtures/import-animation/app/routes.d.ts +0 -18
  457. package/kotlin/fixtures/import-animation/package.json +0 -23
  458. package/kotlin/fixtures/import-animation/tsconfig.json +0 -20
  459. package/kotlin/fixtures/import-animation/vite.config.ts +0 -20
  460. package/kotlin/fixtures/import-drawing/Drawing.d.kt.ts +0 -7
  461. package/kotlin/fixtures/import-drawing/Drawing.kt +0 -101
  462. package/kotlin/fixtures/import-drawing/ImportDrawing.native.tsx +0 -18
  463. package/kotlin/fixtures/import-drawing/README.md +0 -34
  464. package/kotlin/fixtures/import-drawing/app/_layout.tsx +0 -4
  465. package/kotlin/fixtures/import-drawing/app/index+spa.tsx +0 -1
  466. package/kotlin/fixtures/import-drawing/package.json +0 -23
  467. package/kotlin/fixtures/import-drawing/tsconfig.json +0 -20
  468. package/kotlin/fixtures/import-drawing/vite.config.ts +0 -20
  469. package/kotlin/fixtures/import-editor/Editor.d.kt.ts +0 -7
  470. package/kotlin/fixtures/import-editor/Editor.kt +0 -59
  471. package/kotlin/fixtures/import-editor/ImportEditor.native.tsx +0 -23
  472. package/kotlin/fixtures/import-editor/README.md +0 -27
  473. package/kotlin/fixtures/import-editor/app/_layout.tsx +0 -4
  474. package/kotlin/fixtures/import-editor/app/index+spa.tsx +0 -1
  475. package/kotlin/fixtures/import-editor/package.json +0 -23
  476. package/kotlin/fixtures/import-editor/tsconfig.json +0 -20
  477. package/kotlin/fixtures/import-editor/vite.config.ts +0 -20
  478. package/kotlin/fixtures/import-effects/Effects.d.kt.ts +0 -7
  479. package/kotlin/fixtures/import-effects/Effects.kt +0 -87
  480. package/kotlin/fixtures/import-effects/ImportEffects.native.tsx +0 -13
  481. package/kotlin/fixtures/import-effects/README.md +0 -19
  482. package/kotlin/fixtures/import-effects/app/_layout.tsx +0 -4
  483. package/kotlin/fixtures/import-effects/app/index+spa.tsx +0 -1
  484. package/kotlin/fixtures/import-effects/package.json +0 -23
  485. package/kotlin/fixtures/import-effects/tsconfig.json +0 -20
  486. package/kotlin/fixtures/import-effects/vite.config.ts +0 -20
  487. package/kotlin/fixtures/import-layout/ImportLayout.native.tsx +0 -13
  488. package/kotlin/fixtures/import-layout/Layout.d.kt.ts +0 -7
  489. package/kotlin/fixtures/import-layout/Layout.kt +0 -72
  490. package/kotlin/fixtures/import-layout/README.md +0 -24
  491. package/kotlin/fixtures/import-layout/app/_layout.tsx +0 -4
  492. package/kotlin/fixtures/import-layout/app/index+spa.tsx +0 -1
  493. package/kotlin/fixtures/import-layout/package.json +0 -23
  494. package/kotlin/fixtures/import-layout/tsconfig.json +0 -20
  495. package/kotlin/fixtures/import-layout/vite.config.ts +0 -20
  496. package/kotlin/fixtures/import-navigation/ImportNavigation.native.tsx +0 -18
  497. package/kotlin/fixtures/import-navigation/Navigation.d.kt.ts +0 -7
  498. package/kotlin/fixtures/import-navigation/Navigation.kt +0 -104
  499. package/kotlin/fixtures/import-navigation/README.md +0 -31
  500. package/kotlin/fixtures/import-navigation/app/_layout.tsx +0 -4
  501. package/kotlin/fixtures/import-navigation/app/index+spa.tsx +0 -1
  502. package/kotlin/fixtures/import-navigation/package.json +0 -23
  503. package/kotlin/fixtures/import-navigation/tsconfig.json +0 -20
  504. package/kotlin/fixtures/import-navigation/vite.config.ts +0 -20
  505. package/kotlin/fixtures/import-overlays/ImportOverlays.native.tsx +0 -29
  506. package/kotlin/fixtures/import-overlays/Overlays.d.kt.ts +0 -7
  507. package/kotlin/fixtures/import-overlays/Overlays.kt +0 -93
  508. package/kotlin/fixtures/import-overlays/README.md +0 -34
  509. package/kotlin/fixtures/import-overlays/app/_layout.tsx +0 -4
  510. package/kotlin/fixtures/import-overlays/app/index+spa.tsx +0 -1
  511. package/kotlin/fixtures/import-overlays/package.json +0 -23
  512. package/kotlin/fixtures/import-overlays/tsconfig.json +0 -20
  513. package/kotlin/fixtures/import-overlays/vite.config.ts +0 -20
  514. package/kotlin/fixtures/import-resources/ImportResources.native.tsx +0 -18
  515. package/kotlin/fixtures/import-resources/README.md +0 -26
  516. package/kotlin/fixtures/import-resources/Resources.d.kt.ts +0 -6
  517. package/kotlin/fixtures/import-resources/Resources.kt +0 -72
  518. package/kotlin/fixtures/import-resources/app/_layout.tsx +0 -4
  519. package/kotlin/fixtures/import-resources/app/index+spa.tsx +0 -1
  520. package/kotlin/fixtures/import-resources/package.json +0 -23
  521. package/kotlin/fixtures/import-resources/tsconfig.json +0 -20
  522. package/kotlin/fixtures/import-resources/vite.config.ts +0 -20
  523. package/kotlin/fixtures/import-scroll/ImportNested.native.tsx +0 -10
  524. package/kotlin/fixtures/import-scroll/ImportScroll.native.tsx +0 -13
  525. package/kotlin/fixtures/import-scroll/Nested.d.kt.ts +0 -4
  526. package/kotlin/fixtures/import-scroll/Nested.kt +0 -64
  527. package/kotlin/fixtures/import-scroll/README.md +0 -38
  528. package/kotlin/fixtures/import-scroll/Scroll.d.kt.ts +0 -7
  529. package/kotlin/fixtures/import-scroll/Scroll.kt +0 -91
  530. package/kotlin/fixtures/import-scroll/app/_layout.tsx +0 -4
  531. package/kotlin/fixtures/import-scroll/app/index+spa.tsx +0 -1
  532. package/kotlin/fixtures/import-scroll/app/nested+spa.tsx +0 -1
  533. package/kotlin/fixtures/import-scroll/package.json +0 -23
  534. package/kotlin/fixtures/import-scroll/tsconfig.json +0 -20
  535. package/kotlin/fixtures/import-scroll/vite.config.ts +0 -20
  536. package/kotlin/fixtures/import-selection/ImportSelection.native.tsx +0 -44
  537. package/kotlin/fixtures/import-selection/README.md +0 -32
  538. package/kotlin/fixtures/import-selection/Selection.d.kt.ts +0 -8
  539. package/kotlin/fixtures/import-selection/Selection.kt +0 -78
  540. package/kotlin/fixtures/import-selection/app/_layout.tsx +0 -4
  541. package/kotlin/fixtures/import-selection/app/index+spa.tsx +0 -1
  542. package/kotlin/fixtures/import-selection/package.json +0 -23
  543. package/kotlin/fixtures/import-selection/tsconfig.json +0 -20
  544. package/kotlin/fixtures/import-selection/vite.config.ts +0 -20
  545. package/kotlin/fixtures/import-surfaces/ImportSurfaces.native.tsx +0 -13
  546. package/kotlin/fixtures/import-surfaces/README.md +0 -22
  547. package/kotlin/fixtures/import-surfaces/Surfaces.d.kt.ts +0 -7
  548. package/kotlin/fixtures/import-surfaces/Surfaces.kt +0 -64
  549. package/kotlin/fixtures/import-surfaces/app/_layout.tsx +0 -4
  550. package/kotlin/fixtures/import-surfaces/app/index+spa.tsx +0 -1
  551. package/kotlin/fixtures/import-surfaces/package.json +0 -23
  552. package/kotlin/fixtures/import-surfaces/tsconfig.json +0 -20
  553. package/kotlin/fixtures/import-surfaces/vite.config.ts +0 -20
  554. package/kotlin/fixtures/import-values/ImportValues.native.tsx +0 -61
  555. package/kotlin/fixtures/import-values/README.md +0 -28
  556. package/kotlin/fixtures/import-values/Values.d.kt.ts +0 -15
  557. package/kotlin/fixtures/import-values/Values.kt +0 -84
  558. package/kotlin/fixtures/import-values/app/_layout.tsx +0 -4
  559. package/kotlin/fixtures/import-values/app/index+spa.tsx +0 -1
  560. package/kotlin/fixtures/import-values/package.json +0 -23
  561. package/kotlin/fixtures/import-values/tsconfig.json +0 -20
  562. package/kotlin/fixtures/import-values/vite.config.ts +0 -20
  563. package/kotlin/fixtures/kotlin-app/app/build.gradle.kts +0 -30
  564. package/kotlin/fixtures/kotlin-app/app/src/main/AndroidManifest.xml +0 -13
  565. package/kotlin/fixtures/kotlin-app/app/src/main/java/dev/contrast/kotlinapp/MainActivity.kt +0 -60
  566. package/kotlin/fixtures/kotlin-app/app/src/main/java/dev/contrast/kotlinapp/ProbeApplication.kt +0 -18
  567. package/kotlin/fixtures/kotlin-app/build.gradle.kts +0 -5
  568. package/kotlin/fixtures/kotlin-app/gradle.properties +0 -4
  569. package/kotlin/fixtures/kotlin-app/settings.gradle.kts +0 -4
  570. package/kotlin/fixtures/kotlin-app-variants/Anim.kt +0 -62
  571. package/kotlin/fixtures/kotlin-app-variants/BarBehavior.kt +0 -38
  572. package/kotlin/fixtures/kotlin-app-variants/BarVisibility.kt +0 -36
  573. package/kotlin/fixtures/kotlin-app-variants/Bitmaps.kt +0 -50
  574. package/kotlin/fixtures/kotlin-app-variants/Browse.kt +0 -73
  575. package/kotlin/fixtures/kotlin-app-variants/Colors.kt +0 -41
  576. package/kotlin/fixtures/kotlin-app-variants/Controls.kt +0 -62
  577. package/kotlin/fixtures/kotlin-app-variants/Drag.kt +0 -56
  578. package/kotlin/fixtures/kotlin-app-variants/Draw.kt +0 -74
  579. package/kotlin/fixtures/kotlin-app-variants/Drawables.kt +0 -53
  580. package/kotlin/fixtures/kotlin-app-variants/Focus.kt +0 -62
  581. package/kotlin/fixtures/kotlin-app-variants/Form.kt +0 -47
  582. package/kotlin/fixtures/kotlin-app-variants/Icons.kt +0 -59
  583. package/kotlin/fixtures/kotlin-app-variants/Ime.kt +0 -53
  584. package/kotlin/fixtures/kotlin-app-variants/Lists.kt +0 -57
  585. package/kotlin/fixtures/kotlin-app-variants/Nav.kt +0 -47
  586. package/kotlin/fixtures/kotlin-app-variants/Note.kt +0 -40
  587. package/kotlin/fixtures/kotlin-app-variants/Overlays.kt +0 -56
  588. package/kotlin/fixtures/kotlin-app-variants/Pan.kt +0 -38
  589. package/kotlin/fixtures/kotlin-app-variants/Pickers.kt +0 -44
  590. package/kotlin/fixtures/kotlin-app-variants/Press.kt +0 -43
  591. package/kotlin/fixtures/kotlin-app-variants/Scroll.kt +0 -63
  592. package/kotlin/fixtures/kotlin-app-variants/Sheet.kt +0 -43
  593. package/kotlin/fixtures/kotlin-app-variants/Strings.kt +0 -49
  594. package/kotlin/fixtures/kotlin-app-variants/Tabs.kt +0 -47
  595. package/kotlin/fixtures/kotlin-app-variants/TextWidth.kt +0 -45
  596. package/kotlin/fixtures/kotlin-app-variants/TransientInsets.kt +0 -50
  597. package/kotlin/fixtures/kotlin-app-variants/Transition.kt +0 -69
  598. package/kotlin/fixtures/kotlin-app-variants/ViewConfig.kt +0 -22
  599. package/kotlin/fixtures/kotlin-app-variants/Widgets.kt +0 -67
  600. package/kotlin/fixtures/runtime-state/RuntimeState.kt +0 -200
  601. package/kotlin/fork/README.md +0 -97
  602. package/kotlin/fork/build.sh +0 -176
  603. package/kotlin/fork/compose-worker-globals.patch +0 -1247
  604. package/kotlin/fork/fork.json +0 -46
  605. package/kotlin/fork/publish.ts +0 -99
  606. package/kotlin/fork/skia-android-shaping.patch +0 -189
  607. package/kotlin/fork/skiko-local.init.gradle +0 -10
  608. package/kotlin/fork/skiko-worker-clock.patch +0 -122
@@ -0,0 +1,769 @@
1
+ import { createHash } from 'node:crypto'
2
+ import type { GraphSymbol, SymbolFragment, SymbolGraph } from './swift-standin-emit'
3
+
4
+ export interface SwiftObjCImportOptions {
5
+ module: string
6
+ /** original headers, also used by clang to apply their attributes and ownership. */
7
+ headers: readonly string[]
8
+ /** exact objective-c source classes, excluding classes exported from swift. */
9
+ classes: readonly string[]
10
+ /** clang -ast-dump=json of those headers, with their original compile settings. */
11
+ clangAST: unknown
12
+ /** exact exported swift identities, including explicit @objc names. */
13
+ peerTypes?: ReadonlyMap<string, string>
14
+ }
15
+
16
+ export interface SwiftObjCImport {
17
+ swift: string
18
+ objc: string
19
+ registration: string
20
+ registerFunction: string
21
+ classes: { name: string; nativeName: string }[]
22
+ /** swift type -> original objective-c class, for the swift exporter. */
23
+ types: ReadonlyMap<string, string>
24
+ }
25
+
26
+ export class SwiftObjCImportError extends Error {}
27
+
28
+ type Node = Record<string, unknown>
29
+ const record = (value: unknown): value is Node =>
30
+ typeof value === 'object' && value !== null && !Array.isArray(value)
31
+ const nodes = (value: unknown): Node[] => {
32
+ if (!Array.isArray(value)) return []
33
+ const entries: unknown[] = value
34
+ return entries.filter(record)
35
+ }
36
+ const fragments = (value: unknown): SymbolFragment[] => {
37
+ if (!Array.isArray(value)) return []
38
+ const entries: unknown[] = value
39
+ return entries.filter(
40
+ (entry): entry is SymbolFragment =>
41
+ record(entry) &&
42
+ typeof entry.kind === 'string' &&
43
+ typeof entry.spelling === 'string' &&
44
+ (entry.preciseIdentifier === undefined ||
45
+ typeof entry.preciseIdentifier === 'string'),
46
+ )
47
+ }
48
+ const text = (parts: readonly SymbolFragment[]) => parts.map((p) => p.spelling).join('')
49
+ const nativeClass = (id: string) => /^c:objc\(cs\)([A-Za-z_]\w*)$/.exec(id)?.[1]
50
+ const identifier = (name: string) => /^[A-Za-z_]\w*$/.test(name)
51
+ const swiftName = (name: string) => `\`${name}\``
52
+ const hash = (value: string) =>
53
+ createHash('sha256').update(value).digest('hex').slice(0, 24)
54
+
55
+ /** private implementation classes keep their original metadata and bodies.
56
+ * their opaque adapters join the same registry without importing private APIs. */
57
+ export async function swiftObjCPrivateImports(
58
+ asts: AsyncIterable<string>,
59
+ registeredClasses: readonly string[],
60
+ ): Promise<string> {
61
+ const registered = new Set(registeredClasses)
62
+ const implemented = new Set<string>()
63
+ const adapters: { name: string; nativeName: string }[] = []
64
+ for await (const ast of asts) {
65
+ if (!/^TranslationUnitDecl\b/.test(ast))
66
+ throw new SwiftObjCImportError('expected original Objective-C implementation AST')
67
+ const declarations = new Map<string, { parent?: string; renamed: boolean }>()
68
+ const implementations: string[] = []
69
+ let owner: { name: string; depth: number } | undefined
70
+ // textual declarations avoid the json dumper's objective-c method mangling.
71
+ for (const line of ast.split('\n')) {
72
+ const node = /^([| `-]*)(\w+)\b(.*)$/.exec(line)
73
+ if (!node) continue
74
+ const depth = node[1]!.length
75
+ if (owner && depth <= owner.depth) owner = undefined
76
+ const kind = node[2]
77
+ const detail = node[3]!
78
+ if (kind === 'ObjCInterfaceDecl' || kind === 'ObjCImplementationDecl') {
79
+ const name = /\s([A-Za-z_]\w*)$/.exec(detail)?.[1]
80
+ if (!name)
81
+ throw new SwiftObjCImportError(
82
+ 'unsupported Objective-C implementation identity',
83
+ )
84
+ if (kind === 'ObjCImplementationDecl') implementations.push(name)
85
+ else {
86
+ if (!declarations.has(name)) declarations.set(name, { renamed: false })
87
+ owner = { name, depth }
88
+ }
89
+ } else if (owner && depth === owner.depth + 2) {
90
+ const declaration = declarations.get(owner.name)!
91
+ if (kind === 'super') {
92
+ const parent = /^ ObjCInterface 0x[\da-f]+ '([A-Za-z_]\w*)'$/.exec(detail)?.[1]
93
+ if (!parent)
94
+ throw new SwiftObjCImportError('unsupported Objective-C superclass identity')
95
+ declaration.parent = parent
96
+ }
97
+ if (kind === 'ObjCRuntimeNameAttr') declaration.renamed = true
98
+ }
99
+ }
100
+ for (const nativeName of implementations) {
101
+ function fail(reason: string): never {
102
+ throw new SwiftObjCImportError(
103
+ `Objective-C implementation ${nativeName}: ${reason}`,
104
+ )
105
+ }
106
+ if (implemented.has(nativeName)) fail('duplicate original class implementation')
107
+ implemented.add(nativeName)
108
+ if (registered.has(nativeName)) continue
109
+ const declaration = declarations.get(nativeName)
110
+ if (!declaration || declaration.parent !== 'NSObject')
111
+ fail('private superclass requires a qualified foreign proxy hierarchy')
112
+ if (declaration.renamed) fail('private runtime class renaming is unqualified')
113
+ adapters.push({
114
+ name: `__PeachObjCPrivate_${hash(nativeName)}`,
115
+ nativeName,
116
+ })
117
+ }
118
+ }
119
+ adapters.sort((left, right) => left.nativeName.localeCompare(right.nativeName))
120
+ return [
121
+ '',
122
+ ...adapters.map(
123
+ (adapter) => `private final class ${adapter.name}: PeachObjC._ObjCForeignObject {}`,
124
+ ),
125
+ '@_cdecl("_peach_objc_register_private_implementations")',
126
+ 'public func __peachRegisterPrivateImplementations() {',
127
+ ...adapters.map(
128
+ (adapter) =>
129
+ ` PeachObjC._objcRegisterForeignClass(${adapter.name}.self, nativeName: ${JSON.stringify(adapter.nativeName)})`,
130
+ ),
131
+ '}',
132
+ '',
133
+ ].join('\n')
134
+ }
135
+
136
+ interface ImportType {
137
+ swift: string
138
+ abi: string
139
+ c: string
140
+ object: boolean
141
+ optional: boolean
142
+ native?: string
143
+ }
144
+
145
+ /** emit calls to original clang implementations, never replacement method bodies.
146
+ * swift's symbol graph supplies importer names and types; clang's original AST
147
+ * proves membership and the construction boundary before any source is returned. */
148
+ export function swiftObjCImports(
149
+ graphs: readonly SymbolGraph[],
150
+ options: SwiftObjCImportOptions,
151
+ ): SwiftObjCImport {
152
+ function fail(where: string, reason: string): never {
153
+ throw new SwiftObjCImportError(
154
+ `Objective-C import ${options.module}.${where}: ${reason}`,
155
+ )
156
+ }
157
+ if (!identifier(options.module)) fail('module', 'invalid module identifier')
158
+ if (!options.headers.length) fail('headers', 'original headers are required')
159
+ for (const header of options.headers)
160
+ if (!header || /[\r\n]/.test(header) || header.includes('\0'))
161
+ fail('headers', 'invalid header path')
162
+ const selected = new Set(options.classes)
163
+ if (selected.size !== options.classes.length)
164
+ fail('classes', 'require distinct original Objective-C class names')
165
+ for (const name of selected)
166
+ if (!identifier(name)) fail(name, 'invalid Objective-C class name')
167
+
168
+ const declarations = new Map<string, Node>()
169
+ const tails = new Map<string, string>()
170
+ const categories = new Map<string, Node[]>()
171
+ const functions = new Map<string, Node[]>()
172
+ const typedefs = new Map<string, string>()
173
+ const visit = (node: unknown): void => {
174
+ if (!record(node)) return
175
+ if (
176
+ node.kind === 'ObjCInterfaceDecl' &&
177
+ typeof node.name === 'string' &&
178
+ selected.has(node.name)
179
+ ) {
180
+ // clang repeats the superclass throughout a redeclaration chain.
181
+ // retain its member-bearing definition and reject invalid or separate chains.
182
+ if (record(node.super) && node.super.name !== undefined) {
183
+ const chain = declarations.get(node.name)
184
+ if (
185
+ node.isInvalid === true ||
186
+ (chain && node.previousDecl !== tails.get(node.name))
187
+ )
188
+ fail(node.name, 'duplicate interface definitions')
189
+ tails.set(node.name, String(node.id))
190
+ if (!chain || nodes(node.inner).length) declarations.set(node.name, node)
191
+ }
192
+ }
193
+ if (node.kind === 'ObjCCategoryDecl' && record(node.interface)) {
194
+ const name = node.interface.name
195
+ if (typeof name === 'string')
196
+ categories.set(name, [...(categories.get(name) ?? []), node])
197
+ }
198
+ if (node.kind === 'FunctionDecl' && typeof node.name === 'string')
199
+ functions.set(node.name, [...(functions.get(node.name) ?? []), node])
200
+ if (
201
+ node.kind === 'TypedefDecl' &&
202
+ typeof node.name === 'string' &&
203
+ record(node.type)
204
+ ) {
205
+ const canonical = node.type.desugaredQualType ?? node.type.qualType
206
+ if (typeof canonical === 'string') typedefs.set(node.name, canonical)
207
+ }
208
+ for (const child of nodes(node.inner)) visit(child)
209
+ }
210
+ if (!record(options.clangAST) || options.clangAST.kind !== 'TranslationUnitDecl')
211
+ fail('declarations', 'expected a complete Clang translation unit AST')
212
+ visit(options.clangAST)
213
+
214
+ const symbols = new Map<string, GraphSymbol>()
215
+ for (const graph of graphs) {
216
+ if (graph.module.name !== options.module)
217
+ fail('declarations', `symbol graph belongs to ${graph.module.name}`)
218
+ for (const symbol of graph.symbols) {
219
+ const previous = symbols.get(symbol.identifier.precise)
220
+ if (previous && JSON.stringify(previous) !== JSON.stringify(symbol))
221
+ fail(symbol.identifier.precise, 'ambiguous imported declaration')
222
+ symbols.set(symbol.identifier.precise, symbol)
223
+ }
224
+ }
225
+ const classes: SwiftObjCImport['classes'] = []
226
+ const types = new Map<string, string>([['NSObject', 'NSObject']])
227
+ const names = new Map<string, string>([['NSObject', 'NSObject']])
228
+ for (const [name, nativeName] of options.peerTypes ?? []) {
229
+ if (!identifier(name) || !identifier(nativeName))
230
+ fail('peerTypes', 'invalid exported Swift identity')
231
+ if (names.has(nativeName) || types.has(name) || selected.has(nativeName))
232
+ fail(name, 'duplicate canonical object identity')
233
+ names.set(nativeName, name)
234
+ types.set(name, nativeName)
235
+ }
236
+ for (const nativeName of [...selected].sort()) {
237
+ const symbol = symbols.get(`c:objc(cs)${nativeName}`)
238
+ const name = symbol?.pathComponents[0]
239
+ if (!symbol || symbol.kind.identifier !== 'swift.class' || !name || !identifier(name))
240
+ fail(nativeName, 'missing Swift-imported class declaration')
241
+ if (text(symbol.declarationFragments ?? []).trim() !== `class ${name}`)
242
+ fail(nativeName, 'generic, restricted or attributed classes are unqualified')
243
+ if (symbol.pathComponents.length !== 1 || types.has(name))
244
+ fail(nativeName, 'nested or duplicate Swift class identity')
245
+ if (symbol.availability?.length) fail(nativeName, 'class availability is unqualified')
246
+ if (!declarations.has(nativeName))
247
+ fail(nativeName, 'missing original Clang interface')
248
+ names.set(nativeName, name)
249
+ types.set(name, nativeName)
250
+ classes.push({ name, nativeName })
251
+ }
252
+
253
+ const type = (parts: readonly SymbolFragment[], where: string): ImportType => {
254
+ const written = text(parts).trim()
255
+ const optional = /[?!]$/.test(written)
256
+ const spelling = optional ? written.slice(0, -1) : written
257
+ const primitive: Record<string, string> = {
258
+ Void: 'void',
259
+ '()': 'void',
260
+ Bool: '_Bool',
261
+ Int: 'intptr_t',
262
+ UInt: 'uintptr_t',
263
+ Int8: 'int8_t',
264
+ UInt8: 'uint8_t',
265
+ Int16: 'int16_t',
266
+ UInt16: 'uint16_t',
267
+ Int32: 'int32_t',
268
+ UInt32: 'uint32_t',
269
+ Int64: 'int64_t',
270
+ UInt64: 'uint64_t',
271
+ Float: 'float',
272
+ Double: 'double',
273
+ }
274
+ if (
275
+ !optional &&
276
+ primitive[written] &&
277
+ !parts.some(
278
+ (part) =>
279
+ part.preciseIdentifier?.startsWith('c:') ||
280
+ (part.preciseIdentifier &&
281
+ symbols.get(part.preciseIdentifier)?.kind.identifier === 'swift.class'),
282
+ )
283
+ )
284
+ return {
285
+ swift: `Swift.${written === '()' ? 'Void' : written}`,
286
+ abi: `Swift.${written === '()' ? 'Void' : written}`,
287
+ c: primitive[written]!,
288
+ object: false,
289
+ optional: false,
290
+ }
291
+ const identifiers = parts.filter((part) => part.kind === 'typeIdentifier')
292
+ const id = identifiers.length === 1 ? identifiers[0]?.preciseIdentifier : undefined
293
+ const native = id && nativeClass(id)
294
+ const swiftClass = id ? symbols.get(id) : undefined
295
+ const resolved = native
296
+ ? names.get(native)
297
+ : swiftClass?.kind.identifier === 'swift.class' &&
298
+ swiftClass.pathComponents.length === 1 &&
299
+ swiftClass.pathComponents[0] === spelling &&
300
+ types.has(spelling)
301
+ ? spelling
302
+ : undefined
303
+ if (
304
+ !resolved ||
305
+ identifiers[0]?.spelling !== spelling ||
306
+ (spelling !== resolved && spelling !== native)
307
+ )
308
+ return fail(
309
+ where,
310
+ `unsupported imported type ${written}; canonical adapter and ABI are unqualified`,
311
+ )
312
+ return {
313
+ native: types.get(resolved)!,
314
+ swift: `${swiftName(resolved)}${optional ? written.slice(-1) : ''}`,
315
+ abi: 'Swift.UnsafeMutableRawPointer?',
316
+ c: 'void *',
317
+ object: true,
318
+ optional,
319
+ }
320
+ }
321
+
322
+ const canonical = (written: string): string => {
323
+ const seen = new Set<string>()
324
+ while (typedefs.has(written) && !seen.has(written)) {
325
+ seen.add(written)
326
+ written = typedefs.get(written)!
327
+ }
328
+ return written
329
+ .replace(/\bconst\b/g, '')
330
+ .replace(/\s+/g, ' ')
331
+ .trim()
332
+ }
333
+ const scalarTypes: Record<string, readonly string[]> = {
334
+ 'Swift.Void': ['void'],
335
+ 'Swift.Bool': ['_Bool', 'bool'],
336
+ 'Swift.Int': ['long'],
337
+ 'Swift.UInt': ['unsigned long'],
338
+ 'Swift.Int8': ['signed char', 'char'],
339
+ 'Swift.UInt8': ['unsigned char'],
340
+ 'Swift.Int16': ['short'],
341
+ 'Swift.UInt16': ['unsigned short'],
342
+ 'Swift.Int32': ['int'],
343
+ 'Swift.UInt32': ['unsigned int'],
344
+ 'Swift.Int64': ['long long'],
345
+ 'Swift.UInt64': ['unsigned long long'],
346
+ 'Swift.Float': ['float'],
347
+ 'Swift.Double': ['double'],
348
+ }
349
+
350
+ const checkClangType = (imported: ImportType, declaration: unknown, where: string) => {
351
+ if (!record(declaration) || typeof declaration.qualType !== 'string')
352
+ fail(where, 'missing original Clang type')
353
+ if (!imported.object) {
354
+ const original =
355
+ typeof declaration.desugaredQualType === 'string'
356
+ ? declaration.desugaredQualType
357
+ : declaration.qualType
358
+ if (!scalarTypes[imported.swift]?.includes(canonical(original)))
359
+ fail(where, 'original C scalar type differs from imported signature')
360
+ return
361
+ }
362
+ const canonicalType =
363
+ typeof declaration.desugaredQualType === 'string'
364
+ ? declaration.desugaredQualType
365
+ : declaration.qualType
366
+ const normalized = canonicalType
367
+ .replace(
368
+ /\b(?:_Nonnull|_Nullable|_Null_unspecified|__strong|__weak|__unsafe_unretained|const)\b/g,
369
+ '',
370
+ )
371
+ .replace(/\s+/g, '')
372
+ .trim()
373
+ if (normalized !== `${imported.native}*`)
374
+ fail(
375
+ where,
376
+ `Clang object type ${canonicalType} differs from imported ${imported.swift}`,
377
+ )
378
+ }
379
+ const membersByClass = new Map<string, GraphSymbol[]>()
380
+ for (const symbol of symbols.values()) {
381
+ const owner = /^c:objc\(cs\)([A-Za-z_]\w*)\(/.exec(symbol.identifier.precise)?.[1]
382
+ if (owner && selected.has(owner)) {
383
+ const members = membersByClass.get(owner)
384
+ if (members) members.push(symbol)
385
+ else membersByClass.set(owner, [symbol])
386
+ }
387
+ }
388
+
389
+ const external: string[] = []
390
+ const bodies = new Map<string, string[]>()
391
+ const objc = [
392
+ '#include <stdint.h>',
393
+ ...options.headers.map((header) => `#import ${JSON.stringify(header)}`),
394
+ '',
395
+ ]
396
+ const thunk = (
397
+ identity: string,
398
+ result: ImportType,
399
+ parameters: { name: string; type: ImportType }[],
400
+ receiver: string | null,
401
+ expression: string,
402
+ ) => {
403
+ const name = `_peach_objc_import_${hash(`${options.module}:${identity}`)}`
404
+ const cArguments = parameters.map((p) => `${p.type.c} ${p.name}`)
405
+ const swiftArguments = parameters.map((p) => `_ ${p.name}: ${p.type.abi}`)
406
+ if (receiver) {
407
+ cArguments.unshift('void * _receiver')
408
+ swiftArguments.unshift('_ _receiver: Swift.UnsafeMutableRawPointer')
409
+ }
410
+ external.push(
411
+ `@_extern(c, ${JSON.stringify(name)}) private func ${name}(${swiftArguments.join(', ')}) -> ${result.abi}`,
412
+ )
413
+ objc.push(`${result.c} ${name}(${cArguments.join(', ') || 'void'}) {`)
414
+ if (receiver)
415
+ objc.push(` ${receiver} * _object = (__bridge ${receiver} *)_receiver;`)
416
+ objc.push(
417
+ result.object
418
+ ? ` return (__bridge_retained void *)(${expression});`
419
+ : result.c === 'void'
420
+ ? ` ${expression};`
421
+ : ` return ${expression};`,
422
+ '}',
423
+ '',
424
+ )
425
+ return name
426
+ }
427
+ const raw: ImportType = {
428
+ swift: 'Swift.UnsafeMutableRawPointer?',
429
+ abi: 'Swift.UnsafeMutableRawPointer?',
430
+ c: 'void *',
431
+ object: true,
432
+ optional: true,
433
+ }
434
+ const voidType = type([{ kind: 'typeIdentifier', spelling: 'Void' }], 'Void')
435
+ const call = (
436
+ name: string,
437
+ result: ImportType,
438
+ parameters: { name: string; type: ImportType }[],
439
+ instance: boolean,
440
+ owner: string,
441
+ ): string => {
442
+ const lines: string[] = instance
443
+ ? []
444
+ : [
445
+ `precondition(self == ${swiftName(owner)}.self, "Swift subclass dispatch is unqualified")`,
446
+ ]
447
+ const args: string[] = []
448
+ if (instance) {
449
+ lines.push(
450
+ 'let _receiver = PeachObjC._objcRetainedPeer(self)',
451
+ 'defer { PeachObjC._objcReleasePeer(_receiver) }',
452
+ )
453
+ args.push('_receiver')
454
+ }
455
+ for (const parameter of parameters) {
456
+ const value = swiftName(parameter.name)
457
+ if (parameter.type.object) {
458
+ lines.push(
459
+ `let _${parameter.name} = ${parameter.type.optional ? `${value}.map { PeachObjC._objcRetainedPeer($0) }` : `PeachObjC._objcRetainedPeer(${value})`}`,
460
+ `defer { ${parameter.type.optional ? `if let _${parameter.name} { PeachObjC._objcReleasePeer(_${parameter.name}) }` : `PeachObjC._objcReleasePeer(_${parameter.name})`} }`,
461
+ )
462
+ args.push(`_${parameter.name}`)
463
+ } else args.push(value)
464
+ }
465
+ const invocation = `${name}(${args.join(', ')})`
466
+ if (result.object) {
467
+ lines.push(`let _result = ${invocation}`)
468
+ if (result.optional) lines.push('guard let _result else { return nil }')
469
+ else
470
+ lines.push(
471
+ 'precondition(_result != nil, "Objective-C nonnull result was nil")',
472
+ 'let _value = _result!',
473
+ )
474
+ const pointer = result.optional ? '_result' : '_value'
475
+ lines.push(
476
+ `defer { PeachObjC._objcReleasePeer(${pointer}) }`,
477
+ `guard let _object = PeachObjC._objcObjectFromPeer(${pointer}) as? ${result.swift.replace(/[?!]$/, '')} else { preconditionFailure("Objective-C result type mismatch") }`,
478
+ 'return _object',
479
+ )
480
+ } else lines.push(`${result.c === 'void' ? '' : 'return '}${invocation}`)
481
+ return lines.join('; ')
482
+ }
483
+
484
+ const signature = (symbol: GraphSymbol, decl: Node, returnType: unknown) => {
485
+ const usr = symbol.identifier.precise
486
+ const importedSignature = symbol.functionSignature
487
+ if (!importedSignature) fail(usr, 'missing imported function signature')
488
+ const parameterNodes = nodes(Reflect.get(importedSignature, 'parameters'))
489
+ const clangParameters = nodes(decl.inner).filter((n) => n.kind === 'ParmVarDecl')
490
+ if (parameterNodes.length !== clangParameters.length)
491
+ fail(usr, 'Swift and Clang parameter counts differ')
492
+ const labels = (symbol.declarationFragments ?? [])
493
+ .filter((p) => p.kind === 'externalParam')
494
+ .map((p) => p.spelling)
495
+ const parameters = parameterNodes.map((p, index) => {
496
+ const pparts = fragments(p.declarationFragments)
497
+ const colon = pparts.findIndex(
498
+ (p) => p.kind === 'text' && /^:\s*$/.test(p.spelling),
499
+ )
500
+ if (colon < 0) fail(usr, 'missing imported parameter type')
501
+ const imported = type(pparts.slice(colon + 1), usr)
502
+ checkClangType(imported, clangParameters[index]?.type, usr)
503
+ return { name: `argument${index}`, type: imported }
504
+ })
505
+ if (labels.length !== parameters.length || labels.some((label) => !identifier(label)))
506
+ fail(usr, 'missing imported argument labels')
507
+ const result = type(
508
+ importedSignature.returns ?? [{ kind: 'text', spelling: 'Void' }],
509
+ usr,
510
+ )
511
+ checkClangType(result, returnType, usr)
512
+ const argumentsSwift = parameters
513
+ .map(
514
+ (p, index) =>
515
+ `${labels[index] === '_' ? '_' : swiftName(labels[index]!)} ${swiftName(p.name)}: ${p.type.swift}`,
516
+ )
517
+ .join(', ')
518
+ return { parameters, result, argumentsSwift }
519
+ }
520
+
521
+ for (const identity of classes) {
522
+ const { name, nativeName } = identity
523
+ const declaration = declarations.get(nativeName)!
524
+ const parent = record(declaration.super) ? declaration.super.name : undefined
525
+ if (parent !== 'NSObject')
526
+ fail(nativeName, 'superclass requires a qualified foreign proxy hierarchy')
527
+ if (nodes(declaration.protocols).some((p) => p.name !== 'NSObject'))
528
+ fail(nativeName, 'protocol conformances require qualified witnesses')
529
+ const members = [declaration, ...(categories.get(nativeName) ?? [])].flatMap((n) =>
530
+ nodes(n.inner),
531
+ )
532
+ for (const member of members) {
533
+ if (
534
+ member.kind === 'ObjCMethodDecl' &&
535
+ typeof member.name === 'string' &&
536
+ (/^init(?:$|[^a-z])/.test(member.name.replace(/^_+/, '')) ||
537
+ nodes(member.inner).some(
538
+ (attribute) =>
539
+ attribute.kind === 'NSConsumesSelfAttr' ||
540
+ attribute.kind === 'ObjCDesignatedInitializerAttr',
541
+ ))
542
+ )
543
+ fail(
544
+ `${nativeName}.${member.name}`,
545
+ 'explicit or designated initialization is unqualified',
546
+ )
547
+ if (member.variadic === true)
548
+ fail(`${nativeName}.${member.name}`, 'variadic methods are unqualified')
549
+ }
550
+ const constructor = thunk(
551
+ `${nativeName}:new`,
552
+ raw,
553
+ [],
554
+ null,
555
+ `[[${nativeName} alloc] init]`,
556
+ )
557
+ const body = [
558
+ `public required init(_objcRetained: Swift.UnsafeMutableRawPointer) { precondition(Self.self == ${swiftName(name)}.self, "Swift subclass construction is unqualified"); super.init(_objcRetained: _objcRetained) }`,
559
+ `public init() { precondition(Self.self == ${swiftName(name)}.self, "Swift subclass construction is unqualified"); super.init(_objcRetained: ${constructor}()!) }`,
560
+ ]
561
+ bodies.set(name, body)
562
+ const prefix = `c:objc(cs)${nativeName}`
563
+ for (const symbol of membersByClass.get(nativeName) ?? []) {
564
+ const usr = symbol.identifier.precise
565
+ if (!usr.startsWith(`${prefix}(`)) continue
566
+ const match = /^\((im|cm|py|cpy)\)([A-Za-z_]\w*(?::[A-Za-z_]\w*)*:?)$/.exec(
567
+ usr.slice(prefix.length),
568
+ )
569
+ if (!match) fail(usr, 'unsupported Objective-C member identity')
570
+ const kind = match[1]!
571
+ const selector = match[2]!
572
+ const property = kind === 'py' || kind === 'cpy'
573
+ const instance = kind === 'im' || kind === 'py'
574
+ const decl = members.find(
575
+ (m) =>
576
+ m.kind === (property ? 'ObjCPropertyDecl' : 'ObjCMethodDecl') &&
577
+ m.name === selector &&
578
+ (property ? (m.class !== true) === instance : m.instance === instance),
579
+ )
580
+ if (!decl) fail(usr, 'member absent from original Clang interface')
581
+ const parts = symbol.declarationFragments ?? []
582
+ const written = text(parts)
583
+ if (
584
+ symbol.availability?.length ||
585
+ /@|\b(?:optional|nonisolated|isolated|async|throws|rethrows)\b/.test(written)
586
+ )
587
+ fail(usr, 'availability and asynchronous or throwing imports are unqualified')
588
+ if (
589
+ nodes(decl.inner).some((a) =>
590
+ /^(?:Unavailable|SwiftPrivate|SwiftAsync|SwiftError|ObjCRequiresSuper|NSConsumesSelf)Attr$/.test(
591
+ String(a.kind),
592
+ ),
593
+ )
594
+ )
595
+ fail(usr, 'member attributes require a qualified importer path')
596
+ const receiver = instance ? '_object' : nativeName
597
+ const access = symbol.accessLevel === 'open' ? 'open' : 'public'
598
+ const memberName = parts.find((part) => part.kind === 'identifier')?.spelling
599
+ if (!memberName || !identifier(memberName))
600
+ fail(usr, 'missing imported member name')
601
+ if (property) {
602
+ const colon = parts.findIndex(
603
+ (p) => p.kind === 'text' && /^:\s*$/.test(p.spelling),
604
+ )
605
+ const end = parts.findIndex(
606
+ (p, index) => index > colon && p.spelling.includes('{'),
607
+ )
608
+ if (colon < 0 || end < 0) fail(usr, 'missing imported property type or accessors')
609
+ const last = parts[end]!
610
+ const result = type(
611
+ [
612
+ ...parts.slice(colon + 1, end),
613
+ {
614
+ ...last,
615
+ spelling: last.spelling.slice(0, last.spelling.indexOf('{')),
616
+ },
617
+ ],
618
+ usr,
619
+ )
620
+ checkClangType(result, decl.type, usr)
621
+ const getter = thunk(
622
+ `${usr}:get`,
623
+ result,
624
+ [],
625
+ instance ? nativeName : null,
626
+ `${receiver}.${selector}`,
627
+ )
628
+ const writable = parts.some((p) => p.kind === 'keyword' && p.spelling === 'set')
629
+ if (writable !== (decl.readonly !== true))
630
+ fail(usr, 'property mutability differs from Clang')
631
+ const setters: string[] = []
632
+ if (writable) {
633
+ const parameters = [{ name: 'newValue', type: result }]
634
+ const setter = thunk(
635
+ `${usr}:set`,
636
+ voidType,
637
+ parameters,
638
+ instance ? nativeName : null,
639
+ `${receiver}.${selector} = ${result.object ? '(__bridge id)newValue' : 'newValue'}`,
640
+ )
641
+ setters.push(`set { ${call(setter, voidType, parameters, instance, name)} }`)
642
+ }
643
+ body.push(
644
+ `${access} ${instance ? '' : 'class '}var ${swiftName(memberName)}: ${result.swift} { get { ${call(getter, result, [], instance, name)} } ${setters.join(' ')} }`,
645
+ )
646
+ continue
647
+ }
648
+ if (symbol.kind.identifier !== (instance ? 'swift.method' : 'swift.type.method'))
649
+ fail(usr, 'initializer or synthesized importer member is unqualified')
650
+ const { parameters, result, argumentsSwift } = signature(
651
+ symbol,
652
+ decl,
653
+ decl.returnType,
654
+ )
655
+ const components = selector.split(':')
656
+ if ((selector.match(/:/g) ?? []).length !== parameters.length)
657
+ fail(usr, 'selector and parameter counts differ')
658
+ const message = parameters.length
659
+ ? parameters
660
+ .map(
661
+ (p, index) =>
662
+ `${components[index]}:${p.type.object ? `(__bridge id)${p.name}` : p.name}`,
663
+ )
664
+ .join(' ')
665
+ : selector
666
+ const functionName = thunk(
667
+ usr,
668
+ result,
669
+ parameters,
670
+ instance ? nativeName : null,
671
+ `[${receiver} ${message}]`,
672
+ )
673
+ body.push(
674
+ `${access} ${instance ? '' : 'class '}func ${swiftName(memberName)}(${argumentsSwift}) -> ${result.swift} { ${call(functionName, result, parameters, instance, name)} }`,
675
+ )
676
+ }
677
+ }
678
+
679
+ const importedFunctions: string[] = []
680
+ for (const symbol of symbols.values()) {
681
+ if (symbol.kind.identifier !== 'swift.func') continue
682
+ const usr = symbol.identifier.precise
683
+ const native = /^c:@F@([A-Za-z_]\w*)$/.exec(usr)?.[1]
684
+ const parts = symbol.declarationFragments ?? []
685
+ const name = parts.find((p) => p.kind === 'identifier')?.spelling
686
+ if (!native || !name || !identifier(name) || symbol.pathComponents.length !== 1)
687
+ fail(usr, 'only global external C functions are qualified')
688
+ if (
689
+ symbol.availability?.length ||
690
+ /@|\b(?:async|throws|rethrows)\b/.test(text(parts))
691
+ )
692
+ fail(usr, 'attributed or asynchronous C functions are unqualified')
693
+ const original = functions.get(native)
694
+ if (!original?.length) fail(usr, 'function absent from original Clang declarations')
695
+ for (const decl of original) {
696
+ if (
697
+ decl.variadic ||
698
+ decl.inline ||
699
+ decl.storageClass === 'static' ||
700
+ nodes(decl.inner).some(
701
+ (n) =>
702
+ n.kind === 'CompoundStmt' ||
703
+ (String(n.kind).endsWith('Attr') && n.kind !== 'SwiftNameAttr'),
704
+ )
705
+ )
706
+ fail(usr, 'C function linkage, body or attributes are unqualified')
707
+ // Apple object symbols carry a leading underscore; the C source name is
708
+ // target independent. custom assembler names require separate qualification.
709
+ if (decl.mangledName !== native && decl.mangledName !== `_${native}`)
710
+ fail(usr, 'C assembler symbol renaming is unqualified')
711
+ }
712
+ const decl = original[0]!
713
+ if (!record(decl.type) || typeof decl.type.qualType !== 'string')
714
+ fail(usr, 'missing original C function type')
715
+ const clangFunctionType = decl.type.qualType
716
+ if (original.some((d) => !record(d.type) || d.type.qualType !== clangFunctionType))
717
+ fail(usr, 'conflicting original C function types')
718
+ const returnSpelling = /^(.+?)\s*\([^()]*\)$/.exec(clangFunctionType)?.[1]?.trim()
719
+ if (!returnSpelling) fail(usr, 'C function result is unqualified')
720
+ const { parameters, result, argumentsSwift } = signature(symbol, decl, {
721
+ qualType: returnSpelling,
722
+ })
723
+ if (result.object || parameters.some((p) => p.type.object))
724
+ fail(usr, 'only scalar C function signatures are qualified')
725
+ const local = `_peach_c_import_${hash(`${options.module}:${usr}`)}`
726
+ external.push(
727
+ `@_extern(c, ${JSON.stringify(native)}) private func ${local}(${parameters.map((p) => `_ ${p.name}: ${p.type.swift}`).join(', ')}) -> ${result.swift}`,
728
+ )
729
+ importedFunctions.push(
730
+ `public func ${swiftName(name)}(${argumentsSwift}) -> ${result.swift} { ${result.c === 'void' ? '' : 'return '}${local}(${parameters.map((p) => swiftName(p.name)).join(', ')}) }`,
731
+ )
732
+ }
733
+ if (!classes.length && !importedFunctions.length)
734
+ fail('declarations', 'no represented original Objective-C classes or C functions')
735
+
736
+ const registerFunction = `_peachRegisterObjCImports_${hash(options.module)}`
737
+ const registration = [
738
+ ...(classes.length ? ['import PeachObjC'] : []),
739
+ `public func ${registerFunction}() {`,
740
+ ...classes.map(
741
+ (c) =>
742
+ ` PeachObjC._objcRegisterForeignClass(${swiftName(c.name)}.self, nativeName: ${JSON.stringify(c.nativeName)})`,
743
+ ),
744
+ '}',
745
+ '',
746
+ ].join('\n')
747
+ const swift = [
748
+ ...(classes.length ? ['import Foundation', 'import PeachObjC'] : []),
749
+ '',
750
+ ...external,
751
+ '',
752
+ ...importedFunctions,
753
+ '',
754
+ ...classes.flatMap((c) => [
755
+ `open class ${swiftName(c.name)}: PeachObjC._ObjCForeignObject {`,
756
+ ...bodies.get(c.name)!.map((line) => ` ${line}`),
757
+ '}',
758
+ '',
759
+ ]),
760
+ ].join('\n')
761
+ return {
762
+ swift,
763
+ objc: objc.join('\n'),
764
+ registration,
765
+ registerFunction,
766
+ classes,
767
+ types: new Map(classes.map((c) => [c.name, c.nativeName])),
768
+ }
769
+ }