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.
- package/README.md +28 -22
- package/cli/app-catalog.ts +29 -14
- package/cli/app-fonts.ts +5 -3
- package/cli/bridge-flow-runner.ts +40 -29
- package/cli/cloud-client.ts +57 -21
- package/cli/cloud-test-tunnel.ts +12 -18
- package/cli/commands/agent.ts +1 -1
- package/cli/commands/app-fonts.ts +3 -3
- package/cli/commands/assert.ts +8 -8
- package/cli/commands/auth.ts +8 -3
- package/cli/commands/box/bundle-plane.ts +13 -1
- package/cli/commands/box.ts +16 -5
- package/cli/commands/compat.ts +1 -1
- package/cli/commands/config.ts +2 -2
- package/cli/commands/control.ts +125 -71
- package/cli/commands/cpu-profile.ts +45 -1
- package/cli/commands/daemon.ts +131 -33
- package/cli/commands/debug.ts +24 -17
- package/cli/commands/desktop.ts +7 -1
- package/cli/commands/detect.ts +101 -0
- package/cli/commands/detox.ts +6 -6
- package/cli/commands/device.ts +12 -12
- package/cli/commands/electron.ts +32 -14
- package/cli/commands/flow.ts +49 -41
- package/cli/commands/guest-host.ts +39 -1
- package/cli/commands/inspect/core.ts +14 -8
- package/cli/commands/inspect/list.ts +1 -1
- package/cli/commands/inspect/settle.ts +5 -3
- package/cli/commands/inspect/settling.ts +229 -44
- package/cli/commands/inspect/wait-idle.ts +3 -2
- package/cli/commands/inspect.ts +105 -93
- package/cli/commands/install-cli.ts +36 -15
- package/cli/commands/install-desktop.ts +68 -195
- package/cli/commands/kotlin.ts +6 -5
- package/cli/commands/login.ts +5 -5
- package/cli/commands/maestro-compare.ts +554 -0
- package/cli/commands/maestro-generate.ts +6 -3
- package/cli/commands/maestro.ts +22 -0
- package/cli/commands/mode.ts +2 -2
- package/cli/commands/no-bridge-hint.ts +6 -2
- package/cli/commands/platform.ts +35 -6
- package/cli/commands/preview.ts +6 -0
- package/cli/commands/project-report.ts +10 -12
- package/cli/commands/record.ts +37 -37
- package/cli/commands/runtime.ts +9 -9
- package/cli/commands/screenshot-layers.ts +4 -4
- package/cli/commands/screenshot-mode.ts +2 -2
- package/cli/commands/screenshot.ts +8 -8
- package/cli/commands/screenshots-capture.ts +2 -2
- package/cli/commands/serve.ts +9 -12
- package/cli/commands/setup.ts +29 -14
- package/cli/commands/shell-boolean-mode.ts +2 -2
- package/cli/commands/show-touches-mode.ts +2 -2
- package/cli/commands/skills.ts +11 -11
- package/cli/commands/swift.ts +29 -11
- package/cli/commands/telemetry.ts +2 -2
- package/cli/commands/test.ts +5 -0
- package/cli/commands/three-mode.ts +3 -3
- package/cli/commands/timeline.ts +4 -4
- package/cli/commands/upgrade.ts +2 -2
- package/cli/commands/upload.ts +15 -15
- package/cli/commands/what-happened.ts +2 -2
- package/cli/current-sim.ts +6 -3
- package/cli/desktop-companion.ts +55 -149
- package/cli/dev-build-freshness.ts +2 -2
- package/cli/drivers/desktop.ts +17 -9
- package/cli/drivers/electron.ts +1 -2
- package/cli/drivers/playwright-sim-host.ts +11 -2
- package/cli/drivers/playwright.ts +35 -2
- package/cli/drivers/types.ts +8 -0
- package/cli/maestro-compare.ts +670 -0
- package/cli/outbound-endpoints.ts +46 -8
- package/cli/recording-access.ts +6 -6
- package/cli/run-registry.ts +1 -1
- package/cli/runtime-compat.ts +5 -1
- package/cli/send-to-box.ts +3 -3
- package/cli/shell-init.ts +2 -1
- package/cli/ws-bridge.ts +9 -5
- package/detox/element-types.ts +1 -0
- package/detox/gestures.ts +3 -3
- package/detox/index.ts +67 -38
- package/detox/navigation-lifecycle.ts +9 -6
- package/detox/proof-frame.cjs +6 -4
- package/dist-lib/agent-daemon-client.cjs +1 -1
- package/dist-lib/agent-events.cjs +1 -1
- package/dist-lib/attached-projects.cjs +1 -1
- package/dist-lib/auth/shared-session.cjs +1 -1
- package/dist-lib/backend-origin.cjs +1 -1
- package/dist-lib/beta.cjs +1 -1
- package/dist-lib/beta.mjs +1 -1
- package/dist-lib/bridge-constants.cjs +1 -1
- package/dist-lib/bridge-contract-input.cjs +42 -17
- package/dist-lib/bridge-contract-input.mjs +41 -16
- package/dist-lib/bridge-contract.cjs +1 -4
- package/dist-lib/bridge-contract.mjs +1 -3
- package/dist-lib/bundle-channel.cjs +2918 -550
- package/dist-lib/capture-contract.cjs +65 -24
- package/dist-lib/capture-contract.mjs +63 -24
- package/dist-lib/cloud-contract.cjs +2 -2
- package/dist-lib/cloud-contract.mjs +2 -2
- package/dist-lib/cloud-test-args.cjs +1 -1
- package/dist-lib/cloud-test-args.mjs +1 -1
- package/dist-lib/cloud.cjs +3 -3
- package/dist-lib/cloud.mjs +3 -3
- package/dist-lib/config.cjs +15 -5
- package/dist-lib/config.mjs +154 -0
- package/dist-lib/detox/index.cjs +495 -139
- package/dist-lib/dev-bundle-resolution.cjs +1 -1
- package/dist-lib/expo-swift-bundle.cjs +1168 -238
- package/dist-lib/expo-swift-metadata.cjs +34 -23
- package/dist-lib/expo-swift-metadata.mjs +32 -23
- package/dist-lib/home-paths.cjs +2 -2
- package/dist-lib/host/bridge-host.cjs +2938 -654
- package/dist-lib/host/fetch-proxy-handler.cjs +14 -1
- package/dist-lib/host/fetch-proxy-overrides.cjs +7 -1
- package/dist-lib/host/fetch-proxy-overrides.mjs +5 -1
- package/dist-lib/host/replacement-module-handler.cjs +2 -2
- package/dist-lib/host/websocket-proxy.cjs +1 -1
- package/dist-lib/index.cjs +999 -353
- package/dist-lib/jump-to-source-babel.cjs +1 -1
- package/dist-lib/jump-to-source-native.cjs +1 -1
- package/dist-lib/kotlin-host.cjs +332 -19
- package/dist-lib/menu.cjs +1 -1
- package/dist-lib/menu.mjs +1 -1
- package/dist-lib/metro-fingerprint-registry.cjs +1 -1
- package/dist-lib/metro-fingerprint-registry.mjs +1 -1
- package/dist-lib/metro-production-bundle.cjs +7 -7
- package/dist-lib/metro-production-bundle.mjs +5 -5
- package/dist-lib/metro.cjs +688 -250
- package/dist-lib/native-app-identity-project.cjs +2647 -0
- package/dist-lib/native-app-identity-project.mjs +1257 -0
- package/dist-lib/native-app-identity.cjs +325 -25
- package/dist-lib/native-app-identity.mjs +323 -25
- package/dist-lib/native-firebase-metadata.cjs +1 -1
- package/dist-lib/native-firebase-metadata.mjs +1 -1
- package/dist-lib/plist.cjs +1 -1
- package/dist-lib/plist.mjs +1 -1
- package/dist-lib/profiles.cjs +1 -1
- package/dist-lib/public-brand.cjs +1 -1
- package/dist-lib/react-native-host-modules.cjs +5 -1
- package/dist-lib/react-native-host-modules.mjs +5 -1
- package/dist-lib/scripts/dev-server-scanner.cjs +57 -32
- package/dist-lib/sdk.cjs +231 -51
- package/dist-lib/sdk.mjs +231 -51
- package/dist-lib/skills.cjs +4107 -1374
- package/dist-lib/swift-compile.cjs +290 -30
- package/dist-lib/swift-compile.mjs +290 -30
- package/dist-lib/swift-package.cjs +143 -12
- package/dist-lib/swift-package.mjs +137 -11
- package/dist-lib/swift-submit.cjs +47 -5
- package/dist-lib/swift-submit.mjs +42 -5
- package/dist-lib/swift-toolchain.cjs +7 -2
- package/dist-lib/swift.cjs +1 -1
- package/dist-lib/vite-swift.cjs +1392 -458
- package/dist-lib/vite.cjs +13 -17
- package/dist-lib/worklet-executable.cjs +248 -33
- package/dist-lib/worklet-executable.mjs +248 -33
- package/install.sh +10 -1
- package/kotlin/{AppSources → AndroidViewSources}/android/content/res/Resources.kt +9 -9
- package/kotlin/AndroidViewSources/android/graphics/Canvas.kt +20 -0
- package/kotlin/AndroidViewSources/android/view/View.kt +211 -0
- package/kotlin/AndroidViewSources/android/widget/FrameLayout.kt +61 -0
- package/kotlin/AndroidViewSources/android/widget/LinearLayout.kt +49 -0
- package/kotlin/AppSources/android/view/Window.kt +36 -0
- package/kotlin/AppSources/android/view/WindowInsets.kt +9 -0
- package/kotlin/AppSources/android/view/WindowInsetsController.kt +5 -0
- package/kotlin/AppSources/android/window/OnBackInvokedDispatcher.kt +48 -0
- package/kotlin/AppSources/androidx/activity/OnBackPressedDispatcher.kt +20 -5
- package/kotlin/AppSources/androidx/compose/foundation/layout/WindowInsets.kt +15 -0
- package/kotlin/AppSources/androidx/compose/ui/platform/ComposeView.kt +2 -1
- package/kotlin/AppSources/dev/peach/app/PeachApp.kt +42 -50
- package/kotlin/ComposeSources/PeachComposeHost.kt +200 -84
- package/kotlin/ExpoComposeSources/PeachAndroidView.kt +87 -0
- package/kotlin/ExpoComposeSources/PeachExpoViewMount.kt +24 -0
- package/kotlin/ExpoComposeSources/dev/peach/expo/PeachExpoCompose.kt +28 -0
- package/kotlin/ExpoComposeSources/expo/modules/kotlin/views/ExpoComposeView.kt +70 -0
- package/kotlin/ExpoSources/dev/peach/expo/PeachExpoRuntime.kt +513 -0
- package/kotlin/ExpoSources/dev/peach/expo/PeachExpoTypes.kt +173 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/AppContext.kt +20 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/Promise.kt +19 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/classcomponent/ClassComponentBuilder.kt +198 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/exception/CodedException.kt +126 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/functions/Functions.kt +132 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/jni/JavaScriptTypedArray.kt +81 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/modules/Module.kt +98 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/objects/ObjectDefinitionBuilder.kt +236 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/records/Record.kt +12 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/runtime/Runtime.kt +9 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/sharedobjects/SharedObject.kt +50 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/sharedobjects/SharedObjectRegistry.kt +57 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/sharedobjects/SharedRef.kt +19 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/typedarray/ConcreteTypedArrays.kt +158 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/typedarray/GenericTypedArray.kt +8 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/typedarray/TypedArray.kt +29 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/typedarray/TypedArrayIterator.kt +9 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/types/AnyType.kt +155 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/types/Either.kt +91 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/types/Enumerable.kt +6 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/viewevent/ViewEvent.kt +54 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/views/ExpoView.kt +23 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/views/ViewDefinitionBuilder.kt +71 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/views/ViewProps.kt +35 -0
- package/kotlin/README.md +13 -3
- package/kotlin/Sources/android/os/Build.kt +17 -0
- package/kotlin/Sources/android/os/Handler.kt +35 -0
- package/kotlin/Sources/android/os/Looper.kt +17 -0
- package/kotlin/Sources/android/os/MessageQueue.kt +56 -0
- package/kotlin/Sources/android/os/SystemClock.kt +14 -0
- package/kotlin/Sources/android/util/Log.kt +64 -0
- package/kotlin/Sources/java/security/MessageDigest.kt +114 -0
- package/kotlin/Sources/kotlin/text/StringFormat.kt +9 -0
- package/kotlin/Sources/org/json/JSON.kt +44 -0
- package/kotlin/fixtures/counter/Counter.d.kt.ts +1 -0
- package/kotlin/fixtures/counter/Counter.kt +10 -3
- package/kotlin/fixtures/counter/CounterApp.native.tsx +1 -1
- package/kotlin/fixtures/counter/vite.config.ts +2 -2
- package/kotlin/fixtures/headless-counter/Headless.kt +7 -6
- package/kotlin/fixtures/import-animation/Animation.d.kt.ts +7 -0
- package/kotlin/fixtures/import-animation/Animation.kt +80 -0
- package/kotlin/fixtures/import-animation/ImportAnimation.native.tsx +13 -0
- package/kotlin/fixtures/import-animation/README.md +24 -0
- package/kotlin/fixtures/import-animation/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-animation/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-animation/app/routes.d.ts +18 -0
- package/kotlin/fixtures/import-animation/package.json +23 -0
- package/kotlin/fixtures/import-animation/tsconfig.json +20 -0
- package/kotlin/fixtures/import-animation/vite.config.ts +20 -0
- package/kotlin/fixtures/import-editor/Editor.d.kt.ts +7 -0
- package/kotlin/fixtures/import-editor/Editor.kt +59 -0
- package/kotlin/fixtures/import-editor/ImportEditor.native.tsx +23 -0
- package/kotlin/fixtures/import-editor/README.md +27 -0
- package/kotlin/fixtures/import-editor/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-editor/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-editor/package.json +23 -0
- package/kotlin/fixtures/import-editor/tsconfig.json +20 -0
- package/kotlin/fixtures/import-editor/vite.config.ts +20 -0
- package/kotlin/fixtures/import-effects/Effects.d.kt.ts +7 -0
- package/kotlin/fixtures/import-effects/Effects.kt +87 -0
- package/kotlin/fixtures/import-effects/ImportEffects.native.tsx +13 -0
- package/kotlin/fixtures/import-effects/README.md +19 -0
- package/kotlin/fixtures/import-effects/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-effects/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-effects/package.json +23 -0
- package/kotlin/fixtures/import-effects/tsconfig.json +20 -0
- package/kotlin/fixtures/import-effects/vite.config.ts +20 -0
- package/kotlin/fixtures/import-layout/ImportLayout.native.tsx +13 -0
- package/kotlin/fixtures/import-layout/Layout.d.kt.ts +7 -0
- package/kotlin/fixtures/import-layout/Layout.kt +72 -0
- package/kotlin/fixtures/import-layout/README.md +24 -0
- package/kotlin/fixtures/import-layout/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-layout/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-layout/package.json +23 -0
- package/kotlin/fixtures/import-layout/tsconfig.json +20 -0
- package/kotlin/fixtures/import-layout/vite.config.ts +20 -0
- package/kotlin/fixtures/import-navigation/ImportNavigation.native.tsx +18 -0
- package/kotlin/fixtures/import-navigation/Navigation.d.kt.ts +7 -0
- package/kotlin/fixtures/import-navigation/Navigation.kt +104 -0
- package/kotlin/fixtures/import-navigation/README.md +31 -0
- package/kotlin/fixtures/import-navigation/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-navigation/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-navigation/package.json +23 -0
- package/kotlin/fixtures/import-navigation/tsconfig.json +20 -0
- package/kotlin/fixtures/import-navigation/vite.config.ts +20 -0
- package/kotlin/fixtures/import-overlays/ImportOverlays.native.tsx +29 -0
- package/kotlin/fixtures/import-overlays/Overlays.d.kt.ts +7 -0
- package/kotlin/fixtures/import-overlays/Overlays.kt +93 -0
- package/kotlin/fixtures/import-overlays/README.md +34 -0
- package/kotlin/fixtures/import-overlays/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-overlays/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-overlays/package.json +23 -0
- package/kotlin/fixtures/import-overlays/tsconfig.json +20 -0
- package/kotlin/fixtures/import-overlays/vite.config.ts +20 -0
- package/kotlin/fixtures/import-scroll/ImportScroll.native.tsx +13 -0
- package/kotlin/fixtures/import-scroll/README.md +23 -0
- package/kotlin/fixtures/import-scroll/Scroll.d.kt.ts +7 -0
- package/kotlin/fixtures/import-scroll/Scroll.kt +91 -0
- package/kotlin/fixtures/import-scroll/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-scroll/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-scroll/package.json +23 -0
- package/kotlin/fixtures/import-scroll/tsconfig.json +20 -0
- package/kotlin/fixtures/import-scroll/vite.config.ts +20 -0
- package/kotlin/fixtures/import-selection/ImportSelection.native.tsx +44 -0
- package/kotlin/fixtures/import-selection/README.md +32 -0
- package/kotlin/fixtures/import-selection/Selection.d.kt.ts +8 -0
- package/kotlin/fixtures/import-selection/Selection.kt +78 -0
- package/kotlin/fixtures/import-selection/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-selection/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-selection/package.json +23 -0
- package/kotlin/fixtures/import-selection/tsconfig.json +20 -0
- package/kotlin/fixtures/import-selection/vite.config.ts +20 -0
- package/kotlin/fixtures/import-surfaces/ImportSurfaces.native.tsx +13 -0
- package/kotlin/fixtures/import-surfaces/README.md +22 -0
- package/kotlin/fixtures/import-surfaces/Surfaces.d.kt.ts +7 -0
- package/kotlin/fixtures/import-surfaces/Surfaces.kt +64 -0
- package/kotlin/fixtures/import-surfaces/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-surfaces/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-surfaces/package.json +23 -0
- package/kotlin/fixtures/import-surfaces/tsconfig.json +20 -0
- package/kotlin/fixtures/import-surfaces/vite.config.ts +20 -0
- package/kotlin/fixtures/import-values/ImportValues.native.tsx +35 -0
- package/kotlin/fixtures/import-values/README.md +23 -0
- package/kotlin/fixtures/import-values/Values.d.kt.ts +11 -0
- package/kotlin/fixtures/import-values/Values.kt +66 -0
- package/kotlin/fixtures/import-values/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-values/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-values/package.json +23 -0
- package/kotlin/fixtures/import-values/tsconfig.json +20 -0
- package/kotlin/fixtures/import-values/vite.config.ts +20 -0
- package/kotlin/fixtures/kotlin-app-variants/BarBehavior.kt +38 -0
- package/kotlin/fixtures/kotlin-app-variants/BarVisibility.kt +36 -0
- package/kotlin/fixtures/kotlin-app-variants/Ime.kt +3 -1
- package/kotlin/fixtures/kotlin-app-variants/TransientInsets.kt +50 -0
- package/kotlin/fork/NOTICE +6 -1
- package/kotlin/fork/README.md +15 -7
- package/kotlin/fork/build.sh +2 -0
- package/kotlin/fork/compose-worker-globals.patch +186 -4
- package/kotlin/fork/fork.json +2 -2
- package/kotlin/fork/skiko-worker-clock.patch +12 -0
- package/kotlin/toolchain.json +12 -12
- package/kotlin/tools/expo-types.main.kts +115 -0
- package/package.json +17 -23
- package/scripts/dev-server-scanner.ts +92 -66
- package/skills/contrast/SKILL.md +2 -2
- package/skills/peach-debug/SKILL.md +1 -1
- package/skills/peach-perf/SKILL.md +1 -1
- package/skills/peach-setup/SKILL.md +2 -1
- package/skills/peach-test/SKILL.md +8 -0
- package/src/assetCatalogContract.ts +43 -1
- package/src/bridge-contract-input.ts +46 -19
- package/src/bridge-contract.ts +0 -1
- package/src/bundle-channel.mjs +197 -84
- package/src/bundleGlobalFooter.ts +38 -0
- package/src/capture-contract.ts +107 -33
- package/src/cloud-contract.ts +5 -1
- package/src/cloud.ts +5 -2
- package/src/config.ts +22 -3
- package/src/configured-bundle-producer.ts +1 -1
- package/src/desktop-host-delivery.ts +95 -1
- package/src/expo-kotlin-bundle.ts +29 -0
- package/src/expo-kotlin-host.ts +201 -0
- package/src/expo-swift-host.ts +96 -76
- package/src/expoKotlinContract.ts +70 -0
- package/src/expoSwiftContract.ts +4 -25
- package/src/home-paths.ts +7 -4
- package/src/host/bridge-host.ts +23 -3
- package/src/host/fetch-proxy-handler.ts +13 -0
- package/src/host/fetch-proxy-overrides.ts +11 -0
- package/src/host/replacement-module-handler.ts +5 -2
- package/src/index.ts +3 -1
- package/src/kotlin-host.ts +463 -19
- package/src/metro-plugin.ts +56 -28
- package/src/metro-production-bundle.ts +2 -2
- package/src/native-app-identity-project.ts +190 -0
- package/src/native-app-identity.ts +398 -34
- package/src/native-firebase-config.ts +69 -15
- package/src/native-seam-manifest.ts +6 -0
- package/src/one-widget-discovery.ts +2 -1
- package/src/openstep-plist.ts +107 -0
- package/src/react-native-host-modules.ts +4 -0
- package/src/runtime-assets.ts +2 -2
- package/src/sim-client.ts +2 -2
- package/src/swift-binary-modules.ts +3 -1
- package/src/swift-compile.ts +286 -38
- package/src/swift-distribution-contract.ts +4 -0
- package/src/swift-distribution.lock.json +123 -12
- package/src/swift-distribution.ts +7 -3
- package/src/swift-host.ts +298 -83
- package/src/swift-package-manifest.ts +29 -2
- package/src/swift-package.ts +180 -10
- package/src/swift-packages.ts +4 -0
- package/src/swift-standin-emit.ts +4 -1
- package/src/swift-standins.ts +274 -15
- package/src/swift-submit.ts +62 -7
- package/src/swift-toolchain.ts +6 -1
- package/src/swiftContract.ts +126 -3
- package/src/vite-plugin-one.ts +13 -16
- package/src/vite-plugin-swift.ts +4 -5
- package/src/vite-plugin.ts +360 -144
- package/src/vite.d.ts +1 -1
- package/src/worker-system-chunks.ts +221 -0
- package/src/worklet-executable.ts +348 -38
- package/src/worklets-babel.ts +1 -1
- package/src/xcode-project.ts +243 -127
- package/dist-lib/agent-identity.cjs +0 -39
- package/dist-lib/agent-sessions.cjs +0 -760
- package/dist-lib/cli-constants.cjs +0 -32
- package/dist-lib/render-mode.cjs +0 -44
- package/kotlin/AppSources/android/view/View.kt +0 -74
- package/kotlin/AppSources/android/widget/FrameLayout.kt +0 -6
- package/src/render-mode.ts +0 -15
- /package/kotlin/{AppSources → AndroidViewSources}/android/content/Context.kt +0 -0
- /package/kotlin/{AppSources → AndroidViewSources}/android/content/res/Configuration.kt +0 -0
- /package/kotlin/{AppSources → AndroidViewSources}/android/graphics/Color.kt +0 -0
- /package/kotlin/{AppSources → AndroidViewSources}/android/util/DisplayMetrics.kt +0 -0
- /package/kotlin/{AppSources → AndroidViewSources}/dev/peach/app/JavaFormat.kt +0 -0
- /package/kotlin/{AppSources → Sources}/java/lang/Runnable.kt +0 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
package expo.modules.kotlin.sharedobjects
|
|
2
|
+
|
|
3
|
+
import expo.modules.kotlin.exception.CodedException
|
|
4
|
+
import kotlin.reflect.KClass
|
|
5
|
+
|
|
6
|
+
value class SharedObjectId(val value: Int)
|
|
7
|
+
|
|
8
|
+
internal class InvalidSharedObjectIdException : CodedException(
|
|
9
|
+
message = "Cannot convert provided JavaScriptObject to the SharedObject, because it doesn't contain valid id",
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
internal class UsingReleasedSharedObjectException : CodedException(
|
|
13
|
+
message = "Cannot use shared object that was already released",
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
// the JavaScript class a Class definition exports, by module and name
|
|
17
|
+
internal class SharedObjectClass(val module: String, val name: String)
|
|
18
|
+
|
|
19
|
+
// the native half of every shared object the process's JavaScript holds.
|
|
20
|
+
// JavaScript keeps its objects by id; this side keeps the natives until
|
|
21
|
+
// JavaScript releases them or collects their objects.
|
|
22
|
+
internal class SharedObjectRegistry {
|
|
23
|
+
private var currentId = 1
|
|
24
|
+
private val objects = HashMap<Int, SharedObject>()
|
|
25
|
+
private val classes = HashMap<KClass<*>, SharedObjectClass>()
|
|
26
|
+
// events for the runtime to queue: the object, its event and payload
|
|
27
|
+
var emitter: ((SharedObject, String, List<Any?>) -> Unit)? = null
|
|
28
|
+
|
|
29
|
+
fun addClass(type: KClass<*>, exported: SharedObjectClass) {
|
|
30
|
+
classes[type] = exported
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
fun classOf(native: SharedObject): SharedObjectClass? = classes[native::class]
|
|
34
|
+
|
|
35
|
+
fun add(native: SharedObject): SharedObjectId {
|
|
36
|
+
val id = SharedObjectId(currentId++)
|
|
37
|
+
native.sharedObjectId = id
|
|
38
|
+
objects[id.value] = native
|
|
39
|
+
return id
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
fun delete(id: SharedObjectId) {
|
|
43
|
+
val native = objects.remove(id.value) ?: return
|
|
44
|
+
native.sharedObjectId = SharedObjectId(0)
|
|
45
|
+
native.sharedObjectDidRelease()
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
fun toNativeObject(id: SharedObjectId): SharedObject {
|
|
49
|
+
objects[id.value]?.let { return it }
|
|
50
|
+
if (id.value != 0 && id.value < currentId) throw UsingReleasedSharedObjectException()
|
|
51
|
+
throw InvalidSharedObjectIdException()
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
fun emit(native: SharedObject, event: String, payload: List<Any?>) {
|
|
55
|
+
emitter?.invoke(native, event, payload)
|
|
56
|
+
}
|
|
57
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
package expo.modules.kotlin.sharedobjects
|
|
2
|
+
|
|
3
|
+
import expo.modules.kotlin.AppContext
|
|
4
|
+
import expo.modules.kotlin.runtime.Runtime
|
|
5
|
+
|
|
6
|
+
open class SharedRef<RefType>(
|
|
7
|
+
val ref: RefType,
|
|
8
|
+
runtime: Runtime? = null,
|
|
9
|
+
) : SharedObject(runtime) {
|
|
10
|
+
constructor(ref: RefType, appContext: AppContext) : this(ref, appContext.runtime)
|
|
11
|
+
|
|
12
|
+
open val nativeRefType = "unknown"
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
@Suppress("UNCHECKED_CAST")
|
|
16
|
+
inline fun <reified RefType> SharedRef<*>.cast(): SharedRef<RefType>? {
|
|
17
|
+
if (ref is RefType) return this as SharedRef<RefType>
|
|
18
|
+
return null
|
|
19
|
+
}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
package expo.modules.kotlin.typedarray
|
|
2
|
+
|
|
3
|
+
import expo.modules.kotlin.jni.JavaScriptTypedArray
|
|
4
|
+
|
|
5
|
+
@Suppress("NOTHING_TO_INLINE")
|
|
6
|
+
private inline fun TypedArray.checkIfInRange(index: Int) {
|
|
7
|
+
if (index !in 0..<length) {
|
|
8
|
+
throw IndexOutOfBoundsException()
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
interface RawTypedArrayHolder {
|
|
13
|
+
val rawArray: JavaScriptTypedArray
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
class Int8Array(override val rawArray: JavaScriptTypedArray) :
|
|
17
|
+
TypedArray by rawArray, GenericTypedArray<Byte>, RawTypedArrayHolder {
|
|
18
|
+
override operator fun get(index: Int): Byte {
|
|
19
|
+
checkIfInRange(index)
|
|
20
|
+
return readByte(index * Byte.SIZE_BYTES)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
override operator fun set(index: Int, value: Byte) {
|
|
24
|
+
checkIfInRange(index)
|
|
25
|
+
writeByte(index * Byte.SIZE_BYTES, value)
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
class Int16Array(override val rawArray: JavaScriptTypedArray) :
|
|
30
|
+
TypedArray by rawArray, GenericTypedArray<Short>, RawTypedArrayHolder {
|
|
31
|
+
override operator fun get(index: Int): Short {
|
|
32
|
+
checkIfInRange(index)
|
|
33
|
+
return read2Byte(index * Short.SIZE_BYTES)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
override operator fun set(index: Int, value: Short) {
|
|
37
|
+
checkIfInRange(index)
|
|
38
|
+
write2Byte(index * Short.SIZE_BYTES, value)
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
class Int32Array(override val rawArray: JavaScriptTypedArray) :
|
|
43
|
+
TypedArray by rawArray, GenericTypedArray<Int>, RawTypedArrayHolder {
|
|
44
|
+
override operator fun get(index: Int): Int {
|
|
45
|
+
checkIfInRange(index)
|
|
46
|
+
return read4Byte(index * Int.SIZE_BYTES)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
override operator fun set(index: Int, value: Int) {
|
|
50
|
+
checkIfInRange(index)
|
|
51
|
+
write4Byte(index * Int.SIZE_BYTES, value)
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
class Uint8Array(override val rawArray: JavaScriptTypedArray) :
|
|
56
|
+
TypedArray by rawArray, GenericTypedArray<UByte>, RawTypedArrayHolder {
|
|
57
|
+
override operator fun get(index: Int): UByte {
|
|
58
|
+
checkIfInRange(index)
|
|
59
|
+
return readByte(index * UByte.SIZE_BYTES).toUByte()
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
override operator fun set(index: Int, value: UByte) {
|
|
63
|
+
checkIfInRange(index)
|
|
64
|
+
writeByte(index * UByte.SIZE_BYTES, value.toByte())
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
class Uint8ClampedArray(override val rawArray: JavaScriptTypedArray) :
|
|
69
|
+
TypedArray by rawArray, GenericTypedArray<UByte>, RawTypedArrayHolder {
|
|
70
|
+
override operator fun get(index: Int): UByte {
|
|
71
|
+
checkIfInRange(index)
|
|
72
|
+
return readByte(index * UByte.SIZE_BYTES).toUByte()
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
override operator fun set(index: Int, value: UByte) {
|
|
76
|
+
checkIfInRange(index)
|
|
77
|
+
writeByte(index * UByte.SIZE_BYTES, value.toByte())
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
class Uint16Array(override val rawArray: JavaScriptTypedArray) :
|
|
82
|
+
TypedArray by rawArray, GenericTypedArray<UShort>, RawTypedArrayHolder {
|
|
83
|
+
override operator fun get(index: Int): UShort {
|
|
84
|
+
checkIfInRange(index)
|
|
85
|
+
return read2Byte(index * UShort.SIZE_BYTES).toUShort()
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
override operator fun set(index: Int, value: UShort) {
|
|
89
|
+
checkIfInRange(index)
|
|
90
|
+
write2Byte(index * UShort.SIZE_BYTES, value.toShort())
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
class Uint32Array(override val rawArray: JavaScriptTypedArray) :
|
|
95
|
+
TypedArray by rawArray, GenericTypedArray<UInt>, RawTypedArrayHolder {
|
|
96
|
+
override operator fun get(index: Int): UInt {
|
|
97
|
+
checkIfInRange(index)
|
|
98
|
+
return read4Byte(index * UInt.SIZE_BYTES).toUInt()
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
override operator fun set(index: Int, value: UInt) {
|
|
102
|
+
checkIfInRange(index)
|
|
103
|
+
write4Byte(index * UInt.SIZE_BYTES, value.toInt())
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
class Float32Array(override val rawArray: JavaScriptTypedArray) :
|
|
108
|
+
TypedArray by rawArray, GenericTypedArray<Float>, RawTypedArrayHolder {
|
|
109
|
+
override operator fun get(index: Int): Float {
|
|
110
|
+
checkIfInRange(index)
|
|
111
|
+
return readFloat(index * Float.SIZE_BYTES)
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
override operator fun set(index: Int, value: Float) {
|
|
115
|
+
checkIfInRange(index)
|
|
116
|
+
writeFloat(index * Float.SIZE_BYTES, value)
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
class Float64Array(override val rawArray: JavaScriptTypedArray) :
|
|
121
|
+
TypedArray by rawArray, GenericTypedArray<Double>, RawTypedArrayHolder {
|
|
122
|
+
|
|
123
|
+
override operator fun get(index: Int): Double {
|
|
124
|
+
checkIfInRange(index)
|
|
125
|
+
return readDouble(index * Double.SIZE_BYTES)
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
override operator fun set(index: Int, value: Double) {
|
|
129
|
+
checkIfInRange(index)
|
|
130
|
+
writeDouble(index * Double.SIZE_BYTES, value)
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
class BigInt64Array(override val rawArray: JavaScriptTypedArray) :
|
|
135
|
+
TypedArray by rawArray, GenericTypedArray<Long>, RawTypedArrayHolder {
|
|
136
|
+
override operator fun get(index: Int): Long {
|
|
137
|
+
checkIfInRange(index)
|
|
138
|
+
return read8Byte(index * Long.SIZE_BYTES)
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
override operator fun set(index: Int, value: Long) {
|
|
142
|
+
checkIfInRange(index)
|
|
143
|
+
write8Byte(index * Long.SIZE_BYTES, value)
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
class BigUint64Array(override val rawArray: JavaScriptTypedArray) :
|
|
148
|
+
TypedArray by rawArray, GenericTypedArray<ULong>, RawTypedArrayHolder {
|
|
149
|
+
override operator fun get(index: Int): ULong {
|
|
150
|
+
checkIfInRange(index)
|
|
151
|
+
return read8Byte(index * ULong.SIZE_BYTES).toULong()
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
override operator fun set(index: Int, value: ULong) {
|
|
155
|
+
checkIfInRange(index)
|
|
156
|
+
write8Byte(index * ULong.SIZE_BYTES, value.toLong())
|
|
157
|
+
}
|
|
158
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
package expo.modules.kotlin.typedarray
|
|
2
|
+
|
|
3
|
+
import expo.modules.kotlin.jni.TypedArrayKind
|
|
4
|
+
|
|
5
|
+
// upstream's typed array interface. toDirectBuffer is left out: Kotlin/Wasm
|
|
6
|
+
// has no java.nio.
|
|
7
|
+
interface TypedArray {
|
|
8
|
+
val kind: TypedArrayKind
|
|
9
|
+
val length: Int
|
|
10
|
+
val byteLength: Int
|
|
11
|
+
val byteOffset: Int
|
|
12
|
+
|
|
13
|
+
fun read(buffer: ByteArray, position: Int, size: Int)
|
|
14
|
+
fun write(buffer: ByteArray, position: Int, size: Int)
|
|
15
|
+
|
|
16
|
+
fun readByte(position: Int): Byte
|
|
17
|
+
fun read2Byte(position: Int): Short
|
|
18
|
+
fun read4Byte(position: Int): Int
|
|
19
|
+
fun read8Byte(position: Int): Long
|
|
20
|
+
fun readFloat(position: Int): Float
|
|
21
|
+
fun readDouble(position: Int): Double
|
|
22
|
+
|
|
23
|
+
fun writeByte(position: Int, value: Byte)
|
|
24
|
+
fun write2Byte(position: Int, value: Short)
|
|
25
|
+
fun write4Byte(position: Int, value: Int)
|
|
26
|
+
fun write8Byte(position: Int, value: Long)
|
|
27
|
+
fun writeFloat(position: Int, value: Float)
|
|
28
|
+
fun writeDouble(position: Int, value: Double)
|
|
29
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
package expo.modules.kotlin.typedarray
|
|
2
|
+
|
|
3
|
+
class TypedArrayIterator<T>(private val typedArray: GenericTypedArray<T>) : Iterator<T> {
|
|
4
|
+
private var current = 0
|
|
5
|
+
|
|
6
|
+
override fun hasNext(): Boolean = current < typedArray.length
|
|
7
|
+
|
|
8
|
+
override fun next(): T = typedArray[current++]
|
|
9
|
+
}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
package expo.modules.kotlin.types
|
|
2
|
+
|
|
3
|
+
import dev.peach.expo.PeachExpoRuntime
|
|
4
|
+
import dev.peach.expo.PeachExpoTypes
|
|
5
|
+
import expo.modules.kotlin.exception.CodedException
|
|
6
|
+
import expo.modules.kotlin.exception.NullArgumentException
|
|
7
|
+
import expo.modules.kotlin.exception.UnexpectedException
|
|
8
|
+
import expo.modules.kotlin.jni.JavaScriptTypedArray
|
|
9
|
+
import expo.modules.kotlin.sharedobjects.SharedObjectId
|
|
10
|
+
import expo.modules.kotlin.sharedobjects.SharedRef
|
|
11
|
+
import expo.modules.kotlin.typedarray.BigInt64Array
|
|
12
|
+
import expo.modules.kotlin.typedarray.BigUint64Array
|
|
13
|
+
import expo.modules.kotlin.typedarray.Float32Array
|
|
14
|
+
import expo.modules.kotlin.typedarray.Float64Array
|
|
15
|
+
import expo.modules.kotlin.typedarray.Int16Array
|
|
16
|
+
import expo.modules.kotlin.typedarray.Int32Array
|
|
17
|
+
import expo.modules.kotlin.typedarray.Int8Array
|
|
18
|
+
import expo.modules.kotlin.typedarray.TypedArray
|
|
19
|
+
import expo.modules.kotlin.typedarray.Uint16Array
|
|
20
|
+
import expo.modules.kotlin.typedarray.Uint32Array
|
|
21
|
+
import expo.modules.kotlin.typedarray.Uint8Array
|
|
22
|
+
import expo.modules.kotlin.typedarray.Uint8ClampedArray
|
|
23
|
+
import kotlin.reflect.KClass
|
|
24
|
+
import kotlin.reflect.KType
|
|
25
|
+
import kotlin.reflect.typeOf
|
|
26
|
+
|
|
27
|
+
// an argument's desired type, as toArgsArray reads it from the reified DSL.
|
|
28
|
+
// JavaScript values arrive as JSI hands them to the converters: numbers as
|
|
29
|
+
// Double, objects as String-keyed maps, arrays as lists, undefined as null,
|
|
30
|
+
// typed arrays as JavaScriptTypedArray and shared objects as their id.
|
|
31
|
+
class AnyType(val kType: KType) {
|
|
32
|
+
val isNullable: Boolean get() = kType.isMarkedNullable
|
|
33
|
+
|
|
34
|
+
fun convert(value: Any?): Any? = convertValue(kType, value)
|
|
35
|
+
|
|
36
|
+
override fun toString(): String = kType.toString()
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
class TypeCastException(message: String) : CodedException(message = message) {
|
|
40
|
+
constructor(value: Any?, type: KType) : this("Cannot convert '${value}' to the Kotlin type '$type'")
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
@PublishedApi
|
|
44
|
+
internal fun anyTypeOf(type: KType): AnyType = AnyType(type)
|
|
45
|
+
|
|
46
|
+
inline fun <reified T> toAnyType(): AnyType = anyTypeOf(typeOf<T>())
|
|
47
|
+
|
|
48
|
+
private fun number(value: Any?, type: KType): Double = value as? Double ?: throw ClassCastException("Cannot convert '$value' to '$type'")
|
|
49
|
+
|
|
50
|
+
private fun argument(type: KType, index: Int): KType =
|
|
51
|
+
type.arguments.getOrNull(index)?.type ?: typeOf<Any?>()
|
|
52
|
+
|
|
53
|
+
private fun convertValue(type: KType, raw: Any?): Any? {
|
|
54
|
+
if (raw == null) {
|
|
55
|
+
if (type.isMarkedNullable || type.classifier == Unit::class) return null
|
|
56
|
+
throw NullArgumentException()
|
|
57
|
+
}
|
|
58
|
+
val value = if (raw is SharedObjectId) PeachExpoRuntime.sharedObject(raw) else raw
|
|
59
|
+
val classifier = type.classifier as? KClass<*> ?: return value
|
|
60
|
+
return when (classifier) {
|
|
61
|
+
Any::class -> value
|
|
62
|
+
String::class -> value as? String ?: throw ClassCastException("Cannot convert '$value' to '$type'")
|
|
63
|
+
Boolean::class -> value as? Boolean ?: throw ClassCastException("Cannot convert '$value' to '$type'")
|
|
64
|
+
Double::class -> number(value, type)
|
|
65
|
+
Float::class -> number(value, type).toFloat()
|
|
66
|
+
Int::class -> number(value, type).toInt()
|
|
67
|
+
Long::class -> number(value, type).toLong()
|
|
68
|
+
Short::class -> number(value, type).toInt().toShort()
|
|
69
|
+
Byte::class -> number(value, type).toInt().toByte()
|
|
70
|
+
Number::class -> number(value, type)
|
|
71
|
+
Unit::class -> Unit
|
|
72
|
+
List::class, MutableList::class, ArrayList::class, Collection::class, Iterable::class ->
|
|
73
|
+
list(value, type).mapTo(ArrayList()) { convertValue(argument(type, 0), it) }
|
|
74
|
+
Set::class, MutableSet::class, HashSet::class, LinkedHashSet::class ->
|
|
75
|
+
list(value, type).mapTo(LinkedHashSet()) { convertValue(argument(type, 0), it) }
|
|
76
|
+
Map::class, MutableMap::class, HashMap::class, LinkedHashMap::class -> {
|
|
77
|
+
val map = value as? Map<*, *> ?: throw TypeCastException(value, type)
|
|
78
|
+
map.entries.associateTo(LinkedHashMap()) { (key, item) -> key to convertValue(argument(type, 1), item) }
|
|
79
|
+
}
|
|
80
|
+
Pair::class -> {
|
|
81
|
+
val items = list(value, type)
|
|
82
|
+
if (items.size != 2) throw TypeCastException(value, type)
|
|
83
|
+
Pair(convertValue(argument(type, 0), items[0]), convertValue(argument(type, 1), items[1]))
|
|
84
|
+
}
|
|
85
|
+
IntArray::class -> list(value, type).map { number(it, type).toInt() }.toIntArray()
|
|
86
|
+
LongArray::class -> list(value, type).map { number(it, type).toLong() }.toLongArray()
|
|
87
|
+
DoubleArray::class -> list(value, type).map { number(it, type) }.toDoubleArray()
|
|
88
|
+
FloatArray::class -> list(value, type).map { number(it, type).toFloat() }.toFloatArray()
|
|
89
|
+
BooleanArray::class -> list(value, type).map { it as? Boolean ?: throw TypeCastException(it, type) }.toBooleanArray()
|
|
90
|
+
// the single ByteArray frontend converter copies raw view bytes without a kind check
|
|
91
|
+
ByteArray::class -> (value as? JavaScriptTypedArray)?.bytes?.copyOf()
|
|
92
|
+
?: throw TypeCastException(value, type)
|
|
93
|
+
TypedArray::class -> typedArray(value, type)
|
|
94
|
+
Int8Array::class -> Int8Array(typedArray(value, type))
|
|
95
|
+
Int16Array::class -> Int16Array(typedArray(value, type))
|
|
96
|
+
Int32Array::class -> Int32Array(typedArray(value, type))
|
|
97
|
+
Uint8Array::class -> Uint8Array(typedArray(value, type))
|
|
98
|
+
Uint8ClampedArray::class -> Uint8ClampedArray(typedArray(value, type))
|
|
99
|
+
Uint16Array::class -> Uint16Array(typedArray(value, type))
|
|
100
|
+
Uint32Array::class -> Uint32Array(typedArray(value, type))
|
|
101
|
+
Float32Array::class -> Float32Array(typedArray(value, type))
|
|
102
|
+
Float64Array::class -> Float64Array(typedArray(value, type))
|
|
103
|
+
BigInt64Array::class -> BigInt64Array(typedArray(value, type))
|
|
104
|
+
BigUint64Array::class -> BigUint64Array(typedArray(value, type))
|
|
105
|
+
SharedRef::class -> sharedRef(value, type)
|
|
106
|
+
Either::class, EitherOfThree::class, EitherOfFour::class -> either(classifier, type, value)
|
|
107
|
+
// records and enums convert through the host's generated registrations
|
|
108
|
+
else -> {
|
|
109
|
+
val converted = PeachExpoTypes.convert(classifier, value)
|
|
110
|
+
if (converted !== PeachExpoTypes.Unconverted) converted
|
|
111
|
+
else if (classifier.isInstance(value)) value
|
|
112
|
+
else throw ClassCastException("Cannot convert '$value' to '$type'")
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// upstream converts to the first type that accepts the value and defers the rest
|
|
118
|
+
private fun either(classifier: KClass<*>, type: KType, value: Any): Any {
|
|
119
|
+
val types = type.arguments.map { it.type ?: typeOf<Any>() }
|
|
120
|
+
var converted = false
|
|
121
|
+
val deferred: MutableList<DeferredValue> = types.mapTo(ArrayList()) { item ->
|
|
122
|
+
if (converted) {
|
|
123
|
+
UnconvertedValue(value) { convertValue(item, it) }
|
|
124
|
+
} else {
|
|
125
|
+
try {
|
|
126
|
+
ConvertedValue(convertValue(item, value)!!).also { converted = true }
|
|
127
|
+
} catch (_: Throwable) {
|
|
128
|
+
IncompatibleValue
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
if (!converted) throw UnexpectedException("Cannot cast '$value' to 'Either<${types.joinToString(separator = ", ")}>'")
|
|
133
|
+
return when (classifier) {
|
|
134
|
+
EitherOfFour::class -> EitherOfFour<Any, Any, Any, Any>(value, deferred, types)
|
|
135
|
+
EitherOfThree::class -> EitherOfThree<Any, Any, Any>(value, deferred, types)
|
|
136
|
+
else -> Either<Any, Any>(value, deferred, types)
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
private fun list(value: Any, type: KType): List<*> = value as? List<*> ?: throw TypeCastException(value, type)
|
|
141
|
+
|
|
142
|
+
private fun typedArray(value: Any, type: KType): JavaScriptTypedArray =
|
|
143
|
+
value as? JavaScriptTypedArray ?: throw TypeCastException(value, type)
|
|
144
|
+
|
|
145
|
+
internal class IncorrectRefTypeException(desiredType: KType, receivedClass: KClass<*>) : CodedException(
|
|
146
|
+
message = "Cannot convert received '$receivedClass' to the '$desiredType', because of the inner ref type mismatch",
|
|
147
|
+
)
|
|
148
|
+
|
|
149
|
+
// SharedRef<T> also checks its ref against T, unless T is a star
|
|
150
|
+
private fun sharedRef(value: Any, type: KType): SharedRef<*> {
|
|
151
|
+
val ref = value as? SharedRef<*> ?: throw TypeCastException(value, type)
|
|
152
|
+
val inner = type.arguments.firstOrNull()?.type?.classifier as? KClass<*> ?: return ref
|
|
153
|
+
if (inner != Any::class && !inner.isInstance(ref.ref)) throw IncorrectRefTypeException(type, ref::class)
|
|
154
|
+
return ref
|
|
155
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
@file:Suppress("UNCHECKED_CAST")
|
|
2
|
+
|
|
3
|
+
package expo.modules.kotlin.types
|
|
4
|
+
|
|
5
|
+
import kotlin.reflect.KClass
|
|
6
|
+
import kotlin.reflect.KType
|
|
7
|
+
|
|
8
|
+
sealed class DeferredValue
|
|
9
|
+
|
|
10
|
+
data object IncompatibleValue : DeferredValue()
|
|
11
|
+
|
|
12
|
+
class UnconvertedValue(
|
|
13
|
+
private val unconvertedValue: Any,
|
|
14
|
+
private val convert: (Any) -> Any?,
|
|
15
|
+
) : DeferredValue() {
|
|
16
|
+
private var convertedValue: Any? = null
|
|
17
|
+
|
|
18
|
+
fun getConvertedValue(): Any {
|
|
19
|
+
if (convertedValue == null) convertedValue = convert(unconvertedValue)
|
|
20
|
+
return convertedValue!!
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
data class ConvertedValue(val convertedValue: Any) : DeferredValue()
|
|
25
|
+
|
|
26
|
+
inline fun <reified T : Any> toKClass(): KClass<T> = T::class
|
|
27
|
+
|
|
28
|
+
open class Either<FirstType : Any, SecondType : Any>(
|
|
29
|
+
private val bareValue: Any,
|
|
30
|
+
private val deferredValue: MutableList<DeferredValue>,
|
|
31
|
+
private val types: List<KType>,
|
|
32
|
+
) {
|
|
33
|
+
internal fun `is`(index: Int): Boolean = when (val value = deferredValue[index]) {
|
|
34
|
+
is ConvertedValue -> true
|
|
35
|
+
IncompatibleValue -> false
|
|
36
|
+
is UnconvertedValue -> try {
|
|
37
|
+
deferredValue[index] = ConvertedValue(value.getConvertedValue())
|
|
38
|
+
true
|
|
39
|
+
} catch (_: Throwable) {
|
|
40
|
+
deferredValue[index] = IncompatibleValue
|
|
41
|
+
false
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
internal fun get(index: Int): Any = when (val value = deferredValue[index]) {
|
|
46
|
+
is ConvertedValue -> value.convertedValue
|
|
47
|
+
IncompatibleValue -> throw TypeCastException("Cannot cast '$bareValue' to '${types[index]}'")
|
|
48
|
+
is UnconvertedValue -> try {
|
|
49
|
+
value.getConvertedValue().also { deferredValue[index] = ConvertedValue(it) }
|
|
50
|
+
} catch (e: Throwable) {
|
|
51
|
+
deferredValue[index] = IncompatibleValue
|
|
52
|
+
throw TypeCastException("Cannot cast '$bareValue' to '${types[index]}' - ${e.message}")
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
fun `is`(@Suppress("UNUSED_PARAMETER") type: KClass<FirstType>): Boolean = `is`(0)
|
|
57
|
+
|
|
58
|
+
fun `is`(@Suppress("UNUSED_PARAMETER") type: KClass<SecondType>): Boolean = `is`(1)
|
|
59
|
+
|
|
60
|
+
fun get(@Suppress("UNUSED_PARAMETER") type: KClass<FirstType>): FirstType = get(0) as FirstType
|
|
61
|
+
|
|
62
|
+
fun get(@Suppress("UNUSED_PARAMETER") type: KClass<SecondType>): SecondType = get(1) as SecondType
|
|
63
|
+
|
|
64
|
+
fun first(): FirstType = get(0) as FirstType
|
|
65
|
+
|
|
66
|
+
fun second(): SecondType = get(1) as SecondType
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
open class EitherOfThree<FirstType : Any, SecondType : Any, ThirdType : Any>(
|
|
70
|
+
bareValue: Any,
|
|
71
|
+
deferredValue: MutableList<DeferredValue>,
|
|
72
|
+
types: List<KType>,
|
|
73
|
+
) : Either<FirstType, SecondType>(bareValue, deferredValue, types) {
|
|
74
|
+
fun `is`(@Suppress("UNUSED_PARAMETER") type: KClass<ThirdType>): Boolean = `is`(2)
|
|
75
|
+
|
|
76
|
+
fun get(@Suppress("UNUSED_PARAMETER") type: KClass<ThirdType>) = get(2) as ThirdType
|
|
77
|
+
|
|
78
|
+
fun third(): ThirdType = get(2) as ThirdType
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
class EitherOfFour<FirstType : Any, SecondType : Any, ThirdType : Any, FourthType : Any>(
|
|
82
|
+
bareValue: Any,
|
|
83
|
+
deferredValue: MutableList<DeferredValue>,
|
|
84
|
+
types: List<KType>,
|
|
85
|
+
) : EitherOfThree<FirstType, SecondType, ThirdType>(bareValue, deferredValue, types) {
|
|
86
|
+
fun `is`(@Suppress("UNUSED_PARAMETER") type: KClass<FourthType>): Boolean = `is`(3)
|
|
87
|
+
|
|
88
|
+
fun get(@Suppress("UNUSED_PARAMETER") type: KClass<FourthType>): FourthType = get(3) as FourthType
|
|
89
|
+
|
|
90
|
+
fun fourth(): FourthType = get(3) as FourthType
|
|
91
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
package expo.modules.kotlin.viewevent
|
|
2
|
+
|
|
3
|
+
import android.util.Log
|
|
4
|
+
import expo.modules.kotlin.views.ExpoView
|
|
5
|
+
import kotlin.reflect.KProperty
|
|
6
|
+
|
|
7
|
+
typealias CoalescingKey<T> = (event: T) -> Short
|
|
8
|
+
|
|
9
|
+
fun interface ViewEventCallback<T> {
|
|
10
|
+
operator fun invoke(arg: T)
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
// an event a view sends to its callback prop. a body that is not an object
|
|
14
|
+
// reaches JavaScript as { payload }, as convertEventBody wraps it
|
|
15
|
+
open class ViewEvent<T>(
|
|
16
|
+
private val name: String,
|
|
17
|
+
private val view: ExpoView,
|
|
18
|
+
private val coalescingKey: CoalescingKey<T>?,
|
|
19
|
+
) : ViewEventCallback<T> {
|
|
20
|
+
private var isValidated = false
|
|
21
|
+
|
|
22
|
+
override operator fun invoke(arg: T) {
|
|
23
|
+
if (!isValidated) {
|
|
24
|
+
if (name !in view.callbacks) {
|
|
25
|
+
Log.w("ExpoModulesCore", "⚠️ Event $name wasn't exported from ${view::class}")
|
|
26
|
+
return
|
|
27
|
+
}
|
|
28
|
+
isValidated = true
|
|
29
|
+
}
|
|
30
|
+
val body: Any? = when (arg) {
|
|
31
|
+
null, is Unit -> null
|
|
32
|
+
is Map<*, *> -> arg
|
|
33
|
+
else -> mapOf("payload" to arg)
|
|
34
|
+
}
|
|
35
|
+
view.emitter?.invoke(name, body)
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
class ViewEventDelegate<T>(private val view: ExpoView, private val coalescingKey: CoalescingKey<T>?) {
|
|
40
|
+
fun getValue(property: KProperty<*>): ViewEventCallback<T> = ViewEvent(property.name, view, coalescingKey)
|
|
41
|
+
|
|
42
|
+
operator fun getValue(thisRef: ExpoView, property: KProperty<*>): ViewEventCallback<T> = getValue(property)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
@Suppress("NOTHING_TO_INLINE")
|
|
46
|
+
inline operator fun <T> ViewEventDelegate<T>.getValue(thisObj: Any?, property: KProperty<*>): ViewEventCallback<T> = getValue(property)
|
|
47
|
+
|
|
48
|
+
@Suppress("FunctionName")
|
|
49
|
+
inline fun <reified T> ExpoView.EventDispatcher(noinline coalescingKey: CoalescingKey<T>? = null): ViewEventDelegate<T> =
|
|
50
|
+
ViewEventDelegate(this, coalescingKey)
|
|
51
|
+
|
|
52
|
+
@Suppress("FunctionName")
|
|
53
|
+
fun ExpoView.EventDispatcher(coalescingKey: CoalescingKey<Map<String, Any>>? = null): ViewEventDelegate<Map<String, Any>> =
|
|
54
|
+
ViewEventDelegate(this, coalescingKey)
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
package expo.modules.kotlin.views
|
|
2
|
+
|
|
3
|
+
import android.content.Context
|
|
4
|
+
import android.widget.LinearLayout
|
|
5
|
+
import android.graphics.Canvas
|
|
6
|
+
import expo.modules.kotlin.AppContext
|
|
7
|
+
|
|
8
|
+
// upstream's native view root. both canvas-backed and compose Expo views
|
|
9
|
+
// share the Android view lifecycle and exported props/events.
|
|
10
|
+
abstract class ExpoView(context: Context, val appContext: AppContext) : LinearLayout(context) {
|
|
11
|
+
open val shouldUseAndroidLayout: Boolean = false
|
|
12
|
+
|
|
13
|
+
override fun dispatchDraw(canvas: Canvas) {
|
|
14
|
+
val checkpoint = canvas.save()
|
|
15
|
+
canvas.clipRect(paddingLeft, paddingTop, width - paddingRight, height - paddingBottom)
|
|
16
|
+
super.dispatchDraw(canvas)
|
|
17
|
+
canvas.restoreToCount(checkpoint)
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// the runtime's sink for this view's events, set when the view is created
|
|
21
|
+
internal var emitter: ((name: String, body: Any?) -> Unit)? = null
|
|
22
|
+
internal var callbacks: List<String> = emptyList()
|
|
23
|
+
}
|