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