peachsim 0.1.939 → 0.1.1399

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (396) hide show
  1. package/README.md +28 -22
  2. package/cli/app-catalog.ts +29 -14
  3. package/cli/app-fonts.ts +5 -3
  4. package/cli/bridge-flow-runner.ts +40 -29
  5. package/cli/cloud-client.ts +57 -21
  6. package/cli/cloud-test-tunnel.ts +12 -18
  7. package/cli/commands/agent.ts +1 -1
  8. package/cli/commands/app-fonts.ts +3 -3
  9. package/cli/commands/assert.ts +8 -8
  10. package/cli/commands/auth.ts +8 -3
  11. package/cli/commands/box/bundle-plane.ts +13 -1
  12. package/cli/commands/box.ts +16 -5
  13. package/cli/commands/compat.ts +1 -1
  14. package/cli/commands/config.ts +2 -2
  15. package/cli/commands/control.ts +125 -71
  16. package/cli/commands/cpu-profile.ts +45 -1
  17. package/cli/commands/daemon.ts +131 -33
  18. package/cli/commands/debug.ts +24 -17
  19. package/cli/commands/desktop.ts +7 -1
  20. package/cli/commands/detect.ts +101 -0
  21. package/cli/commands/detox.ts +6 -6
  22. package/cli/commands/device.ts +12 -12
  23. package/cli/commands/electron.ts +32 -14
  24. package/cli/commands/flow.ts +49 -41
  25. package/cli/commands/guest-host.ts +39 -1
  26. package/cli/commands/inspect/core.ts +14 -8
  27. package/cli/commands/inspect/list.ts +1 -1
  28. package/cli/commands/inspect/settle.ts +5 -3
  29. package/cli/commands/inspect/settling.ts +229 -44
  30. package/cli/commands/inspect/wait-idle.ts +3 -2
  31. package/cli/commands/inspect.ts +105 -93
  32. package/cli/commands/install-cli.ts +36 -15
  33. package/cli/commands/install-desktop.ts +68 -195
  34. package/cli/commands/kotlin.ts +6 -5
  35. package/cli/commands/login.ts +5 -5
  36. package/cli/commands/maestro-compare.ts +554 -0
  37. package/cli/commands/maestro-generate.ts +6 -3
  38. package/cli/commands/maestro.ts +22 -0
  39. package/cli/commands/mode.ts +2 -2
  40. package/cli/commands/no-bridge-hint.ts +6 -2
  41. package/cli/commands/platform.ts +35 -6
  42. package/cli/commands/preview.ts +6 -0
  43. package/cli/commands/project-report.ts +10 -12
  44. package/cli/commands/record.ts +37 -37
  45. package/cli/commands/runtime.ts +9 -9
  46. package/cli/commands/screenshot-layers.ts +4 -4
  47. package/cli/commands/screenshot-mode.ts +2 -2
  48. package/cli/commands/screenshot.ts +8 -8
  49. package/cli/commands/screenshots-capture.ts +2 -2
  50. package/cli/commands/serve.ts +9 -12
  51. package/cli/commands/setup.ts +29 -14
  52. package/cli/commands/shell-boolean-mode.ts +2 -2
  53. package/cli/commands/show-touches-mode.ts +2 -2
  54. package/cli/commands/skills.ts +11 -11
  55. package/cli/commands/swift.ts +29 -11
  56. package/cli/commands/telemetry.ts +2 -2
  57. package/cli/commands/test.ts +5 -0
  58. package/cli/commands/three-mode.ts +3 -3
  59. package/cli/commands/timeline.ts +4 -4
  60. package/cli/commands/upgrade.ts +2 -2
  61. package/cli/commands/upload.ts +15 -15
  62. package/cli/commands/what-happened.ts +2 -2
  63. package/cli/current-sim.ts +6 -3
  64. package/cli/desktop-companion.ts +55 -149
  65. package/cli/dev-build-freshness.ts +2 -2
  66. package/cli/drivers/desktop.ts +17 -9
  67. package/cli/drivers/electron.ts +1 -2
  68. package/cli/drivers/playwright-sim-host.ts +11 -2
  69. package/cli/drivers/playwright.ts +35 -2
  70. package/cli/drivers/types.ts +8 -0
  71. package/cli/maestro-compare.ts +670 -0
  72. package/cli/outbound-endpoints.ts +46 -8
  73. package/cli/recording-access.ts +6 -6
  74. package/cli/run-registry.ts +1 -1
  75. package/cli/runtime-compat.ts +5 -1
  76. package/cli/send-to-box.ts +3 -3
  77. package/cli/shell-init.ts +2 -1
  78. package/cli/ws-bridge.ts +9 -5
  79. package/detox/element-types.ts +1 -0
  80. package/detox/gestures.ts +3 -3
  81. package/detox/index.ts +67 -38
  82. package/detox/navigation-lifecycle.ts +9 -6
  83. package/detox/proof-frame.cjs +6 -4
  84. package/dist-lib/agent-daemon-client.cjs +1 -1
  85. package/dist-lib/agent-events.cjs +1 -1
  86. package/dist-lib/attached-projects.cjs +1 -1
  87. package/dist-lib/auth/shared-session.cjs +1 -1
  88. package/dist-lib/backend-origin.cjs +1 -1
  89. package/dist-lib/beta.cjs +1 -1
  90. package/dist-lib/beta.mjs +1 -1
  91. package/dist-lib/bridge-constants.cjs +1 -1
  92. package/dist-lib/bridge-contract-input.cjs +42 -17
  93. package/dist-lib/bridge-contract-input.mjs +41 -16
  94. package/dist-lib/bridge-contract.cjs +1 -4
  95. package/dist-lib/bridge-contract.mjs +1 -3
  96. package/dist-lib/bundle-channel.cjs +2918 -550
  97. package/dist-lib/capture-contract.cjs +65 -24
  98. package/dist-lib/capture-contract.mjs +63 -24
  99. package/dist-lib/cloud-contract.cjs +2 -2
  100. package/dist-lib/cloud-contract.mjs +2 -2
  101. package/dist-lib/cloud-test-args.cjs +1 -1
  102. package/dist-lib/cloud-test-args.mjs +1 -1
  103. package/dist-lib/cloud.cjs +3 -3
  104. package/dist-lib/cloud.mjs +3 -3
  105. package/dist-lib/config.cjs +15 -5
  106. package/dist-lib/config.mjs +154 -0
  107. package/dist-lib/detox/index.cjs +495 -139
  108. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  109. package/dist-lib/expo-swift-bundle.cjs +1168 -238
  110. package/dist-lib/expo-swift-metadata.cjs +34 -23
  111. package/dist-lib/expo-swift-metadata.mjs +32 -23
  112. package/dist-lib/home-paths.cjs +2 -2
  113. package/dist-lib/host/bridge-host.cjs +2938 -654
  114. package/dist-lib/host/fetch-proxy-handler.cjs +14 -1
  115. package/dist-lib/host/fetch-proxy-overrides.cjs +7 -1
  116. package/dist-lib/host/fetch-proxy-overrides.mjs +5 -1
  117. package/dist-lib/host/replacement-module-handler.cjs +2 -2
  118. package/dist-lib/host/websocket-proxy.cjs +1 -1
  119. package/dist-lib/index.cjs +999 -353
  120. package/dist-lib/jump-to-source-babel.cjs +1 -1
  121. package/dist-lib/jump-to-source-native.cjs +1 -1
  122. package/dist-lib/kotlin-host.cjs +332 -19
  123. package/dist-lib/menu.cjs +1 -1
  124. package/dist-lib/menu.mjs +1 -1
  125. package/dist-lib/metro-fingerprint-registry.cjs +1 -1
  126. package/dist-lib/metro-fingerprint-registry.mjs +1 -1
  127. package/dist-lib/metro-production-bundle.cjs +7 -7
  128. package/dist-lib/metro-production-bundle.mjs +5 -5
  129. package/dist-lib/metro.cjs +688 -250
  130. package/dist-lib/native-app-identity-project.cjs +2647 -0
  131. package/dist-lib/native-app-identity-project.mjs +1257 -0
  132. package/dist-lib/native-app-identity.cjs +325 -25
  133. package/dist-lib/native-app-identity.mjs +323 -25
  134. package/dist-lib/native-firebase-metadata.cjs +1 -1
  135. package/dist-lib/native-firebase-metadata.mjs +1 -1
  136. package/dist-lib/plist.cjs +1 -1
  137. package/dist-lib/plist.mjs +1 -1
  138. package/dist-lib/profiles.cjs +1 -1
  139. package/dist-lib/public-brand.cjs +1 -1
  140. package/dist-lib/react-native-host-modules.cjs +5 -1
  141. package/dist-lib/react-native-host-modules.mjs +5 -1
  142. package/dist-lib/scripts/dev-server-scanner.cjs +57 -32
  143. package/dist-lib/sdk.cjs +231 -51
  144. package/dist-lib/sdk.mjs +231 -51
  145. package/dist-lib/skills.cjs +4107 -1374
  146. package/dist-lib/swift-compile.cjs +290 -30
  147. package/dist-lib/swift-compile.mjs +290 -30
  148. package/dist-lib/swift-package.cjs +143 -12
  149. package/dist-lib/swift-package.mjs +137 -11
  150. package/dist-lib/swift-submit.cjs +47 -5
  151. package/dist-lib/swift-submit.mjs +42 -5
  152. package/dist-lib/swift-toolchain.cjs +7 -2
  153. package/dist-lib/swift.cjs +1 -1
  154. package/dist-lib/vite-swift.cjs +1392 -458
  155. package/dist-lib/vite.cjs +13 -17
  156. package/dist-lib/worklet-executable.cjs +248 -33
  157. package/dist-lib/worklet-executable.mjs +248 -33
  158. package/install.sh +10 -1
  159. package/kotlin/{AppSources → AndroidViewSources}/android/content/res/Resources.kt +9 -9
  160. package/kotlin/AndroidViewSources/android/graphics/Canvas.kt +20 -0
  161. package/kotlin/AndroidViewSources/android/view/View.kt +211 -0
  162. package/kotlin/AndroidViewSources/android/widget/FrameLayout.kt +61 -0
  163. package/kotlin/AndroidViewSources/android/widget/LinearLayout.kt +49 -0
  164. package/kotlin/AppSources/android/view/Window.kt +36 -0
  165. package/kotlin/AppSources/android/view/WindowInsets.kt +9 -0
  166. package/kotlin/AppSources/android/view/WindowInsetsController.kt +5 -0
  167. package/kotlin/AppSources/android/window/OnBackInvokedDispatcher.kt +48 -0
  168. package/kotlin/AppSources/androidx/activity/OnBackPressedDispatcher.kt +20 -5
  169. package/kotlin/AppSources/androidx/compose/foundation/layout/WindowInsets.kt +15 -0
  170. package/kotlin/AppSources/androidx/compose/ui/platform/ComposeView.kt +2 -1
  171. package/kotlin/AppSources/dev/peach/app/PeachApp.kt +42 -50
  172. package/kotlin/ComposeSources/PeachComposeHost.kt +200 -84
  173. package/kotlin/ExpoComposeSources/PeachAndroidView.kt +87 -0
  174. package/kotlin/ExpoComposeSources/PeachExpoViewMount.kt +24 -0
  175. package/kotlin/ExpoComposeSources/dev/peach/expo/PeachExpoCompose.kt +28 -0
  176. package/kotlin/ExpoComposeSources/expo/modules/kotlin/views/ExpoComposeView.kt +70 -0
  177. package/kotlin/ExpoSources/dev/peach/expo/PeachExpoRuntime.kt +513 -0
  178. package/kotlin/ExpoSources/dev/peach/expo/PeachExpoTypes.kt +173 -0
  179. package/kotlin/ExpoSources/expo/modules/kotlin/AppContext.kt +20 -0
  180. package/kotlin/ExpoSources/expo/modules/kotlin/Promise.kt +19 -0
  181. package/kotlin/ExpoSources/expo/modules/kotlin/classcomponent/ClassComponentBuilder.kt +198 -0
  182. package/kotlin/ExpoSources/expo/modules/kotlin/exception/CodedException.kt +126 -0
  183. package/kotlin/ExpoSources/expo/modules/kotlin/functions/Functions.kt +132 -0
  184. package/kotlin/ExpoSources/expo/modules/kotlin/jni/JavaScriptTypedArray.kt +81 -0
  185. package/kotlin/ExpoSources/expo/modules/kotlin/modules/Module.kt +98 -0
  186. package/kotlin/ExpoSources/expo/modules/kotlin/objects/ObjectDefinitionBuilder.kt +236 -0
  187. package/kotlin/ExpoSources/expo/modules/kotlin/records/Record.kt +12 -0
  188. package/kotlin/ExpoSources/expo/modules/kotlin/runtime/Runtime.kt +9 -0
  189. package/kotlin/ExpoSources/expo/modules/kotlin/sharedobjects/SharedObject.kt +50 -0
  190. package/kotlin/ExpoSources/expo/modules/kotlin/sharedobjects/SharedObjectRegistry.kt +57 -0
  191. package/kotlin/ExpoSources/expo/modules/kotlin/sharedobjects/SharedRef.kt +19 -0
  192. package/kotlin/ExpoSources/expo/modules/kotlin/typedarray/ConcreteTypedArrays.kt +158 -0
  193. package/kotlin/ExpoSources/expo/modules/kotlin/typedarray/GenericTypedArray.kt +8 -0
  194. package/kotlin/ExpoSources/expo/modules/kotlin/typedarray/TypedArray.kt +29 -0
  195. package/kotlin/ExpoSources/expo/modules/kotlin/typedarray/TypedArrayIterator.kt +9 -0
  196. package/kotlin/ExpoSources/expo/modules/kotlin/types/AnyType.kt +155 -0
  197. package/kotlin/ExpoSources/expo/modules/kotlin/types/Either.kt +91 -0
  198. package/kotlin/ExpoSources/expo/modules/kotlin/types/Enumerable.kt +6 -0
  199. package/kotlin/ExpoSources/expo/modules/kotlin/viewevent/ViewEvent.kt +54 -0
  200. package/kotlin/ExpoSources/expo/modules/kotlin/views/ExpoView.kt +23 -0
  201. package/kotlin/ExpoSources/expo/modules/kotlin/views/ViewDefinitionBuilder.kt +71 -0
  202. package/kotlin/ExpoSources/expo/modules/kotlin/views/ViewProps.kt +35 -0
  203. package/kotlin/README.md +13 -3
  204. package/kotlin/Sources/android/os/Build.kt +17 -0
  205. package/kotlin/Sources/android/os/Handler.kt +35 -0
  206. package/kotlin/Sources/android/os/Looper.kt +17 -0
  207. package/kotlin/Sources/android/os/MessageQueue.kt +56 -0
  208. package/kotlin/Sources/android/os/SystemClock.kt +14 -0
  209. package/kotlin/Sources/android/util/Log.kt +64 -0
  210. package/kotlin/Sources/java/security/MessageDigest.kt +114 -0
  211. package/kotlin/Sources/kotlin/text/StringFormat.kt +9 -0
  212. package/kotlin/Sources/org/json/JSON.kt +44 -0
  213. package/kotlin/fixtures/counter/Counter.d.kt.ts +1 -0
  214. package/kotlin/fixtures/counter/Counter.kt +10 -3
  215. package/kotlin/fixtures/counter/CounterApp.native.tsx +1 -1
  216. package/kotlin/fixtures/counter/vite.config.ts +2 -2
  217. package/kotlin/fixtures/headless-counter/Headless.kt +7 -6
  218. package/kotlin/fixtures/import-animation/Animation.d.kt.ts +7 -0
  219. package/kotlin/fixtures/import-animation/Animation.kt +80 -0
  220. package/kotlin/fixtures/import-animation/ImportAnimation.native.tsx +13 -0
  221. package/kotlin/fixtures/import-animation/README.md +24 -0
  222. package/kotlin/fixtures/import-animation/app/_layout.tsx +4 -0
  223. package/kotlin/fixtures/import-animation/app/index+spa.tsx +1 -0
  224. package/kotlin/fixtures/import-animation/app/routes.d.ts +18 -0
  225. package/kotlin/fixtures/import-animation/package.json +23 -0
  226. package/kotlin/fixtures/import-animation/tsconfig.json +20 -0
  227. package/kotlin/fixtures/import-animation/vite.config.ts +20 -0
  228. package/kotlin/fixtures/import-editor/Editor.d.kt.ts +7 -0
  229. package/kotlin/fixtures/import-editor/Editor.kt +59 -0
  230. package/kotlin/fixtures/import-editor/ImportEditor.native.tsx +23 -0
  231. package/kotlin/fixtures/import-editor/README.md +27 -0
  232. package/kotlin/fixtures/import-editor/app/_layout.tsx +4 -0
  233. package/kotlin/fixtures/import-editor/app/index+spa.tsx +1 -0
  234. package/kotlin/fixtures/import-editor/package.json +23 -0
  235. package/kotlin/fixtures/import-editor/tsconfig.json +20 -0
  236. package/kotlin/fixtures/import-editor/vite.config.ts +20 -0
  237. package/kotlin/fixtures/import-effects/Effects.d.kt.ts +7 -0
  238. package/kotlin/fixtures/import-effects/Effects.kt +87 -0
  239. package/kotlin/fixtures/import-effects/ImportEffects.native.tsx +13 -0
  240. package/kotlin/fixtures/import-effects/README.md +19 -0
  241. package/kotlin/fixtures/import-effects/app/_layout.tsx +4 -0
  242. package/kotlin/fixtures/import-effects/app/index+spa.tsx +1 -0
  243. package/kotlin/fixtures/import-effects/package.json +23 -0
  244. package/kotlin/fixtures/import-effects/tsconfig.json +20 -0
  245. package/kotlin/fixtures/import-effects/vite.config.ts +20 -0
  246. package/kotlin/fixtures/import-layout/ImportLayout.native.tsx +13 -0
  247. package/kotlin/fixtures/import-layout/Layout.d.kt.ts +7 -0
  248. package/kotlin/fixtures/import-layout/Layout.kt +72 -0
  249. package/kotlin/fixtures/import-layout/README.md +24 -0
  250. package/kotlin/fixtures/import-layout/app/_layout.tsx +4 -0
  251. package/kotlin/fixtures/import-layout/app/index+spa.tsx +1 -0
  252. package/kotlin/fixtures/import-layout/package.json +23 -0
  253. package/kotlin/fixtures/import-layout/tsconfig.json +20 -0
  254. package/kotlin/fixtures/import-layout/vite.config.ts +20 -0
  255. package/kotlin/fixtures/import-navigation/ImportNavigation.native.tsx +18 -0
  256. package/kotlin/fixtures/import-navigation/Navigation.d.kt.ts +7 -0
  257. package/kotlin/fixtures/import-navigation/Navigation.kt +104 -0
  258. package/kotlin/fixtures/import-navigation/README.md +31 -0
  259. package/kotlin/fixtures/import-navigation/app/_layout.tsx +4 -0
  260. package/kotlin/fixtures/import-navigation/app/index+spa.tsx +1 -0
  261. package/kotlin/fixtures/import-navigation/package.json +23 -0
  262. package/kotlin/fixtures/import-navigation/tsconfig.json +20 -0
  263. package/kotlin/fixtures/import-navigation/vite.config.ts +20 -0
  264. package/kotlin/fixtures/import-overlays/ImportOverlays.native.tsx +29 -0
  265. package/kotlin/fixtures/import-overlays/Overlays.d.kt.ts +7 -0
  266. package/kotlin/fixtures/import-overlays/Overlays.kt +93 -0
  267. package/kotlin/fixtures/import-overlays/README.md +34 -0
  268. package/kotlin/fixtures/import-overlays/app/_layout.tsx +4 -0
  269. package/kotlin/fixtures/import-overlays/app/index+spa.tsx +1 -0
  270. package/kotlin/fixtures/import-overlays/package.json +23 -0
  271. package/kotlin/fixtures/import-overlays/tsconfig.json +20 -0
  272. package/kotlin/fixtures/import-overlays/vite.config.ts +20 -0
  273. package/kotlin/fixtures/import-scroll/ImportScroll.native.tsx +13 -0
  274. package/kotlin/fixtures/import-scroll/README.md +23 -0
  275. package/kotlin/fixtures/import-scroll/Scroll.d.kt.ts +7 -0
  276. package/kotlin/fixtures/import-scroll/Scroll.kt +91 -0
  277. package/kotlin/fixtures/import-scroll/app/_layout.tsx +4 -0
  278. package/kotlin/fixtures/import-scroll/app/index+spa.tsx +1 -0
  279. package/kotlin/fixtures/import-scroll/package.json +23 -0
  280. package/kotlin/fixtures/import-scroll/tsconfig.json +20 -0
  281. package/kotlin/fixtures/import-scroll/vite.config.ts +20 -0
  282. package/kotlin/fixtures/import-selection/ImportSelection.native.tsx +44 -0
  283. package/kotlin/fixtures/import-selection/README.md +32 -0
  284. package/kotlin/fixtures/import-selection/Selection.d.kt.ts +8 -0
  285. package/kotlin/fixtures/import-selection/Selection.kt +78 -0
  286. package/kotlin/fixtures/import-selection/app/_layout.tsx +4 -0
  287. package/kotlin/fixtures/import-selection/app/index+spa.tsx +1 -0
  288. package/kotlin/fixtures/import-selection/package.json +23 -0
  289. package/kotlin/fixtures/import-selection/tsconfig.json +20 -0
  290. package/kotlin/fixtures/import-selection/vite.config.ts +20 -0
  291. package/kotlin/fixtures/import-surfaces/ImportSurfaces.native.tsx +13 -0
  292. package/kotlin/fixtures/import-surfaces/README.md +22 -0
  293. package/kotlin/fixtures/import-surfaces/Surfaces.d.kt.ts +7 -0
  294. package/kotlin/fixtures/import-surfaces/Surfaces.kt +64 -0
  295. package/kotlin/fixtures/import-surfaces/app/_layout.tsx +4 -0
  296. package/kotlin/fixtures/import-surfaces/app/index+spa.tsx +1 -0
  297. package/kotlin/fixtures/import-surfaces/package.json +23 -0
  298. package/kotlin/fixtures/import-surfaces/tsconfig.json +20 -0
  299. package/kotlin/fixtures/import-surfaces/vite.config.ts +20 -0
  300. package/kotlin/fixtures/import-values/ImportValues.native.tsx +35 -0
  301. package/kotlin/fixtures/import-values/README.md +23 -0
  302. package/kotlin/fixtures/import-values/Values.d.kt.ts +11 -0
  303. package/kotlin/fixtures/import-values/Values.kt +66 -0
  304. package/kotlin/fixtures/import-values/app/_layout.tsx +4 -0
  305. package/kotlin/fixtures/import-values/app/index+spa.tsx +1 -0
  306. package/kotlin/fixtures/import-values/package.json +23 -0
  307. package/kotlin/fixtures/import-values/tsconfig.json +20 -0
  308. package/kotlin/fixtures/import-values/vite.config.ts +20 -0
  309. package/kotlin/fixtures/kotlin-app-variants/BarBehavior.kt +38 -0
  310. package/kotlin/fixtures/kotlin-app-variants/BarVisibility.kt +36 -0
  311. package/kotlin/fixtures/kotlin-app-variants/Ime.kt +3 -1
  312. package/kotlin/fixtures/kotlin-app-variants/TransientInsets.kt +50 -0
  313. package/kotlin/fork/NOTICE +6 -1
  314. package/kotlin/fork/README.md +15 -7
  315. package/kotlin/fork/build.sh +2 -0
  316. package/kotlin/fork/compose-worker-globals.patch +186 -4
  317. package/kotlin/fork/fork.json +2 -2
  318. package/kotlin/fork/skiko-worker-clock.patch +12 -0
  319. package/kotlin/toolchain.json +12 -12
  320. package/kotlin/tools/expo-types.main.kts +115 -0
  321. package/package.json +17 -23
  322. package/scripts/dev-server-scanner.ts +92 -66
  323. package/skills/contrast/SKILL.md +2 -2
  324. package/skills/peach-debug/SKILL.md +1 -1
  325. package/skills/peach-perf/SKILL.md +1 -1
  326. package/skills/peach-setup/SKILL.md +2 -1
  327. package/skills/peach-test/SKILL.md +8 -0
  328. package/src/assetCatalogContract.ts +43 -1
  329. package/src/bridge-contract-input.ts +46 -19
  330. package/src/bridge-contract.ts +0 -1
  331. package/src/bundle-channel.mjs +197 -84
  332. package/src/bundleGlobalFooter.ts +38 -0
  333. package/src/capture-contract.ts +107 -33
  334. package/src/cloud-contract.ts +5 -1
  335. package/src/cloud.ts +5 -2
  336. package/src/config.ts +22 -3
  337. package/src/configured-bundle-producer.ts +1 -1
  338. package/src/desktop-host-delivery.ts +95 -1
  339. package/src/expo-kotlin-bundle.ts +29 -0
  340. package/src/expo-kotlin-host.ts +201 -0
  341. package/src/expo-swift-host.ts +96 -76
  342. package/src/expoKotlinContract.ts +70 -0
  343. package/src/expoSwiftContract.ts +4 -25
  344. package/src/home-paths.ts +7 -4
  345. package/src/host/bridge-host.ts +23 -3
  346. package/src/host/fetch-proxy-handler.ts +13 -0
  347. package/src/host/fetch-proxy-overrides.ts +11 -0
  348. package/src/host/replacement-module-handler.ts +5 -2
  349. package/src/index.ts +3 -1
  350. package/src/kotlin-host.ts +463 -19
  351. package/src/metro-plugin.ts +56 -28
  352. package/src/metro-production-bundle.ts +2 -2
  353. package/src/native-app-identity-project.ts +190 -0
  354. package/src/native-app-identity.ts +398 -34
  355. package/src/native-firebase-config.ts +69 -15
  356. package/src/native-seam-manifest.ts +6 -0
  357. package/src/one-widget-discovery.ts +2 -1
  358. package/src/openstep-plist.ts +107 -0
  359. package/src/react-native-host-modules.ts +4 -0
  360. package/src/runtime-assets.ts +2 -2
  361. package/src/sim-client.ts +2 -2
  362. package/src/swift-binary-modules.ts +3 -1
  363. package/src/swift-compile.ts +286 -38
  364. package/src/swift-distribution-contract.ts +4 -0
  365. package/src/swift-distribution.lock.json +123 -12
  366. package/src/swift-distribution.ts +7 -3
  367. package/src/swift-host.ts +298 -83
  368. package/src/swift-package-manifest.ts +29 -2
  369. package/src/swift-package.ts +180 -10
  370. package/src/swift-packages.ts +4 -0
  371. package/src/swift-standin-emit.ts +4 -1
  372. package/src/swift-standins.ts +274 -15
  373. package/src/swift-submit.ts +62 -7
  374. package/src/swift-toolchain.ts +6 -1
  375. package/src/swiftContract.ts +126 -3
  376. package/src/vite-plugin-one.ts +13 -16
  377. package/src/vite-plugin-swift.ts +4 -5
  378. package/src/vite-plugin.ts +360 -144
  379. package/src/vite.d.ts +1 -1
  380. package/src/worker-system-chunks.ts +221 -0
  381. package/src/worklet-executable.ts +348 -38
  382. package/src/worklets-babel.ts +1 -1
  383. package/src/xcode-project.ts +243 -127
  384. package/dist-lib/agent-identity.cjs +0 -39
  385. package/dist-lib/agent-sessions.cjs +0 -760
  386. package/dist-lib/cli-constants.cjs +0 -32
  387. package/dist-lib/render-mode.cjs +0 -44
  388. package/kotlin/AppSources/android/view/View.kt +0 -74
  389. package/kotlin/AppSources/android/widget/FrameLayout.kt +0 -6
  390. package/src/render-mode.ts +0 -15
  391. /package/kotlin/{AppSources → AndroidViewSources}/android/content/Context.kt +0 -0
  392. /package/kotlin/{AppSources → AndroidViewSources}/android/content/res/Configuration.kt +0 -0
  393. /package/kotlin/{AppSources → AndroidViewSources}/android/graphics/Color.kt +0 -0
  394. /package/kotlin/{AppSources → AndroidViewSources}/android/util/DisplayMetrics.kt +0 -0
  395. /package/kotlin/{AppSources → AndroidViewSources}/dev/peach/app/JavaFormat.kt +0 -0
  396. /package/kotlin/{AppSources → Sources}/java/lang/Runnable.kt +0 -0
@@ -0,0 +1,57 @@
1
+ package expo.modules.kotlin.sharedobjects
2
+
3
+ import expo.modules.kotlin.exception.CodedException
4
+ import kotlin.reflect.KClass
5
+
6
+ value class SharedObjectId(val value: Int)
7
+
8
+ internal class InvalidSharedObjectIdException : CodedException(
9
+ message = "Cannot convert provided JavaScriptObject to the SharedObject, because it doesn't contain valid id",
10
+ )
11
+
12
+ internal class UsingReleasedSharedObjectException : CodedException(
13
+ message = "Cannot use shared object that was already released",
14
+ )
15
+
16
+ // the JavaScript class a Class definition exports, by module and name
17
+ internal class SharedObjectClass(val module: String, val name: String)
18
+
19
+ // the native half of every shared object the process's JavaScript holds.
20
+ // JavaScript keeps its objects by id; this side keeps the natives until
21
+ // JavaScript releases them or collects their objects.
22
+ internal class SharedObjectRegistry {
23
+ private var currentId = 1
24
+ private val objects = HashMap<Int, SharedObject>()
25
+ private val classes = HashMap<KClass<*>, SharedObjectClass>()
26
+ // events for the runtime to queue: the object, its event and payload
27
+ var emitter: ((SharedObject, String, List<Any?>) -> Unit)? = null
28
+
29
+ fun addClass(type: KClass<*>, exported: SharedObjectClass) {
30
+ classes[type] = exported
31
+ }
32
+
33
+ fun classOf(native: SharedObject): SharedObjectClass? = classes[native::class]
34
+
35
+ fun add(native: SharedObject): SharedObjectId {
36
+ val id = SharedObjectId(currentId++)
37
+ native.sharedObjectId = id
38
+ objects[id.value] = native
39
+ return id
40
+ }
41
+
42
+ fun delete(id: SharedObjectId) {
43
+ val native = objects.remove(id.value) ?: return
44
+ native.sharedObjectId = SharedObjectId(0)
45
+ native.sharedObjectDidRelease()
46
+ }
47
+
48
+ fun toNativeObject(id: SharedObjectId): SharedObject {
49
+ objects[id.value]?.let { return it }
50
+ if (id.value != 0 && id.value < currentId) throw UsingReleasedSharedObjectException()
51
+ throw InvalidSharedObjectIdException()
52
+ }
53
+
54
+ fun emit(native: SharedObject, event: String, payload: List<Any?>) {
55
+ emitter?.invoke(native, event, payload)
56
+ }
57
+ }
@@ -0,0 +1,19 @@
1
+ package expo.modules.kotlin.sharedobjects
2
+
3
+ import expo.modules.kotlin.AppContext
4
+ import expo.modules.kotlin.runtime.Runtime
5
+
6
+ open class SharedRef<RefType>(
7
+ val ref: RefType,
8
+ runtime: Runtime? = null,
9
+ ) : SharedObject(runtime) {
10
+ constructor(ref: RefType, appContext: AppContext) : this(ref, appContext.runtime)
11
+
12
+ open val nativeRefType = "unknown"
13
+ }
14
+
15
+ @Suppress("UNCHECKED_CAST")
16
+ inline fun <reified RefType> SharedRef<*>.cast(): SharedRef<RefType>? {
17
+ if (ref is RefType) return this as SharedRef<RefType>
18
+ return null
19
+ }
@@ -0,0 +1,158 @@
1
+ package expo.modules.kotlin.typedarray
2
+
3
+ import expo.modules.kotlin.jni.JavaScriptTypedArray
4
+
5
+ @Suppress("NOTHING_TO_INLINE")
6
+ private inline fun TypedArray.checkIfInRange(index: Int) {
7
+ if (index !in 0..<length) {
8
+ throw IndexOutOfBoundsException()
9
+ }
10
+ }
11
+
12
+ interface RawTypedArrayHolder {
13
+ val rawArray: JavaScriptTypedArray
14
+ }
15
+
16
+ class Int8Array(override val rawArray: JavaScriptTypedArray) :
17
+ TypedArray by rawArray, GenericTypedArray<Byte>, RawTypedArrayHolder {
18
+ override operator fun get(index: Int): Byte {
19
+ checkIfInRange(index)
20
+ return readByte(index * Byte.SIZE_BYTES)
21
+ }
22
+
23
+ override operator fun set(index: Int, value: Byte) {
24
+ checkIfInRange(index)
25
+ writeByte(index * Byte.SIZE_BYTES, value)
26
+ }
27
+ }
28
+
29
+ class Int16Array(override val rawArray: JavaScriptTypedArray) :
30
+ TypedArray by rawArray, GenericTypedArray<Short>, RawTypedArrayHolder {
31
+ override operator fun get(index: Int): Short {
32
+ checkIfInRange(index)
33
+ return read2Byte(index * Short.SIZE_BYTES)
34
+ }
35
+
36
+ override operator fun set(index: Int, value: Short) {
37
+ checkIfInRange(index)
38
+ write2Byte(index * Short.SIZE_BYTES, value)
39
+ }
40
+ }
41
+
42
+ class Int32Array(override val rawArray: JavaScriptTypedArray) :
43
+ TypedArray by rawArray, GenericTypedArray<Int>, RawTypedArrayHolder {
44
+ override operator fun get(index: Int): Int {
45
+ checkIfInRange(index)
46
+ return read4Byte(index * Int.SIZE_BYTES)
47
+ }
48
+
49
+ override operator fun set(index: Int, value: Int) {
50
+ checkIfInRange(index)
51
+ write4Byte(index * Int.SIZE_BYTES, value)
52
+ }
53
+ }
54
+
55
+ class Uint8Array(override val rawArray: JavaScriptTypedArray) :
56
+ TypedArray by rawArray, GenericTypedArray<UByte>, RawTypedArrayHolder {
57
+ override operator fun get(index: Int): UByte {
58
+ checkIfInRange(index)
59
+ return readByte(index * UByte.SIZE_BYTES).toUByte()
60
+ }
61
+
62
+ override operator fun set(index: Int, value: UByte) {
63
+ checkIfInRange(index)
64
+ writeByte(index * UByte.SIZE_BYTES, value.toByte())
65
+ }
66
+ }
67
+
68
+ class Uint8ClampedArray(override val rawArray: JavaScriptTypedArray) :
69
+ TypedArray by rawArray, GenericTypedArray<UByte>, RawTypedArrayHolder {
70
+ override operator fun get(index: Int): UByte {
71
+ checkIfInRange(index)
72
+ return readByte(index * UByte.SIZE_BYTES).toUByte()
73
+ }
74
+
75
+ override operator fun set(index: Int, value: UByte) {
76
+ checkIfInRange(index)
77
+ writeByte(index * UByte.SIZE_BYTES, value.toByte())
78
+ }
79
+ }
80
+
81
+ class Uint16Array(override val rawArray: JavaScriptTypedArray) :
82
+ TypedArray by rawArray, GenericTypedArray<UShort>, RawTypedArrayHolder {
83
+ override operator fun get(index: Int): UShort {
84
+ checkIfInRange(index)
85
+ return read2Byte(index * UShort.SIZE_BYTES).toUShort()
86
+ }
87
+
88
+ override operator fun set(index: Int, value: UShort) {
89
+ checkIfInRange(index)
90
+ write2Byte(index * UShort.SIZE_BYTES, value.toShort())
91
+ }
92
+ }
93
+
94
+ class Uint32Array(override val rawArray: JavaScriptTypedArray) :
95
+ TypedArray by rawArray, GenericTypedArray<UInt>, RawTypedArrayHolder {
96
+ override operator fun get(index: Int): UInt {
97
+ checkIfInRange(index)
98
+ return read4Byte(index * UInt.SIZE_BYTES).toUInt()
99
+ }
100
+
101
+ override operator fun set(index: Int, value: UInt) {
102
+ checkIfInRange(index)
103
+ write4Byte(index * UInt.SIZE_BYTES, value.toInt())
104
+ }
105
+ }
106
+
107
+ class Float32Array(override val rawArray: JavaScriptTypedArray) :
108
+ TypedArray by rawArray, GenericTypedArray<Float>, RawTypedArrayHolder {
109
+ override operator fun get(index: Int): Float {
110
+ checkIfInRange(index)
111
+ return readFloat(index * Float.SIZE_BYTES)
112
+ }
113
+
114
+ override operator fun set(index: Int, value: Float) {
115
+ checkIfInRange(index)
116
+ writeFloat(index * Float.SIZE_BYTES, value)
117
+ }
118
+ }
119
+
120
+ class Float64Array(override val rawArray: JavaScriptTypedArray) :
121
+ TypedArray by rawArray, GenericTypedArray<Double>, RawTypedArrayHolder {
122
+
123
+ override operator fun get(index: Int): Double {
124
+ checkIfInRange(index)
125
+ return readDouble(index * Double.SIZE_BYTES)
126
+ }
127
+
128
+ override operator fun set(index: Int, value: Double) {
129
+ checkIfInRange(index)
130
+ writeDouble(index * Double.SIZE_BYTES, value)
131
+ }
132
+ }
133
+
134
+ class BigInt64Array(override val rawArray: JavaScriptTypedArray) :
135
+ TypedArray by rawArray, GenericTypedArray<Long>, RawTypedArrayHolder {
136
+ override operator fun get(index: Int): Long {
137
+ checkIfInRange(index)
138
+ return read8Byte(index * Long.SIZE_BYTES)
139
+ }
140
+
141
+ override operator fun set(index: Int, value: Long) {
142
+ checkIfInRange(index)
143
+ write8Byte(index * Long.SIZE_BYTES, value)
144
+ }
145
+ }
146
+
147
+ class BigUint64Array(override val rawArray: JavaScriptTypedArray) :
148
+ TypedArray by rawArray, GenericTypedArray<ULong>, RawTypedArrayHolder {
149
+ override operator fun get(index: Int): ULong {
150
+ checkIfInRange(index)
151
+ return read8Byte(index * ULong.SIZE_BYTES).toULong()
152
+ }
153
+
154
+ override operator fun set(index: Int, value: ULong) {
155
+ checkIfInRange(index)
156
+ write8Byte(index * ULong.SIZE_BYTES, value.toLong())
157
+ }
158
+ }
@@ -0,0 +1,8 @@
1
+ package expo.modules.kotlin.typedarray
2
+
3
+ interface GenericTypedArray<T> : TypedArray, Iterable<T> {
4
+ operator fun get(index: Int): T
5
+ operator fun set(index: Int, value: T)
6
+
7
+ override fun iterator(): Iterator<T> = TypedArrayIterator(this)
8
+ }
@@ -0,0 +1,29 @@
1
+ package expo.modules.kotlin.typedarray
2
+
3
+ import expo.modules.kotlin.jni.TypedArrayKind
4
+
5
+ // upstream's typed array interface. toDirectBuffer is left out: Kotlin/Wasm
6
+ // has no java.nio.
7
+ interface TypedArray {
8
+ val kind: TypedArrayKind
9
+ val length: Int
10
+ val byteLength: Int
11
+ val byteOffset: Int
12
+
13
+ fun read(buffer: ByteArray, position: Int, size: Int)
14
+ fun write(buffer: ByteArray, position: Int, size: Int)
15
+
16
+ fun readByte(position: Int): Byte
17
+ fun read2Byte(position: Int): Short
18
+ fun read4Byte(position: Int): Int
19
+ fun read8Byte(position: Int): Long
20
+ fun readFloat(position: Int): Float
21
+ fun readDouble(position: Int): Double
22
+
23
+ fun writeByte(position: Int, value: Byte)
24
+ fun write2Byte(position: Int, value: Short)
25
+ fun write4Byte(position: Int, value: Int)
26
+ fun write8Byte(position: Int, value: Long)
27
+ fun writeFloat(position: Int, value: Float)
28
+ fun writeDouble(position: Int, value: Double)
29
+ }
@@ -0,0 +1,9 @@
1
+ package expo.modules.kotlin.typedarray
2
+
3
+ class TypedArrayIterator<T>(private val typedArray: GenericTypedArray<T>) : Iterator<T> {
4
+ private var current = 0
5
+
6
+ override fun hasNext(): Boolean = current < typedArray.length
7
+
8
+ override fun next(): T = typedArray[current++]
9
+ }
@@ -0,0 +1,155 @@
1
+ package expo.modules.kotlin.types
2
+
3
+ import dev.peach.expo.PeachExpoRuntime
4
+ import dev.peach.expo.PeachExpoTypes
5
+ import expo.modules.kotlin.exception.CodedException
6
+ import expo.modules.kotlin.exception.NullArgumentException
7
+ import expo.modules.kotlin.exception.UnexpectedException
8
+ import expo.modules.kotlin.jni.JavaScriptTypedArray
9
+ import expo.modules.kotlin.sharedobjects.SharedObjectId
10
+ import expo.modules.kotlin.sharedobjects.SharedRef
11
+ import expo.modules.kotlin.typedarray.BigInt64Array
12
+ import expo.modules.kotlin.typedarray.BigUint64Array
13
+ import expo.modules.kotlin.typedarray.Float32Array
14
+ import expo.modules.kotlin.typedarray.Float64Array
15
+ import expo.modules.kotlin.typedarray.Int16Array
16
+ import expo.modules.kotlin.typedarray.Int32Array
17
+ import expo.modules.kotlin.typedarray.Int8Array
18
+ import expo.modules.kotlin.typedarray.TypedArray
19
+ import expo.modules.kotlin.typedarray.Uint16Array
20
+ import expo.modules.kotlin.typedarray.Uint32Array
21
+ import expo.modules.kotlin.typedarray.Uint8Array
22
+ import expo.modules.kotlin.typedarray.Uint8ClampedArray
23
+ import kotlin.reflect.KClass
24
+ import kotlin.reflect.KType
25
+ import kotlin.reflect.typeOf
26
+
27
+ // an argument's desired type, as toArgsArray reads it from the reified DSL.
28
+ // JavaScript values arrive as JSI hands them to the converters: numbers as
29
+ // Double, objects as String-keyed maps, arrays as lists, undefined as null,
30
+ // typed arrays as JavaScriptTypedArray and shared objects as their id.
31
+ class AnyType(val kType: KType) {
32
+ val isNullable: Boolean get() = kType.isMarkedNullable
33
+
34
+ fun convert(value: Any?): Any? = convertValue(kType, value)
35
+
36
+ override fun toString(): String = kType.toString()
37
+ }
38
+
39
+ class TypeCastException(message: String) : CodedException(message = message) {
40
+ constructor(value: Any?, type: KType) : this("Cannot convert '${value}' to the Kotlin type '$type'")
41
+ }
42
+
43
+ @PublishedApi
44
+ internal fun anyTypeOf(type: KType): AnyType = AnyType(type)
45
+
46
+ inline fun <reified T> toAnyType(): AnyType = anyTypeOf(typeOf<T>())
47
+
48
+ private fun number(value: Any?, type: KType): Double = value as? Double ?: throw ClassCastException("Cannot convert '$value' to '$type'")
49
+
50
+ private fun argument(type: KType, index: Int): KType =
51
+ type.arguments.getOrNull(index)?.type ?: typeOf<Any?>()
52
+
53
+ private fun convertValue(type: KType, raw: Any?): Any? {
54
+ if (raw == null) {
55
+ if (type.isMarkedNullable || type.classifier == Unit::class) return null
56
+ throw NullArgumentException()
57
+ }
58
+ val value = if (raw is SharedObjectId) PeachExpoRuntime.sharedObject(raw) else raw
59
+ val classifier = type.classifier as? KClass<*> ?: return value
60
+ return when (classifier) {
61
+ Any::class -> value
62
+ String::class -> value as? String ?: throw ClassCastException("Cannot convert '$value' to '$type'")
63
+ Boolean::class -> value as? Boolean ?: throw ClassCastException("Cannot convert '$value' to '$type'")
64
+ Double::class -> number(value, type)
65
+ Float::class -> number(value, type).toFloat()
66
+ Int::class -> number(value, type).toInt()
67
+ Long::class -> number(value, type).toLong()
68
+ Short::class -> number(value, type).toInt().toShort()
69
+ Byte::class -> number(value, type).toInt().toByte()
70
+ Number::class -> number(value, type)
71
+ Unit::class -> Unit
72
+ List::class, MutableList::class, ArrayList::class, Collection::class, Iterable::class ->
73
+ list(value, type).mapTo(ArrayList()) { convertValue(argument(type, 0), it) }
74
+ Set::class, MutableSet::class, HashSet::class, LinkedHashSet::class ->
75
+ list(value, type).mapTo(LinkedHashSet()) { convertValue(argument(type, 0), it) }
76
+ Map::class, MutableMap::class, HashMap::class, LinkedHashMap::class -> {
77
+ val map = value as? Map<*, *> ?: throw TypeCastException(value, type)
78
+ map.entries.associateTo(LinkedHashMap()) { (key, item) -> key to convertValue(argument(type, 1), item) }
79
+ }
80
+ Pair::class -> {
81
+ val items = list(value, type)
82
+ if (items.size != 2) throw TypeCastException(value, type)
83
+ Pair(convertValue(argument(type, 0), items[0]), convertValue(argument(type, 1), items[1]))
84
+ }
85
+ IntArray::class -> list(value, type).map { number(it, type).toInt() }.toIntArray()
86
+ LongArray::class -> list(value, type).map { number(it, type).toLong() }.toLongArray()
87
+ DoubleArray::class -> list(value, type).map { number(it, type) }.toDoubleArray()
88
+ FloatArray::class -> list(value, type).map { number(it, type).toFloat() }.toFloatArray()
89
+ BooleanArray::class -> list(value, type).map { it as? Boolean ?: throw TypeCastException(it, type) }.toBooleanArray()
90
+ // the single ByteArray frontend converter copies raw view bytes without a kind check
91
+ ByteArray::class -> (value as? JavaScriptTypedArray)?.bytes?.copyOf()
92
+ ?: throw TypeCastException(value, type)
93
+ TypedArray::class -> typedArray(value, type)
94
+ Int8Array::class -> Int8Array(typedArray(value, type))
95
+ Int16Array::class -> Int16Array(typedArray(value, type))
96
+ Int32Array::class -> Int32Array(typedArray(value, type))
97
+ Uint8Array::class -> Uint8Array(typedArray(value, type))
98
+ Uint8ClampedArray::class -> Uint8ClampedArray(typedArray(value, type))
99
+ Uint16Array::class -> Uint16Array(typedArray(value, type))
100
+ Uint32Array::class -> Uint32Array(typedArray(value, type))
101
+ Float32Array::class -> Float32Array(typedArray(value, type))
102
+ Float64Array::class -> Float64Array(typedArray(value, type))
103
+ BigInt64Array::class -> BigInt64Array(typedArray(value, type))
104
+ BigUint64Array::class -> BigUint64Array(typedArray(value, type))
105
+ SharedRef::class -> sharedRef(value, type)
106
+ Either::class, EitherOfThree::class, EitherOfFour::class -> either(classifier, type, value)
107
+ // records and enums convert through the host's generated registrations
108
+ else -> {
109
+ val converted = PeachExpoTypes.convert(classifier, value)
110
+ if (converted !== PeachExpoTypes.Unconverted) converted
111
+ else if (classifier.isInstance(value)) value
112
+ else throw ClassCastException("Cannot convert '$value' to '$type'")
113
+ }
114
+ }
115
+ }
116
+
117
+ // upstream converts to the first type that accepts the value and defers the rest
118
+ private fun either(classifier: KClass<*>, type: KType, value: Any): Any {
119
+ val types = type.arguments.map { it.type ?: typeOf<Any>() }
120
+ var converted = false
121
+ val deferred: MutableList<DeferredValue> = types.mapTo(ArrayList()) { item ->
122
+ if (converted) {
123
+ UnconvertedValue(value) { convertValue(item, it) }
124
+ } else {
125
+ try {
126
+ ConvertedValue(convertValue(item, value)!!).also { converted = true }
127
+ } catch (_: Throwable) {
128
+ IncompatibleValue
129
+ }
130
+ }
131
+ }
132
+ if (!converted) throw UnexpectedException("Cannot cast '$value' to 'Either<${types.joinToString(separator = ", ")}>'")
133
+ return when (classifier) {
134
+ EitherOfFour::class -> EitherOfFour<Any, Any, Any, Any>(value, deferred, types)
135
+ EitherOfThree::class -> EitherOfThree<Any, Any, Any>(value, deferred, types)
136
+ else -> Either<Any, Any>(value, deferred, types)
137
+ }
138
+ }
139
+
140
+ private fun list(value: Any, type: KType): List<*> = value as? List<*> ?: throw TypeCastException(value, type)
141
+
142
+ private fun typedArray(value: Any, type: KType): JavaScriptTypedArray =
143
+ value as? JavaScriptTypedArray ?: throw TypeCastException(value, type)
144
+
145
+ internal class IncorrectRefTypeException(desiredType: KType, receivedClass: KClass<*>) : CodedException(
146
+ message = "Cannot convert received '$receivedClass' to the '$desiredType', because of the inner ref type mismatch",
147
+ )
148
+
149
+ // SharedRef<T> also checks its ref against T, unless T is a star
150
+ private fun sharedRef(value: Any, type: KType): SharedRef<*> {
151
+ val ref = value as? SharedRef<*> ?: throw TypeCastException(value, type)
152
+ val inner = type.arguments.firstOrNull()?.type?.classifier as? KClass<*> ?: return ref
153
+ if (inner != Any::class && !inner.isInstance(ref.ref)) throw IncorrectRefTypeException(type, ref::class)
154
+ return ref
155
+ }
@@ -0,0 +1,91 @@
1
+ @file:Suppress("UNCHECKED_CAST")
2
+
3
+ package expo.modules.kotlin.types
4
+
5
+ import kotlin.reflect.KClass
6
+ import kotlin.reflect.KType
7
+
8
+ sealed class DeferredValue
9
+
10
+ data object IncompatibleValue : DeferredValue()
11
+
12
+ class UnconvertedValue(
13
+ private val unconvertedValue: Any,
14
+ private val convert: (Any) -> Any?,
15
+ ) : DeferredValue() {
16
+ private var convertedValue: Any? = null
17
+
18
+ fun getConvertedValue(): Any {
19
+ if (convertedValue == null) convertedValue = convert(unconvertedValue)
20
+ return convertedValue!!
21
+ }
22
+ }
23
+
24
+ data class ConvertedValue(val convertedValue: Any) : DeferredValue()
25
+
26
+ inline fun <reified T : Any> toKClass(): KClass<T> = T::class
27
+
28
+ open class Either<FirstType : Any, SecondType : Any>(
29
+ private val bareValue: Any,
30
+ private val deferredValue: MutableList<DeferredValue>,
31
+ private val types: List<KType>,
32
+ ) {
33
+ internal fun `is`(index: Int): Boolean = when (val value = deferredValue[index]) {
34
+ is ConvertedValue -> true
35
+ IncompatibleValue -> false
36
+ is UnconvertedValue -> try {
37
+ deferredValue[index] = ConvertedValue(value.getConvertedValue())
38
+ true
39
+ } catch (_: Throwable) {
40
+ deferredValue[index] = IncompatibleValue
41
+ false
42
+ }
43
+ }
44
+
45
+ internal fun get(index: Int): Any = when (val value = deferredValue[index]) {
46
+ is ConvertedValue -> value.convertedValue
47
+ IncompatibleValue -> throw TypeCastException("Cannot cast '$bareValue' to '${types[index]}'")
48
+ is UnconvertedValue -> try {
49
+ value.getConvertedValue().also { deferredValue[index] = ConvertedValue(it) }
50
+ } catch (e: Throwable) {
51
+ deferredValue[index] = IncompatibleValue
52
+ throw TypeCastException("Cannot cast '$bareValue' to '${types[index]}' - ${e.message}")
53
+ }
54
+ }
55
+
56
+ fun `is`(@Suppress("UNUSED_PARAMETER") type: KClass<FirstType>): Boolean = `is`(0)
57
+
58
+ fun `is`(@Suppress("UNUSED_PARAMETER") type: KClass<SecondType>): Boolean = `is`(1)
59
+
60
+ fun get(@Suppress("UNUSED_PARAMETER") type: KClass<FirstType>): FirstType = get(0) as FirstType
61
+
62
+ fun get(@Suppress("UNUSED_PARAMETER") type: KClass<SecondType>): SecondType = get(1) as SecondType
63
+
64
+ fun first(): FirstType = get(0) as FirstType
65
+
66
+ fun second(): SecondType = get(1) as SecondType
67
+ }
68
+
69
+ open class EitherOfThree<FirstType : Any, SecondType : Any, ThirdType : Any>(
70
+ bareValue: Any,
71
+ deferredValue: MutableList<DeferredValue>,
72
+ types: List<KType>,
73
+ ) : Either<FirstType, SecondType>(bareValue, deferredValue, types) {
74
+ fun `is`(@Suppress("UNUSED_PARAMETER") type: KClass<ThirdType>): Boolean = `is`(2)
75
+
76
+ fun get(@Suppress("UNUSED_PARAMETER") type: KClass<ThirdType>) = get(2) as ThirdType
77
+
78
+ fun third(): ThirdType = get(2) as ThirdType
79
+ }
80
+
81
+ class EitherOfFour<FirstType : Any, SecondType : Any, ThirdType : Any, FourthType : Any>(
82
+ bareValue: Any,
83
+ deferredValue: MutableList<DeferredValue>,
84
+ types: List<KType>,
85
+ ) : EitherOfThree<FirstType, SecondType, ThirdType>(bareValue, deferredValue, types) {
86
+ fun `is`(@Suppress("UNUSED_PARAMETER") type: KClass<FourthType>): Boolean = `is`(3)
87
+
88
+ fun get(@Suppress("UNUSED_PARAMETER") type: KClass<FourthType>): FourthType = get(3) as FourthType
89
+
90
+ fun fourth(): FourthType = get(3) as FourthType
91
+ }
@@ -0,0 +1,6 @@
1
+ package expo.modules.kotlin.types
2
+
3
+ /**
4
+ * An interface that allows converting raw values to enum cases.
5
+ */
6
+ interface Enumerable
@@ -0,0 +1,54 @@
1
+ package expo.modules.kotlin.viewevent
2
+
3
+ import android.util.Log
4
+ import expo.modules.kotlin.views.ExpoView
5
+ import kotlin.reflect.KProperty
6
+
7
+ typealias CoalescingKey<T> = (event: T) -> Short
8
+
9
+ fun interface ViewEventCallback<T> {
10
+ operator fun invoke(arg: T)
11
+ }
12
+
13
+ // an event a view sends to its callback prop. a body that is not an object
14
+ // reaches JavaScript as { payload }, as convertEventBody wraps it
15
+ open class ViewEvent<T>(
16
+ private val name: String,
17
+ private val view: ExpoView,
18
+ private val coalescingKey: CoalescingKey<T>?,
19
+ ) : ViewEventCallback<T> {
20
+ private var isValidated = false
21
+
22
+ override operator fun invoke(arg: T) {
23
+ if (!isValidated) {
24
+ if (name !in view.callbacks) {
25
+ Log.w("ExpoModulesCore", "⚠️ Event $name wasn't exported from ${view::class}")
26
+ return
27
+ }
28
+ isValidated = true
29
+ }
30
+ val body: Any? = when (arg) {
31
+ null, is Unit -> null
32
+ is Map<*, *> -> arg
33
+ else -> mapOf("payload" to arg)
34
+ }
35
+ view.emitter?.invoke(name, body)
36
+ }
37
+ }
38
+
39
+ class ViewEventDelegate<T>(private val view: ExpoView, private val coalescingKey: CoalescingKey<T>?) {
40
+ fun getValue(property: KProperty<*>): ViewEventCallback<T> = ViewEvent(property.name, view, coalescingKey)
41
+
42
+ operator fun getValue(thisRef: ExpoView, property: KProperty<*>): ViewEventCallback<T> = getValue(property)
43
+ }
44
+
45
+ @Suppress("NOTHING_TO_INLINE")
46
+ inline operator fun <T> ViewEventDelegate<T>.getValue(thisObj: Any?, property: KProperty<*>): ViewEventCallback<T> = getValue(property)
47
+
48
+ @Suppress("FunctionName")
49
+ inline fun <reified T> ExpoView.EventDispatcher(noinline coalescingKey: CoalescingKey<T>? = null): ViewEventDelegate<T> =
50
+ ViewEventDelegate(this, coalescingKey)
51
+
52
+ @Suppress("FunctionName")
53
+ fun ExpoView.EventDispatcher(coalescingKey: CoalescingKey<Map<String, Any>>? = null): ViewEventDelegate<Map<String, Any>> =
54
+ ViewEventDelegate(this, coalescingKey)
@@ -0,0 +1,23 @@
1
+ package expo.modules.kotlin.views
2
+
3
+ import android.content.Context
4
+ import android.widget.LinearLayout
5
+ import android.graphics.Canvas
6
+ import expo.modules.kotlin.AppContext
7
+
8
+ // upstream's native view root. both canvas-backed and compose Expo views
9
+ // share the Android view lifecycle and exported props/events.
10
+ abstract class ExpoView(context: Context, val appContext: AppContext) : LinearLayout(context) {
11
+ open val shouldUseAndroidLayout: Boolean = false
12
+
13
+ override fun dispatchDraw(canvas: Canvas) {
14
+ val checkpoint = canvas.save()
15
+ canvas.clipRect(paddingLeft, paddingTop, width - paddingRight, height - paddingBottom)
16
+ super.dispatchDraw(canvas)
17
+ canvas.restoreToCount(checkpoint)
18
+ }
19
+
20
+ // the runtime's sink for this view's events, set when the view is created
21
+ internal var emitter: ((name: String, body: Any?) -> Unit)? = null
22
+ internal var callbacks: List<String> = emptyList()
23
+ }