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,173 @@
1
+ @file:Suppress("UNCHECKED_CAST")
2
+
3
+ package dev.peach.expo
4
+
5
+ import android.content.Context
6
+ import expo.modules.kotlin.AppContext
7
+ import expo.modules.kotlin.exception.CodedException
8
+ import expo.modules.kotlin.exception.EnumNoSuchValueException
9
+ import expo.modules.kotlin.exception.FieldCastException
10
+ import expo.modules.kotlin.exception.FieldRequiredException
11
+ import expo.modules.kotlin.exception.IncompatibleArgTypeException
12
+ import expo.modules.kotlin.exception.exceptionDecorator
13
+ import expo.modules.kotlin.types.AnyType
14
+ import expo.modules.kotlin.types.TypeCastException
15
+ import expo.modules.kotlin.views.AnyViewProp
16
+ import expo.modules.kotlin.views.ExpoView
17
+ import kotlin.reflect.KClass
18
+ import kotlin.reflect.KType
19
+ import kotlin.reflect.typeOf
20
+
21
+ // the app's records, enums and compose views, registered by code the host
22
+ // generates from their sources: upstream's compile-time introspection, since
23
+ // Kotlin/Wasm has no reflection to find @Field properties, enum parameters,
24
+ // constructors or MutableState props.
25
+ object PeachExpoTypes {
26
+ class RecordField(
27
+ val key: String,
28
+ val type: KType,
29
+ val required: Boolean,
30
+ val read: ((Any) -> Any?)?,
31
+ // a field with no initializer is written after construction
32
+ val write: ((Any, Any?) -> Unit)?,
33
+ )
34
+
35
+ class RecordType(val name: String, val create: () -> Any, val fields: List<RecordField>)
36
+
37
+ class EnumType(val type: KClass<*>, val entries: List<Enum<*>>, val fields: Int, val parameter: String?, val value: ((Enum<*>) -> Any?)?)
38
+
39
+ private class Frame(val type: KClass<*>?, val name: String, val values: Map<*, *>?)
40
+
41
+ class ViewType(val create: (Context, AppContext) -> ExpoView, val props: List<AnyViewProp>)
42
+
43
+ private class ViewClass(val props: KClass<*>?, val create: (Context, AppContext) -> ExpoView)
44
+
45
+ private val views = HashMap<KClass<*>, ViewClass>()
46
+ private val composeProps = HashMap<KClass<*>, List<AnyViewProp>>()
47
+ private val records = HashMap<KClass<*>, RecordType>()
48
+ private val enums = HashMap<KClass<*>, EnumType>()
49
+ // records under construction; a frame with no values builds defaults
50
+ private val frames = ArrayList<Frame>()
51
+
52
+ fun <V : ExpoView> view(type: KClass<V>, props: KClass<*>?, create: (Context, AppContext) -> V) {
53
+ views[type] = ViewClass(props, create)
54
+ }
55
+
56
+ fun composeProps(type: KClass<*>, props: List<AnyViewProp>) {
57
+ composeProps[type] = props
58
+ }
59
+
60
+ fun viewType(type: KClass<*>): ViewType {
61
+ val view = views[type] ?: throw CodedException(
62
+ "ERR_VIEW_NOT_SUPPORTED",
63
+ "Expo view ${type.simpleName} has no registered constructor",
64
+ null,
65
+ )
66
+ return ViewType(view.create, view.props?.let { composeProps[it] }.orEmpty())
67
+ }
68
+
69
+ fun <R : Any> record(type: KClass<R>, name: String, create: () -> R, fields: List<RecordField>) {
70
+ records[type] = RecordType(name, create, fields)
71
+ }
72
+
73
+ inline fun <R : Any, reified T> field(
74
+ key: String,
75
+ required: Boolean,
76
+ noinline read: ((R) -> T)?,
77
+ noinline write: ((R, T) -> Unit)?,
78
+ ): RecordField = RecordField(
79
+ key,
80
+ typeOf<T>(),
81
+ required,
82
+ read?.let { get -> { record: Any -> get(record as R) } },
83
+ write?.let { set -> { record: Any, value: Any? -> set(record as R, value as T) } },
84
+ )
85
+
86
+ fun <E : Enum<E>> enum(type: KClass<E>, entries: Array<E>, fields: Int, parameter: String?, value: ((E) -> Any?)?) {
87
+ enums[type] = EnumType(type, entries.toList(), fields, parameter, value?.let { get -> { entry: Enum<*> -> get(entry as E) } })
88
+ }
89
+
90
+ // a @Field initializer or constructor default: the incoming value when the
91
+ // converter is building this record, otherwise the declared default
92
+ inline fun <reified T> initial(owner: KClass<*>, key: String, required: Boolean, noinline default: () -> T): T =
93
+ initialValue(owner, key, required, typeOf<T>(), default) as T
94
+
95
+ @PublishedApi
96
+ internal fun initialValue(owner: KClass<*>, key: String, required: Boolean, type: KType, default: () -> Any?): Any? {
97
+ val frame = frames.lastOrNull()
98
+ val values = frame?.values
99
+ if (frame == null || values == null || frame.type != owner) return default()
100
+ if (!values.containsKey(key)) {
101
+ if (required) throw FieldRequiredException(key)
102
+ return withDefaults(default)
103
+ }
104
+ return fieldValue(frame.name, key, type, values[key])
105
+ }
106
+
107
+ private fun fieldValue(record: String, key: String, type: KType, value: Any?): Any? =
108
+ exceptionDecorator({ cause -> FieldCastException(key, type, record, cause) }) {
109
+ AnyType(type).convert(value)
110
+ }
111
+
112
+ private fun withDefaults(default: () -> Any?): Any? {
113
+ frames.add(Frame(null, "", null))
114
+ try {
115
+ return default()
116
+ } finally {
117
+ frames.removeAt(frames.lastIndex)
118
+ }
119
+ }
120
+
121
+ fun convert(classifier: KClass<*>, value: Any): Any? {
122
+ records[classifier]?.let { record ->
123
+ val values = value as? Map<*, *> ?: throw TypeCastException("Cannot cast '$value' to '${record.name}'")
124
+ frames.add(Frame(classifier, record.name, values))
125
+ val instance = try {
126
+ record.create()
127
+ } finally {
128
+ frames.removeAt(frames.lastIndex)
129
+ }
130
+ for (field in record.fields) {
131
+ val write = field.write ?: continue
132
+ if (!values.containsKey(field.key)) {
133
+ if (field.required) throw FieldRequiredException(field.key)
134
+ continue
135
+ }
136
+ write(instance, fieldValue(record.name, field.key, field.type, values[field.key]))
137
+ }
138
+ return instance
139
+ }
140
+ val enum = enums[classifier] ?: return Unconverted
141
+ return when (enum.fields) {
142
+ 0 -> enum.entries.find { it.name == value } ?: throw EnumNoSuchValueException(classifier, enum.entries, value)
143
+ 1 -> {
144
+ val read = enum.value!!
145
+ val unwrapped = if (read(enum.entries.first()) is String) value as String
146
+ else if (value is Double) value.toInt() else value as Int
147
+ requireNotNull(enum.entries.find { read(it) == unwrapped }) {
148
+ "Couldn't convert '$value' to ${classifier.simpleName} where ${enum.parameter} is the enum parameter"
149
+ }
150
+ }
151
+ else -> throw IncompatibleArgTypeException(value::class, classifier)
152
+ }
153
+ }
154
+
155
+ // a Kotlin value as JavaScript sees it: a record's fields, an enum's value
156
+ fun toJS(value: Any): Any? {
157
+ if (value is Enum<*>) {
158
+ val enum = enums[value::class] ?: return value.name
159
+ return when (enum.fields) {
160
+ 0 -> value.name
161
+ 1 -> enum.value!!(value)
162
+ else -> throw IllegalStateException("Enum '${value::class.simpleName}' cannot be used as return type (incompatible with JS)")
163
+ }
164
+ }
165
+ val record = records[value::class] ?: return Unconverted
166
+ val result = LinkedHashMap<String, Any?>()
167
+ for (field in record.fields) result[field.key] = (field.read ?: continue)(value)
168
+ return result
169
+ }
170
+
171
+ // a value no registered type owns
172
+ object Unconverted
173
+ }
@@ -0,0 +1,20 @@
1
+ package expo.modules.kotlin
2
+
3
+ import expo.modules.kotlin.runtime.Runtime
4
+ import kotlinx.coroutines.CoroutineScope
5
+ import kotlinx.coroutines.Dispatchers
6
+ import kotlinx.coroutines.SupervisorJob
7
+
8
+ // the app context every module of one process shares. its queues all run on
9
+ // the guest's single event loop, where Android's modules queue and main
10
+ // thread also take turns.
11
+ class AppContext internal constructor() {
12
+ val mainQueue: CoroutineScope = CoroutineScope(SupervisorJob() + Dispatchers.Main)
13
+ val modulesQueue: CoroutineScope = CoroutineScope(SupervisorJob() + Dispatchers.Main)
14
+ val backgroundCoroutineScope: CoroutineScope = CoroutineScope(SupervisorJob() + Dispatchers.Default)
15
+ val runtime: Runtime = Runtime(this)
16
+ }
17
+
18
+ interface AppContextProvider {
19
+ val appContext: AppContext
20
+ }
@@ -0,0 +1,19 @@
1
+ package expo.modules.kotlin
2
+
3
+ import expo.modules.kotlin.exception.CodedException
4
+
5
+ interface Promise {
6
+ fun resolve(value: Any?)
7
+ fun resolve() = resolve(null)
8
+ fun resolve(result: Int) = resolve(result as Any?)
9
+ fun resolve(result: Boolean) = resolve(result as Any?)
10
+ fun resolve(result: Double) = resolve(result as Any?)
11
+ fun resolve(result: Float) = resolve(result as Any?)
12
+ fun resolve(result: String) = resolve(result as Any?)
13
+ fun resolve(result: Collection<Any?>) = resolve(result as Any?)
14
+ fun resolve(result: Map<String, Any?>) = resolve(result as Any?)
15
+ fun reject(code: String?, message: String?, cause: Throwable?)
16
+ fun reject(exception: CodedException) {
17
+ reject(exception.code, exception.message, exception.cause)
18
+ }
19
+ }
@@ -0,0 +1,198 @@
1
+ @file:Suppress("FunctionName", "UNCHECKED_CAST")
2
+
3
+ package expo.modules.kotlin.classcomponent
4
+
5
+ import expo.modules.kotlin.Promise
6
+ import expo.modules.kotlin.functions.AsyncFunctionComponent
7
+ import expo.modules.kotlin.functions.AsyncFunctionWithPromiseComponent
8
+ import expo.modules.kotlin.functions.SyncFunctionComponent
9
+ import expo.modules.kotlin.functions.createAsyncFunctionComponent
10
+ import expo.modules.kotlin.functions.AsyncFunctionBuilder
11
+ import expo.modules.kotlin.objects.ObjectDefinitionBuilder
12
+ import expo.modules.kotlin.objects.ObjectDefinitionData
13
+ import expo.modules.kotlin.objects.PropertyComponentBuilderWithThis
14
+ import expo.modules.kotlin.types.toAnyType
15
+ import kotlin.reflect.KClass
16
+ import kotlin.reflect.KType
17
+
18
+ // generated arities 0 to 8, as upstream's ClassComponentBuilder declares
19
+
20
+ class ClassDefinitionData(
21
+ val name: String,
22
+ internal val ownerClass: KClass<*>,
23
+ internal val constructor: SyncFunctionComponent?,
24
+ internal val staticSyncFunctions: Map<String, SyncFunctionComponent>,
25
+ internal val staticAsyncFunctions: Map<String, AsyncFunctionComponent>,
26
+ internal val objectDefinition: ObjectDefinitionData,
27
+ )
28
+
29
+ class ClassComponentBuilder<SharedObjectType : Any>(
30
+ val name: String,
31
+ @PublishedApi internal val ownerClass: KClass<SharedObjectType>,
32
+ @PublishedApi internal val ownerType: KType,
33
+ ) : ObjectDefinitionBuilder() {
34
+ var constructor: SyncFunctionComponent? = null
35
+ @PublishedApi internal val staticSyncFunctions = mutableMapOf<String, SyncFunctionComponent>()
36
+ @PublishedApi internal val staticAsyncFunctions = mutableMapOf<String, AsyncFunctionComponent>()
37
+ private val staticAsyncFunctionBuilders = mutableMapOf<String, AsyncFunctionBuilder>()
38
+
39
+ fun buildClass(): ClassDefinitionData {
40
+ val hasOwnerType = ownerClass != Unit::class
41
+ // a shared object class with events forwards its listeners' first and
42
+ // last subscriptions to the native object
43
+ if (hasOwnerType && eventNames.isNotEmpty()) {
44
+ for ((name, start) in listOf("__expo_onStartListeningToEvent" to true, "__expo_onStopListeningToEvent" to false)) {
45
+ syncFunctions[name] = SyncFunctionComponent(name, arrayOf(anyTypeOfOwner(), toAnyType<String>())) {
46
+ val self = it[0] as expo.modules.kotlin.sharedobjects.SharedObject
47
+ if (start) self.onStartListeningToEvent(it[1] as String) else self.onStopListeningToEvent(it[1] as String)
48
+ }.also { function -> function.enumerable(false) }
49
+ }
50
+ }
51
+ val objectData = buildObject()
52
+ for (function in objectData.syncFunctions.values + objectData.asyncFunctions.values) {
53
+ function.ownerType = ownerType
54
+ function.canTakeOwner = true
55
+ }
56
+ for (property in objectData.properties.values) {
57
+ property.getter?.let { it.ownerType = ownerType; it.canTakeOwner = true }
58
+ property.setter?.let { it.ownerType = ownerType; it.canTakeOwner = true }
59
+ }
60
+ return ClassDefinitionData(
61
+ name,
62
+ ownerClass,
63
+ constructor,
64
+ staticSyncFunctions.toMap(),
65
+ staticAsyncFunctions + staticAsyncFunctionBuilders.mapValues { (_, builder) -> builder.build() },
66
+ objectData,
67
+ )
68
+ }
69
+
70
+ @PublishedApi internal fun anyTypeOfOwner() = expo.modules.kotlin.types.anyTypeOf(ownerType)
71
+
72
+ inline fun <reified T> Property(name: String, crossinline body: (owner: SharedObjectType) -> T): PropertyComponentBuilderWithThis<SharedObjectType> =
73
+ PropertyComponentBuilderWithThis<SharedObjectType>(ownerType, name).also {
74
+ it.get(body)
75
+ properties[name] = it
76
+ }
77
+
78
+ override fun Property(name: String): PropertyComponentBuilderWithThis<SharedObjectType> =
79
+ PropertyComponentBuilderWithThis<SharedObjectType>(ownerType, name).also { properties[name] = it }
80
+
81
+ fun StaticAsyncFunction(name: String) = AsyncFunctionBuilder(name).also { staticAsyncFunctionBuilders[name] = it }
82
+
83
+
84
+ inline fun Constructor(crossinline body: () -> SharedObjectType): SyncFunctionComponent =
85
+ SyncFunctionComponent("constructor", emptyArray()) { body() }.also { constructor = it }
86
+
87
+ inline fun <reified P0> Constructor(crossinline body: (p0: P0) -> SharedObjectType): SyncFunctionComponent =
88
+ SyncFunctionComponent("constructor", arrayOf(toAnyType<P0>())) { body(it[0] as P0) }.also { constructor = it }
89
+
90
+ inline fun <reified P0, reified P1> Constructor(crossinline body: (p0: P0, p1: P1) -> SharedObjectType): SyncFunctionComponent =
91
+ SyncFunctionComponent("constructor", arrayOf(toAnyType<P0>(), toAnyType<P1>())) { body(it[0] as P0, it[1] as P1) }.also { constructor = it }
92
+
93
+ inline fun <reified P0, reified P1, reified P2> Constructor(crossinline body: (p0: P0, p1: P1, p2: P2) -> SharedObjectType): SyncFunctionComponent =
94
+ SyncFunctionComponent("constructor", arrayOf(toAnyType<P0>(), toAnyType<P1>(), toAnyType<P2>())) { body(it[0] as P0, it[1] as P1, it[2] as P2) }.also { constructor = it }
95
+
96
+ inline fun <reified P0, reified P1, reified P2, reified P3> Constructor(crossinline body: (p0: P0, p1: P1, p2: P2, p3: P3) -> SharedObjectType): SyncFunctionComponent =
97
+ SyncFunctionComponent("constructor", 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 { constructor = it }
98
+
99
+ inline fun <reified P0, reified P1, reified P2, reified P3, reified P4> Constructor(crossinline body: (p0: P0, p1: P1, p2: P2, p3: P3, p4: P4) -> SharedObjectType): SyncFunctionComponent =
100
+ SyncFunctionComponent("constructor", 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 { constructor = it }
101
+
102
+ inline fun <reified P0, reified P1, reified P2, reified P3, reified P4, reified P5> Constructor(crossinline body: (p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5) -> SharedObjectType): SyncFunctionComponent =
103
+ SyncFunctionComponent("constructor", 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 { constructor = it }
104
+
105
+ inline fun <reified P0, reified P1, reified P2, reified P3, reified P4, reified P5, reified P6> Constructor(crossinline body: (p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6) -> SharedObjectType): SyncFunctionComponent =
106
+ SyncFunctionComponent("constructor", 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 { constructor = it }
107
+
108
+ inline fun <reified P0, reified P1, reified P2, reified P3, reified P4, reified P5, reified P6, reified P7> Constructor(crossinline body: (p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7) -> SharedObjectType): SyncFunctionComponent =
109
+ SyncFunctionComponent("constructor", 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 { constructor = it }
110
+
111
+ inline fun StaticFunction(name: String, crossinline body: () -> Any?): SyncFunctionComponent =
112
+ SyncFunctionComponent(name, emptyArray()) { body() }.also { staticSyncFunctions[name] = it }
113
+
114
+ inline fun StaticAsyncFunction(name: String, crossinline body: () -> Any?): AsyncFunctionComponent =
115
+ createAsyncFunctionComponent(name, emptyArray()) { body() }.also { staticAsyncFunctions[name] = it }
116
+
117
+ inline fun <R> StaticFunction(name: String, crossinline body: () -> R): SyncFunctionComponent =
118
+ SyncFunctionComponent(name, emptyArray()) { body() }.also { staticSyncFunctions[name] = it }
119
+
120
+ inline fun <R> StaticAsyncFunction(name: String, crossinline body: () -> R): AsyncFunctionComponent =
121
+ createAsyncFunctionComponent(name, emptyArray()) { body() }.also { staticAsyncFunctions[name] = it }
122
+
123
+ inline fun <R, reified P0> StaticFunction(name: String, crossinline body: (p0: P0) -> R): SyncFunctionComponent =
124
+ SyncFunctionComponent(name, arrayOf(toAnyType<P0>())) { body(it[0] as P0) }.also { staticSyncFunctions[name] = it }
125
+
126
+ inline fun <R, reified P0> StaticAsyncFunction(name: String, crossinline body: (p0: P0) -> R): AsyncFunctionComponent =
127
+ if (P0::class == Promise::class) {
128
+ AsyncFunctionWithPromiseComponent(name, emptyArray()) { _, promise -> body(promise as P0) }
129
+ } else {
130
+ createAsyncFunctionComponent(name, arrayOf(toAnyType<P0>())) { body(it[0] as P0) }
131
+ }.also { staticAsyncFunctions[name] = it }
132
+
133
+ inline fun <R, reified P0> StaticAsyncFunction(name: String, crossinline body: (p0: P0, promise: Promise) -> R): AsyncFunctionComponent =
134
+ AsyncFunctionWithPromiseComponent(name, arrayOf(toAnyType<P0>())) { it, promise -> body(it[0] as P0, promise) }.also { staticAsyncFunctions[name] = it }
135
+
136
+ inline fun <R, reified P0, reified P1> StaticFunction(name: String, crossinline body: (p0: P0, p1: P1) -> R): SyncFunctionComponent =
137
+ SyncFunctionComponent(name, arrayOf(toAnyType<P0>(), toAnyType<P1>())) { body(it[0] as P0, it[1] as P1) }.also { staticSyncFunctions[name] = it }
138
+
139
+ inline fun <R, reified P0, reified P1> StaticAsyncFunction(name: String, crossinline body: (p0: P0, p1: P1) -> R): AsyncFunctionComponent =
140
+ createAsyncFunctionComponent(name, arrayOf(toAnyType<P0>(), toAnyType<P1>())) { body(it[0] as P0, it[1] as P1) }.also { staticAsyncFunctions[name] = it }
141
+
142
+ inline fun <R, reified P0, reified P1> StaticAsyncFunction(name: String, crossinline body: (p0: P0, p1: P1, promise: Promise) -> R): AsyncFunctionComponent =
143
+ AsyncFunctionWithPromiseComponent(name, arrayOf(toAnyType<P0>(), toAnyType<P1>())) { it, promise -> body(it[0] as P0, it[1] as P1, promise) }.also { staticAsyncFunctions[name] = it }
144
+
145
+ inline fun <R, reified P0, reified P1, reified P2> StaticFunction(name: String, crossinline body: (p0: P0, p1: P1, p2: P2) -> R): SyncFunctionComponent =
146
+ SyncFunctionComponent(name, arrayOf(toAnyType<P0>(), toAnyType<P1>(), toAnyType<P2>())) { body(it[0] as P0, it[1] as P1, it[2] as P2) }.also { staticSyncFunctions[name] = it }
147
+
148
+ inline fun <R, reified P0, reified P1, reified P2> StaticAsyncFunction(name: String, crossinline body: (p0: P0, p1: P1, p2: P2) -> R): AsyncFunctionComponent =
149
+ createAsyncFunctionComponent(name, arrayOf(toAnyType<P0>(), toAnyType<P1>(), toAnyType<P2>())) { body(it[0] as P0, it[1] as P1, it[2] as P2) }.also { staticAsyncFunctions[name] = it }
150
+
151
+ inline fun <R, reified P0, reified P1, reified P2> StaticAsyncFunction(name: String, crossinline body: (p0: P0, p1: P1, p2: P2, promise: Promise) -> R): AsyncFunctionComponent =
152
+ 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 { staticAsyncFunctions[name] = it }
153
+
154
+ inline fun <R, reified P0, reified P1, reified P2, reified P3> StaticFunction(name: String, crossinline body: (p0: P0, p1: P1, p2: P2, p3: P3) -> R): SyncFunctionComponent =
155
+ 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 { staticSyncFunctions[name] = it }
156
+
157
+ inline fun <R, reified P0, reified P1, reified P2, reified P3> StaticAsyncFunction(name: String, crossinline body: (p0: P0, p1: P1, p2: P2, p3: P3) -> R): AsyncFunctionComponent =
158
+ 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 { staticAsyncFunctions[name] = it }
159
+
160
+ inline fun <R, reified P0, reified P1, reified P2, reified P3> StaticAsyncFunction(name: String, crossinline body: (p0: P0, p1: P1, p2: P2, p3: P3, promise: Promise) -> R): AsyncFunctionComponent =
161
+ 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 { staticAsyncFunctions[name] = it }
162
+
163
+ inline fun <R, reified P0, reified P1, reified P2, reified P3, reified P4> StaticFunction(name: String, crossinline body: (p0: P0, p1: P1, p2: P2, p3: P3, p4: P4) -> R): SyncFunctionComponent =
164
+ 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 { staticSyncFunctions[name] = it }
165
+
166
+ inline fun <R, reified P0, reified P1, reified P2, reified P3, reified P4> StaticAsyncFunction(name: String, crossinline body: (p0: P0, p1: P1, p2: P2, p3: P3, p4: P4) -> R): AsyncFunctionComponent =
167
+ 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 { staticAsyncFunctions[name] = it }
168
+
169
+ inline fun <R, reified P0, reified P1, reified P2, reified P3, reified P4> StaticAsyncFunction(name: String, crossinline body: (p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, promise: Promise) -> R): AsyncFunctionComponent =
170
+ 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 { staticAsyncFunctions[name] = it }
171
+
172
+ inline fun <R, reified P0, reified P1, reified P2, reified P3, reified P4, reified P5> StaticFunction(name: String, crossinline body: (p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5) -> R): SyncFunctionComponent =
173
+ 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 { staticSyncFunctions[name] = it }
174
+
175
+ inline fun <R, reified P0, reified P1, reified P2, reified P3, reified P4, reified P5> StaticAsyncFunction(name: String, crossinline body: (p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5) -> R): AsyncFunctionComponent =
176
+ 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 { staticAsyncFunctions[name] = it }
177
+
178
+ inline fun <R, reified P0, reified P1, reified P2, reified P3, reified P4, reified P5> StaticAsyncFunction(name: String, crossinline body: (p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, promise: Promise) -> R): AsyncFunctionComponent =
179
+ 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 { staticAsyncFunctions[name] = it }
180
+
181
+ inline fun <R, reified P0, reified P1, reified P2, reified P3, reified P4, reified P5, reified P6> StaticFunction(name: String, crossinline body: (p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6) -> R): SyncFunctionComponent =
182
+ 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 { staticSyncFunctions[name] = it }
183
+
184
+ inline fun <R, reified P0, reified P1, reified P2, reified P3, reified P4, reified P5, reified P6> StaticAsyncFunction(name: String, crossinline body: (p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6) -> R): AsyncFunctionComponent =
185
+ 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 { staticAsyncFunctions[name] = it }
186
+
187
+ inline fun <R, reified P0, reified P1, reified P2, reified P3, reified P4, reified P5, reified P6> StaticAsyncFunction(name: String, crossinline body: (p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, promise: Promise) -> R): AsyncFunctionComponent =
188
+ 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 { staticAsyncFunctions[name] = it }
189
+
190
+ inline fun <R, reified P0, reified P1, reified P2, reified P3, reified P4, reified P5, reified P6, reified P7> StaticFunction(name: String, crossinline body: (p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7) -> R): SyncFunctionComponent =
191
+ 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 { staticSyncFunctions[name] = it }
192
+
193
+ inline fun <R, reified P0, reified P1, reified P2, reified P3, reified P4, reified P5, reified P6, reified P7> StaticAsyncFunction(name: String, crossinline body: (p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7) -> R): AsyncFunctionComponent =
194
+ 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 { staticAsyncFunctions[name] = it }
195
+
196
+ inline fun <R, reified P0, reified P1, reified P2, reified P3, reified P4, reified P5, reified P6, reified P7> StaticAsyncFunction(name: String, crossinline body: (p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, promise: Promise) -> R): AsyncFunctionComponent =
197
+ AsyncFunctionWithPromiseComponent(name, arrayOf(toAnyType<P0>(), toAnyType<P1>(), toAnyType<P2>(), toAnyType<P3>(), toAnyType<P4>(), toAnyType<P5>(), toAnyType<P6>(), toAnyType<P7>())) { 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, it[7] as P7, promise) }.also { staticAsyncFunctions[name] = it }
198
+ }
@@ -0,0 +1,126 @@
1
+ package expo.modules.kotlin.exception
2
+
3
+ import kotlin.reflect.KClass
4
+ import kotlin.reflect.KType
5
+
6
+ // expo-modules-core's coded errors: the code a promise rejects with, inferred
7
+ // from the class name when none is given
8
+ fun Throwable?.toCodedException(): CodedException = when (this) {
9
+ null -> UnexpectedException("Unknown error")
10
+ is CodedException -> this
11
+ else -> UnexpectedException(this)
12
+ }
13
+
14
+ open class CodedException(message: String?, cause: Throwable? = null) : Exception(message, cause) {
15
+ private var providedCode: String? = null
16
+
17
+ val code: String
18
+ get() = providedCode ?: inferCode(this::class)
19
+
20
+ constructor(code: String?, message: String?, cause: Throwable?) : this(message = message, cause = cause) {
21
+ providedCode = code
22
+ }
23
+
24
+ constructor(cause: Throwable) : this(message = cause.message, cause = cause)
25
+
26
+ constructor() : this(null, null)
27
+
28
+ companion object {
29
+ // ModuleNotFoundException becomes ERR_MODULE_NOT_FOUND
30
+ fun inferCode(type: KClass<*>): String {
31
+ val name = requireNotNull(type.simpleName) { "Cannot infer code name from class name. We don't support anonymous classes." }
32
+ return "ERR_" + name
33
+ .replace("(Exception)$".toRegex(), "")
34
+ .replace("(.)([A-Z])".toRegex(), "$1_$2")
35
+ .uppercase()
36
+ }
37
+ }
38
+ }
39
+
40
+ inline fun <reified T : CodedException> errorCodeOf(): String = CodedException.inferCode(T::class)
41
+
42
+ class UnexpectedException(message: String?, cause: Throwable? = null) : CodedException(message = message, cause) {
43
+ constructor(throwable: Throwable) : this(throwable.toString(), throwable)
44
+ constructor(message: String) : this(message, null)
45
+ }
46
+
47
+ internal class InvalidArgsNumberException(received: Int, expected: Int, required: Int = expected) : CodedException(
48
+ message = if (required < expected) {
49
+ "Received $received arguments, but $expected was expected and at least $required is required"
50
+ } else {
51
+ "Received $received arguments, but $expected was expected"
52
+ }
53
+ )
54
+
55
+ internal class NullArgumentException : CodedException(message = "Cannot assigned null to not nullable type.")
56
+
57
+ internal class MethodNotFoundException : CodedException(message = "Method does not exist.")
58
+
59
+ open class DecoratedException(message: String, cause: CodedException) : CodedException(
60
+ cause.code,
61
+ message = "$message\n→ Caused by: ${cause.message ?: cause}",
62
+ cause
63
+ )
64
+
65
+ internal class FunctionCallException(methodName: String, moduleName: String, cause: CodedException) : DecoratedException(
66
+ message = "Call to function '$moduleName.$methodName' has been rejected.",
67
+ cause
68
+ )
69
+
70
+ internal class PropSetException(propName: String, viewType: KClass<*>, cause: CodedException) : DecoratedException(
71
+ message = "Cannot set prop '$propName' on view '$viewType'",
72
+ cause
73
+ )
74
+
75
+ internal class ArgumentCastException(desiredType: String, argIndex: Int, providedType: String, cause: CodedException) : DecoratedException(
76
+ message = "The ${formatOrdinalNumber(argIndex + 1)} argument cannot be cast to type $desiredType (received $providedType)",
77
+ cause
78
+ ) {
79
+ companion object {
80
+ fun formatOrdinalNumber(number: Int) = "$number" + when {
81
+ (number % 100 in 11..13) -> "th"
82
+ (number % 10) == 1 -> "st"
83
+ (number % 10) == 2 -> "nd"
84
+ (number % 10) == 3 -> "rd"
85
+ else -> "th"
86
+ }
87
+ }
88
+ }
89
+
90
+ internal class IncompatibleArgTypeException(argumentType: KClass<*>, desiredType: KClass<*>, cause: Throwable? = null) :
91
+ CodedException("Argument type '$argumentType' is not compatible with expected type '$desiredType'.", cause)
92
+
93
+ internal class EnumNoSuchValueException(enumType: KClass<*>, enumConstants: List<Enum<*>>, value: Any?) : CodedException(
94
+ "'$value' is not present in ${enumType.simpleName} enum, it must be one of: ${enumConstants.joinToString(separator = ", ") { "'${it.name}'" }}"
95
+ )
96
+
97
+ internal class FieldRequiredException(property: String) :
98
+ CodedException(message = "Value for field '$property' is required, got nil")
99
+
100
+ internal class FieldCastException(fieldName: String, fieldType: KType, recordType: String, cause: CodedException) : DecoratedException(
101
+ message = "Cannot cast value for field '$fieldName' ('$fieldType') in record '$recordType'.",
102
+ cause
103
+ )
104
+
105
+ inline fun <T> exceptionDecorator(decoratorBlock: (e: CodedException) -> Throwable, block: () -> T): T {
106
+ try {
107
+ return block()
108
+ } catch (e: CodedException) {
109
+ throw decoratorBlock(e)
110
+ } catch (e: Throwable) {
111
+ throw decoratorBlock(UnexpectedException(e))
112
+ }
113
+ }
114
+
115
+ class Exceptions {
116
+ class AppContextLost : CodedException(message = "The app context has been lost")
117
+ class RuntimeLost : CodedException(message = "The runtime has been lost")
118
+ class ReactContextLost : CodedException(message = "The react context has been lost")
119
+ open class ModuleNotFound(type: KClass<*>) : CodedException(message = "$type module not found, make sure that everything is linked correctly")
120
+ class SimulatorNotSupported : CodedException(message = "This operation is not supported on the simulator")
121
+ class MissingPermissions(vararg permissions: String) : CodedException(message = "Missing permissions: ${permissions.joinToString(separator = ", ")}")
122
+ class MissingActivity : CodedException(message = "The current activity is no longer available")
123
+ class MissingRootView : CodedException(message = "The root view is missing")
124
+ class IllegalArgument(message: String, cause: Throwable? = null) : CodedException(message, cause)
125
+ class IllegalStateException(message: String, cause: Throwable? = null) : CodedException(message, cause)
126
+ }