peachsim 0.1.940 → 0.1.1400
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 +17 -8
- 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 +107 -95
- 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 +19 -16
- 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 +50 -8
- package/cli/recording-access.ts +6 -6
- package/cli/run-registry.ts +1 -1
- package/cli/runtime-compat.ts +5 -1
- package/cli/screenshot-output.ts +17 -0
- 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 +3 -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 +4114 -1376
- 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/dev-bundle-resolution.ts +1 -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
package/cli/cloud-test-tunnel.ts
CHANGED
|
@@ -110,7 +110,7 @@ export function startCloudTestTokenProxy(
|
|
|
110
110
|
upstreamPort: number,
|
|
111
111
|
sidecarPorts: readonly number[],
|
|
112
112
|
token: string,
|
|
113
|
-
): Promise<{ close: () => void } | null> {
|
|
113
|
+
): Promise<{ port: number; close: () => void } | null> {
|
|
114
114
|
const server = createServer((req, res) => {
|
|
115
115
|
const auth = req.headers.authorization || ''
|
|
116
116
|
if (auth !== `Bearer ${token}`) {
|
|
@@ -177,7 +177,11 @@ export function startCloudTestTokenProxy(
|
|
|
177
177
|
return new Promise((resolve) => {
|
|
178
178
|
server.on('error', () => resolve(null))
|
|
179
179
|
server.listen(listenPort, '127.0.0.1', () => {
|
|
180
|
-
|
|
180
|
+
const address = server.address()
|
|
181
|
+
if (!address || typeof address !== 'object') {
|
|
182
|
+
throw new Error('token proxy has no listening address')
|
|
183
|
+
}
|
|
184
|
+
resolve({ port: address.port, close: () => server.close() })
|
|
181
185
|
})
|
|
182
186
|
})
|
|
183
187
|
}
|
|
@@ -187,7 +191,7 @@ function cloudflaredAvailable(): boolean {
|
|
|
187
191
|
return probe.status === 0
|
|
188
192
|
}
|
|
189
193
|
|
|
190
|
-
async function ensureCloudflared(): Promise<boolean> {
|
|
194
|
+
export async function ensureCloudflared(): Promise<boolean> {
|
|
191
195
|
if (cloudflaredAvailable()) return true
|
|
192
196
|
const archMap: Record<string, string> = { x64: 'amd64', arm64: 'arm64' }
|
|
193
197
|
const arch = archMap[process.arch]
|
|
@@ -232,7 +236,7 @@ function childAlive(child: ChildProcess): boolean {
|
|
|
232
236
|
return child.exitCode === null && child.signalCode === null
|
|
233
237
|
}
|
|
234
238
|
|
|
235
|
-
async function launchQuickTunnel(
|
|
239
|
+
export async function launchQuickTunnel(
|
|
236
240
|
originUrl: string,
|
|
237
241
|
hostHeader: string,
|
|
238
242
|
logFile: string,
|
|
@@ -297,23 +301,13 @@ export async function publishLiveDevStack(args: {
|
|
|
297
301
|
}): Promise<PublishedLiveDevStack> {
|
|
298
302
|
const { devPort, sidecarPorts } = args
|
|
299
303
|
const jobToken = randomBytes(16).toString('hex')
|
|
300
|
-
//
|
|
304
|
+
// let the token proxy own its port; the advertised authority stays
|
|
301
305
|
// the dev server's own port so Metro URLs resolve on the recorder.
|
|
302
|
-
const
|
|
303
|
-
const proxyPort = await new Promise<number>((resolve, reject) => {
|
|
304
|
-
const probe = new Server()
|
|
305
|
-
probe.once('error', reject)
|
|
306
|
-
probe.listen(0, '127.0.0.1', () => {
|
|
307
|
-
const address = probe.address()
|
|
308
|
-
const port = address && typeof address === 'object' ? address.port : 0
|
|
309
|
-
probe.close(() => resolve(port))
|
|
310
|
-
})
|
|
311
|
-
})
|
|
312
|
-
if (!proxyPort) throw new Error('could not allocate a tunnel proxy port')
|
|
313
|
-
const proxy = await startCloudTestTokenProxy(proxyPort, devPort, sidecarPorts, jobToken)
|
|
306
|
+
const proxy = await startCloudTestTokenProxy(0, devPort, sidecarPorts, jobToken)
|
|
314
307
|
if (!proxy) {
|
|
315
|
-
throw new Error(
|
|
308
|
+
throw new Error('could not start the tunnel token proxy on 127.0.0.1')
|
|
316
309
|
}
|
|
310
|
+
const proxyPort = proxy.port
|
|
317
311
|
const closeProxy = proxy.close
|
|
318
312
|
const hostHeader = `127.0.0.1:${devPort}`
|
|
319
313
|
if (!(await ensureCloudflared())) {
|
package/cli/commands/agent.ts
CHANGED
|
@@ -37,7 +37,7 @@ import type { AgentEvent } from '../../src/agent-events'
|
|
|
37
37
|
import type { AgentInspectMessage } from '../../src/agent-prompt'
|
|
38
38
|
|
|
39
39
|
// the bridge this invocation talks to: `-p`, else the same dev-bridge or
|
|
40
|
-
// daemon pick every other command makes (PORT_OFFSET and
|
|
40
|
+
// daemon pick every other command makes (PORT_OFFSET and PEACH_BRIDGE_PORT
|
|
41
41
|
// included).
|
|
42
42
|
let daemonPort = 0
|
|
43
43
|
|
|
@@ -15,7 +15,7 @@ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'
|
|
|
15
15
|
import { join } from 'node:path'
|
|
16
16
|
import { gzipSync } from 'node:zlib'
|
|
17
17
|
import { fetchAppFontFiles } from '../app-fonts'
|
|
18
|
-
import {
|
|
18
|
+
import { peachExit } from '../run-rnx'
|
|
19
19
|
|
|
20
20
|
type ManifestEntry = {
|
|
21
21
|
url: string
|
|
@@ -41,7 +41,7 @@ async function stage(args: string[]): Promise<void> {
|
|
|
41
41
|
console.error(
|
|
42
42
|
' usage: peach app-fonts stage --wire <wire> --out-dir <dir> --manifest <path>',
|
|
43
43
|
)
|
|
44
|
-
|
|
44
|
+
peachExit(1)
|
|
45
45
|
}
|
|
46
46
|
if (!wire.trim()) {
|
|
47
47
|
console.log('no app fonts declared — nothing to stage')
|
|
@@ -95,5 +95,5 @@ export async function runAppFonts(args: string[]): Promise<void> {
|
|
|
95
95
|
}
|
|
96
96
|
console.error(` unknown app-fonts subcommand: ${sub ?? '(none)'}`)
|
|
97
97
|
console.error(' available: stage')
|
|
98
|
-
|
|
98
|
+
peachExit(1)
|
|
99
99
|
}
|
package/cli/commands/assert.ts
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
|
|
16
16
|
import { spawn } from 'child_process'
|
|
17
17
|
import { sleep } from '../../src/sleep'
|
|
18
|
-
import {
|
|
18
|
+
import { peachExit } from '../run-rnx'
|
|
19
19
|
import { rnxSelfInvocation } from '../self-invocation'
|
|
20
20
|
|
|
21
21
|
// READ_VERBS lists every command whose stdout we know is valid JSON under
|
|
@@ -405,13 +405,13 @@ function runJq(expr: string, payload: unknown): Promise<string> {
|
|
|
405
405
|
export async function runAssert(rawArgs: string[]): Promise<void> {
|
|
406
406
|
if (rawArgs[0] === '--help' || rawArgs[0] === '-h' || rawArgs.length === 0) {
|
|
407
407
|
printHelp()
|
|
408
|
-
|
|
408
|
+
peachExit(rawArgs.length === 0 ? 2 : 0)
|
|
409
409
|
}
|
|
410
410
|
|
|
411
411
|
const parsed = parseAssertArgs(rawArgs)
|
|
412
412
|
if ('error' in parsed) {
|
|
413
413
|
process.stderr.write(` assert: ${parsed.error}\n`)
|
|
414
|
-
|
|
414
|
+
peachExit(2)
|
|
415
415
|
}
|
|
416
416
|
|
|
417
417
|
const { verbArgs, predicates, withinMs, negate, quiet, allowTimeout } = parsed
|
|
@@ -422,7 +422,7 @@ export async function runAssert(rawArgs: string[]): Promise<void> {
|
|
|
422
422
|
` assert: unknown or non-read verb: ${verbArgs.join(' ')}\n` +
|
|
423
423
|
` supported: ${Array.from(READ_VERBS).sort().join(', ')}\n`,
|
|
424
424
|
)
|
|
425
|
-
|
|
425
|
+
peachExit(2)
|
|
426
426
|
}
|
|
427
427
|
|
|
428
428
|
// default assertion when none given is --exists. matches the common
|
|
@@ -454,7 +454,7 @@ export async function runAssert(rawArgs: string[]): Promise<void> {
|
|
|
454
454
|
const label = exitCode === 1 ? 'fail' : 'skip'
|
|
455
455
|
process.stderr.write(` assert: ${label} — ${lastVerbSkipReason}\n`)
|
|
456
456
|
}
|
|
457
|
-
|
|
457
|
+
peachExit(exitCode)
|
|
458
458
|
}
|
|
459
459
|
|
|
460
460
|
let allPass = true
|
|
@@ -470,7 +470,7 @@ export async function runAssert(rawArgs: string[]): Promise<void> {
|
|
|
470
470
|
}
|
|
471
471
|
} catch (err: any) {
|
|
472
472
|
if (!quiet) process.stderr.write(` assert: skip — ${err.message}\n`)
|
|
473
|
-
|
|
473
|
+
peachExit(125)
|
|
474
474
|
}
|
|
475
475
|
|
|
476
476
|
const pass = negate ? !allPass : allPass
|
|
@@ -480,7 +480,7 @@ export async function runAssert(rawArgs: string[]): Promise<void> {
|
|
|
480
480
|
` assert: pass${attempts > 1 ? ` (attempt ${attempts})` : ''} — ${reasons.join('; ')}\n`,
|
|
481
481
|
)
|
|
482
482
|
}
|
|
483
|
-
|
|
483
|
+
peachExit(0)
|
|
484
484
|
}
|
|
485
485
|
|
|
486
486
|
lastFailReason = reasons.join('; ')
|
|
@@ -493,7 +493,7 @@ export async function runAssert(rawArgs: string[]): Promise<void> {
|
|
|
493
493
|
` assert: fail${attempts > 1 ? ` after ${attempts} attempt(s)` : ''} — ${lastFailReason}\n`,
|
|
494
494
|
)
|
|
495
495
|
}
|
|
496
|
-
|
|
496
|
+
peachExit(1)
|
|
497
497
|
}
|
|
498
498
|
}
|
|
499
499
|
|
package/cli/commands/auth.ts
CHANGED
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
sharedDesktopAuthAccounts,
|
|
4
4
|
} from '../../src/auth/shared-session'
|
|
5
5
|
import { CHOOSE_ACCOUNT_HINT, resolveCliAuth } from '../auth'
|
|
6
|
-
import {
|
|
6
|
+
import { peachExit } from '../run-rnx'
|
|
7
7
|
|
|
8
8
|
function printHelp(): void {
|
|
9
9
|
console.log(`
|
|
@@ -38,7 +38,12 @@ async function printStatus(): Promise<number> {
|
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
const current = await refreshSharedDesktopAuthSession(auth.origin)
|
|
41
|
-
|
|
41
|
+
if (!current) {
|
|
42
|
+
console.log(' not signed in')
|
|
43
|
+
console.log(' run `peach login` to sign in again')
|
|
44
|
+
return 1
|
|
45
|
+
}
|
|
46
|
+
const user = current.user
|
|
42
47
|
const accounts = sharedDesktopAuthAccounts(user)
|
|
43
48
|
const accountId = current?.accountId ?? auth.accountId
|
|
44
49
|
const account = accounts.find((candidate) => candidate.id === accountId)
|
|
@@ -67,5 +72,5 @@ export async function runAuth(args: string[]): Promise<void> {
|
|
|
67
72
|
|
|
68
73
|
console.error(` unknown auth command: ${sub}`)
|
|
69
74
|
printHelp()
|
|
70
|
-
|
|
75
|
+
peachExit(1)
|
|
71
76
|
}
|
|
@@ -10,21 +10,33 @@
|
|
|
10
10
|
|
|
11
11
|
import {
|
|
12
12
|
PREBUILT_BUNDLE_DEVICE_PATH,
|
|
13
|
+
PREBUILT_BUNDLE_NATIVE_RENDERER_PATH,
|
|
13
14
|
prebuiltAppFontsPartPath,
|
|
14
15
|
PREBUILT_BUNDLE_PART_BYTES,
|
|
15
16
|
prebuiltBundlePartPath,
|
|
16
17
|
} from '@peach/box/template'
|
|
18
|
+
import type { NativeRenderer } from '../../../src/config'
|
|
17
19
|
import type { ProjectFileMeta, ProjectFilePlane } from '@peach/box/plane'
|
|
18
20
|
|
|
19
21
|
export class BundleFilePlane implements ProjectFilePlane {
|
|
20
22
|
private readonly parts = new Map<string, Uint8Array>()
|
|
21
23
|
private readonly entries = new Map<string, ProjectFileMeta>()
|
|
22
24
|
|
|
23
|
-
constructor(
|
|
25
|
+
constructor(
|
|
26
|
+
bundle: Uint8Array,
|
|
27
|
+
device: string | null,
|
|
28
|
+
appFonts = '',
|
|
29
|
+
nativeRenderer?: NativeRenderer,
|
|
30
|
+
) {
|
|
24
31
|
if (bundle.byteLength === 0) throw new Error('a Box bundle cannot be empty')
|
|
25
32
|
if (appFonts)
|
|
26
33
|
this.recordParts(new TextEncoder().encode(appFonts), prebuiltAppFontsPartPath)
|
|
27
34
|
if (device) this.record(PREBUILT_BUNDLE_DEVICE_PATH, new TextEncoder().encode(device))
|
|
35
|
+
if (nativeRenderer !== undefined)
|
|
36
|
+
this.record(
|
|
37
|
+
PREBUILT_BUNDLE_NATIVE_RENDERER_PATH,
|
|
38
|
+
new TextEncoder().encode(nativeRenderer),
|
|
39
|
+
)
|
|
28
40
|
this.recordParts(bundle, prebuiltBundlePartPath)
|
|
29
41
|
}
|
|
30
42
|
|
package/cli/commands/box.ts
CHANGED
|
@@ -44,6 +44,7 @@ import { CheckoutFilePlane, CheckoutRequiresGitError } from './box/checkout-plan
|
|
|
44
44
|
import { createPeachCommand } from './box/peach-command'
|
|
45
45
|
import { sharePlane } from './box/plane-share'
|
|
46
46
|
import { createSearchCommand } from './box/search-command'
|
|
47
|
+
import { readNativeProjectRenderer } from './detect'
|
|
47
48
|
import type { BoxShellSession } from '@peach/box/client'
|
|
48
49
|
import type { BoxTemplateResolution } from '@peach/box/template'
|
|
49
50
|
|
|
@@ -535,6 +536,13 @@ export async function createPrebuiltBundleBox(options: {
|
|
|
535
536
|
accountId: string | null
|
|
536
537
|
secrets?: Readonly<Record<string, string>>
|
|
537
538
|
}) {
|
|
539
|
+
const platform =
|
|
540
|
+
options.device && isDeviceModel(options.device)
|
|
541
|
+
? getRuntimePlatform(options.device)
|
|
542
|
+
: 'ios'
|
|
543
|
+
const nativeRenderer = options.nativeProjectDir
|
|
544
|
+
? readNativeProjectRenderer(options.nativeProjectDir, platform)
|
|
545
|
+
: undefined
|
|
538
546
|
return cloudBoxClient(options).create({
|
|
539
547
|
name: options.name,
|
|
540
548
|
stack: prebuiltBundleBoxTemplate.stack,
|
|
@@ -545,12 +553,10 @@ export async function createPrebuiltBundleBox(options: {
|
|
|
545
553
|
options.nativeProjectDir
|
|
546
554
|
? readNativeLinkedAppFontsWire({
|
|
547
555
|
projectDir: options.nativeProjectDir,
|
|
548
|
-
platform
|
|
549
|
-
options.device && isDeviceModel(options.device)
|
|
550
|
-
? getRuntimePlatform(options.device)
|
|
551
|
-
: 'ios',
|
|
556
|
+
platform,
|
|
552
557
|
})
|
|
553
558
|
: '',
|
|
559
|
+
nativeRenderer,
|
|
554
560
|
),
|
|
555
561
|
...(options.secrets ? { secrets: options.secrets } : {}),
|
|
556
562
|
})
|
|
@@ -592,10 +598,15 @@ async function runCloudBoxCreate(
|
|
|
592
598
|
// built, so naming a second template would ask for two different boxes.
|
|
593
599
|
const bundlePath = flag(args, 'bundle')
|
|
594
600
|
const nativeProjectDir = flag(args, 'native-project')
|
|
601
|
+
const assetsDirectory = flag(args, 'assets')
|
|
595
602
|
if (nativeProjectDir && !bundlePath) {
|
|
596
603
|
console.error(` ${peach} box create: --native-project requires --bundle.`)
|
|
597
604
|
return 1
|
|
598
605
|
}
|
|
606
|
+
if (assetsDirectory && !bundlePath) {
|
|
607
|
+
console.error(` ${peach} box create: --assets requires --bundle.`)
|
|
608
|
+
return 1
|
|
609
|
+
}
|
|
599
610
|
const namedTemplate = flag(args, 'template')
|
|
600
611
|
if (bundlePath && namedTemplate) {
|
|
601
612
|
console.error(
|
|
@@ -630,7 +641,7 @@ async function runCloudBoxCreate(
|
|
|
630
641
|
// embeds them. the box service owns the size ceiling, not this producer.
|
|
631
642
|
let artifact: CloudBoxArtifactProduction
|
|
632
643
|
try {
|
|
633
|
-
artifact = await produceCloudBoxArtifact(resolved)
|
|
644
|
+
artifact = await produceCloudBoxArtifact(resolved, assetsDirectory)
|
|
634
645
|
} catch (error) {
|
|
635
646
|
console.error(
|
|
636
647
|
` ${peach} box create: could not prepare the bundle at ${resolved}: ${
|
package/cli/commands/compat.ts
CHANGED
|
@@ -202,7 +202,7 @@ function reportLocalNative(local: LocalNative[]): void {
|
|
|
202
202
|
}
|
|
203
203
|
console.log(` })`)
|
|
204
204
|
}
|
|
205
|
-
console.log(`\n guide: ${rnxPublicBrand.origin}/docs/
|
|
205
|
+
console.log(`\n guide: ${rnxPublicBrand.origin}/docs/peach/compat/custom-stubs`)
|
|
206
206
|
}
|
|
207
207
|
|
|
208
208
|
// an app's own native code, found from the names its JavaScript asks the native
|
package/cli/commands/config.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { peachExit } from '../run-rnx'
|
|
2
2
|
import { runTelemetry } from './telemetry'
|
|
3
3
|
|
|
4
4
|
function printHelp(): void {
|
|
@@ -30,5 +30,5 @@ export async function runConfig(args: string[]): Promise<void> {
|
|
|
30
30
|
|
|
31
31
|
console.error(` unknown config command: ${sub ?? '(missing)'}`)
|
|
32
32
|
printHelp()
|
|
33
|
-
|
|
33
|
+
peachExit(1)
|
|
34
34
|
}
|