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
|
@@ -6,8 +6,10 @@
|
|
|
6
6
|
|
|
7
7
|
import { spawnSync } from 'node:child_process'
|
|
8
8
|
import {
|
|
9
|
+
accessSync,
|
|
9
10
|
appendFileSync,
|
|
10
11
|
chmodSync,
|
|
12
|
+
constants,
|
|
11
13
|
copyFileSync,
|
|
12
14
|
existsSync,
|
|
13
15
|
mkdirSync,
|
|
@@ -161,25 +163,44 @@ function installCommandPath(target: string): string | null {
|
|
|
161
163
|
const home = process.env.HOME || homedir()
|
|
162
164
|
const shell = process.env.SHELL || ''
|
|
163
165
|
const shellName = shell.endsWith('/zsh') ? 'zsh' : shell.endsWith('/bash') ? 'bash' : ''
|
|
164
|
-
const
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
166
|
+
const profiles = [
|
|
167
|
+
join(
|
|
168
|
+
home,
|
|
169
|
+
shellName === 'zsh' ? '.zshrc' : shellName === 'bash' ? '.bashrc' : '.profile',
|
|
170
|
+
),
|
|
171
|
+
]
|
|
172
|
+
if (shellName === 'bash') {
|
|
173
|
+
let loginProfile = join(home, '.profile')
|
|
174
|
+
// bash login shells read only the first readable profile in this order.
|
|
175
|
+
for (const name of ['.bash_profile', '.bash_login']) {
|
|
176
|
+
const candidate = join(home, name)
|
|
177
|
+
try {
|
|
178
|
+
accessSync(candidate, constants.R_OK)
|
|
179
|
+
loginProfile = candidate
|
|
180
|
+
break
|
|
181
|
+
} catch {}
|
|
182
|
+
}
|
|
183
|
+
profiles.push(loginProfile)
|
|
184
|
+
}
|
|
168
185
|
const bin = dirname(target)
|
|
169
186
|
const pathLine = `export PATH="${bin}:$PATH"`
|
|
170
187
|
const integration = shellName ? `eval "$(command peach __shell-init ${shellName})"` : ''
|
|
171
|
-
const
|
|
172
|
-
|
|
173
|
-
|
|
188
|
+
const updatedProfiles: string[] = []
|
|
189
|
+
for (const profile of profiles) {
|
|
190
|
+
const current = existsSync(profile) ? readFileSync(profile, 'utf8') : ''
|
|
191
|
+
if (current.includes(pathLine) && (!integration || current.includes(integration)))
|
|
192
|
+
continue
|
|
174
193
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
194
|
+
const additions = [
|
|
195
|
+
'',
|
|
196
|
+
'# added by the peach installer; delete this block to remove peach from your shell',
|
|
197
|
+
...(current.includes(pathLine) ? [] : [pathLine]),
|
|
198
|
+
...(integration && !current.includes(integration) ? [integration] : []),
|
|
199
|
+
]
|
|
200
|
+
appendFileSync(profile, `${additions.join('\n')}\n`)
|
|
201
|
+
updatedProfiles.push(profile)
|
|
202
|
+
}
|
|
203
|
+
return updatedProfiles.length ? updatedProfiles.join(', ') : null
|
|
183
204
|
}
|
|
184
205
|
|
|
185
206
|
async function handOffDaemon({
|
|
@@ -1,53 +1,30 @@
|
|
|
1
|
-
//
|
|
2
|
-
//
|
|
3
|
-
// the CLI + daemon are the canonical peach surface; this command is only
|
|
4
|
-
// for users who want a GUI companion on top of that.
|
|
5
|
-
//
|
|
6
|
-
// --native installs the native desktop host at /Applications/Peach.app on
|
|
7
|
-
// macOS, or the standalone headless host that `peach open --headless` attaches
|
|
8
|
-
// on Linux x64, verified and cached by version under ~/.peach/desktop/versions/<version>/
|
|
9
|
-
// through the same delivery `peach runtime install` uses (src/desktop-host-delivery.ts).
|
|
10
|
-
//
|
|
11
|
-
// otherwise it installs the Electron companion: it
|
|
12
|
-
// fetches the right platform artifact from https://contrast.dev/api/electron-release/
|
|
13
|
-
// and installs it into the OS-native location that findInstalledDesktopCompanion() looks for:
|
|
14
|
-
// macos: /Applications/peach.app when writable and free of the native host,
|
|
15
|
-
// else ~/Applications/peach.app
|
|
16
|
-
// linux: ~/Applications/peach.AppImage
|
|
17
|
-
// win: spawns the NSIS installer
|
|
18
|
-
//
|
|
19
|
-
// post-install the electron-updater feed (same URL) handles upgrades inside the
|
|
20
|
-
// running app, so this command is a first-install bootstrap, not an update path.
|
|
1
|
+
// install the native Mac app or Linux GTK package; --native on Linux acquires
|
|
2
|
+
// the standalone headless host for CI. Electron installs only on Windows.
|
|
21
3
|
|
|
22
|
-
import { spawn
|
|
23
|
-
import {
|
|
24
|
-
chmodSync,
|
|
25
|
-
copyFileSync,
|
|
26
|
-
createWriteStream,
|
|
27
|
-
existsSync,
|
|
28
|
-
mkdirSync,
|
|
29
|
-
rmSync,
|
|
30
|
-
statSync,
|
|
31
|
-
unlinkSync,
|
|
32
|
-
} from 'fs'
|
|
4
|
+
import { spawn } from 'child_process'
|
|
5
|
+
import { createWriteStream, existsSync, mkdirSync, rmSync, statSync } from 'fs'
|
|
33
6
|
import { tmpdir } from 'os'
|
|
34
|
-
import {
|
|
7
|
+
import { dirname, join } from 'path'
|
|
35
8
|
import {
|
|
36
9
|
DESKTOP_HOST_CHANNELS,
|
|
37
10
|
desktopHostDelivery,
|
|
38
11
|
desktopHostPlatform,
|
|
39
|
-
isNativeHostBundle,
|
|
40
12
|
MAC_HOST_APP,
|
|
13
|
+
registerNativeDesktopLinks,
|
|
14
|
+
uninstallNativeDesktopHost,
|
|
41
15
|
} from '../../src/desktop-host-delivery'
|
|
42
16
|
import { desktopHostDir } from '../../src/home-paths'
|
|
43
|
-
import {
|
|
17
|
+
import {
|
|
18
|
+
findInstalledDesktopCompanion,
|
|
19
|
+
notifyDesktopMigration,
|
|
20
|
+
} from '../desktop-companion'
|
|
44
21
|
import { confirm } from '../prompt'
|
|
45
|
-
import {
|
|
22
|
+
import { peachExit } from '../run-rnx'
|
|
46
23
|
import { accent, bold, failure, muted, success, withSpinner } from '../ui'
|
|
47
24
|
|
|
48
25
|
const DOWNLOAD_BASE = 'https://contrast.dev/api/electron-release'
|
|
49
26
|
|
|
50
|
-
type TargetPlatform = '
|
|
27
|
+
type TargetPlatform = 'win-x64' | 'linux-x64'
|
|
51
28
|
|
|
52
29
|
interface Target {
|
|
53
30
|
platform: TargetPlatform
|
|
@@ -57,30 +34,12 @@ interface Target {
|
|
|
57
34
|
}
|
|
58
35
|
|
|
59
36
|
function detectTarget(): Target | null {
|
|
60
|
-
|
|
61
|
-
if (process.platform === 'darwin') {
|
|
62
|
-
const platform: TargetPlatform = arch === 'arm64' ? 'mac-arm64' : 'mac-x64'
|
|
63
|
-
const filename = `peach-latest-${platform}.dmg`
|
|
37
|
+
if (process.platform === 'linux' && process.arch === 'x64') {
|
|
64
38
|
return {
|
|
65
|
-
platform,
|
|
66
|
-
filename,
|
|
67
|
-
url:
|
|
68
|
-
install:
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
if (process.platform === 'linux') {
|
|
72
|
-
// ship arch-appropriate AppImages. on Apple Silicon Macs (the default
|
|
73
|
-
// host for orb/multipass VMs) the linux VM is arm64, so the x64
|
|
74
|
-
// AppImage fails at runtime with "Dynamic loader not found:
|
|
75
|
-
// /lib64/ld-linux-x86-64.so.2". detect the running arch and pick the
|
|
76
|
-
// matching artifact.
|
|
77
|
-
const platform: TargetPlatform = arch === 'arm64' ? 'linux-arm64' : 'linux-x64'
|
|
78
|
-
const filename = `peach-latest-${platform}.AppImage`
|
|
79
|
-
return {
|
|
80
|
-
platform,
|
|
81
|
-
filename,
|
|
82
|
-
url: `${DOWNLOAD_BASE}/${filename}`,
|
|
83
|
-
install: installLinuxAppImage,
|
|
39
|
+
platform: 'linux-x64',
|
|
40
|
+
filename: 'PeachDesktop-linux-x64.deb',
|
|
41
|
+
url: 'https://contrast.dev/api/native-release/linux-x64',
|
|
42
|
+
install: installLinuxDeb,
|
|
84
43
|
}
|
|
85
44
|
}
|
|
86
45
|
if (process.platform === 'win32') {
|
|
@@ -143,122 +102,24 @@ function renderProgress(received: number, total: number | null): string {
|
|
|
143
102
|
return ` ${bar} ${pct}% ${mb} / ${totalMb} MB`
|
|
144
103
|
}
|
|
145
104
|
|
|
146
|
-
async function
|
|
147
|
-
|
|
148
|
-
'
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
const mountLines = mountOutput.stdout.trim().split('\n')
|
|
160
|
-
const mountLine = mountLines[mountLines.length - 1]
|
|
161
|
-
const mountPoint = mountLine.split('\t').pop()?.trim()
|
|
162
|
-
if (!mountPoint || !existsSync(mountPoint)) {
|
|
163
|
-
throw new Error(`could not determine dmg mount point (output: ${mountOutput.stdout})`)
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
const appSource = join(mountPoint, 'peach.app')
|
|
167
|
-
if (!existsSync(appSource)) {
|
|
168
|
-
spawnSync('hdiutil', ['detach', '-force', mountPoint])
|
|
169
|
-
throw new Error(`peach.app not found inside ${mountPoint}`)
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
// prefer /Applications if writable, otherwise ~/Applications (same paths
|
|
173
|
-
// findInstalledDesktopCompanion checks, so no extra config needed post-install).
|
|
174
|
-
const systemApps = '/Applications'
|
|
175
|
-
const userApps = resolve(process.env.HOME || '', 'Applications')
|
|
176
|
-
let destRoot = systemApps
|
|
177
|
-
try {
|
|
178
|
-
const probe = join(systemApps, `.peach-write-probe-${process.pid}`)
|
|
179
|
-
spawnSync('touch', [probe])
|
|
180
|
-
if (existsSync(probe)) rmSync(probe, { force: true })
|
|
181
|
-
else destRoot = userApps
|
|
182
|
-
} catch {
|
|
183
|
-
destRoot = userApps
|
|
184
|
-
}
|
|
185
|
-
// the native host owns /Applications/Peach.app, the same path on a
|
|
186
|
-
// case-insensitive disk, so Electron goes beside the user's apps then
|
|
187
|
-
if (isNativeHostBundle(join(systemApps, 'peach.app'))) destRoot = userApps
|
|
188
|
-
if (destRoot === userApps) {
|
|
189
|
-
mkdirSync(destRoot, { recursive: true })
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
const appDest = join(destRoot, 'peach.app')
|
|
193
|
-
|
|
194
|
-
// copy alongside the destination and swap, rather than deleting the installed
|
|
195
|
-
// app first. removing it up front means a failed copy leaves the user with no
|
|
196
|
-
// app at all, having destroyed a working install to do it. the staging path is
|
|
197
|
-
// in the same directory so the swap is a rename on one volume.
|
|
198
|
-
const staging = join(
|
|
199
|
-
destRoot,
|
|
200
|
-
`.${basename(appDest, '.app')}-incoming-${process.pid}.app`,
|
|
201
|
-
)
|
|
202
|
-
rmSync(staging, { recursive: true, force: true })
|
|
203
|
-
|
|
204
|
-
const copy = spawnSync('cp', ['-R', appSource, staging])
|
|
205
|
-
if (copy.status !== 0) {
|
|
206
|
-
spawnSync('hdiutil', ['detach', '-force', mountPoint])
|
|
207
|
-
rmSync(staging, { recursive: true, force: true })
|
|
208
|
-
throw new Error(`copy to ${destRoot} failed: ${copy.stderr?.toString() || ''}`.trim())
|
|
209
|
-
}
|
|
210
|
-
const detach = spawnSync('hdiutil', ['detach', '-force', mountPoint])
|
|
211
|
-
|
|
212
|
-
const previous = join(
|
|
213
|
-
destRoot,
|
|
214
|
-
`.${basename(appDest, '.app')}-previous-${process.pid}.app`,
|
|
215
|
-
)
|
|
216
|
-
if (existsSync(appDest)) {
|
|
217
|
-
const park = spawnSync('mv', [appDest, previous])
|
|
218
|
-
if (park.status !== 0) {
|
|
219
|
-
rmSync(staging, { recursive: true, force: true })
|
|
220
|
-
throw new Error(
|
|
221
|
-
`could not replace ${appDest}: ${park.stderr?.toString() || ''}`.trim(),
|
|
222
|
-
)
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
const swap = spawnSync('mv', [staging, appDest])
|
|
226
|
-
if (swap.status !== 0) {
|
|
227
|
-
// put the working install back before reporting failure
|
|
228
|
-
if (existsSync(previous)) spawnSync('mv', [previous, appDest])
|
|
229
|
-
rmSync(staging, { recursive: true, force: true })
|
|
230
|
-
throw new Error(
|
|
231
|
-
`could not move into ${appDest}: ${swap.stderr?.toString() || ''}`.trim(),
|
|
232
|
-
)
|
|
233
|
-
}
|
|
234
|
-
rmSync(previous, { recursive: true, force: true })
|
|
235
|
-
|
|
236
|
-
if (detach.status !== 0) {
|
|
237
|
-
console.warn(
|
|
238
|
-
` warning: failed to unmount ${mountPoint} (${detach.stderr?.toString().trim() || 'unknown error'})`,
|
|
105
|
+
async function installLinuxDeb(packagePath: string): Promise<string> {
|
|
106
|
+
await new Promise<void>((resolvePromise, rejectPromise) => {
|
|
107
|
+
const command = process.getuid?.() === 0 ? 'apt-get' : 'sudo'
|
|
108
|
+
const args =
|
|
109
|
+
command === 'sudo'
|
|
110
|
+
? ['apt-get', 'install', '-y', packagePath]
|
|
111
|
+
: ['install', '-y', packagePath]
|
|
112
|
+
const child = spawn(command, args, { stdio: 'inherit' })
|
|
113
|
+
child.once('error', rejectPromise)
|
|
114
|
+
child.once('exit', (code) =>
|
|
115
|
+
code === 0
|
|
116
|
+
? resolvePromise()
|
|
117
|
+
: rejectPromise(new Error(`package install exited with code ${code}`)),
|
|
239
118
|
)
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
spawnSync('xattr', ['-dr', 'com.apple.quarantine', appDest])
|
|
245
|
-
|
|
246
|
-
return appDest
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
async function installLinuxAppImage(appImagePath: string): Promise<string> {
|
|
250
|
-
const destDir = resolve(process.env.HOME || '', 'Applications')
|
|
251
|
-
mkdirSync(destDir, { recursive: true })
|
|
252
|
-
const dest = join(destDir, 'peach.AppImage')
|
|
253
|
-
if (existsSync(dest)) rmSync(dest, { force: true })
|
|
254
|
-
// copyFile + unlink instead of rename: /tmp and ~/Applications are
|
|
255
|
-
// routinely on separate mounts in containers / VMs, where renameSync
|
|
256
|
-
// fails EXDEV. copy is portable across mounts and the unlink at the
|
|
257
|
-
// end keeps the staging dir clean.
|
|
258
|
-
copyFileSync(appImagePath, dest)
|
|
259
|
-
unlinkSync(appImagePath)
|
|
260
|
-
chmodSync(dest, 0o755)
|
|
261
|
-
return dest
|
|
119
|
+
})
|
|
120
|
+
if (!existsSync('/usr/bin/peach-desktop'))
|
|
121
|
+
throw new Error('native desktop launcher missing after package install')
|
|
122
|
+
return '/usr/bin/peach-desktop'
|
|
262
123
|
}
|
|
263
124
|
|
|
264
125
|
async function installWindowsExe(exePath: string): Promise<string> {
|
|
@@ -286,7 +147,7 @@ export async function runInstallDesktop(args: string[]) {
|
|
|
286
147
|
peach desktop install
|
|
287
148
|
|
|
288
149
|
Download and install the optional peach Desktop app.
|
|
289
|
-
The CLI works without it.
|
|
150
|
+
The CLI works without it. Mac and Linux install the native app; Windows installs Electron.
|
|
290
151
|
|
|
291
152
|
usage:
|
|
292
153
|
peach desktop install [options]
|
|
@@ -295,6 +156,7 @@ usage:
|
|
|
295
156
|
options:
|
|
296
157
|
-y, --yes skip confirmation and install immediately
|
|
297
158
|
--force reinstall even if the companion is already present
|
|
159
|
+
--electron install Electron on Windows; native app on Mac and Linux
|
|
298
160
|
--native install the native desktop host: /Applications/Peach.app
|
|
299
161
|
on macOS arm64, the headless host on Linux x64
|
|
300
162
|
--channel <name> with --native: production (default) or staging
|
|
@@ -309,7 +171,7 @@ examples:
|
|
|
309
171
|
peach desktop install --native
|
|
310
172
|
peach desktop install --native --channel staging
|
|
311
173
|
`)
|
|
312
|
-
|
|
174
|
+
peachExit(0)
|
|
313
175
|
}
|
|
314
176
|
|
|
315
177
|
const skipConfirm =
|
|
@@ -319,7 +181,14 @@ examples:
|
|
|
319
181
|
process.env.CI === '1' ||
|
|
320
182
|
!process.stdin.isTTY
|
|
321
183
|
const force = args.includes('--force')
|
|
322
|
-
if (args.includes('--native')) {
|
|
184
|
+
if (args.includes('--native') && args.includes('--electron')) {
|
|
185
|
+
console.error(' --native cannot be combined with --electron')
|
|
186
|
+
peachExit(1)
|
|
187
|
+
}
|
|
188
|
+
notifyDesktopMigration()
|
|
189
|
+
if (args.includes('--electron') && process.platform !== 'win32')
|
|
190
|
+
console.error(' Electron is Windows-only; installing the native desktop app.')
|
|
191
|
+
if (args.includes('--native') || process.platform === 'darwin') {
|
|
323
192
|
await installNativeHost(args, force)
|
|
324
193
|
return
|
|
325
194
|
}
|
|
@@ -336,10 +205,8 @@ examples:
|
|
|
336
205
|
console.error(
|
|
337
206
|
` ${failure('×')} No desktop build is available for ${process.platform}/${process.arch}.`,
|
|
338
207
|
)
|
|
339
|
-
console.error(
|
|
340
|
-
|
|
341
|
-
)
|
|
342
|
-
rnxExit(1)
|
|
208
|
+
console.error(' Supported: darwin-arm64, linux-x64, win32-x64')
|
|
209
|
+
peachExit(1)
|
|
343
210
|
}
|
|
344
211
|
|
|
345
212
|
console.log(` ${bold('Desktop app')}`)
|
|
@@ -388,7 +255,7 @@ examples:
|
|
|
388
255
|
console.error(
|
|
389
256
|
' The CLI and daemon work without the desktop app. Run `peach --help`.',
|
|
390
257
|
)
|
|
391
|
-
|
|
258
|
+
peachExit(1)
|
|
392
259
|
}
|
|
393
260
|
|
|
394
261
|
if (process.stdout.isTTY) process.stdout.write('\n')
|
|
@@ -406,16 +273,8 @@ examples:
|
|
|
406
273
|
console.error(
|
|
407
274
|
` ${failure('×')} Install failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
408
275
|
)
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
// drag rather than leaving them at a dead end. keep workDir for that.
|
|
412
|
-
if (process.platform === 'darwin') {
|
|
413
|
-
spawnSync('open', [downloadPath])
|
|
414
|
-
console.error(` Opened ${target.filename} — drag peach to Applications to finish.`)
|
|
415
|
-
} else {
|
|
416
|
-
console.error(` Keeping the download at ${downloadPath} for manual installation.`)
|
|
417
|
-
}
|
|
418
|
-
rnxExit(1)
|
|
276
|
+
console.error(` Keeping the download at ${downloadPath} for manual installation.`)
|
|
277
|
+
peachExit(1)
|
|
419
278
|
}
|
|
420
279
|
|
|
421
280
|
console.log()
|
|
@@ -429,7 +288,7 @@ async function installNativeHost(args: string[], force: boolean): Promise<void>
|
|
|
429
288
|
const channel = channelIndex >= 0 ? args[channelIndex + 1] : undefined
|
|
430
289
|
if (channelIndex >= 0 && !channel) {
|
|
431
290
|
console.error(` --channel needs ${DESKTOP_HOST_CHANNELS.join(' or ')}`)
|
|
432
|
-
|
|
291
|
+
peachExit(1)
|
|
433
292
|
}
|
|
434
293
|
const version = args.find(
|
|
435
294
|
(arg, i) => !arg.startsWith('-') && args[i - 1] !== '--channel' && arg !== 'install',
|
|
@@ -447,6 +306,8 @@ async function installNativeHost(args: string[], force: boolean): Promise<void>
|
|
|
447
306
|
quiet: true,
|
|
448
307
|
}),
|
|
449
308
|
)
|
|
309
|
+
if (resolvedChannel === 'production' && !args.includes('--native'))
|
|
310
|
+
registerNativeDesktopLinks()
|
|
450
311
|
const location =
|
|
451
312
|
desktopHostPlatform() === 'linux-x64'
|
|
452
313
|
? desktopHostDir(result.version)
|
|
@@ -458,7 +319,7 @@ async function installNativeHost(args: string[], force: boolean): Promise<void>
|
|
|
458
319
|
console.error(
|
|
459
320
|
` ${failure('×')} Native desktop install failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
460
321
|
)
|
|
461
|
-
|
|
322
|
+
peachExit(1)
|
|
462
323
|
}
|
|
463
324
|
console.log()
|
|
464
325
|
console.log(` ${bold('Ready')}`)
|
|
@@ -466,6 +327,18 @@ async function installNativeHost(args: string[], force: boolean): Promise<void>
|
|
|
466
327
|
console.log(' peach open <target> --headless Render it through the host')
|
|
467
328
|
return
|
|
468
329
|
}
|
|
469
|
-
console.log(' peach desktop
|
|
330
|
+
console.log(' peach desktop Launch the native desktop host')
|
|
470
331
|
console.log(' peach open <target> --driver desktop Open a demo or bundle in it')
|
|
471
332
|
}
|
|
333
|
+
|
|
334
|
+
export async function runUninstallDesktop(args: string[]): Promise<void> {
|
|
335
|
+
if (args.some((arg) => arg !== '--native')) {
|
|
336
|
+
throw new Error(
|
|
337
|
+
'desktop uninstall removes the native host; Electron remains installed',
|
|
338
|
+
)
|
|
339
|
+
}
|
|
340
|
+
if (!desktopHostPlatform())
|
|
341
|
+
throw new Error('no native desktop host ships on this platform')
|
|
342
|
+
uninstallNativeDesktopHost()
|
|
343
|
+
console.log(' Native desktop host uninstalled.')
|
|
344
|
+
}
|
package/cli/commands/kotlin.ts
CHANGED
|
@@ -11,7 +11,11 @@ import {
|
|
|
11
11
|
} from '../../src/kotlin-app'
|
|
12
12
|
import { PeachExit } from '../run-rnx'
|
|
13
13
|
import { runOpenCommand, type OpenCommandResources } from './control'
|
|
14
|
-
import {
|
|
14
|
+
import {
|
|
15
|
+
closeGuestResources,
|
|
16
|
+
isLoopbackGuestRequest,
|
|
17
|
+
waitForGuestCompletion,
|
|
18
|
+
} from './guest-host'
|
|
15
19
|
|
|
16
20
|
const GUEST_PATH = '/__peach/kotlin-guest.js'
|
|
17
21
|
const HMR_PATH = '/__peach/kotlin-hmr'
|
|
@@ -182,10 +186,7 @@ export async function runKotlin(
|
|
|
182
186
|
signal: controller.signal,
|
|
183
187
|
ownerPid: process.pid,
|
|
184
188
|
})
|
|
185
|
-
await
|
|
186
|
-
if (controller.signal.aborted) resolve()
|
|
187
|
-
else controller.signal.addEventListener('abort', () => resolve(), { once: true })
|
|
188
|
-
})
|
|
189
|
+
code = await waitForGuestCompletion(resources, controller.signal, 'Kotlin app')
|
|
189
190
|
} catch (error) {
|
|
190
191
|
if (!controller.signal.aborted) {
|
|
191
192
|
console.error(
|
package/cli/commands/login.ts
CHANGED
|
@@ -11,7 +11,7 @@ import { isLoopbackHost } from '../../src/backend-origin'
|
|
|
11
11
|
import { rnxPublicBrand } from '../../src/public-brand'
|
|
12
12
|
import { openUrl } from '../open-url'
|
|
13
13
|
import { extractStringFlag } from '../parse-args'
|
|
14
|
-
import {
|
|
14
|
+
import { peachExit } from '../run-rnx'
|
|
15
15
|
|
|
16
16
|
const REMOTE_DEFAULT_ORIGIN = process.env.PEACH_AUTH_ORIGIN || 'https://contrast.dev'
|
|
17
17
|
|
|
@@ -61,7 +61,7 @@ async function chooseAccount(
|
|
|
61
61
|
` no account named ${JSON.stringify(requested)}. your accounts:\n` +
|
|
62
62
|
accounts.map((account) => ` ${account.name} (${account.id})`).join('\n'),
|
|
63
63
|
)
|
|
64
|
-
|
|
64
|
+
peachExit(1)
|
|
65
65
|
}
|
|
66
66
|
return match
|
|
67
67
|
}
|
|
@@ -71,7 +71,7 @@ async function chooseAccount(
|
|
|
71
71
|
' this sign-in belongs to several accounts; rerun with --account <name> to choose the one to bill:\n' +
|
|
72
72
|
accounts.map((account) => ` ${account.name} (${account.id})`).join('\n'),
|
|
73
73
|
)
|
|
74
|
-
|
|
74
|
+
peachExit(1)
|
|
75
75
|
}
|
|
76
76
|
console.log(' which account should remote simulators and boxes bill to?')
|
|
77
77
|
accounts.forEach((account, index) => console.log(` ${index + 1}. ${account.name}`))
|
|
@@ -186,7 +186,7 @@ function isLocalOrigin(origin: string): boolean {
|
|
|
186
186
|
export async function runLogin(args: string[]) {
|
|
187
187
|
if (args.includes('--help') || args.includes('-h')) {
|
|
188
188
|
printHelp()
|
|
189
|
-
|
|
189
|
+
peachExit(0)
|
|
190
190
|
}
|
|
191
191
|
|
|
192
192
|
const mutableArgs = [...args]
|
|
@@ -317,7 +317,7 @@ export async function runLogin(args: string[]) {
|
|
|
317
317
|
|
|
318
318
|
if (!result.ok) {
|
|
319
319
|
console.error(` login failed: ${result.error}`)
|
|
320
|
-
|
|
320
|
+
peachExit(1)
|
|
321
321
|
}
|
|
322
322
|
|
|
323
323
|
writeSharedDesktopAuthSession({
|