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
@@ -7,7 +7,7 @@ import { MAX_SWIFT_COMPILE_SOURCE_BYTES } from './swift-submit'
7
7
  import type { SwiftCompileInput } from './swift-compile'
8
8
  import type { SwiftPackageTarget } from './swift-package'
9
9
 
10
- export type NitroSourceOptions = { packageRoot: string } & (
10
+ export type NitroSourceOptions = { packageRoots: string[] } & (
11
11
  | { appRoot: string; dependencyRoots?: never }
12
12
  | {
13
13
  appRoot?: never
@@ -15,13 +15,19 @@ export type NitroSourceOptions = { packageRoot: string } & (
15
15
  }
16
16
  )
17
17
 
18
+ type NitroPackage = { name: string; version: string; root: string }
19
+
18
20
  /** source fragments for the common Swift host; its caller owns the executable,
19
- * platform bindings and invocation of the generated registration function. */
21
+ * platform bindings and invocation of each generated registration function.
22
+ * every provider shares one Nitro core and one JSI. */
20
23
  export interface NitroSourceCollection {
21
24
  files: SwiftCompileInput['files']
22
25
  targets: SwiftPackageTarget[]
23
- registration: { symbol: string; header: string }
24
- packages: { name: string; version: string; root: string }[]
26
+ /** one per provider, sorted by package name; `target` holds its header. */
27
+ registrations: { symbol: string; header: string; target: string }[]
28
+ providers: NitroPackage[]
29
+ nitro: NitroPackage
30
+ reactNative: NitroPackage
25
31
  sources: { file: string; source: string; sha256: string }[]
26
32
  /** generated include paths pointing at one unchanged original input. */
27
33
  aliases: Record<string, string>
@@ -41,7 +47,7 @@ function readJson(root: string, relative: string): unknown {
41
47
  )
42
48
  }
43
49
 
44
- function packageInfo(root: string): NitroSourceCollection['packages'][number] {
50
+ function packageInfo(root: string): NitroPackage {
45
51
  root = fs.realpathSync(root)
46
52
  const value = readJson(root, 'package.json')
47
53
  if (
@@ -119,11 +125,69 @@ function registrations(root: string) {
119
125
  return { namespace, swiftModule, classes }
120
126
  }
121
127
 
128
+ /** the installed packages react native's iOS autolinking would link into the
129
+ * app that ship a generated Nitro iOS initializer: the app's own declared
130
+ * dependencies, resolved from its directory. Android-only packages ship none. */
131
+ export function discoverNitroProviders(appRoot: string): string[] {
132
+ appRoot = fs.realpathSync(appRoot)
133
+ const manifest = readJson(appRoot, 'package.json')
134
+ if (!object(manifest)) throw new Error(`${appRoot}: package.json is not an object`)
135
+ const declared = new Set<string>()
136
+ for (const field of ['dependencies', 'devDependencies']) {
137
+ const value = manifest[field]
138
+ if (object(value)) for (const name of Object.keys(value)) declared.add(name)
139
+ }
140
+ const roots: string[] = []
141
+ for (const name of [...declared].sort()) {
142
+ for (let directory = appRoot; ; directory = path.dirname(directory)) {
143
+ const root = path.join(directory, 'node_modules', name)
144
+ if (fs.existsSync(path.join(root, 'package.json'))) {
145
+ const generated = path.join(root, 'nitrogen/generated/ios')
146
+ if (
147
+ fs.existsSync(generated) &&
148
+ fs.readdirSync(generated).some((file) => file.endsWith('Autolinking.mm'))
149
+ )
150
+ roots.push(root)
151
+ break
152
+ }
153
+ if (path.dirname(directory) === directory) break
154
+ }
155
+ }
156
+ return roots
157
+ }
158
+
122
159
  /** collect installed native bodies, generated bridges, Nitro core and RN's
123
160
  * JSI without reading or rewriting package JavaScript. */
124
161
  export function collectNitroSources(options: NitroSourceOptions): NitroSourceCollection {
125
- const module = packageInfo(options.packageRoot)
126
- const config = registrations(module.root)
162
+ if (options.packageRoots.length === 0)
163
+ throw new Error('Nitro compilation needs at least one installed provider')
164
+ const providers = options.packageRoots
165
+ .map(packageInfo)
166
+ .sort((a, b) => a.name.localeCompare(b.name))
167
+ for (const [index, provider] of providers.entries())
168
+ if (providers.findIndex(({ name }) => name === provider.name) !== index)
169
+ throw new Error(`duplicate Nitro provider package ${provider.name}`)
170
+ const configs = providers.map((provider) => registrations(provider.root))
171
+ const names = new Map<string, string>()
172
+ for (const [index, config] of configs.entries())
173
+ for (const { name } of config.classes) {
174
+ const owner = names.get(name)
175
+ if (owner !== undefined)
176
+ throw new Error(
177
+ `Nitro HybridObject ${name} is registered by ${owner} and ${providers[index]!.name}`,
178
+ )
179
+ names.set(name, providers[index]!.name)
180
+ }
181
+ const swiftModules = new Map<string, string>()
182
+ for (const [index, config] of configs.entries()) {
183
+ if (config.swiftModule === null) continue
184
+ const owner = swiftModules.get(config.swiftModule)
185
+ if (owner !== undefined)
186
+ throw new Error(
187
+ `Nitro Swift module ${config.swiftModule} is declared by ${owner} and ${providers[index]!.name}`,
188
+ )
189
+ swiftModules.set(config.swiftModule, providers[index]!.name)
190
+ }
127
191
  let roots: NonNullable<NitroSourceOptions['dependencyRoots']>
128
192
  if (options.dependencyRoots !== undefined) {
129
193
  roots = options.dependencyRoots
@@ -143,7 +207,8 @@ export function collectNitroSources(options: NitroSourceOptions): NitroSourceCol
143
207
  if (nitro.name !== 'react-native-nitro-modules' || reactNative.name !== 'react-native')
144
208
  throw new Error('Nitro source dependency roots must identify Nitro Modules and RN')
145
209
 
146
- const targetName = `NitroPackage_${createHash('sha256').update(module.name).digest('hex').slice(0, 16)}`
210
+ const providerTarget = (provider: NitroPackage) =>
211
+ `NitroPackage_${createHash('sha256').update(provider.name).digest('hex').slice(0, 16)}`
147
212
  const coreTarget = 'NitroCore'
148
213
  const jsiTarget = 'JsiBridge'
149
214
  const targetPath = (name: string) => `Sources/${name}`
@@ -164,13 +229,18 @@ export function collectNitroSources(options: NitroSourceOptions): NitroSourceCol
164
229
  targets: [
165
230
  target(jsiTarget, []),
166
231
  target(coreTarget, [jsiTarget]),
167
- target(targetName, [coreTarget, jsiTarget]),
232
+ ...providers.map((provider) =>
233
+ target(providerTarget(provider), [coreTarget, jsiTarget]),
234
+ ),
168
235
  ],
169
- registration: {
170
- symbol: `peach_register_${targetName}`,
171
- header: `${targetPath(targetName)}/include/PeachNitroRegistration.hpp`,
172
- },
173
- packages: [module, nitro, reactNative],
236
+ registrations: providers.map((provider) => ({
237
+ symbol: `peach_register_${providerTarget(provider)}`,
238
+ header: `${targetPath(providerTarget(provider))}/include/PeachNitroRegistration.hpp`,
239
+ target: providerTarget(provider),
240
+ })),
241
+ providers,
242
+ nitro,
243
+ reactNative,
174
244
  sources: [],
175
245
  aliases: {},
176
246
  }
@@ -271,20 +341,8 @@ export function collectNitroSources(options: NitroSourceOptions): NitroSourceCol
271
341
  (file) => (file.endsWith('.h') && file !== 'JSIDynamic.h') || file === 'jsi.cpp',
272
342
  )
273
343
  collect(nitro.root, 'cpp', coreTarget, 'NitroModules', new Set(['views']))
274
- const implementationHeaders = fs.existsSync(path.join(module.root, 'cpp'))
275
- ? collect(module.root, 'cpp', targetName, null)
276
- : new Map<string, string>()
277
- collect(module.root, 'nitrogen/generated/shared/c++', targetName, null)
278
- for (const entry of config.classes)
279
- if (
280
- entry.language === 'c++' &&
281
- !implementationHeaders.has(`${entry.implementation}.hpp`)
282
- )
283
- throw new Error(
284
- `${module.root}: missing C++ implementation header ${entry.implementation}.hpp`,
285
- )
286
344
 
287
- if (config.swiftModule) {
345
+ if (swiftModules.size > 0) {
288
346
  for (const directory of ['ios/core', 'ios/utils'])
289
347
  collect(
290
348
  nitro.root,
@@ -296,9 +354,7 @@ export function collectNitroSources(options: NitroSourceOptions): NitroSourceCol
296
354
  )
297
355
  const nitroSwift = target('NitroModules', [coreTarget, jsiTarget])
298
356
  nitroSwift.cxxInterop = true
299
- const packageSwift = target(config.swiftModule, [targetName, 'NitroModules'])
300
- packageSwift.cxxInterop = true
301
- result.targets.push(nitroSwift, packageSwift)
357
+ result.targets.push(nitroSwift)
302
358
  for (const directory of ['ios/core', 'ios/utils', 'ios/views'])
303
359
  collect(
304
360
  nitro.root,
@@ -313,29 +369,52 @@ export function collectNitroSources(options: NitroSourceOptions): NitroSourceCol
313
369
  `${targetPath('NitroModules')}/PeachNitroExports.swift`,
314
370
  `@_exported import ${coreTarget}\n`,
315
371
  )
316
- collect(
317
- module.root,
318
- 'ios',
319
- config.swiftModule,
320
- null,
321
- new Set(['Tests']),
322
- () => true,
323
- /\.swift$/,
324
- )
325
- collect(
326
- module.root,
327
- 'nitrogen/generated/ios',
328
- config.swiftModule,
329
- null,
330
- new Set(),
331
- () => true,
332
- /\.swift$/,
333
- )
334
- collect(module.root, 'nitrogen/generated/ios', targetName, null)
335
- add(
336
- `${targetPath(config.swiftModule)}/PeachNitroExports.swift`,
337
- `@_exported import ${targetName}\n`,
338
- )
372
+ }
373
+
374
+ for (const [index, module] of providers.entries()) {
375
+ const config = configs[index]!
376
+ const targetName = providerTarget(module)
377
+ const implementationHeaders = fs.existsSync(path.join(module.root, 'cpp'))
378
+ ? collect(module.root, 'cpp', targetName, null)
379
+ : new Map<string, string>()
380
+ collect(module.root, 'nitrogen/generated/shared/c++', targetName, null)
381
+ for (const entry of config.classes)
382
+ if (
383
+ entry.language === 'c++' &&
384
+ !implementationHeaders.has(`${entry.implementation}.hpp`)
385
+ )
386
+ throw new Error(
387
+ `${module.root}: missing C++ implementation header ${entry.implementation}.hpp`,
388
+ )
389
+
390
+ if (config.swiftModule) {
391
+ const packageSwift = target(config.swiftModule, [targetName, 'NitroModules'])
392
+ packageSwift.cxxInterop = true
393
+ result.targets.push(packageSwift)
394
+ collect(
395
+ module.root,
396
+ 'ios',
397
+ config.swiftModule,
398
+ null,
399
+ new Set(['Tests']),
400
+ () => true,
401
+ /\.swift$/,
402
+ )
403
+ collect(
404
+ module.root,
405
+ 'nitrogen/generated/ios',
406
+ config.swiftModule,
407
+ null,
408
+ new Set(),
409
+ () => true,
410
+ /\.swift$/,
411
+ )
412
+ collect(module.root, 'nitrogen/generated/ios', targetName, null)
413
+ add(
414
+ `${targetPath(config.swiftModule)}/PeachNitroExports.swift`,
415
+ `@_exported import ${targetName}\n`,
416
+ )
417
+ }
339
418
  }
340
419
 
341
420
  // explicit module maps avoid importing every RN view or private JSI header.
@@ -345,50 +424,52 @@ export function collectNitroSources(options: NitroSourceOptions): NitroSourceCol
345
424
  )
346
425
  add(
347
426
  `${targetPath(coreTarget)}/include/module.modulemap`,
348
- `module ${coreTarget} { header "NitroModules/InstallNitro.hpp"${config.swiftModule ? ['ArrayBufferHolder.hpp', 'AnyMapUtils.hpp', 'PromiseHolder.hpp', 'Result.hpp', 'RuntimeError.hpp', 'DateToChronoDate.hpp'].map((header) => ` header "NitroModules/${header}"`).join('') : ''} export * }\n`,
349
- )
350
- add(
351
- result.registration.header,
352
- `#pragma once\nextern "C" void ${result.registration.symbol}();\n`,
427
+ `module ${coreTarget} { header "NitroModules/InstallNitro.hpp"${swiftModules.size > 0 ? ['ArrayBufferHolder.hpp', 'AnyMapUtils.hpp', 'PromiseHolder.hpp', 'Result.hpp', 'RuntimeError.hpp', 'DateToChronoDate.hpp'].map((header) => ` header "NitroModules/${header}"`).join('') : ''} export * }\n`,
353
428
  )
354
- add(
355
- `${targetPath(targetName)}/include/module.modulemap`,
356
- `module ${targetName} { header "PeachNitroRegistration.hpp"${config.swiftModule ? ` header "${config.swiftModule}-Swift-Cxx-Bridge.hpp"` : ''} export * }\n`,
357
- )
358
- add(
359
- `${targetPath(targetName)}/PeachNitroRegistration.cpp`,
360
- [
361
- '#include "PeachNitroRegistration.hpp"',
362
- '#include <NitroModules/HybridObjectRegistry.hpp>',
363
- '#include <memory>',
364
- '#include <type_traits>',
365
- ...(config.swiftModule
366
- ? [`#include "${config.swiftModule}-Swift-Cxx-Umbrella.hpp"`]
367
- : []),
368
- ...[
369
- ...new Set(
370
- config.classes
371
- .filter((entry) => entry.language === 'c++')
372
- .map(({ implementation }) => implementation),
373
- ),
374
- ].map((implementation) => `#include "${implementation}.hpp"`),
375
- `extern "C" void ${result.registration.symbol}() {`,
376
- ...config.classes.flatMap((entry) => [
377
- ...(entry.language === 'c++'
378
- ? [
379
- ` static_assert(std::is_default_constructible_v<${config.namespace}::${entry.implementation}>);`,
380
- ]
429
+ for (const [index, module] of providers.entries()) {
430
+ const config = configs[index]!
431
+ const targetName = providerTarget(module)
432
+ const registration = result.registrations[index]!
433
+ add(registration.header, `#pragma once\nextern "C" void ${registration.symbol}();\n`)
434
+ add(
435
+ `${targetPath(targetName)}/include/module.modulemap`,
436
+ `module ${targetName} { header "PeachNitroRegistration.hpp"${config.swiftModule ? ` header "${config.swiftModule}-Swift-Cxx-Bridge.hpp"` : ''} export * }\n`,
437
+ )
438
+ add(
439
+ `${targetPath(targetName)}/PeachNitroRegistration.cpp`,
440
+ [
441
+ '#include "PeachNitroRegistration.hpp"',
442
+ '#include <NitroModules/HybridObjectRegistry.hpp>',
443
+ '#include <memory>',
444
+ '#include <type_traits>',
445
+ ...(config.swiftModule
446
+ ? [`#include "${config.swiftModule}-Swift-Cxx-Umbrella.hpp"`]
381
447
  : []),
382
- ' margelo::nitro::HybridObjectRegistry::registerHybridObjectConstructor(',
383
- ` ${JSON.stringify(entry.name)}, []() -> std::shared_ptr<margelo::nitro::HybridObject> {`,
384
- entry.language === 'swift'
385
- ? ` return ${config.swiftModule}::${config.swiftModule}Autolinking::create${entry.name}();`
386
- : ` return std::make_shared<${config.namespace}::${entry.implementation}>();`,
387
- ' });',
388
- ]),
389
- '}',
390
- '',
391
- ].join('\n'),
392
- )
448
+ ...[
449
+ ...new Set(
450
+ config.classes
451
+ .filter((entry) => entry.language === 'c++')
452
+ .map(({ implementation }) => implementation),
453
+ ),
454
+ ].map((implementation) => `#include "${implementation}.hpp"`),
455
+ `extern "C" void ${registration.symbol}() {`,
456
+ ...config.classes.flatMap((entry) => [
457
+ ...(entry.language === 'c++'
458
+ ? [
459
+ ` static_assert(std::is_default_constructible_v<${config.namespace}::${entry.implementation}>);`,
460
+ ]
461
+ : []),
462
+ ' margelo::nitro::HybridObjectRegistry::registerHybridObjectConstructor(',
463
+ ` ${JSON.stringify(entry.name)}, []() -> std::shared_ptr<margelo::nitro::HybridObject> {`,
464
+ entry.language === 'swift'
465
+ ? ` return ${config.swiftModule}::${config.swiftModule}Autolinking::create${entry.name}();`
466
+ : ` return std::make_shared<${config.namespace}::${entry.implementation}>();`,
467
+ ' });',
468
+ ]),
469
+ '}',
470
+ '',
471
+ ].join('\n'),
472
+ )
473
+ }
393
474
  return result
394
475
  }
@@ -0,0 +1,217 @@
1
+ // the prebuilt Nitro adapter archive's shapes and identity rules, shared by its
2
+ // builder (packages/sootsim-swift/scripts/build-nitro-adapter-archive.ts), its
3
+ // publisher (scripts/ops/nitro-adapter-publish.ts) and the installed CLI that
4
+ // downloads and verifies it. nothing here reads adapter sources: an installed
5
+ // CLI carries this file and checks an archive against the lock it was built with.
6
+ import { createHash } from 'node:crypto'
7
+ import { readdirSync, readFileSync } from 'node:fs'
8
+ import path from 'node:path'
9
+ import { isRecord } from './is-record'
10
+
11
+ /** the file at the root of an unpacked adapter, and its install marker. */
12
+ export const NITRO_ADAPTER_MANIFEST = 'manifest.json'
13
+ export const NITRO_ADAPTER_ARCHIVE = 'libPeachNitroAdapter.a'
14
+
15
+ // header staging the collector exposes: JSI without the dynamic and test
16
+ // pieces, and Nitro's cpp tree without views, copied to bare and nested names.
17
+ export const HEADER_STAGE = {
18
+ jsi: {
19
+ from: 'ReactCommon/jsi/jsi',
20
+ skip: ['test'],
21
+ keep: '\\.h$',
22
+ exclude: 'JSIDynamic.h',
23
+ to: 'jsi',
24
+ },
25
+ nitro: {
26
+ from: 'cpp',
27
+ skip: ['views'],
28
+ keep: '\\.(?:h|hpp|hxx|inl)$',
29
+ to: ['core', 'core/NitroModules'],
30
+ },
31
+ }
32
+
33
+ export interface NitroAdapterRoots {
34
+ nitroModules: string
35
+ reactNative: string
36
+ }
37
+
38
+ /** what the installed CLI needs to trust an archive; no private provenance. */
39
+ export interface NitroAdapterManifest {
40
+ schema: 1
41
+ /** the guest platform the producer built for; every consumer matches it against the lock or its own recomputed identity. */
42
+ platform: string
43
+ target: string
44
+ recipe: string
45
+ adapter: { sha256: string }
46
+ headers: { reactNativeJsi: string; nitroModules: string }
47
+ compiler: string
48
+ sdk: { id: string; checksum: string }
49
+ framework: { distribution: string; wireAbi: string }
50
+ archive: { path: string; size: number; sha256: string }
51
+ }
52
+
53
+ /** the published tarball one CLI build installs, committed beside swift-distribution.lock.json. */
54
+ export interface NitroAdapterLock extends Omit<NitroAdapterManifest, 'archive'> {
55
+ /** the downloaded .tar.gz, which installVerifiedTarball checks. */
56
+ archive: { sha256: string; size: number }
57
+ }
58
+
59
+ export const sha256Hex = (data: Uint8Array | string) =>
60
+ createHash('sha256').update(data).digest('hex')
61
+
62
+ export function digest(entries: Record<string, string>) {
63
+ const hash = createHash('sha256')
64
+ for (const key of Object.keys(entries).sort()) hash.update(`${key}\0${entries[key]}\n`)
65
+ return hash.digest('hex')
66
+ }
67
+
68
+ function headerFiles(base: string, directory: string, skip: string[], keep: RegExp) {
69
+ const files: string[] = []
70
+ const walk = (relative: string) => {
71
+ for (const entry of readdirSync(path.join(base, relative), { withFileTypes: true })) {
72
+ if (entry.name.startsWith('.') || skip.includes(entry.name)) continue
73
+ const next = path.posix.join(relative, entry.name)
74
+ if (entry.isDirectory()) walk(next)
75
+ else if (keep.test(entry.name)) files.push(next)
76
+ }
77
+ }
78
+ walk(directory)
79
+ return files.sort()
80
+ }
81
+
82
+ /** the original header closures the collector exposes, with per-file hashes. */
83
+ export function headerClosure(roots: NitroAdapterRoots) {
84
+ const { jsi: j, nitro: n } = HEADER_STAGE
85
+ const jsiFiles = headerFiles(
86
+ roots.reactNative,
87
+ j.from,
88
+ j.skip,
89
+ new RegExp(j.keep),
90
+ ).filter((file) => !file.endsWith(`/${j.exclude}`))
91
+ const nitroFiles = headerFiles(roots.nitroModules, n.from, n.skip, new RegExp(n.keep))
92
+ const hashes = (base: string, files: string[]) =>
93
+ Object.fromEntries(
94
+ files.map((file) => [file, sha256Hex(readFileSync(path.join(base, file)))]),
95
+ )
96
+ return {
97
+ jsi: hashes(roots.reactNative, jsiFiles),
98
+ nitro: hashes(roots.nitroModules, nitroFiles),
99
+ nitroFiles,
100
+ jsiFiles,
101
+ }
102
+ }
103
+
104
+ /** the digests an app's original React Native and Nitro headers must match. */
105
+ export function headerDigests(roots: NitroAdapterRoots) {
106
+ const closure = headerClosure(roots)
107
+ return { reactNativeJsi: digest(closure.jsi), nitroModules: digest(closure.nitro) }
108
+ }
109
+
110
+ const hex64 = (value: unknown): value is string =>
111
+ typeof value === 'string' && /^[a-f0-9]{64}$/.test(value)
112
+
113
+ function text(value: unknown, what: string): string {
114
+ if (typeof value !== 'string' || !value)
115
+ throw new Error(`invalid Nitro adapter ${what}`)
116
+ return value
117
+ }
118
+
119
+ function digestField(value: unknown, what: string): string {
120
+ if (!hex64(value)) throw new Error(`invalid Nitro adapter ${what}`)
121
+ return value
122
+ }
123
+
124
+ function identity(value: unknown) {
125
+ if (!isRecord(value) || value.schema !== 1)
126
+ throw new Error('invalid Nitro adapter manifest')
127
+ const { adapter, headers, sdk, framework } = value
128
+ if (!isRecord(adapter) || !isRecord(headers) || !isRecord(sdk) || !isRecord(framework))
129
+ throw new Error('invalid Nitro adapter manifest')
130
+ return {
131
+ schema: 1 as const,
132
+ platform: text(value.platform, 'platform'),
133
+ target: text(value.target, 'target'),
134
+ recipe: digestField(value.recipe, 'recipe'),
135
+ adapter: { sha256: digestField(adapter.sha256, 'adapter digest') },
136
+ headers: {
137
+ reactNativeJsi: digestField(headers.reactNativeJsi, 'JSI header digest'),
138
+ nitroModules: digestField(headers.nitroModules, 'Nitro header digest'),
139
+ },
140
+ compiler: text(value.compiler, 'compiler'),
141
+ sdk: {
142
+ id: text(sdk.id, 'sdk id'),
143
+ checksum: digestField(sdk.checksum, 'sdk checksum'),
144
+ },
145
+ framework: {
146
+ distribution: text(framework.distribution, 'distribution'),
147
+ wireAbi: digestField(framework.wireAbi, 'wire abi'),
148
+ },
149
+ }
150
+ }
151
+
152
+ /** keeps only the public fields, so a producer's private provenance never
153
+ * reaches a packed manifest. */
154
+ export function parseNitroAdapterManifest(value: unknown): NitroAdapterManifest {
155
+ const archive = isRecord(value) ? value.archive : undefined
156
+ if (
157
+ !isRecord(archive) ||
158
+ typeof archive.path !== 'string' ||
159
+ archive.path !== NITRO_ADAPTER_ARCHIVE ||
160
+ typeof archive.size !== 'number'
161
+ )
162
+ throw new Error('invalid Nitro adapter archive record')
163
+ return {
164
+ ...identity(value),
165
+ archive: {
166
+ path: archive.path,
167
+ size: archive.size,
168
+ sha256: digestField(archive.sha256, 'archive digest'),
169
+ },
170
+ }
171
+ }
172
+
173
+ export function parseNitroAdapterLock(value: unknown): NitroAdapterLock {
174
+ const archive = isRecord(value) ? value.archive : undefined
175
+ if (!isRecord(archive) || typeof archive.size !== 'number')
176
+ throw new Error('invalid Nitro adapter lock archive')
177
+ return {
178
+ ...identity(value),
179
+ archive: {
180
+ sha256: digestField(archive.sha256, 'lock archive digest'),
181
+ size: archive.size,
182
+ },
183
+ }
184
+ }
185
+
186
+ /** the lock one published manifest and its tarball produce. */
187
+ export function nitroAdapterLock(
188
+ manifest: NitroAdapterManifest,
189
+ tarball: { sha256: string; size: number },
190
+ ): NitroAdapterLock {
191
+ const { archive: _library, ...rest } = manifest
192
+ return { ...rest, archive: tarball }
193
+ }
194
+
195
+ /** the tarball's path under PEACH_SWIFT_ENDPOINT: content addressed, so immutable. */
196
+ export function nitroAdapterArchiveKey(lock: NitroAdapterLock): string {
197
+ return `nitro-adapter/${lock.archive.sha256}.tar.gz`
198
+ }
199
+
200
+ /** throws unless an unpacked adapter is the one the lock pins and its library
201
+ * bytes are the ones its manifest records. needs no adapter source. */
202
+ export function verifyInstalledNitroAdapter(
203
+ directory: string,
204
+ lock: NitroAdapterLock,
205
+ ): NitroAdapterManifest {
206
+ const manifest = parseNitroAdapterManifest(
207
+ JSON.parse(readFileSync(path.join(directory, NITRO_ADAPTER_MANIFEST), 'utf8')),
208
+ )
209
+ const { archive, ...recorded } = manifest
210
+ const { archive: _tarball, ...pinned } = lock
211
+ if (JSON.stringify(recorded) !== JSON.stringify(pinned))
212
+ throw new Error('Nitro adapter manifest does not match the lock this build carries')
213
+ const bytes = readFileSync(path.join(directory, archive.path))
214
+ if (bytes.length !== archive.size || sha256Hex(bytes) !== archive.sha256)
215
+ throw new Error('Nitro adapter library does not match its manifest')
216
+ return manifest
217
+ }
@@ -3,33 +3,46 @@ import {
3
3
  readBundleMetadataFooter,
4
4
  } from './bundleGlobalFooter'
5
5
 
6
+ /** the guest platform every Nitro compile targets. */
7
+ export const NITRO_GUEST_PLATFORM = 'ios'
8
+
6
9
  export interface NitroCompiledModule {
7
- platform: 'ios'
8
- packageName: string
9
- packageVersion: string
10
+ platform: typeof NITRO_GUEST_PLATFORM
11
+ /** the original providers this one executable registers, by package name. */
12
+ packages: { name: string; version: string }[]
10
13
  url: string
11
14
  hash: string
12
15
  icuUrl: string
13
16
  }
14
17
 
18
+ function readNitroPackage(
19
+ value: unknown,
20
+ ): NitroCompiledModule['packages'][number] | null {
21
+ if (typeof value !== 'object' || value === null) return null
22
+ const name = Reflect.get(value, 'name')
23
+ const version = Reflect.get(value, 'version')
24
+ return typeof name === 'string' && name && typeof version === 'string' && version
25
+ ? { name, version }
26
+ : null
27
+ }
28
+
15
29
  export function readNitroMetadata(value: unknown): NitroCompiledModule | null {
16
30
  if (value === null || value === undefined) return null
17
31
  if (
18
32
  typeof value !== 'object' ||
19
33
  Array.isArray(value) ||
20
- Reflect.get(value, 'platform') !== 'ios'
34
+ Reflect.get(value, 'platform') !== NITRO_GUEST_PLATFORM
21
35
  )
22
36
  throw new Error('invalid Nitro compilation metadata')
23
- const packageName = Reflect.get(value, 'packageName')
24
- const packageVersion = Reflect.get(value, 'packageVersion')
37
+ const listed = Reflect.get(value, 'packages')
38
+ const packages = Array.isArray(listed) ? listed.map(readNitroPackage) : []
25
39
  const url = Reflect.get(value, 'url')
26
40
  const hash = Reflect.get(value, 'hash')
27
41
  const icuUrl = Reflect.get(value, 'icuUrl')
28
42
  if (
29
- typeof packageName !== 'string' ||
30
- !packageName ||
31
- typeof packageVersion !== 'string' ||
32
- !packageVersion ||
43
+ packages.length === 0 ||
44
+ !packages.every((entry) => entry !== null) ||
45
+ new Set(packages.map(({ name }) => name)).size !== packages.length ||
33
46
  typeof url !== 'string' ||
34
47
  !url ||
35
48
  typeof hash !== 'string' ||
@@ -38,7 +51,7 @@ export function readNitroMetadata(value: unknown): NitroCompiledModule | null {
38
51
  !icuUrl
39
52
  )
40
53
  throw new Error('invalid Nitro compilation metadata')
41
- return { platform: 'ios', packageName, packageVersion, url, hash, icuUrl }
54
+ return { platform: 'ios', packages, url, hash, icuUrl }
42
55
  }
43
56
 
44
57
  export function readNitroFooter(source: string): NitroCompiledModule | null {