peachsim 0.1.939 → 0.1.1399
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +28 -22
- package/cli/app-catalog.ts +29 -14
- package/cli/app-fonts.ts +5 -3
- package/cli/bridge-flow-runner.ts +40 -29
- package/cli/cloud-client.ts +57 -21
- package/cli/cloud-test-tunnel.ts +12 -18
- package/cli/commands/agent.ts +1 -1
- package/cli/commands/app-fonts.ts +3 -3
- package/cli/commands/assert.ts +8 -8
- package/cli/commands/auth.ts +8 -3
- package/cli/commands/box/bundle-plane.ts +13 -1
- package/cli/commands/box.ts +16 -5
- package/cli/commands/compat.ts +1 -1
- package/cli/commands/config.ts +2 -2
- package/cli/commands/control.ts +125 -71
- package/cli/commands/cpu-profile.ts +45 -1
- package/cli/commands/daemon.ts +131 -33
- package/cli/commands/debug.ts +24 -17
- package/cli/commands/desktop.ts +7 -1
- package/cli/commands/detect.ts +101 -0
- package/cli/commands/detox.ts +6 -6
- package/cli/commands/device.ts +12 -12
- package/cli/commands/electron.ts +32 -14
- package/cli/commands/flow.ts +49 -41
- package/cli/commands/guest-host.ts +39 -1
- package/cli/commands/inspect/core.ts +14 -8
- package/cli/commands/inspect/list.ts +1 -1
- package/cli/commands/inspect/settle.ts +5 -3
- package/cli/commands/inspect/settling.ts +229 -44
- package/cli/commands/inspect/wait-idle.ts +3 -2
- package/cli/commands/inspect.ts +105 -93
- package/cli/commands/install-cli.ts +36 -15
- package/cli/commands/install-desktop.ts +68 -195
- package/cli/commands/kotlin.ts +6 -5
- package/cli/commands/login.ts +5 -5
- package/cli/commands/maestro-compare.ts +554 -0
- package/cli/commands/maestro-generate.ts +6 -3
- package/cli/commands/maestro.ts +22 -0
- package/cli/commands/mode.ts +2 -2
- package/cli/commands/no-bridge-hint.ts +6 -2
- package/cli/commands/platform.ts +35 -6
- package/cli/commands/preview.ts +6 -0
- package/cli/commands/project-report.ts +10 -12
- package/cli/commands/record.ts +37 -37
- package/cli/commands/runtime.ts +9 -9
- package/cli/commands/screenshot-layers.ts +4 -4
- package/cli/commands/screenshot-mode.ts +2 -2
- package/cli/commands/screenshot.ts +8 -8
- package/cli/commands/screenshots-capture.ts +2 -2
- package/cli/commands/serve.ts +9 -12
- package/cli/commands/setup.ts +29 -14
- package/cli/commands/shell-boolean-mode.ts +2 -2
- package/cli/commands/show-touches-mode.ts +2 -2
- package/cli/commands/skills.ts +11 -11
- package/cli/commands/swift.ts +29 -11
- package/cli/commands/telemetry.ts +2 -2
- package/cli/commands/test.ts +5 -0
- package/cli/commands/three-mode.ts +3 -3
- package/cli/commands/timeline.ts +4 -4
- package/cli/commands/upgrade.ts +2 -2
- package/cli/commands/upload.ts +15 -15
- package/cli/commands/what-happened.ts +2 -2
- package/cli/current-sim.ts +6 -3
- package/cli/desktop-companion.ts +55 -149
- package/cli/dev-build-freshness.ts +2 -2
- package/cli/drivers/desktop.ts +17 -9
- package/cli/drivers/electron.ts +1 -2
- package/cli/drivers/playwright-sim-host.ts +11 -2
- package/cli/drivers/playwright.ts +35 -2
- package/cli/drivers/types.ts +8 -0
- package/cli/maestro-compare.ts +670 -0
- package/cli/outbound-endpoints.ts +46 -8
- package/cli/recording-access.ts +6 -6
- package/cli/run-registry.ts +1 -1
- package/cli/runtime-compat.ts +5 -1
- package/cli/send-to-box.ts +3 -3
- package/cli/shell-init.ts +2 -1
- package/cli/ws-bridge.ts +9 -5
- package/detox/element-types.ts +1 -0
- package/detox/gestures.ts +3 -3
- package/detox/index.ts +67 -38
- package/detox/navigation-lifecycle.ts +9 -6
- package/detox/proof-frame.cjs +6 -4
- package/dist-lib/agent-daemon-client.cjs +1 -1
- package/dist-lib/agent-events.cjs +1 -1
- package/dist-lib/attached-projects.cjs +1 -1
- package/dist-lib/auth/shared-session.cjs +1 -1
- package/dist-lib/backend-origin.cjs +1 -1
- package/dist-lib/beta.cjs +1 -1
- package/dist-lib/beta.mjs +1 -1
- package/dist-lib/bridge-constants.cjs +1 -1
- package/dist-lib/bridge-contract-input.cjs +42 -17
- package/dist-lib/bridge-contract-input.mjs +41 -16
- package/dist-lib/bridge-contract.cjs +1 -4
- package/dist-lib/bridge-contract.mjs +1 -3
- package/dist-lib/bundle-channel.cjs +2918 -550
- package/dist-lib/capture-contract.cjs +65 -24
- package/dist-lib/capture-contract.mjs +63 -24
- package/dist-lib/cloud-contract.cjs +2 -2
- package/dist-lib/cloud-contract.mjs +2 -2
- package/dist-lib/cloud-test-args.cjs +1 -1
- package/dist-lib/cloud-test-args.mjs +1 -1
- package/dist-lib/cloud.cjs +3 -3
- package/dist-lib/cloud.mjs +3 -3
- package/dist-lib/config.cjs +15 -5
- package/dist-lib/config.mjs +154 -0
- package/dist-lib/detox/index.cjs +495 -139
- package/dist-lib/dev-bundle-resolution.cjs +1 -1
- package/dist-lib/expo-swift-bundle.cjs +1168 -238
- package/dist-lib/expo-swift-metadata.cjs +34 -23
- package/dist-lib/expo-swift-metadata.mjs +32 -23
- package/dist-lib/home-paths.cjs +2 -2
- package/dist-lib/host/bridge-host.cjs +2938 -654
- package/dist-lib/host/fetch-proxy-handler.cjs +14 -1
- package/dist-lib/host/fetch-proxy-overrides.cjs +7 -1
- package/dist-lib/host/fetch-proxy-overrides.mjs +5 -1
- package/dist-lib/host/replacement-module-handler.cjs +2 -2
- package/dist-lib/host/websocket-proxy.cjs +1 -1
- package/dist-lib/index.cjs +999 -353
- package/dist-lib/jump-to-source-babel.cjs +1 -1
- package/dist-lib/jump-to-source-native.cjs +1 -1
- package/dist-lib/kotlin-host.cjs +332 -19
- package/dist-lib/menu.cjs +1 -1
- package/dist-lib/menu.mjs +1 -1
- package/dist-lib/metro-fingerprint-registry.cjs +1 -1
- package/dist-lib/metro-fingerprint-registry.mjs +1 -1
- package/dist-lib/metro-production-bundle.cjs +7 -7
- package/dist-lib/metro-production-bundle.mjs +5 -5
- package/dist-lib/metro.cjs +688 -250
- package/dist-lib/native-app-identity-project.cjs +2647 -0
- package/dist-lib/native-app-identity-project.mjs +1257 -0
- package/dist-lib/native-app-identity.cjs +325 -25
- package/dist-lib/native-app-identity.mjs +323 -25
- package/dist-lib/native-firebase-metadata.cjs +1 -1
- package/dist-lib/native-firebase-metadata.mjs +1 -1
- package/dist-lib/plist.cjs +1 -1
- package/dist-lib/plist.mjs +1 -1
- package/dist-lib/profiles.cjs +1 -1
- package/dist-lib/public-brand.cjs +1 -1
- package/dist-lib/react-native-host-modules.cjs +5 -1
- package/dist-lib/react-native-host-modules.mjs +5 -1
- package/dist-lib/scripts/dev-server-scanner.cjs +57 -32
- package/dist-lib/sdk.cjs +231 -51
- package/dist-lib/sdk.mjs +231 -51
- package/dist-lib/skills.cjs +4107 -1374
- package/dist-lib/swift-compile.cjs +290 -30
- package/dist-lib/swift-compile.mjs +290 -30
- package/dist-lib/swift-package.cjs +143 -12
- package/dist-lib/swift-package.mjs +137 -11
- package/dist-lib/swift-submit.cjs +47 -5
- package/dist-lib/swift-submit.mjs +42 -5
- package/dist-lib/swift-toolchain.cjs +7 -2
- package/dist-lib/swift.cjs +1 -1
- package/dist-lib/vite-swift.cjs +1392 -458
- package/dist-lib/vite.cjs +13 -17
- package/dist-lib/worklet-executable.cjs +248 -33
- package/dist-lib/worklet-executable.mjs +248 -33
- package/install.sh +10 -1
- package/kotlin/{AppSources → AndroidViewSources}/android/content/res/Resources.kt +9 -9
- package/kotlin/AndroidViewSources/android/graphics/Canvas.kt +20 -0
- package/kotlin/AndroidViewSources/android/view/View.kt +211 -0
- package/kotlin/AndroidViewSources/android/widget/FrameLayout.kt +61 -0
- package/kotlin/AndroidViewSources/android/widget/LinearLayout.kt +49 -0
- package/kotlin/AppSources/android/view/Window.kt +36 -0
- package/kotlin/AppSources/android/view/WindowInsets.kt +9 -0
- package/kotlin/AppSources/android/view/WindowInsetsController.kt +5 -0
- package/kotlin/AppSources/android/window/OnBackInvokedDispatcher.kt +48 -0
- package/kotlin/AppSources/androidx/activity/OnBackPressedDispatcher.kt +20 -5
- package/kotlin/AppSources/androidx/compose/foundation/layout/WindowInsets.kt +15 -0
- package/kotlin/AppSources/androidx/compose/ui/platform/ComposeView.kt +2 -1
- package/kotlin/AppSources/dev/peach/app/PeachApp.kt +42 -50
- package/kotlin/ComposeSources/PeachComposeHost.kt +200 -84
- package/kotlin/ExpoComposeSources/PeachAndroidView.kt +87 -0
- package/kotlin/ExpoComposeSources/PeachExpoViewMount.kt +24 -0
- package/kotlin/ExpoComposeSources/dev/peach/expo/PeachExpoCompose.kt +28 -0
- package/kotlin/ExpoComposeSources/expo/modules/kotlin/views/ExpoComposeView.kt +70 -0
- package/kotlin/ExpoSources/dev/peach/expo/PeachExpoRuntime.kt +513 -0
- package/kotlin/ExpoSources/dev/peach/expo/PeachExpoTypes.kt +173 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/AppContext.kt +20 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/Promise.kt +19 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/classcomponent/ClassComponentBuilder.kt +198 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/exception/CodedException.kt +126 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/functions/Functions.kt +132 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/jni/JavaScriptTypedArray.kt +81 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/modules/Module.kt +98 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/objects/ObjectDefinitionBuilder.kt +236 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/records/Record.kt +12 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/runtime/Runtime.kt +9 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/sharedobjects/SharedObject.kt +50 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/sharedobjects/SharedObjectRegistry.kt +57 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/sharedobjects/SharedRef.kt +19 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/typedarray/ConcreteTypedArrays.kt +158 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/typedarray/GenericTypedArray.kt +8 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/typedarray/TypedArray.kt +29 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/typedarray/TypedArrayIterator.kt +9 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/types/AnyType.kt +155 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/types/Either.kt +91 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/types/Enumerable.kt +6 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/viewevent/ViewEvent.kt +54 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/views/ExpoView.kt +23 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/views/ViewDefinitionBuilder.kt +71 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/views/ViewProps.kt +35 -0
- package/kotlin/README.md +13 -3
- package/kotlin/Sources/android/os/Build.kt +17 -0
- package/kotlin/Sources/android/os/Handler.kt +35 -0
- package/kotlin/Sources/android/os/Looper.kt +17 -0
- package/kotlin/Sources/android/os/MessageQueue.kt +56 -0
- package/kotlin/Sources/android/os/SystemClock.kt +14 -0
- package/kotlin/Sources/android/util/Log.kt +64 -0
- package/kotlin/Sources/java/security/MessageDigest.kt +114 -0
- package/kotlin/Sources/kotlin/text/StringFormat.kt +9 -0
- package/kotlin/Sources/org/json/JSON.kt +44 -0
- package/kotlin/fixtures/counter/Counter.d.kt.ts +1 -0
- package/kotlin/fixtures/counter/Counter.kt +10 -3
- package/kotlin/fixtures/counter/CounterApp.native.tsx +1 -1
- package/kotlin/fixtures/counter/vite.config.ts +2 -2
- package/kotlin/fixtures/headless-counter/Headless.kt +7 -6
- package/kotlin/fixtures/import-animation/Animation.d.kt.ts +7 -0
- package/kotlin/fixtures/import-animation/Animation.kt +80 -0
- package/kotlin/fixtures/import-animation/ImportAnimation.native.tsx +13 -0
- package/kotlin/fixtures/import-animation/README.md +24 -0
- package/kotlin/fixtures/import-animation/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-animation/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-animation/app/routes.d.ts +18 -0
- package/kotlin/fixtures/import-animation/package.json +23 -0
- package/kotlin/fixtures/import-animation/tsconfig.json +20 -0
- package/kotlin/fixtures/import-animation/vite.config.ts +20 -0
- package/kotlin/fixtures/import-editor/Editor.d.kt.ts +7 -0
- package/kotlin/fixtures/import-editor/Editor.kt +59 -0
- package/kotlin/fixtures/import-editor/ImportEditor.native.tsx +23 -0
- package/kotlin/fixtures/import-editor/README.md +27 -0
- package/kotlin/fixtures/import-editor/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-editor/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-editor/package.json +23 -0
- package/kotlin/fixtures/import-editor/tsconfig.json +20 -0
- package/kotlin/fixtures/import-editor/vite.config.ts +20 -0
- package/kotlin/fixtures/import-effects/Effects.d.kt.ts +7 -0
- package/kotlin/fixtures/import-effects/Effects.kt +87 -0
- package/kotlin/fixtures/import-effects/ImportEffects.native.tsx +13 -0
- package/kotlin/fixtures/import-effects/README.md +19 -0
- package/kotlin/fixtures/import-effects/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-effects/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-effects/package.json +23 -0
- package/kotlin/fixtures/import-effects/tsconfig.json +20 -0
- package/kotlin/fixtures/import-effects/vite.config.ts +20 -0
- package/kotlin/fixtures/import-layout/ImportLayout.native.tsx +13 -0
- package/kotlin/fixtures/import-layout/Layout.d.kt.ts +7 -0
- package/kotlin/fixtures/import-layout/Layout.kt +72 -0
- package/kotlin/fixtures/import-layout/README.md +24 -0
- package/kotlin/fixtures/import-layout/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-layout/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-layout/package.json +23 -0
- package/kotlin/fixtures/import-layout/tsconfig.json +20 -0
- package/kotlin/fixtures/import-layout/vite.config.ts +20 -0
- package/kotlin/fixtures/import-navigation/ImportNavigation.native.tsx +18 -0
- package/kotlin/fixtures/import-navigation/Navigation.d.kt.ts +7 -0
- package/kotlin/fixtures/import-navigation/Navigation.kt +104 -0
- package/kotlin/fixtures/import-navigation/README.md +31 -0
- package/kotlin/fixtures/import-navigation/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-navigation/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-navigation/package.json +23 -0
- package/kotlin/fixtures/import-navigation/tsconfig.json +20 -0
- package/kotlin/fixtures/import-navigation/vite.config.ts +20 -0
- package/kotlin/fixtures/import-overlays/ImportOverlays.native.tsx +29 -0
- package/kotlin/fixtures/import-overlays/Overlays.d.kt.ts +7 -0
- package/kotlin/fixtures/import-overlays/Overlays.kt +93 -0
- package/kotlin/fixtures/import-overlays/README.md +34 -0
- package/kotlin/fixtures/import-overlays/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-overlays/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-overlays/package.json +23 -0
- package/kotlin/fixtures/import-overlays/tsconfig.json +20 -0
- package/kotlin/fixtures/import-overlays/vite.config.ts +20 -0
- package/kotlin/fixtures/import-scroll/ImportScroll.native.tsx +13 -0
- package/kotlin/fixtures/import-scroll/README.md +23 -0
- package/kotlin/fixtures/import-scroll/Scroll.d.kt.ts +7 -0
- package/kotlin/fixtures/import-scroll/Scroll.kt +91 -0
- package/kotlin/fixtures/import-scroll/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-scroll/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-scroll/package.json +23 -0
- package/kotlin/fixtures/import-scroll/tsconfig.json +20 -0
- package/kotlin/fixtures/import-scroll/vite.config.ts +20 -0
- package/kotlin/fixtures/import-selection/ImportSelection.native.tsx +44 -0
- package/kotlin/fixtures/import-selection/README.md +32 -0
- package/kotlin/fixtures/import-selection/Selection.d.kt.ts +8 -0
- package/kotlin/fixtures/import-selection/Selection.kt +78 -0
- package/kotlin/fixtures/import-selection/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-selection/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-selection/package.json +23 -0
- package/kotlin/fixtures/import-selection/tsconfig.json +20 -0
- package/kotlin/fixtures/import-selection/vite.config.ts +20 -0
- package/kotlin/fixtures/import-surfaces/ImportSurfaces.native.tsx +13 -0
- package/kotlin/fixtures/import-surfaces/README.md +22 -0
- package/kotlin/fixtures/import-surfaces/Surfaces.d.kt.ts +7 -0
- package/kotlin/fixtures/import-surfaces/Surfaces.kt +64 -0
- package/kotlin/fixtures/import-surfaces/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-surfaces/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-surfaces/package.json +23 -0
- package/kotlin/fixtures/import-surfaces/tsconfig.json +20 -0
- package/kotlin/fixtures/import-surfaces/vite.config.ts +20 -0
- package/kotlin/fixtures/import-values/ImportValues.native.tsx +35 -0
- package/kotlin/fixtures/import-values/README.md +23 -0
- package/kotlin/fixtures/import-values/Values.d.kt.ts +11 -0
- package/kotlin/fixtures/import-values/Values.kt +66 -0
- package/kotlin/fixtures/import-values/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-values/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-values/package.json +23 -0
- package/kotlin/fixtures/import-values/tsconfig.json +20 -0
- package/kotlin/fixtures/import-values/vite.config.ts +20 -0
- package/kotlin/fixtures/kotlin-app-variants/BarBehavior.kt +38 -0
- package/kotlin/fixtures/kotlin-app-variants/BarVisibility.kt +36 -0
- package/kotlin/fixtures/kotlin-app-variants/Ime.kt +3 -1
- package/kotlin/fixtures/kotlin-app-variants/TransientInsets.kt +50 -0
- package/kotlin/fork/NOTICE +6 -1
- package/kotlin/fork/README.md +15 -7
- package/kotlin/fork/build.sh +2 -0
- package/kotlin/fork/compose-worker-globals.patch +186 -4
- package/kotlin/fork/fork.json +2 -2
- package/kotlin/fork/skiko-worker-clock.patch +12 -0
- package/kotlin/toolchain.json +12 -12
- package/kotlin/tools/expo-types.main.kts +115 -0
- package/package.json +17 -23
- package/scripts/dev-server-scanner.ts +92 -66
- package/skills/contrast/SKILL.md +2 -2
- package/skills/peach-debug/SKILL.md +1 -1
- package/skills/peach-perf/SKILL.md +1 -1
- package/skills/peach-setup/SKILL.md +2 -1
- package/skills/peach-test/SKILL.md +8 -0
- package/src/assetCatalogContract.ts +43 -1
- package/src/bridge-contract-input.ts +46 -19
- package/src/bridge-contract.ts +0 -1
- package/src/bundle-channel.mjs +197 -84
- package/src/bundleGlobalFooter.ts +38 -0
- package/src/capture-contract.ts +107 -33
- package/src/cloud-contract.ts +5 -1
- package/src/cloud.ts +5 -2
- package/src/config.ts +22 -3
- package/src/configured-bundle-producer.ts +1 -1
- package/src/desktop-host-delivery.ts +95 -1
- package/src/expo-kotlin-bundle.ts +29 -0
- package/src/expo-kotlin-host.ts +201 -0
- package/src/expo-swift-host.ts +96 -76
- package/src/expoKotlinContract.ts +70 -0
- package/src/expoSwiftContract.ts +4 -25
- package/src/home-paths.ts +7 -4
- package/src/host/bridge-host.ts +23 -3
- package/src/host/fetch-proxy-handler.ts +13 -0
- package/src/host/fetch-proxy-overrides.ts +11 -0
- package/src/host/replacement-module-handler.ts +5 -2
- package/src/index.ts +3 -1
- package/src/kotlin-host.ts +463 -19
- package/src/metro-plugin.ts +56 -28
- package/src/metro-production-bundle.ts +2 -2
- package/src/native-app-identity-project.ts +190 -0
- package/src/native-app-identity.ts +398 -34
- package/src/native-firebase-config.ts +69 -15
- package/src/native-seam-manifest.ts +6 -0
- package/src/one-widget-discovery.ts +2 -1
- package/src/openstep-plist.ts +107 -0
- package/src/react-native-host-modules.ts +4 -0
- package/src/runtime-assets.ts +2 -2
- package/src/sim-client.ts +2 -2
- package/src/swift-binary-modules.ts +3 -1
- package/src/swift-compile.ts +286 -38
- package/src/swift-distribution-contract.ts +4 -0
- package/src/swift-distribution.lock.json +123 -12
- package/src/swift-distribution.ts +7 -3
- package/src/swift-host.ts +298 -83
- package/src/swift-package-manifest.ts +29 -2
- package/src/swift-package.ts +180 -10
- package/src/swift-packages.ts +4 -0
- package/src/swift-standin-emit.ts +4 -1
- package/src/swift-standins.ts +274 -15
- package/src/swift-submit.ts +62 -7
- package/src/swift-toolchain.ts +6 -1
- package/src/swiftContract.ts +126 -3
- package/src/vite-plugin-one.ts +13 -16
- package/src/vite-plugin-swift.ts +4 -5
- package/src/vite-plugin.ts +360 -144
- package/src/vite.d.ts +1 -1
- package/src/worker-system-chunks.ts +221 -0
- package/src/worklet-executable.ts +348 -38
- package/src/worklets-babel.ts +1 -1
- package/src/xcode-project.ts +243 -127
- package/dist-lib/agent-identity.cjs +0 -39
- package/dist-lib/agent-sessions.cjs +0 -760
- package/dist-lib/cli-constants.cjs +0 -32
- package/dist-lib/render-mode.cjs +0 -44
- package/kotlin/AppSources/android/view/View.kt +0 -74
- package/kotlin/AppSources/android/widget/FrameLayout.kt +0 -6
- package/src/render-mode.ts +0 -15
- /package/kotlin/{AppSources → AndroidViewSources}/android/content/Context.kt +0 -0
- /package/kotlin/{AppSources → AndroidViewSources}/android/content/res/Configuration.kt +0 -0
- /package/kotlin/{AppSources → AndroidViewSources}/android/graphics/Color.kt +0 -0
- /package/kotlin/{AppSources → AndroidViewSources}/android/util/DisplayMetrics.kt +0 -0
- /package/kotlin/{AppSources → AndroidViewSources}/dev/peach/app/JavaFormat.kt +0 -0
- /package/kotlin/{AppSources → Sources}/java/lang/Runnable.kt +0 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { insertBundleGlobalFooter, readBundleGlobalFooter } from './bundleGlobalFooter'
|
|
2
|
+
|
|
3
|
+
// what the dev server answers for an app's local Expo Kotlin modules on an
|
|
4
|
+
// Android device: one linked Kotlin/Wasm process, or each module's diagnostic.
|
|
5
|
+
// a process that links compose views needs the tenant's kotlin native runtime.
|
|
6
|
+
// a release bundle carries the same result as a footer.
|
|
7
|
+
export interface ExpoKotlinCompilationResult {
|
|
8
|
+
namespaces: string[]
|
|
9
|
+
module: { url: string; hash: string; compose: boolean } | null
|
|
10
|
+
failures: { namespace: string; diagnostic: string }[]
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function record(value: unknown): value is Record<string, unknown> {
|
|
14
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value)
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function readExpoKotlinMetadata(value: unknown): ExpoKotlinCompilationResult {
|
|
18
|
+
const invalid = () => new Error('invalid Expo Kotlin compilation metadata')
|
|
19
|
+
if (
|
|
20
|
+
!record(value) ||
|
|
21
|
+
!Array.isArray(value.namespaces) ||
|
|
22
|
+
!Array.isArray(value.failures)
|
|
23
|
+
)
|
|
24
|
+
throw invalid()
|
|
25
|
+
const namespaces: string[] = []
|
|
26
|
+
for (const namespace of value.namespaces) {
|
|
27
|
+
if (typeof namespace !== 'string') throw invalid()
|
|
28
|
+
namespaces.push(namespace)
|
|
29
|
+
}
|
|
30
|
+
const failures: ExpoKotlinCompilationResult['failures'] = []
|
|
31
|
+
for (const failure of value.failures) {
|
|
32
|
+
if (
|
|
33
|
+
!record(failure) ||
|
|
34
|
+
typeof failure.namespace !== 'string' ||
|
|
35
|
+
typeof failure.diagnostic !== 'string'
|
|
36
|
+
)
|
|
37
|
+
throw invalid()
|
|
38
|
+
failures.push({ namespace: failure.namespace, diagnostic: failure.diagnostic })
|
|
39
|
+
}
|
|
40
|
+
const module = value.module
|
|
41
|
+
if (module === null) return { namespaces, module: null, failures }
|
|
42
|
+
if (
|
|
43
|
+
!record(module) ||
|
|
44
|
+
typeof module.url !== 'string' ||
|
|
45
|
+
typeof module.hash !== 'string' ||
|
|
46
|
+
typeof module.compose !== 'boolean'
|
|
47
|
+
)
|
|
48
|
+
throw invalid()
|
|
49
|
+
return {
|
|
50
|
+
namespaces,
|
|
51
|
+
module: { url: module.url, hash: module.hash, compose: module.compose },
|
|
52
|
+
failures,
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export function readExpoKotlinFooter(source: string): ExpoKotlinCompilationResult | null {
|
|
57
|
+
const value = readBundleGlobalFooter(source, '__peachExpoKotlin')
|
|
58
|
+
return value === null ? null : readExpoKotlinMetadata(value)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export function insertExpoKotlinFooter(
|
|
62
|
+
source: string,
|
|
63
|
+
metadata: ExpoKotlinCompilationResult,
|
|
64
|
+
): string {
|
|
65
|
+
return insertBundleGlobalFooter(
|
|
66
|
+
source,
|
|
67
|
+
'__peachExpoKotlin',
|
|
68
|
+
readExpoKotlinMetadata(metadata),
|
|
69
|
+
)
|
|
70
|
+
}
|
package/src/expoSwiftContract.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { insertBundleGlobalFooter, readBundleGlobalFooter } from './bundleGlobalFooter'
|
|
2
|
+
|
|
1
3
|
export interface ExpoSwiftSourceUnit {
|
|
2
4
|
namespace: string
|
|
3
5
|
moduleId: string
|
|
@@ -64,8 +66,6 @@ export function isExpoSwiftCompilationResult(
|
|
|
64
66
|
return remaining.size === 0
|
|
65
67
|
}
|
|
66
68
|
|
|
67
|
-
const FOOTER_PREFIX = 'globalThis.__peachExpoSwift='
|
|
68
|
-
|
|
69
69
|
export function readExpoSwiftMetadata(value: unknown): ExpoSwiftCompilationResult | null {
|
|
70
70
|
if (value === null || value === undefined) return null
|
|
71
71
|
if (!isExpoSwiftCompilationResult(value))
|
|
@@ -74,14 +74,7 @@ export function readExpoSwiftMetadata(value: unknown): ExpoSwiftCompilationResul
|
|
|
74
74
|
}
|
|
75
75
|
|
|
76
76
|
export function readExpoSwiftFooter(source: string): ExpoSwiftCompilationResult | null {
|
|
77
|
-
|
|
78
|
-
if (start < 0) return null
|
|
79
|
-
const end = source.indexOf('\n', start + 1)
|
|
80
|
-
const line = source.slice(start + 1, end < 0 ? undefined : end)
|
|
81
|
-
if (!line.endsWith(';')) throw new Error('Expo Swift footer is truncated')
|
|
82
|
-
const metadata = readExpoSwiftMetadata(JSON.parse(line.slice(FOOTER_PREFIX.length, -1)))
|
|
83
|
-
if (!metadata) throw new Error('Expo Swift footer has no metadata')
|
|
84
|
-
return metadata
|
|
77
|
+
return readExpoSwiftMetadata(readBundleGlobalFooter(source, '__peachExpoSwift'))
|
|
85
78
|
}
|
|
86
79
|
|
|
87
80
|
export function insertExpoSwiftFooter(
|
|
@@ -89,19 +82,5 @@ export function insertExpoSwiftFooter(
|
|
|
89
82
|
metadata: ExpoSwiftCompilationResult,
|
|
90
83
|
): string {
|
|
91
84
|
readExpoSwiftMetadata(metadata)
|
|
92
|
-
|
|
93
|
-
if (start >= 0) {
|
|
94
|
-
readExpoSwiftFooter(source)
|
|
95
|
-
const end = source.indexOf('\n', start + 1)
|
|
96
|
-
source = source.slice(0, start) + (end < 0 ? '' : source.slice(end))
|
|
97
|
-
}
|
|
98
|
-
const json = JSON.stringify(metadata)
|
|
99
|
-
.replace(/\u2028/g, '\\u2028')
|
|
100
|
-
.replace(/\u2029/g, '\\u2029')
|
|
101
|
-
.replace(/<\//g, '<\\/')
|
|
102
|
-
const footer = `\n${FOOTER_PREFIX}${json};`
|
|
103
|
-
const identity = source.lastIndexOf('\nglobalThis.__sootsimModulePaths=')
|
|
104
|
-
return identity < 0
|
|
105
|
-
? source + footer
|
|
106
|
-
: source.slice(0, identity) + footer + source.slice(identity)
|
|
85
|
+
return insertBundleGlobalFooter(source, '__peachExpoSwift', metadata)
|
|
107
86
|
}
|
package/src/home-paths.ts
CHANGED
|
@@ -35,6 +35,7 @@ import { randomUUID } from 'node:crypto'
|
|
|
35
35
|
import fs from 'node:fs'
|
|
36
36
|
import { homedir } from 'node:os'
|
|
37
37
|
import path from 'node:path'
|
|
38
|
+
import type { DriverId } from '../cli/drivers/types'
|
|
38
39
|
|
|
39
40
|
export const PEACH_HOME_ENV = 'PEACH_HOME'
|
|
40
41
|
export const ACTIVE_RUNTIME_FILE = 'active'
|
|
@@ -56,7 +57,7 @@ export function rnxHomeDir(): string {
|
|
|
56
57
|
// persistent launchd / systemd agent: dev shells shouldn't register an agent
|
|
57
58
|
// whose Program path points at workspace artifacts that change between
|
|
58
59
|
// sessions, and whose served engine assets are the stale prod build instead
|
|
59
|
-
// of the live `bun dev:
|
|
60
|
+
// of the live `bun dev:peach` output.
|
|
60
61
|
//
|
|
61
62
|
// overrides:
|
|
62
63
|
// SOOTSIM_DEV=1 / SOOTSIM_DEV=0 force the answer
|
|
@@ -224,7 +225,7 @@ export interface SharedConfig {
|
|
|
224
225
|
homeScreen?: import('@peach/globals').PeachHomeScreenConfig
|
|
225
226
|
telemetry?: boolean
|
|
226
227
|
onboardingVersion?: number
|
|
227
|
-
simulatorDriver?:
|
|
228
|
+
simulatorDriver?: SimulatorDriverPreference
|
|
228
229
|
settings?: Record<string, unknown>
|
|
229
230
|
[key: string]: unknown
|
|
230
231
|
}
|
|
@@ -262,7 +263,7 @@ export function writeSharedConfig(patch: Partial<SharedConfig>): SharedConfig {
|
|
|
262
263
|
|
|
263
264
|
const CURRENT_ONBOARDING_VERSION = 1
|
|
264
265
|
|
|
265
|
-
export type SimulatorDriverPreference =
|
|
266
|
+
export type SimulatorDriverPreference = DriverId
|
|
266
267
|
|
|
267
268
|
export function isOnboardingComplete(): boolean {
|
|
268
269
|
return readSharedConfig().onboardingVersion === CURRENT_ONBOARDING_VERSION
|
|
@@ -270,7 +271,9 @@ export function isOnboardingComplete(): boolean {
|
|
|
270
271
|
|
|
271
272
|
export function readSimulatorDriverPreference(): SimulatorDriverPreference | null {
|
|
272
273
|
const driver = readSharedConfig().simulatorDriver
|
|
273
|
-
return driver === '
|
|
274
|
+
return driver === 'desktop' || driver === 'electron' || driver === 'playwright'
|
|
275
|
+
? driver
|
|
276
|
+
: null
|
|
274
277
|
}
|
|
275
278
|
|
|
276
279
|
export function writeOnboardingPreferences(driver: SimulatorDriverPreference): void {
|
package/src/host/bridge-host.ts
CHANGED
|
@@ -505,7 +505,7 @@ export class SootSimBridgeHost {
|
|
|
505
505
|
!fs.existsSync(path.join(this.activeRuntimeDirPath, 'index.html'))
|
|
506
506
|
|
|
507
507
|
for (let attempt = 0; attempt < this.portFallbackCount; attempt++) {
|
|
508
|
-
const candidate = this.preferredPort + attempt
|
|
508
|
+
const candidate = this.preferredPort === 0 ? 0 : this.preferredPort + attempt
|
|
509
509
|
try {
|
|
510
510
|
const boundPort = await this.bindOnce(candidate, options?.silent === true)
|
|
511
511
|
this.effectivePort = boundPort
|
|
@@ -513,7 +513,7 @@ export class SootSimBridgeHost {
|
|
|
513
513
|
this.startedAt = Date.now()
|
|
514
514
|
if (attempt > 0 && !options?.silent) {
|
|
515
515
|
process.stderr.write(
|
|
516
|
-
`ws bridge bound to port ${
|
|
516
|
+
`ws bridge bound to port ${boundPort} (preferred ${this.preferredPort} was taken)\n`,
|
|
517
517
|
)
|
|
518
518
|
}
|
|
519
519
|
try {
|
|
@@ -533,7 +533,7 @@ export class SootSimBridgeHost {
|
|
|
533
533
|
}
|
|
534
534
|
if (!options?.silent) {
|
|
535
535
|
process.stderr.write(
|
|
536
|
-
`ws bridge port ${candidate} already in use, trying ${candidate + 1}\n`,
|
|
536
|
+
`ws bridge port ${candidate} already in use, trying ${this.preferredPort === 0 ? 'another ephemeral port' : candidate + 1}\n`,
|
|
537
537
|
)
|
|
538
538
|
}
|
|
539
539
|
// bindOnce already cleaned up httpServer/wss on failure
|
|
@@ -1383,6 +1383,8 @@ export class SootSimBridgeHost {
|
|
|
1383
1383
|
// daemon would silently validate published code instead of the checkout.
|
|
1384
1384
|
// local-publish writes the marker above when it stages a source build.
|
|
1385
1385
|
if (process.env.PEACH_HOME && isSootsimDevCheckout() && !readActiveRuntime()) {
|
|
1386
|
+
this.bootstrapping = false
|
|
1387
|
+
if (this.httpServer) this.writeLockfileSnapshot()
|
|
1386
1388
|
return
|
|
1387
1389
|
}
|
|
1388
1390
|
void this.runRuntimeUpdate('startup')
|
|
@@ -1549,6 +1551,24 @@ export class SootSimBridgeHost {
|
|
|
1549
1551
|
})
|
|
1550
1552
|
return
|
|
1551
1553
|
}
|
|
1554
|
+
if (
|
|
1555
|
+
req.url?.startsWith('/__peach/expo-kotlin') ||
|
|
1556
|
+
req.url?.startsWith('/__peach/kotlin-artifact/')
|
|
1557
|
+
) {
|
|
1558
|
+
void import('../expo-kotlin-host.ts')
|
|
1559
|
+
.then(({ handleExpoKotlinRequest }) => handleExpoKotlinRequest(req, res))
|
|
1560
|
+
.then((handled) => {
|
|
1561
|
+
if (!handled) {
|
|
1562
|
+
res.writeHead(404)
|
|
1563
|
+
res.end('Kotlin artifact not found')
|
|
1564
|
+
}
|
|
1565
|
+
})
|
|
1566
|
+
.catch((error: unknown) => {
|
|
1567
|
+
res.writeHead(500)
|
|
1568
|
+
res.end(String(error))
|
|
1569
|
+
})
|
|
1570
|
+
return
|
|
1571
|
+
}
|
|
1552
1572
|
|
|
1553
1573
|
// proxy + app-api routes need to accept POST/PUT/DELETE/PATCH/OPTIONS
|
|
1554
1574
|
// because they forward the request to a real upstream. handle them
|
|
@@ -35,6 +35,8 @@ import {
|
|
|
35
35
|
} from '../backend-origin.ts'
|
|
36
36
|
import {
|
|
37
37
|
buildFetchProxyUpstreamHeaders,
|
|
38
|
+
FETCH_PROXY_FAILURE_HEADER,
|
|
39
|
+
FETCH_PROXY_FAILURE_PARAM,
|
|
38
40
|
nodeRequestHeaderEntries,
|
|
39
41
|
resolveFetchProxyTargetUrl,
|
|
40
42
|
} from './fetch-proxy-overrides.ts'
|
|
@@ -344,6 +346,17 @@ export async function handleFetchProxyRequest(
|
|
|
344
346
|
} catch {}
|
|
345
347
|
}
|
|
346
348
|
}
|
|
349
|
+
if (!res.headersSent && params.has(FETCH_PROXY_FAILURE_PARAM)) {
|
|
350
|
+
const code = (err as { code?: unknown })?.code
|
|
351
|
+
res.statusCode = 502
|
|
352
|
+
res.setHeader(
|
|
353
|
+
FETCH_PROXY_FAILURE_HEADER,
|
|
354
|
+
typeof code === 'string' ? code : 'unknown',
|
|
355
|
+
)
|
|
356
|
+
applyFetchProxyCors(req, res)
|
|
357
|
+
res.end()
|
|
358
|
+
return
|
|
359
|
+
}
|
|
347
360
|
// an upstream that cannot be reached fails the page's request the way a
|
|
348
361
|
// direct fetch would: as a network error, never a response. a synthetic
|
|
349
362
|
// 5xx reads as a live server answering (the bundle loader then polls it as
|
|
@@ -14,6 +14,17 @@
|
|
|
14
14
|
// the name itself reach upstream (see buildFetchProxyUpstreamHeaders).
|
|
15
15
|
export const FETCH_PROXY_NATIVE_USER_AGENT_HEADER = 'x-sootsim-native-user-agent'
|
|
16
16
|
|
|
17
|
+
// a fetch cannot read why a request failed: the browser reports every
|
|
18
|
+
// transport failure as the same TypeError. the engine's fetch transport adds
|
|
19
|
+
// this query parameter to the proxy requests it sends, and for those alone
|
|
20
|
+
// the proxy answers an unreachable upstream with a 502 naming the node error
|
|
21
|
+
// code (ENOTFOUND, ECONNREFUSED, ECONNRESET, ...) under the header below; the
|
|
22
|
+
// transport turns that answer back into a rejection carrying the code, so
|
|
23
|
+
// URLSession can report the error iOS reports. every other consumer (xhr,
|
|
24
|
+
// images, webview loads) keeps the bare network error.
|
|
25
|
+
export const FETCH_PROXY_FAILURE_PARAM = 'peachFailure'
|
|
26
|
+
export const FETCH_PROXY_FAILURE_HEADER = 'x-peach-upstream-failure'
|
|
27
|
+
|
|
17
28
|
const HOST_HEADER_OVERRIDES: Array<{
|
|
18
29
|
hostSuffix: string
|
|
19
30
|
headers: Record<string, string>
|
|
@@ -85,6 +85,11 @@ export async function handleReplacementModuleRequest(
|
|
|
85
85
|
return false
|
|
86
86
|
}
|
|
87
87
|
|
|
88
|
+
// the route check comes first: dev servers mount this handler ahead of every
|
|
89
|
+
// request, so the loopback guard must only refuse replacement-module requests,
|
|
90
|
+
// never the bundle and status requests a LAN device or remote emulator makes.
|
|
91
|
+
if (url.pathname !== REPLACEMENT_MODULE_ROUTE) return false
|
|
92
|
+
|
|
88
93
|
if (options.requireLoopbackOrigin) {
|
|
89
94
|
const origin = req.headers.origin
|
|
90
95
|
const remoteAddress = req.socket.remoteAddress?.replace(/^::ffff:/, '')
|
|
@@ -103,8 +108,6 @@ export async function handleReplacementModuleRequest(
|
|
|
103
108
|
}
|
|
104
109
|
}
|
|
105
110
|
|
|
106
|
-
if (url.pathname !== REPLACEMENT_MODULE_ROUTE) return false
|
|
107
|
-
|
|
108
111
|
if (options.requestToken && url.searchParams.get('token') !== options.requestToken) {
|
|
109
112
|
res.writeHead(403, { 'Content-Type': 'text/plain; charset=utf-8' })
|
|
110
113
|
res.end('replacement module request token is invalid')
|
package/src/index.ts
CHANGED
|
@@ -42,6 +42,7 @@ export {
|
|
|
42
42
|
rnxCaptureRasterRegions,
|
|
43
43
|
packRnxCaptureRegions,
|
|
44
44
|
rnxRasterFrames,
|
|
45
|
+
rnxRasterRegionRequests,
|
|
45
46
|
RNX_SCREEN_CAPTURE_VERSION,
|
|
46
47
|
selectRnxRasterNodeIds,
|
|
47
48
|
type RnxCaptureAccessibility,
|
|
@@ -62,10 +63,11 @@ export {
|
|
|
62
63
|
type RnxCaptureTree,
|
|
63
64
|
type RnxCaptureVisualEvidence,
|
|
64
65
|
type RnxRasterRegionTree,
|
|
66
|
+
type RnxRasterSelection,
|
|
65
67
|
type RnxScreenCapture,
|
|
66
68
|
} from './capture-contract'
|
|
67
69
|
|
|
68
|
-
export {
|
|
70
|
+
export { peachPlugin } from './vite-plugin-one'
|
|
69
71
|
export { default as metroPlugin } from './metro-plugin'
|
|
70
72
|
export { default as jumpToSourceBabelPlugin } from './jump-to-source-babel'
|
|
71
73
|
export {
|