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