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,132 @@
1
+ @file:Suppress("FunctionName", "UNCHECKED_CAST")
2
+
3
+ package expo.modules.kotlin.functions
4
+
5
+ import expo.modules.kotlin.Promise
6
+ import expo.modules.kotlin.exception.ArgumentCastException
7
+ import expo.modules.kotlin.exception.InvalidArgsNumberException
8
+ import expo.modules.kotlin.exception.exceptionDecorator
9
+ import expo.modules.kotlin.types.AnyType
10
+ import expo.modules.kotlin.types.toAnyType
11
+ import kotlinx.coroutines.CoroutineScope
12
+ import kotlin.reflect.KType
13
+
14
+ abstract class AnyFunction(
15
+ val name: String,
16
+ @PublishedApi internal val desiredArgsTypes: Array<AnyType>,
17
+ ) {
18
+ internal var isEnumerable: Boolean = true
19
+
20
+ // a class member takes the JavaScript `this` as its first argument when
21
+ // that argument is the owner type
22
+ @PublishedApi internal var canTakeOwner: Boolean = false
23
+ @PublishedApi internal var ownerType: KType? = null
24
+
25
+ internal val takesOwner: Boolean
26
+ get() = canTakeOwner && ownerType != null && desiredArgsTypes.firstOrNull()?.kType?.classifier == ownerType?.classifier
27
+
28
+ // trailing nullable arguments are optional
29
+ private val requiredArgumentsCount = run {
30
+ val last = desiredArgsTypes.indexOfLast { !it.isNullable }
31
+ last + 1
32
+ }
33
+
34
+ internal fun convertArgs(args: List<Any?>): Array<Any?> {
35
+ if (requiredArgumentsCount > args.size || args.size > desiredArgsTypes.size)
36
+ throw InvalidArgsNumberException(args.size, desiredArgsTypes.size, requiredArgumentsCount)
37
+ val converted = arrayOfNulls<Any?>(desiredArgsTypes.size)
38
+ for (index in args.indices) {
39
+ val element = args[index]
40
+ val desiredType = desiredArgsTypes[index]
41
+ exceptionDecorator({ cause ->
42
+ ArgumentCastException(desiredType.toString(), index, jvmClassName(element), cause)
43
+ }) {
44
+ converted[index] = desiredType.convert(element)
45
+ }
46
+ }
47
+ return converted
48
+ }
49
+
50
+ fun enumerable(isEnumerable: Boolean = true) = apply {
51
+ this.isEnumerable = isEnumerable
52
+ }
53
+ }
54
+
55
+ // the Java class an argument has when JSI hands it to the converters
56
+ private fun jvmClassName(value: Any?): String = when (value) {
57
+ null -> "null"
58
+ is Double -> "class java.lang.Double"
59
+ is String -> "class java.lang.String"
60
+ is Boolean -> "class java.lang.Boolean"
61
+ is List<*> -> "class java.util.ArrayList"
62
+ is Map<*, *> -> "class java.util.HashMap"
63
+ is expo.modules.kotlin.jni.JavaScriptTypedArray -> "class expo.modules.kotlin.jni.JavaScriptTypedArray"
64
+ is expo.modules.kotlin.sharedobjects.SharedObjectId -> "class java.lang.Integer"
65
+ else -> "class ${value::class.simpleName}"
66
+ }
67
+
68
+ class SyncFunctionComponent(
69
+ name: String,
70
+ desiredArgsTypes: Array<AnyType>,
71
+ @PublishedApi internal val body: (args: Array<out Any?>) -> Any?,
72
+ ) : AnyFunction(name, desiredArgsTypes)
73
+
74
+ sealed class AsyncFunctionComponent(name: String, desiredArgsTypes: Array<AnyType>) : AnyFunction(name, desiredArgsTypes)
75
+
76
+ class UntypedAsyncFunctionComponent(
77
+ name: String,
78
+ desiredArgsTypes: Array<AnyType>,
79
+ internal val body: (args: Array<out Any?>) -> Any?,
80
+ ) : AsyncFunctionComponent(name, desiredArgsTypes)
81
+
82
+ class AsyncFunctionWithPromiseComponent(
83
+ name: String,
84
+ desiredArgsTypes: Array<AnyType>,
85
+ internal val body: (args: Array<out Any?>, promise: Promise) -> Unit,
86
+ ) : AsyncFunctionComponent(name, desiredArgsTypes)
87
+
88
+ class SuspendFunctionComponent(
89
+ name: String,
90
+ desiredArgsTypes: Array<AnyType>,
91
+ internal val body: suspend CoroutineScope.(args: Array<out Any?>) -> Any?,
92
+ ) : AsyncFunctionComponent(name, desiredArgsTypes)
93
+
94
+ @PublishedApi
95
+ internal fun createAsyncFunctionComponent(
96
+ name: String,
97
+ desiredArgsTypes: Array<AnyType>,
98
+ body: (args: Array<out Any?>) -> Any?,
99
+ ): AsyncFunctionComponent = UntypedAsyncFunctionComponent(name, desiredArgsTypes, body)
100
+
101
+ class AsyncFunctionBuilder(@PublishedApi internal val name: String) {
102
+ @PublishedApi internal var component: AsyncFunctionComponent? = null
103
+
104
+ fun build(): AsyncFunctionComponent = requireNotNull(component) { "AsyncFunction '$name' has no body" }
105
+ }
106
+
107
+ inline infix fun <reified R> AsyncFunctionBuilder.Coroutine(crossinline body: suspend () -> R): AsyncFunctionComponent =
108
+ SuspendFunctionComponent(name, emptyArray()) { body() }.also { component = it }
109
+
110
+ inline infix fun <reified R, reified P0> AsyncFunctionBuilder.Coroutine(crossinline body: suspend (p0: P0) -> R): AsyncFunctionComponent =
111
+ SuspendFunctionComponent(name, arrayOf(toAnyType<P0>())) { body(it[0] as P0) }.also { component = it }
112
+
113
+ inline infix fun <reified R, reified P0, reified P1> AsyncFunctionBuilder.Coroutine(crossinline body: suspend (p0: P0, p1: P1) -> R): AsyncFunctionComponent =
114
+ SuspendFunctionComponent(name, arrayOf(toAnyType<P0>(), toAnyType<P1>())) { body(it[0] as P0, it[1] as P1) }.also { component = it }
115
+
116
+ inline infix fun <reified R, reified P0, reified P1, reified P2> AsyncFunctionBuilder.Coroutine(crossinline body: suspend (p0: P0, p1: P1, p2: P2) -> R): AsyncFunctionComponent =
117
+ SuspendFunctionComponent(name, arrayOf(toAnyType<P0>(), toAnyType<P1>(), toAnyType<P2>())) { body(it[0] as P0, it[1] as P1, it[2] as P2) }.also { component = it }
118
+
119
+ inline infix fun <reified R, reified P0, reified P1, reified P2, reified P3> AsyncFunctionBuilder.Coroutine(crossinline body: suspend (p0: P0, p1: P1, p2: P2, p3: P3) -> R): AsyncFunctionComponent =
120
+ SuspendFunctionComponent(name, arrayOf(toAnyType<P0>(), toAnyType<P1>(), toAnyType<P2>(), toAnyType<P3>())) { body(it[0] as P0, it[1] as P1, it[2] as P2, it[3] as P3) }.also { component = it }
121
+
122
+ inline infix fun <reified R, reified P0, reified P1, reified P2, reified P3, reified P4> AsyncFunctionBuilder.Coroutine(crossinline body: suspend (p0: P0, p1: P1, p2: P2, p3: P3, p4: P4) -> R): AsyncFunctionComponent =
123
+ SuspendFunctionComponent(name, arrayOf(toAnyType<P0>(), toAnyType<P1>(), toAnyType<P2>(), toAnyType<P3>(), toAnyType<P4>())) { body(it[0] as P0, it[1] as P1, it[2] as P2, it[3] as P3, it[4] as P4) }.also { component = it }
124
+
125
+ inline infix fun <reified R, reified P0, reified P1, reified P2, reified P3, reified P4, reified P5> AsyncFunctionBuilder.Coroutine(crossinline body: suspend (p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5) -> R): AsyncFunctionComponent =
126
+ SuspendFunctionComponent(name, arrayOf(toAnyType<P0>(), toAnyType<P1>(), toAnyType<P2>(), toAnyType<P3>(), toAnyType<P4>(), toAnyType<P5>())) { body(it[0] as P0, it[1] as P1, it[2] as P2, it[3] as P3, it[4] as P4, it[5] as P5) }.also { component = it }
127
+
128
+ inline infix fun <reified R, reified P0, reified P1, reified P2, reified P3, reified P4, reified P5, reified P6> AsyncFunctionBuilder.Coroutine(crossinline body: suspend (p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6) -> R): AsyncFunctionComponent =
129
+ SuspendFunctionComponent(name, arrayOf(toAnyType<P0>(), toAnyType<P1>(), toAnyType<P2>(), toAnyType<P3>(), toAnyType<P4>(), toAnyType<P5>(), toAnyType<P6>())) { body(it[0] as P0, it[1] as P1, it[2] as P2, it[3] as P3, it[4] as P4, it[5] as P5, it[6] as P6) }.also { component = it }
130
+
131
+ inline infix fun <reified R, reified P0, reified P1, reified P2, reified P3, reified P4, reified P5, reified P6, reified P7> AsyncFunctionBuilder.Coroutine(crossinline body: suspend (p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7) -> R): AsyncFunctionComponent =
132
+ SuspendFunctionComponent(name, arrayOf(toAnyType<P0>(), toAnyType<P1>(), toAnyType<P2>(), toAnyType<P3>(), toAnyType<P4>(), toAnyType<P5>(), toAnyType<P6>(), toAnyType<P7>())) { body(it[0] as P0, it[1] as P1, it[2] as P2, it[3] as P3, it[4] as P4, it[5] as P5, it[6] as P6, it[7] as P7) }.also { component = it }
@@ -0,0 +1,81 @@
1
+ package expo.modules.kotlin.jni
2
+
3
+ import expo.modules.kotlin.typedarray.TypedArray
4
+
5
+ enum class TypedArrayKind(val value: Int) {
6
+ Int8Array(1),
7
+ Int16Array(2),
8
+ Int32Array(3),
9
+ Uint8Array(4),
10
+ Uint8ClampedArray(5),
11
+ Uint16Array(6),
12
+ Uint32Array(7),
13
+ Float32Array(8),
14
+ Float64Array(9),
15
+ BigInt64Array(10),
16
+ BigUint64Array(11),
17
+ }
18
+
19
+ // a JavaScript typed array as the wire hands it over: a copy of its bytes,
20
+ // little endian as every engine Peach runs on. a write marks it dirty, and a
21
+ // synchronous call's writes are copied back into the caller's array when the
22
+ // call returns (PeachExpoRuntime).
23
+ class JavaScriptTypedArray internal constructor(
24
+ override val kind: TypedArrayKind,
25
+ internal val bytes: ByteArray,
26
+ // its position among the request's typed arrays, or -1 for a native one
27
+ internal val ordinal: Int,
28
+ override val byteOffset: Int,
29
+ ) : TypedArray {
30
+ internal var dirty = false
31
+
32
+ override val length: Int get() = bytes.size / elementSize(kind)
33
+ override val byteLength: Int get() = bytes.size
34
+
35
+ override fun read(buffer: ByteArray, position: Int, size: Int) {
36
+ bytes.copyInto(buffer, 0, position, position + size)
37
+ }
38
+
39
+ override fun write(buffer: ByteArray, position: Int, size: Int) {
40
+ buffer.copyInto(bytes, position, 0, size)
41
+ dirty = true
42
+ }
43
+
44
+ private fun unsigned(position: Int): Long = bytes[position].toLong() and 0xff
45
+
46
+ private fun readBits(position: Int, size: Int): Long {
47
+ if (position < 0 || position + size > bytes.size) throw IndexOutOfBoundsException()
48
+ var bits = 0L
49
+ for (index in size - 1 downTo 0) bits = (bits shl 8) or unsigned(position + index)
50
+ return bits
51
+ }
52
+
53
+ private fun writeBits(position: Int, size: Int, bits: Long) {
54
+ if (position < 0 || position + size > bytes.size) throw IndexOutOfBoundsException()
55
+ for (index in 0 until size) bytes[position + index] = (bits ushr (8 * index)).toByte()
56
+ dirty = true
57
+ }
58
+
59
+ override fun readByte(position: Int): Byte = readBits(position, 1).toByte()
60
+ override fun read2Byte(position: Int): Short = readBits(position, 2).toShort()
61
+ override fun read4Byte(position: Int): Int = readBits(position, 4).toInt()
62
+ override fun read8Byte(position: Int): Long = readBits(position, 8)
63
+ override fun readFloat(position: Int): Float = Float.fromBits(read4Byte(position))
64
+ override fun readDouble(position: Int): Double = Double.fromBits(read8Byte(position))
65
+
66
+ override fun writeByte(position: Int, value: Byte) = writeBits(position, 1, value.toLong())
67
+ override fun write2Byte(position: Int, value: Short) = writeBits(position, 2, value.toLong())
68
+ override fun write4Byte(position: Int, value: Int) = writeBits(position, 4, value.toLong())
69
+ override fun write8Byte(position: Int, value: Long) = writeBits(position, 8, value)
70
+ override fun writeFloat(position: Int, value: Float) = write4Byte(position, value.toRawBits())
71
+ override fun writeDouble(position: Int, value: Double) = write8Byte(position, value.toRawBits())
72
+
73
+ internal companion object {
74
+ fun elementSize(kind: TypedArrayKind): Int = when (kind) {
75
+ TypedArrayKind.Int8Array, TypedArrayKind.Uint8Array, TypedArrayKind.Uint8ClampedArray -> 1
76
+ TypedArrayKind.Int16Array, TypedArrayKind.Uint16Array -> 2
77
+ TypedArrayKind.Int32Array, TypedArrayKind.Uint32Array, TypedArrayKind.Float32Array -> 4
78
+ TypedArrayKind.Float64Array, TypedArrayKind.BigInt64Array, TypedArrayKind.BigUint64Array -> 8
79
+ }
80
+ }
81
+ }
@@ -0,0 +1,98 @@
1
+ package expo.modules.kotlin.modules
2
+
3
+ import expo.modules.kotlin.AppContext
4
+ import expo.modules.kotlin.AppContextProvider
5
+ import expo.modules.kotlin.classcomponent.ClassComponentBuilder
6
+ import expo.modules.kotlin.classcomponent.ClassDefinitionData
7
+ import expo.modules.kotlin.objects.ObjectDefinitionBuilder
8
+ import expo.modules.kotlin.objects.ObjectDefinitionData
9
+ import expo.modules.kotlin.sharedobjects.SharedObject
10
+ import expo.modules.kotlin.views.ExpoView
11
+ import expo.modules.kotlin.views.ViewDefinitionBuilder
12
+ import expo.modules.kotlin.views.ViewManagerDefinition
13
+ import kotlin.reflect.KClass
14
+ import kotlin.reflect.typeOf
15
+
16
+ abstract class Module : AppContextProvider {
17
+ internal var context: AppContext? = null
18
+ // the runtime's emitter for this module, set when the module is created
19
+ internal var emitter: ((name: String, body: Map<String, Any?>?) -> Unit)? = null
20
+
21
+ override val appContext: AppContext
22
+ get() = requireNotNull(context) {
23
+ "You attempted to access the app context before the module was created. " +
24
+ "Defer accessing the context until after the module initializes."
25
+ }
26
+
27
+ fun sendEvent(name: String, body: Map<String, Any?>? = emptyMap()) {
28
+ emitter?.invoke(name, body)
29
+ }
30
+
31
+ abstract fun definition(): ModuleDefinitionData
32
+ }
33
+
34
+ inline fun Module.ModuleDefinition(crossinline block: ModuleDefinitionBuilder.() -> Unit): ModuleDefinitionData =
35
+ ModuleDefinitionBuilder(this).also(block).buildModule()
36
+
37
+ class ModuleDefinitionData(
38
+ val name: String,
39
+ val objectDefinition: ObjectDefinitionData,
40
+ internal val onCreate: List<() -> Unit>,
41
+ internal val onDestroy: List<() -> Unit>,
42
+ internal val classData: List<ClassDefinitionData>,
43
+ internal val views: List<ViewManagerDefinition>,
44
+ )
45
+
46
+ class ModuleDefinitionBuilder(@PublishedApi internal val module: Module? = null) : ObjectDefinitionBuilder() {
47
+ private var name: String? = null
48
+ @PublishedApi internal val onCreate = mutableListOf<() -> Unit>()
49
+ @PublishedApi internal val onDestroy = mutableListOf<() -> Unit>()
50
+ @PublishedApi internal val classData = mutableListOf<ClassDefinitionData>()
51
+ @PublishedApi internal val views = mutableListOf<ViewManagerDefinition>()
52
+
53
+ fun buildModule(): ModuleDefinitionData {
54
+ val moduleName = name ?: module?.let { it::class.simpleName }
55
+ return ModuleDefinitionData(requireNotNull(moduleName), buildObject(), onCreate, onDestroy, classData, views)
56
+ }
57
+
58
+ // a compose view also takes its props class's MutableState props, which
59
+ // upstream unwraps by reflection and the host's generated table names here
60
+ inline fun <reified T : ExpoView> View(viewClass: KClass<T>, body: ViewDefinitionBuilder<T>.() -> Unit = {}) {
61
+ val view = dev.peach.expo.PeachExpoTypes.viewType(viewClass)
62
+ val builder = ViewDefinitionBuilder(viewClass, typeOf<T>())
63
+ for (prop in view.props) builder.props[prop.name] = prop
64
+ body(builder)
65
+ views.add(builder.build(view.create))
66
+ }
67
+
68
+ fun Name(name: String) {
69
+ this.name = name
70
+ }
71
+
72
+ inline fun OnCreate(crossinline body: () -> Unit) {
73
+ onCreate.add { body() }
74
+ }
75
+
76
+ inline fun OnDestroy(crossinline body: () -> Unit) {
77
+ onDestroy.add { body() }
78
+ }
79
+
80
+ inline fun Class(name: String, body: ClassComponentBuilder<Unit>.() -> Unit = {}) {
81
+ classData.add(ClassComponentBuilder(name, Unit::class, typeOf<Unit>()).also(body).buildClass())
82
+ }
83
+
84
+ inline fun <reified SharedObjectType : SharedObject> Class(
85
+ name: String,
86
+ sharedObjectClass: KClass<SharedObjectType> = SharedObjectType::class,
87
+ body: ClassComponentBuilder<SharedObjectType>.() -> Unit = {},
88
+ ) {
89
+ classData.add(ClassComponentBuilder(name, sharedObjectClass, typeOf<SharedObjectType>()).also(body).buildClass())
90
+ }
91
+
92
+ inline fun <reified SharedObjectType : SharedObject> Class(
93
+ sharedObjectClass: KClass<SharedObjectType> = SharedObjectType::class,
94
+ body: ClassComponentBuilder<SharedObjectType>.() -> Unit = {},
95
+ ) {
96
+ Class(requireNotNull(sharedObjectClass.simpleName), sharedObjectClass, body)
97
+ }
98
+ }
@@ -0,0 +1,236 @@
1
+ @file:Suppress("FunctionName", "UNCHECKED_CAST")
2
+
3
+ package expo.modules.kotlin.objects
4
+
5
+ import expo.modules.kotlin.Promise
6
+ import expo.modules.kotlin.functions.AsyncFunctionBuilder
7
+ import expo.modules.kotlin.functions.AsyncFunctionComponent
8
+ import expo.modules.kotlin.functions.AsyncFunctionWithPromiseComponent
9
+ import expo.modules.kotlin.functions.SyncFunctionComponent
10
+ import expo.modules.kotlin.functions.createAsyncFunctionComponent
11
+ import expo.modules.kotlin.types.AnyType
12
+ import expo.modules.kotlin.types.anyTypeOf
13
+ import expo.modules.kotlin.types.toAnyType
14
+ import kotlin.reflect.KType
15
+
16
+ // generated arities 0 to 8, as upstream's ObjectDefinitionBuilder declares
17
+
18
+ class ObjectDefinitionData(
19
+ internal val legacyConstantsProvider: () -> Map<String, Any?>,
20
+ internal val syncFunctions: Map<String, SyncFunctionComponent>,
21
+ internal val asyncFunctions: Map<String, AsyncFunctionComponent>,
22
+ internal val eventNames: List<String>,
23
+ internal val properties: Map<String, PropertyComponentBuilder>,
24
+ internal val constants: Map<String, ConstantComponentBuilder>,
25
+ )
26
+
27
+ class EventObservingDefinition(internal val start: Boolean, internal val event: String?, internal val body: () -> Unit)
28
+
29
+ open class ObjectDefinitionBuilder {
30
+ private var legacyConstantsProvider = { emptyMap<String, Any?>() }
31
+ @PublishedApi internal var eventNames = listOf<String>()
32
+ @PublishedApi internal val syncFunctions = mutableMapOf<String, SyncFunctionComponent>()
33
+ @PublishedApi internal val asyncFunctions = mutableMapOf<String, AsyncFunctionComponent>()
34
+ @PublishedApi internal val asyncFunctionBuilders = mutableMapOf<String, AsyncFunctionBuilder>()
35
+ @PublishedApi internal val properties = mutableMapOf<String, PropertyComponentBuilder>()
36
+ @PublishedApi internal val constants = mutableMapOf<String, ConstantComponentBuilder>()
37
+ private val eventObservers = mutableListOf<EventObservingDefinition>()
38
+
39
+ fun buildObject(): ObjectDefinitionData {
40
+ // android exports startObserving and stopObserving unless the module
41
+ // defines functions with those names
42
+ for ((start, name) in listOf(true to "startObserving", false to "stopObserving")) {
43
+ if (!asyncFunctions.containsKey(name) && !asyncFunctionBuilders.containsKey(name)) {
44
+ AsyncFunction(name) { eventName: String ->
45
+ for (observer in eventObservers) {
46
+ if (observer.start == start && (observer.event == null || observer.event == eventName)) observer.body()
47
+ }
48
+ }
49
+ }
50
+ }
51
+ return ObjectDefinitionData(
52
+ legacyConstantsProvider,
53
+ syncFunctions.toMap(),
54
+ asyncFunctions + asyncFunctionBuilders.mapValues { (_, builder) -> builder.build() },
55
+ eventNames,
56
+ properties.toMap(),
57
+ constants.toMap(),
58
+ )
59
+ }
60
+
61
+ @Deprecated("Use `Constant` or `Property` instead")
62
+ fun Constants(legacyConstantsProvider: () -> Map<String, Any?>) {
63
+ this.legacyConstantsProvider = legacyConstantsProvider
64
+ }
65
+
66
+ @Deprecated("Use `Constant` or `Property` instead")
67
+ fun Constants(vararg constants: Pair<String, Any?>) {
68
+ legacyConstantsProvider = { constants.toMap() }
69
+ }
70
+
71
+ fun Events(vararg events: String) {
72
+ eventNames = events.toList()
73
+ }
74
+
75
+ fun Events(events: Array<String>) {
76
+ eventNames = events.toList()
77
+ }
78
+
79
+ fun OnStartObserving(eventName: String, body: () -> Unit) {
80
+ eventObservers.add(EventObservingDefinition(true, eventName, body))
81
+ }
82
+
83
+ fun OnStartObserving(body: () -> Unit) {
84
+ eventObservers.add(EventObservingDefinition(true, null, body))
85
+ }
86
+
87
+ fun OnStopObserving(eventName: String, body: () -> Unit) {
88
+ eventObservers.add(EventObservingDefinition(false, eventName, body))
89
+ }
90
+
91
+ fun OnStopObserving(body: () -> Unit) {
92
+ eventObservers.add(EventObservingDefinition(false, null, body))
93
+ }
94
+
95
+ open fun Property(name: String): PropertyComponentBuilder =
96
+ PropertyComponentBuilder(name).also { properties[name] = it }
97
+
98
+ inline fun <reified T> Property(name: String, crossinline body: () -> T): PropertyComponentBuilder =
99
+ PropertyComponentBuilder(name).also {
100
+ it.get(body)
101
+ properties[name] = it
102
+ }
103
+
104
+ open fun Constant(name: String): ConstantComponentBuilder =
105
+ ConstantComponentBuilder(name).also { constants[name] = it }
106
+
107
+ inline fun <reified T> Constant(name: String, crossinline body: () -> T): ConstantComponentBuilder =
108
+ ConstantComponentBuilder(name).also {
109
+ it.get(body)
110
+ constants[name] = it
111
+ }
112
+
113
+ fun AsyncFunction(name: String) = AsyncFunctionBuilder(name).also { asyncFunctionBuilders[name] = it }
114
+
115
+ inline fun Function(name: String, crossinline body: () -> Any?): SyncFunctionComponent =
116
+ SyncFunctionComponent(name, emptyArray()) { body() }.also { syncFunctions[name] = it }
117
+
118
+ inline fun AsyncFunction(name: String, crossinline body: () -> Any?): AsyncFunctionComponent =
119
+ createAsyncFunctionComponent(name, emptyArray()) { body() }.also { asyncFunctions[name] = it }
120
+
121
+ inline fun <R> Function(name: String, crossinline body: () -> R): SyncFunctionComponent =
122
+ SyncFunctionComponent(name, emptyArray()) { body() }.also { syncFunctions[name] = it }
123
+
124
+ inline fun <R> AsyncFunction(name: String, crossinline body: () -> R): AsyncFunctionComponent =
125
+ createAsyncFunctionComponent(name, emptyArray()) { body() }.also { asyncFunctions[name] = it }
126
+
127
+ inline fun <R, reified P0> Function(name: String, crossinline body: (p0: P0) -> R): SyncFunctionComponent =
128
+ SyncFunctionComponent(name, arrayOf(toAnyType<P0>())) { body(it[0] as P0) }.also { syncFunctions[name] = it }
129
+
130
+ // one Promise argument is the promise itself, as upstream decides by class
131
+ inline fun <R, reified P0> AsyncFunction(name: String, crossinline body: (p0: P0) -> R): AsyncFunctionComponent =
132
+ if (P0::class == Promise::class) {
133
+ AsyncFunctionWithPromiseComponent(name, emptyArray()) { _, promise -> body(promise as P0) }
134
+ } else {
135
+ createAsyncFunctionComponent(name, arrayOf(toAnyType<P0>())) { body(it[0] as P0) }
136
+ }.also { asyncFunctions[name] = it }
137
+
138
+ inline fun <R, reified P0, reified P1> Function(name: String, crossinline body: (p0: P0, p1: P1) -> R): SyncFunctionComponent =
139
+ SyncFunctionComponent(name, arrayOf(toAnyType<P0>(), toAnyType<P1>())) { body(it[0] as P0, it[1] as P1) }.also { syncFunctions[name] = it }
140
+
141
+ inline fun <R, reified P0, reified P1> AsyncFunction(name: String, crossinline body: (p0: P0, p1: P1) -> R): AsyncFunctionComponent =
142
+ createAsyncFunctionComponent(name, arrayOf(toAnyType<P0>(), toAnyType<P1>())) { body(it[0] as P0, it[1] as P1) }.also { asyncFunctions[name] = it }
143
+
144
+ inline fun <R, reified P0> AsyncFunction(name: String, crossinline body: (p0: P0, promise: Promise) -> R): AsyncFunctionComponent =
145
+ AsyncFunctionWithPromiseComponent(name, arrayOf(toAnyType<P0>())) { it, promise -> body(it[0] as P0, promise) }.also { asyncFunctions[name] = it }
146
+
147
+ inline fun <R, reified P0, reified P1, reified P2> Function(name: String, crossinline body: (p0: P0, p1: P1, p2: P2) -> R): SyncFunctionComponent =
148
+ SyncFunctionComponent(name, arrayOf(toAnyType<P0>(), toAnyType<P1>(), toAnyType<P2>())) { body(it[0] as P0, it[1] as P1, it[2] as P2) }.also { syncFunctions[name] = it }
149
+
150
+ inline fun <R, reified P0, reified P1, reified P2> AsyncFunction(name: String, crossinline body: (p0: P0, p1: P1, p2: P2) -> R): AsyncFunctionComponent =
151
+ createAsyncFunctionComponent(name, arrayOf(toAnyType<P0>(), toAnyType<P1>(), toAnyType<P2>())) { body(it[0] as P0, it[1] as P1, it[2] as P2) }.also { asyncFunctions[name] = it }
152
+
153
+ inline fun <R, reified P0, reified P1> AsyncFunction(name: String, crossinline body: (p0: P0, p1: P1, promise: Promise) -> R): AsyncFunctionComponent =
154
+ AsyncFunctionWithPromiseComponent(name, arrayOf(toAnyType<P0>(), toAnyType<P1>())) { it, promise -> body(it[0] as P0, it[1] as P1, promise) }.also { asyncFunctions[name] = it }
155
+
156
+ inline fun <R, reified P0, reified P1, reified P2, reified P3> Function(name: String, crossinline body: (p0: P0, p1: P1, p2: P2, p3: P3) -> R): SyncFunctionComponent =
157
+ SyncFunctionComponent(name, arrayOf(toAnyType<P0>(), toAnyType<P1>(), toAnyType<P2>(), toAnyType<P3>())) { body(it[0] as P0, it[1] as P1, it[2] as P2, it[3] as P3) }.also { syncFunctions[name] = it }
158
+
159
+ inline fun <R, reified P0, reified P1, reified P2, reified P3> AsyncFunction(name: String, crossinline body: (p0: P0, p1: P1, p2: P2, p3: P3) -> R): AsyncFunctionComponent =
160
+ createAsyncFunctionComponent(name, arrayOf(toAnyType<P0>(), toAnyType<P1>(), toAnyType<P2>(), toAnyType<P3>())) { body(it[0] as P0, it[1] as P1, it[2] as P2, it[3] as P3) }.also { asyncFunctions[name] = it }
161
+
162
+ inline fun <R, reified P0, reified P1, reified P2> AsyncFunction(name: String, crossinline body: (p0: P0, p1: P1, p2: P2, promise: Promise) -> R): AsyncFunctionComponent =
163
+ AsyncFunctionWithPromiseComponent(name, arrayOf(toAnyType<P0>(), toAnyType<P1>(), toAnyType<P2>())) { it, promise -> body(it[0] as P0, it[1] as P1, it[2] as P2, promise) }.also { asyncFunctions[name] = it }
164
+
165
+ inline fun <R, reified P0, reified P1, reified P2, reified P3, reified P4> Function(name: String, crossinline body: (p0: P0, p1: P1, p2: P2, p3: P3, p4: P4) -> R): SyncFunctionComponent =
166
+ SyncFunctionComponent(name, arrayOf(toAnyType<P0>(), toAnyType<P1>(), toAnyType<P2>(), toAnyType<P3>(), toAnyType<P4>())) { body(it[0] as P0, it[1] as P1, it[2] as P2, it[3] as P3, it[4] as P4) }.also { syncFunctions[name] = it }
167
+
168
+ inline fun <R, reified P0, reified P1, reified P2, reified P3, reified P4> AsyncFunction(name: String, crossinline body: (p0: P0, p1: P1, p2: P2, p3: P3, p4: P4) -> R): AsyncFunctionComponent =
169
+ createAsyncFunctionComponent(name, arrayOf(toAnyType<P0>(), toAnyType<P1>(), toAnyType<P2>(), toAnyType<P3>(), toAnyType<P4>())) { body(it[0] as P0, it[1] as P1, it[2] as P2, it[3] as P3, it[4] as P4) }.also { asyncFunctions[name] = it }
170
+
171
+ inline fun <R, reified P0, reified P1, reified P2, reified P3> AsyncFunction(name: String, crossinline body: (p0: P0, p1: P1, p2: P2, p3: P3, promise: Promise) -> R): AsyncFunctionComponent =
172
+ AsyncFunctionWithPromiseComponent(name, arrayOf(toAnyType<P0>(), toAnyType<P1>(), toAnyType<P2>(), toAnyType<P3>())) { it, promise -> body(it[0] as P0, it[1] as P1, it[2] as P2, it[3] as P3, promise) }.also { asyncFunctions[name] = it }
173
+
174
+ inline fun <R, reified P0, reified P1, reified P2, reified P3, reified P4, reified P5> Function(name: String, crossinline body: (p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5) -> R): SyncFunctionComponent =
175
+ SyncFunctionComponent(name, arrayOf(toAnyType<P0>(), toAnyType<P1>(), toAnyType<P2>(), toAnyType<P3>(), toAnyType<P4>(), toAnyType<P5>())) { body(it[0] as P0, it[1] as P1, it[2] as P2, it[3] as P3, it[4] as P4, it[5] as P5) }.also { syncFunctions[name] = it }
176
+
177
+ inline fun <R, reified P0, reified P1, reified P2, reified P3, reified P4, reified P5> AsyncFunction(name: String, crossinline body: (p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5) -> R): AsyncFunctionComponent =
178
+ createAsyncFunctionComponent(name, arrayOf(toAnyType<P0>(), toAnyType<P1>(), toAnyType<P2>(), toAnyType<P3>(), toAnyType<P4>(), toAnyType<P5>())) { body(it[0] as P0, it[1] as P1, it[2] as P2, it[3] as P3, it[4] as P4, it[5] as P5) }.also { asyncFunctions[name] = it }
179
+
180
+ inline fun <R, reified P0, reified P1, reified P2, reified P3, reified P4> AsyncFunction(name: String, crossinline body: (p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, promise: Promise) -> R): AsyncFunctionComponent =
181
+ AsyncFunctionWithPromiseComponent(name, arrayOf(toAnyType<P0>(), toAnyType<P1>(), toAnyType<P2>(), toAnyType<P3>(), toAnyType<P4>())) { it, promise -> body(it[0] as P0, it[1] as P1, it[2] as P2, it[3] as P3, it[4] as P4, promise) }.also { asyncFunctions[name] = it }
182
+
183
+ inline fun <R, reified P0, reified P1, reified P2, reified P3, reified P4, reified P5, reified P6> Function(name: String, crossinline body: (p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6) -> R): SyncFunctionComponent =
184
+ SyncFunctionComponent(name, arrayOf(toAnyType<P0>(), toAnyType<P1>(), toAnyType<P2>(), toAnyType<P3>(), toAnyType<P4>(), toAnyType<P5>(), toAnyType<P6>())) { body(it[0] as P0, it[1] as P1, it[2] as P2, it[3] as P3, it[4] as P4, it[5] as P5, it[6] as P6) }.also { syncFunctions[name] = it }
185
+
186
+ inline fun <R, reified P0, reified P1, reified P2, reified P3, reified P4, reified P5, reified P6> AsyncFunction(name: String, crossinline body: (p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6) -> R): AsyncFunctionComponent =
187
+ createAsyncFunctionComponent(name, arrayOf(toAnyType<P0>(), toAnyType<P1>(), toAnyType<P2>(), toAnyType<P3>(), toAnyType<P4>(), toAnyType<P5>(), toAnyType<P6>())) { body(it[0] as P0, it[1] as P1, it[2] as P2, it[3] as P3, it[4] as P4, it[5] as P5, it[6] as P6) }.also { asyncFunctions[name] = it }
188
+
189
+ inline fun <R, reified P0, reified P1, reified P2, reified P3, reified P4, reified P5> AsyncFunction(name: String, crossinline body: (p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, promise: Promise) -> R): AsyncFunctionComponent =
190
+ AsyncFunctionWithPromiseComponent(name, arrayOf(toAnyType<P0>(), toAnyType<P1>(), toAnyType<P2>(), toAnyType<P3>(), toAnyType<P4>(), toAnyType<P5>())) { it, promise -> body(it[0] as P0, it[1] as P1, it[2] as P2, it[3] as P3, it[4] as P4, it[5] as P5, promise) }.also { asyncFunctions[name] = it }
191
+
192
+ inline fun <R, reified P0, reified P1, reified P2, reified P3, reified P4, reified P5, reified P6, reified P7> Function(name: String, crossinline body: (p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7) -> R): SyncFunctionComponent =
193
+ SyncFunctionComponent(name, arrayOf(toAnyType<P0>(), toAnyType<P1>(), toAnyType<P2>(), toAnyType<P3>(), toAnyType<P4>(), toAnyType<P5>(), toAnyType<P6>(), toAnyType<P7>())) { body(it[0] as P0, it[1] as P1, it[2] as P2, it[3] as P3, it[4] as P4, it[5] as P5, it[6] as P6, it[7] as P7) }.also { syncFunctions[name] = it }
194
+
195
+ inline fun <R, reified P0, reified P1, reified P2, reified P3, reified P4, reified P5, reified P6, reified P7> AsyncFunction(name: String, crossinline body: (p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7) -> R): AsyncFunctionComponent =
196
+ createAsyncFunctionComponent(name, arrayOf(toAnyType<P0>(), toAnyType<P1>(), toAnyType<P2>(), toAnyType<P3>(), toAnyType<P4>(), toAnyType<P5>(), toAnyType<P6>(), toAnyType<P7>())) { body(it[0] as P0, it[1] as P1, it[2] as P2, it[3] as P3, it[4] as P4, it[5] as P5, it[6] as P6, it[7] as P7) }.also { asyncFunctions[name] = it }
197
+
198
+ inline fun <R, reified P0, reified P1, reified P2, reified P3, reified P4, reified P5, reified P6> AsyncFunction(name: String, crossinline body: (p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, promise: Promise) -> R): AsyncFunctionComponent =
199
+ AsyncFunctionWithPromiseComponent(name, arrayOf(toAnyType<P0>(), toAnyType<P1>(), toAnyType<P2>(), toAnyType<P3>(), toAnyType<P4>(), toAnyType<P5>(), toAnyType<P6>())) { it, promise -> body(it[0] as P0, it[1] as P1, it[2] as P2, it[3] as P3, it[4] as P4, it[5] as P5, it[6] as P6, promise) }.also { asyncFunctions[name] = it }
200
+ }
201
+
202
+
203
+ open class PropertyComponentBuilder(val name: String) {
204
+ var getter: SyncFunctionComponent? = null
205
+ var setter: SyncFunctionComponent? = null
206
+
207
+ inline fun <R> get(crossinline body: () -> R) = apply {
208
+ getter = SyncFunctionComponent("get", emptyArray()) { body() }
209
+ }
210
+
211
+ inline fun <reified T> set(crossinline body: (newValue: T) -> Unit) = apply {
212
+ setter = SyncFunctionComponent("set", arrayOf(toAnyType<T>())) { body(it[0] as T) }
213
+ }
214
+ }
215
+
216
+ // a class property whose getter and setter take the caller
217
+ class PropertyComponentBuilderWithThis<ThisType>(@PublishedApi internal val thisType: KType, name: String) : PropertyComponentBuilder(name) {
218
+ inline fun <R> get(crossinline body: (ThisType) -> R) = apply {
219
+ getter = SyncFunctionComponent("get", arrayOf(anyTypeOf(thisType))) { body(it[0] as ThisType) }
220
+ }
221
+
222
+ inline fun <reified T> set(crossinline body: (self: ThisType, newValue: T) -> Unit) = apply {
223
+ setter = SyncFunctionComponent("set", arrayOf(anyTypeOf(thisType), toAnyType<T>())) { body(it[0] as ThisType, it[1] as T) }
224
+ }
225
+ }
226
+
227
+ // a constant's getter runs once, on its first read
228
+ class ConstantComponentBuilder(val name: String) {
229
+ var getter: SyncFunctionComponent? = null
230
+ internal var value: Any? = null
231
+ internal var evaluated = false
232
+
233
+ inline fun <R> get(crossinline body: () -> R) = apply {
234
+ getter = SyncFunctionComponent("get", emptyArray()) { body() }
235
+ }
236
+ }
@@ -0,0 +1,12 @@
1
+ package expo.modules.kotlin.records
2
+
3
+ // For supported field types, see https://docs.expo.dev/modules/module-api/#argument-types
4
+ interface Record
5
+
6
+ @Target(AnnotationTarget.PROPERTY)
7
+ @Retention(AnnotationRetention.RUNTIME)
8
+ annotation class Field(val key: String = "")
9
+
10
+ @Target(AnnotationTarget.PROPERTY)
11
+ @Retention(AnnotationRetention.RUNTIME)
12
+ annotation class Required
@@ -0,0 +1,9 @@
1
+ package expo.modules.kotlin.runtime
2
+
3
+ import expo.modules.kotlin.AppContext
4
+ import expo.modules.kotlin.sharedobjects.SharedObjectRegistry
5
+
6
+ // the one JavaScript runtime a Kotlin/Wasm process answers
7
+ class Runtime internal constructor(val appContext: AppContext) {
8
+ internal val sharedObjectRegistry = SharedObjectRegistry()
9
+ }
@@ -0,0 +1,50 @@
1
+ package expo.modules.kotlin.sharedobjects
2
+
3
+ import expo.modules.kotlin.AppContext
4
+ import expo.modules.kotlin.runtime.Runtime
5
+
6
+ open class SharedObject(runtime: Runtime? = null) {
7
+ constructor(appContext: AppContext) : this(appContext.runtime)
8
+
9
+ // the id of the JavaScript object this one maps to, or 0 when unlinked
10
+ internal var sharedObjectId: SharedObjectId = SharedObjectId(0)
11
+
12
+ internal var runtime: Runtime? = runtime
13
+
14
+ val appContext: AppContext?
15
+ get() = runtime?.appContext
16
+
17
+ fun emit(event: String) {
18
+ emitInternal(event, emptyArray())
19
+ }
20
+
21
+ fun emit(event: String, payload: Any?) {
22
+ emitInternal(event, arrayOf(payload))
23
+ }
24
+
25
+ @Deprecated(
26
+ "Multi-argument event emission is deprecated. Use `emit(event)` or `emit(event, payload)` and pass a single payload (typically a Map/Bundle) instead.",
27
+ ReplaceWith("emit(event, args)"),
28
+ )
29
+ fun emit(event: String, vararg args: Any?) {
30
+ emitInternal(event, args)
31
+ }
32
+
33
+ private fun emitInternal(event: String, payload: Array<out Any?>) {
34
+ if (sharedObjectId.value == 0) return
35
+ val registry = runtime?.sharedObjectRegistry ?: return
36
+ registry.emit(this, event, payload.toList())
37
+ }
38
+
39
+ open fun onStartListeningToEvent(eventName: String) = Unit
40
+
41
+ open fun onStopListeningToEvent(eventName: String) = Unit
42
+
43
+ @Suppress("DEPRECATION")
44
+ open fun sharedObjectDidRelease() = deallocate()
45
+
46
+ @Deprecated("Use sharedObjectDidRelease() instead.", ReplaceWith("sharedObjectDidRelease()"))
47
+ open fun deallocate() = Unit
48
+
49
+ open fun getAdditionalMemoryPressure(): Int = 0
50
+ }