peachsim 0.1.1644 → 0.1.1653
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 +12 -0
- package/cli/app-catalog.ts +1 -1
- package/cli/app-fonts.ts +11 -80
- package/cli/app-splash.ts +18 -12
- package/cli/bridge-flow-runner.ts +11 -7
- package/cli/cloud-client.ts +10 -13
- package/cli/command-registry.ts +13 -4
- package/cli/commands/box.ts +4 -4
- package/cli/commands/control.ts +93 -53
- package/cli/commands/coverage-parser.ts +67 -0
- package/cli/commands/coverage.ts +550 -0
- package/cli/commands/debug.ts +9 -18
- package/cli/commands/desktop.ts +19 -7
- package/cli/commands/device.ts +14 -9
- package/cli/commands/guest-host.ts +6 -10
- package/cli/commands/inspect/core.ts +81 -17
- package/cli/commands/inspect.ts +13 -8
- package/cli/commands/kotlin.ts +2 -2
- package/cli/commands/maestro-compare.ts +1 -1
- package/cli/commands/platform.ts +20 -11
- package/cli/commands/preview.ts +16 -18
- package/cli/commands/runtime.ts +3 -2
- package/cli/commands/screenshot-layers.ts +1 -1
- package/cli/commands/screenshot.ts +1 -1
- package/cli/commands/serve.ts +5 -1
- package/cli/commands/support.ts +4 -4
- package/cli/commands/three-mode.ts +22 -15
- package/cli/commands/upload.ts +44 -45
- package/cli/current-sim.ts +38 -0
- package/cli/desktop-companion.ts +36 -8
- package/cli/device-option.ts +1 -1
- package/cli/drivers/playwright.ts +1 -0
- package/cli/drivers/types.ts +4 -0
- package/cli/help-core.ts +1 -1
- package/cli/internal-child.ts +2 -1
- package/cli/main.ts +9 -3
- package/cli/outbound-endpoints.ts +11 -3
- package/cli/output-redaction.ts +39 -14
- package/cli/remote-simulators.ts +4 -1
- package/cli/scene-video.ts +5 -2
- package/cli/send-to-box.ts +7 -10
- package/cli/telemetry.ts +1 -1
- package/cli/ws-bridge.ts +8 -1
- package/detox/attempt-events.cjs +3 -1
- package/detox/attempt-events.d.cts +1 -1
- package/detox/expectations.ts +108 -99
- package/detox/frame-offset.d.mts +6 -0
- package/detox/frame-offset.mjs +35 -0
- package/detox/gestures.ts +6 -18
- package/detox/index.ts +169 -101
- package/detox/jest-preset.cjs +1 -3
- package/detox/jest-transform.cjs +4 -0
- package/detox/matchers.ts +3 -0
- package/detox/motion-change.cjs +46 -114
- package/detox/motion-change.d.cts +5 -27
- 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 +65 -1
- package/dist-lib/bridge-contract-input.mjs +63 -1
- package/dist-lib/bridge-contract.cjs +19 -1
- package/dist-lib/bridge-contract.mjs +17 -1
- package/dist-lib/bundle-channel.cjs +38091 -14846
- package/dist-lib/capture-contract.cjs +1 -1
- package/dist-lib/capture-contract.mjs +1 -1
- package/dist-lib/cloud-contract.cjs +1 -1
- package/dist-lib/cloud-contract.mjs +1 -1
- package/dist-lib/cloud-test-args.cjs +1 -1
- package/dist-lib/cloud-test-args.mjs +1 -1
- package/dist-lib/cloud.cjs +1 -1
- package/dist-lib/cloud.mjs +1 -1
- package/dist-lib/config.cjs +1 -1
- package/dist-lib/config.mjs +5 -3
- package/dist-lib/detox/index.cjs +1244 -4509
- package/dist-lib/detox/jest-preset.cjs +1 -3
- package/dist-lib/detox/jest-transform.cjs +4 -0
- package/dist-lib/dev-bundle-resolution.cjs +28 -24
- package/dist-lib/expo-swift-bundle.cjs +35049 -13125
- package/dist-lib/expo-swift-metadata.cjs +1 -1
- package/dist-lib/expo-swift-metadata.mjs +1 -1
- package/dist-lib/home-paths.cjs +1 -1
- package/dist-lib/host/bridge-host.cjs +45112 -63143
- package/dist-lib/host/fetch-proxy-handler.cjs +3544 -11
- package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
- package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
- package/dist-lib/host/replacement-module-handler.cjs +1 -1
- package/dist-lib/host/websocket-proxy.cjs +1 -1
- package/dist-lib/index.cjs +1909 -2029
- 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 +2 -2
- 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 +1 -1
- package/dist-lib/metro-production-bundle.mjs +1 -1
- package/dist-lib/metro.cjs +380 -522
- package/dist-lib/native-app-identity-project.cjs +39 -252
- package/dist-lib/native-app-identity-project.mjs +1174 -11
- package/dist-lib/native-app-identity.cjs +8 -3
- package/dist-lib/native-app-identity.mjs +8 -3
- package/dist-lib/native-firebase-metadata.cjs +1 -1
- package/dist-lib/native-firebase-metadata.mjs +1 -1
- package/dist-lib/plist.cjs +2 -244
- 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/public-origins-lib-esm.json +290 -0
- package/dist-lib/public-origins-lib-static.json +1 -0
- package/dist-lib/public-origins-lib.json +1852 -0
- package/dist-lib/react-native-host-modules.cjs +1 -1
- package/dist-lib/react-native-host-modules.mjs +1 -1
- package/dist-lib/scripts/dev-server-scanner.cjs +14 -253
- package/dist-lib/sdk.cjs +83 -16
- package/dist-lib/sdk.mjs +81 -15
- package/dist-lib/skills.cjs +50546 -75098
- package/dist-lib/swift-compile.cjs +25897 -1070
- package/dist-lib/swift-compile.mjs +25866 -1033
- package/dist-lib/swift-package.cjs +79 -1
- package/dist-lib/swift-package.mjs +75 -1
- package/dist-lib/swift-submit.cjs +1 -1
- package/dist-lib/swift-submit.mjs +1 -1
- package/dist-lib/swift-toolchain.cjs +1 -1
- package/dist-lib/swift.cjs +1 -1
- package/dist-lib/vite-swift.cjs +34273 -12349
- package/dist-lib/vite.cjs +373 -298
- package/dist-lib/worklet-executable.cjs +1 -1
- package/dist-lib/worklet-executable.mjs +1 -1
- package/dist-types/packages/peach-compat/src/engine-config.d.ts +2 -0
- package/dist-types/packages/peach-compat/src/stubs/form-sheet-spring.d.ts +9 -0
- package/dist-types/packages/peach-compat/src/stubs/native-evaluation-lease.d.ts +47 -0
- package/dist-types/packages/peach-compat/src/stubs/native-seams/react-native-cookies.d.ts +113 -0
- package/dist-types/packages/peach-compat/src/stubs/native-seams/react-native-gesture-handler.d.ts +154 -0
- package/dist-types/packages/peach-compat/src/stubs/screen-transition-math.d.ts +756 -0
- package/dist-types/packages/peach-compat/src/stubs/transition-scalar.d.ts +25 -0
- package/dist-types/packages/peach-engine/src/billing/plans.d.ts +64 -0
- package/dist-types/packages/peach-engine/src/browser-page-target.d.ts +2 -0
- package/dist-types/packages/peach-engine/src/bundle-platform-url.d.ts +3 -0
- package/dist-types/packages/peach-engine/src/capture/browser-accessibility-host.d.ts +3 -0
- package/dist-types/packages/peach-engine/src/capture/browser-composite.d.ts +55 -0
- package/dist-types/packages/peach-engine/src/capture/browserAccessibilityContract.d.ts +27 -0
- package/dist-types/packages/peach-engine/src/capture/nativeScreenCaptureContract.d.ts +22 -0
- package/dist-types/packages/peach-engine/src/cli-companion.d.ts +36 -0
- package/dist-types/packages/peach-engine/src/components/native-ui/webview-frame-bridge.d.ts +34 -0
- package/dist-types/packages/peach-engine/src/config.d.ts +5 -0
- package/dist-types/packages/peach-engine/src/engine/android-stretch-effect.d.ts +57 -0
- package/dist-types/packages/peach-engine/src/engine/animated-driven-style.d.ts +47 -0
- package/dist-types/packages/peach-engine/src/engine/animated-value.d.ts +5 -0
- package/dist-types/packages/peach-engine/src/engine/animated.d.ts +195 -0
- package/dist-types/packages/peach-engine/src/engine/animation-clockContract.d.ts +15 -0
- package/dist-types/packages/peach-engine/src/engine/animation-graph.d.ts +148 -0
- package/dist-types/packages/peach-engine/src/engine/app-catalog-wire.d.ts +10 -0
- package/dist-types/packages/peach-engine/src/engine/app-font-registry.d.ts +87 -0
- package/dist-types/packages/peach-engine/src/engine/attributed-paragraph-paint.d.ts +7 -0
- package/dist-types/packages/peach-engine/src/engine/attributed-paragraph.d.ts +123 -0
- package/dist-types/packages/peach-engine/src/engine/audioContract.d.ts +16 -0
- package/dist-types/packages/peach-engine/src/engine/canvaskit-api.d.ts +93 -0
- package/dist-types/packages/peach-engine/src/engine/canvaskit-renderer.d.ts +216 -0
- package/dist-types/packages/peach-engine/src/engine/config-plugin-fonts.d.ts +40 -0
- package/dist-types/packages/peach-engine/src/engine/config-plugin-splash.d.ts +25 -0
- package/dist-types/packages/peach-engine/src/engine/cull-visibility.d.ts +44 -0
- package/dist-types/packages/peach-engine/src/engine/damage-rect.d.ts +19 -0
- package/dist-types/packages/peach-engine/src/engine/engine-resource.d.ts +6 -0
- package/dist-types/packages/peach-engine/src/engine/expo-manifest.d.ts +5 -0
- package/dist-types/packages/peach-engine/src/engine/fiber-debug-metadata.d.ts +30 -0
- package/dist-types/packages/peach-engine/src/engine/font-config.d.ts +139 -0
- package/dist-types/packages/peach-engine/src/engine/generated/sf-pro-font.d.ts +1 -0
- package/dist-types/packages/peach-engine/src/engine/glass-material.d.ts +31 -0
- package/dist-types/packages/peach-engine/src/engine/host-composite.d.ts +100 -0
- package/dist-types/packages/peach-engine/src/engine/hosted-semantics.d.ts +49 -0
- package/dist-types/packages/peach-engine/src/engine/image-audit.d.ts +70 -0
- package/dist-types/packages/peach-engine/src/engine/image-loader.d.ts +350 -0
- package/dist-types/packages/peach-engine/src/engine/inspect-info.d.ts +27 -0
- package/dist-types/packages/peach-engine/src/engine/inspect-outline.d.ts +14 -0
- package/dist-types/packages/peach-engine/src/engine/inspect-visibility.d.ts +33 -0
- package/dist-types/packages/peach-engine/src/engine/ios-fast-scroll.d.ts +16 -0
- package/dist-types/packages/peach-engine/src/engine/layout-sab.d.ts +43 -0
- package/dist-types/packages/peach-engine/src/engine/liquid-glass-rect.d.ts +23 -0
- package/dist-types/packages/peach-engine/src/engine/liquid-glass-shaders.d.ts +9 -0
- package/dist-types/packages/peach-engine/src/engine/liquid-glass.d.ts +283 -0
- package/dist-types/packages/peach-engine/src/engine/live-object-counts.d.ts +6 -0
- package/dist-types/packages/peach-engine/src/engine/lottie-runtime.d.ts +32 -0
- package/dist-types/packages/peach-engine/src/engine/lottie-types.d.ts +138 -0
- package/dist-types/packages/peach-engine/src/engine/memory-counts.d.ts +27 -0
- package/dist-types/packages/peach-engine/src/engine/metalDirectContract.d.ts +108 -0
- package/dist-types/packages/peach-engine/src/engine/metalShaderContract.d.ts +217 -0
- package/dist-types/packages/peach-engine/src/engine/native-animation-driver.d.ts +112 -0
- package/dist-types/packages/peach-engine/src/engine/native-animation-graph.d.ts +62 -0
- package/dist-types/packages/peach-engine/src/engine/native-layout.d.ts +133 -0
- package/dist-types/packages/peach-engine/src/engine/native-resources.d.ts +26 -0
- package/dist-types/packages/peach-engine/src/engine/nativeReanimatedContract.d.ts +25 -0
- package/dist-types/packages/peach-engine/src/engine/nativeReplayContract.d.ts +64 -0
- package/dist-types/packages/peach-engine/src/engine/node.d.ts +589 -0
- package/dist-types/packages/peach-engine/src/engine/paint-boundary-types.d.ts +112 -0
- package/dist-types/packages/peach-engine/src/engine/paint-boundary.d.ts +57 -0
- package/dist-types/packages/peach-engine/src/engine/portalContract.d.ts +21 -0
- package/dist-types/packages/peach-engine/src/engine/portals.d.ts +20 -0
- package/dist-types/packages/peach-engine/src/engine/render-damage.d.ts +107 -0
- package/dist-types/packages/peach-engine/src/engine/riveContract.d.ts +420 -0
- package/dist-types/packages/peach-engine/src/engine/rn-spring.d.ts +51 -0
- package/dist-types/packages/peach-engine/src/engine/scene-table.d.ts +379 -0
- package/dist-types/packages/peach-engine/src/engine/scroll-momentum-math.d.ts +152 -0
- package/dist-types/packages/peach-engine/src/engine/scroll-pan-contacts.d.ts +10 -0
- package/dist-types/packages/peach-engine/src/engine/scroll-platform.d.ts +75 -0
- package/dist-types/packages/peach-engine/src/engine/scroll-range.d.ts +14 -0
- package/dist-types/packages/peach-engine/src/engine/scroll-velocity.d.ts +14 -0
- package/dist-types/packages/peach-engine/src/engine/scroll.d.ts +320 -0
- package/dist-types/packages/peach-engine/src/engine/signal.d.ts +7 -0
- package/dist-types/packages/peach-engine/src/engine/snapshot-cache-policy.d.ts +6 -0
- package/dist-types/packages/peach-engine/src/engine/svg-geometry.d.ts +41 -0
- package/dist-types/packages/peach-engine/src/engine/text-attachment-paragraphs.d.ts +10 -0
- package/dist-types/packages/peach-engine/src/engine/text-decoration.d.ts +11 -0
- package/dist-types/packages/peach-engine/src/engine/text-line-break.d.ts +22 -0
- package/dist-types/packages/peach-engine/src/engine/text-paint-receipt.d.ts +98 -0
- package/dist-types/packages/peach-engine/src/engine/text-paragraph.d.ts +11 -0
- package/dist-types/packages/peach-engine/src/engine/text-paragraphContract.d.ts +34 -0
- package/dist-types/packages/peach-engine/src/engine/text-transform.d.ts +1 -0
- package/dist-types/packages/peach-engine/src/engine/types.d.ts +657 -0
- package/dist-types/packages/peach-engine/src/engine/visible-frame.d.ts +54 -0
- package/dist-types/packages/peach-engine/src/engine/webrtcContract.d.ts +74 -0
- package/dist-types/packages/peach-engine/src/graphite-stats-fields.d.ts +184 -0
- package/dist-types/packages/peach-engine/src/guest-import-meta.d.ts +12 -0
- package/dist-types/packages/peach-engine/src/guest-module-overrides.d.ts +7 -0
- package/dist-types/packages/peach-engine/src/ios/app-card-types.d.ts +7 -0
- package/dist-types/packages/peach-engine/src/ios/apps/canvas-map-data.d.ts +177 -0
- package/dist-types/packages/peach-engine/src/ios/aux-home-scene.d.ts +54 -0
- package/dist-types/packages/peach-engine/src/ios/chrome-metrics.d.ts +47 -0
- package/dist-types/packages/peach-engine/src/ios/constants.d.ts +21 -0
- package/dist-types/packages/peach-engine/src/ios/duo-housing.d.ts +37 -0
- package/dist-types/packages/peach-engine/src/ios/home/types.d.ts +29 -0
- package/dist-types/packages/peach-engine/src/ios/home-app-catalog.d.ts +43 -0
- package/dist-types/packages/peach-engine/src/ios/photo-store.d.ts +73 -0
- package/dist-types/packages/peach-engine/src/ios/photoLibraryContract.d.ts +166 -0
- package/dist-types/packages/peach-engine/src/ios/shell-controller-types.d.ts +21 -0
- package/dist-types/packages/peach-engine/src/ios/shell-transition-debug.d.ts +18 -0
- package/dist-types/packages/peach-engine/src/metro-asset-path.d.ts +21 -0
- package/dist-types/packages/peach-engine/src/metro-fingerprint-registry-client.d.ts +11 -0
- package/dist-types/packages/peach-engine/src/metro-fingerprint.d.ts +38 -0
- package/dist-types/packages/peach-engine/src/native-preview-bundle.d.ts +44 -0
- package/dist-types/packages/peach-engine/src/observability/types.d.ts +74 -0
- package/dist-types/packages/peach-engine/src/peach-warm-manifest.d.ts +32 -0
- package/dist-types/packages/peach-engine/src/permissions/app-settings-client.d.ts +25 -0
- package/dist-types/packages/peach-engine/src/permissions/system-permission-types.d.ts +20 -0
- package/dist-types/packages/peach-engine/src/platform/android-back-panel.d.ts +131 -0
- package/dist-types/packages/peach-engine/src/platform/android-gesture-exclusion.d.ts +28 -0
- package/dist-types/packages/peach-engine/src/platform/android-predictive-back.d.ts +33 -0
- package/dist-types/packages/peach-engine/src/platform/system-bars-state.d.ts +14 -0
- package/dist-types/packages/peach-engine/src/playwright-sim-host.d.ts +1 -0
- package/dist-types/packages/peach-engine/src/preview/bundle-layout.d.ts +8 -0
- package/dist-types/packages/peach-engine/src/preview/bundle-variantContract.d.ts +24 -0
- package/dist-types/packages/peach-engine/src/preview/capture-bundle.d.ts +26 -0
- package/dist-types/packages/peach-engine/src/preview/compress-node.d.ts +2 -0
- package/dist-types/packages/peach-engine/src/preview/compress.d.ts +2 -0
- package/dist-types/packages/peach-engine/src/preview/presigned-upload.d.ts +60 -0
- package/dist-types/packages/peach-engine/src/preview/trace.d.ts +144 -0
- package/dist-types/packages/peach-engine/src/preview/upload-protocol.d.ts +152 -0
- package/dist-types/packages/peach-engine/src/profiler/animation-recording-loader.d.ts +1 -0
- package/dist-types/packages/peach-engine/src/profiler/profile-trace.d.ts +4 -0
- package/dist-types/packages/peach-engine/src/react-bridge.d.ts +3 -0
- package/dist-types/packages/peach-engine/src/react-native/AppState.d.ts +45 -0
- package/dist-types/packages/peach-engine/src/react-native/Appearance.d.ts +34 -0
- package/dist-types/packages/peach-engine/src/react-native/framework-colors-data.d.ts +2 -0
- package/dist-types/packages/peach-engine/src/react-native/host-services.d.ts +42 -0
- package/dist-types/packages/peach-engine/src/react-native/layout-animation.d.ts +22 -0
- package/dist-types/packages/peach-engine/src/react-native/platform-colors.d.ts +17 -0
- package/dist-types/packages/peach-engine/src/remote-stream/client-config.d.ts +10 -0
- package/dist-types/packages/peach-engine/src/remote-stream/cloud-display.d.ts +58 -0
- package/dist-types/packages/peach-engine/src/remote-stream/scene-recording.d.ts +45 -0
- package/dist-types/packages/peach-engine/src/render-worker/animated-drive-output.d.ts +35 -0
- package/dist-types/packages/peach-engine/src/render-worker/app-load.d.ts +16 -0
- package/dist-types/packages/peach-engine/src/render-worker/aux-surface-types.d.ts +2 -0
- package/dist-types/packages/peach-engine/src/render-worker/canvaskit-shared.d.ts +42 -0
- package/dist-types/packages/peach-engine/src/render-worker/canvaskit-webgpu.d.ts +434 -0
- package/dist-types/packages/peach-engine/src/render-worker/canvaskit-worker-init.d.ts +12 -0
- package/dist-types/packages/peach-engine/src/render-worker/compositor-backend.d.ts +31 -0
- package/dist-types/packages/peach-engine/src/render-worker/compositor-gpu.d.ts +202 -0
- package/dist-types/packages/peach-engine/src/render-worker/compositor-protocol.d.ts +1945 -0
- package/dist-types/packages/peach-engine/src/render-worker/compositor-runtime/scroll-drag-resample.d.ts +44 -0
- package/dist-types/packages/peach-engine/src/render-worker/css-keyframes-drive.d.ts +36 -0
- package/dist-types/packages/peach-engine/src/render-worker/edit-menu-geometry.d.ts +8 -0
- package/dist-types/packages/peach-engine/src/render-worker/engine-resource-relay.d.ts +21 -0
- package/dist-types/packages/peach-engine/src/render-worker/expo-widgetContract.d.ts +16 -0
- package/dist-types/packages/peach-engine/src/render-worker/gesture-seam-protocol.d.ts +152 -0
- package/dist-types/packages/peach-engine/src/render-worker/graph-linked-value.d.ts +29 -0
- package/dist-types/packages/peach-engine/src/render-worker/graphite-pipeline-compiler-contract.d.ts +49 -0
- package/dist-types/packages/peach-engine/src/render-worker/graphite-pipeline-compiler.d.ts +12 -0
- package/dist-types/packages/peach-engine/src/render-worker/host-service-protocol.d.ts +756 -0
- package/dist-types/packages/peach-engine/src/render-worker/image-lifecycle-event.d.ts +22 -0
- package/dist-types/packages/peach-engine/src/render-worker/image-pixel-contract.d.ts +48 -0
- package/dist-types/packages/peach-engine/src/render-worker/live-frame-mirror.d.ts +34 -0
- package/dist-types/packages/peach-engine/src/render-worker/map-command-channel.d.ts +189 -0
- package/dist-types/packages/peach-engine/src/render-worker/mapNativeContract.d.ts +101 -0
- package/dist-types/packages/peach-engine/src/render-worker/native-dynamic-synchronizable.d.ts +22 -0
- package/dist-types/packages/peach-engine/src/render-worker/native-menu-gesture.d.ts +9 -0
- package/dist-types/packages/peach-engine/src/render-worker/native-ui-commandContract.d.ts +23 -0
- package/dist-types/packages/peach-engine/src/render-worker/native-ui-protocol.d.ts +1087 -0
- package/dist-types/packages/peach-engine/src/render-worker/native-widgetContract.d.ts +100 -0
- package/dist-types/packages/peach-engine/src/render-worker/nativeAnimMirrorContract.d.ts +174 -0
- package/dist-types/packages/peach-engine/src/render-worker/nativeSyncReplyContract.d.ts +11 -0
- package/dist-types/packages/peach-engine/src/render-worker/one-native-contentContract.d.ts +54 -0
- package/dist-types/packages/peach-engine/src/render-worker/pointerSampleContract.d.ts +14 -0
- package/dist-types/packages/peach-engine/src/render-worker/protocol.d.ts +880 -0
- package/dist-types/packages/peach-engine/src/render-worker/reanimated-css-contract.d.ts +63 -0
- package/dist-types/packages/peach-engine/src/render-worker/reanimated-readiness.d.ts +29 -0
- package/dist-types/packages/peach-engine/src/render-worker/resilient-frame-clock.d.ts +22 -0
- package/dist-types/packages/peach-engine/src/render-worker/retained-app-load.d.ts +20 -0
- package/dist-types/packages/peach-engine/src/render-worker/screen-edge-swipe-commit-protocol.d.ts +1 -0
- package/dist-types/packages/peach-engine/src/render-worker/screen-form-sheet-commit-protocol.d.ts +26 -0
- package/dist-types/packages/peach-engine/src/render-worker/scroll-mirror-tenant.d.ts +37 -0
- package/dist-types/packages/peach-engine/src/render-worker/scroll-mirror.d.ts +164 -0
- package/dist-types/packages/peach-engine/src/render-worker/shell-event-registry.d.ts +119 -0
- package/dist-types/packages/peach-engine/src/render-worker/shell-gesture-regions.d.ts +41 -0
- package/dist-types/packages/peach-engine/src/render-worker/shell-protocol.d.ts +603 -0
- package/dist-types/packages/peach-engine/src/render-worker/shell-scene-schema.d.ts +101 -0
- package/dist-types/packages/peach-engine/src/render-worker/shell-tree-inline-sources.d.ts +13 -0
- package/dist-types/packages/peach-engine/src/render-worker/shell-tree-wire.d.ts +87 -0
- package/dist-types/packages/peach-engine/src/render-worker/test-bridge-protocol.d.ts +47 -0
- package/dist-types/packages/peach-engine/src/render-worker/text-inputContract.d.ts +93 -0
- package/dist-types/packages/peach-engine/src/render-worker/tree-sync-port.d.ts +102 -0
- package/dist-types/packages/peach-engine/src/render-worker/webgpu-frame-transaction.d.ts +292 -0
- package/dist-types/packages/peach-engine/src/render-worker/webgpu-readback-scheduler.d.ts +107 -0
- package/dist-types/packages/peach-engine/src/render-worker/webview-capture-protocol.d.ts +16 -0
- package/dist-types/packages/peach-engine/src/render-worker/worker-input-runtime.d.ts +211 -0
- package/dist-types/packages/peach-engine/src/render-worker/worker-storage.d.ts +33 -0
- package/dist-types/packages/peach-engine/src/render-worker/worklet-runtime.d.ts +987 -0
- package/dist-types/packages/peach-engine/src/render-worker/worklet-sab.d.ts +24 -0
- package/dist-types/packages/peach-engine/src/rolldown-bundle-inventory.d.ts +84 -0
- package/dist-types/packages/peach-engine/src/rolldown-production-fingerprint.d.ts +31 -0
- package/dist-types/packages/peach-engine/src/screenshots/timeline-assets.d.ts +10 -0
- package/dist-types/packages/peach-engine/src/screenshots/tokens.d.ts +9 -0
- package/dist-types/packages/peach-engine/src/settings/devices.d.ts +70 -0
- package/dist-types/packages/peach-engine/src/settings/duo-fold-bus.d.ts +87 -0
- package/dist-types/packages/peach-engine/src/settings/interface-rotation.d.ts +30 -0
- package/dist-types/packages/peach-engine/src/settings/react-native-configuration.d.ts +12 -0
- package/dist-types/packages/peach-engine/src/settings/scene-geometryContract.d.ts +40 -0
- package/dist-types/packages/peach-engine/src/settings/store.d.ts +37 -0
- package/dist-types/packages/peach-engine/src/shell-events.d.ts +203 -0
- package/dist-types/packages/peach-engine/src/shell-intent.d.ts +68 -0
- package/dist-types/packages/peach-engine/src/sootsim-event.d.ts +35 -0
- package/dist-types/packages/peach-engine/src/top-overlay-state.d.ts +5 -0
- package/dist-types/packages/peach-engine/src/web-authentication-automation-host.d.ts +2 -0
- package/dist-types/packages/peach-engine/src/webAuthenticationContract.d.ts +34 -0
- package/dist-types/packages/peach-engine/src/webview-automation-host.d.ts +180 -0
- package/dist-types/packages/peach-engine/src/wireframe-mode.d.ts +16 -0
- package/dist-types/packages/peach-globals/src/frameBreakdownContract.d.ts +16 -0
- package/dist-types/packages/peach-globals/src/index.d.ts +3311 -0
- package/dist-types/packages/peach-globals/src/nativeSurfaceContract.d.ts +76 -0
- package/dist-types/packages/peach-globals/src/pointerSourceEventContract.d.ts +8 -0
- package/dist-types/packages/peach-globals/src/profileTrace.d.ts +11 -0
- package/dist-types/packages/peach-globals/src/profilerContract.d.ts +223 -0
- package/dist-types/packages/peach-kit/src/capabilities.d.ts +721 -0
- package/dist-types/packages/peach-kit/src/internal.d.ts +4 -0
- package/dist-types/packages/peach-kit/src/materials/types.d.ts +27 -0
- package/dist-types/packages/peach-kit/src/materials/uikit-blur-material.d.ts +14 -0
- package/dist-types/packages/peach-kit/src/navigation-types.d.ts +11 -0
- package/dist-types/packages/peach-kit/src/react-bridge.d.ts +53 -0
- package/dist-types/packages/peach-kit/src/runtime.d.ts +26 -0
- package/dist-types/packages/peach-kit/src/ui/hosting-safe-area.d.ts +24 -0
- package/dist-types/packages/peach-kit/src/ui/popover-placement.d.ts +53 -0
- package/dist-types/packages/peach-kit/src/ui/presentationContract.d.ts +17 -0
- package/kotlin/ComposeSources/PeachComposeHost.kt +1 -1
- package/kotlin/JniSources/com/facebook/jni/HybridData.kt +0 -2
- package/kotlin/JniSources/dev/peach/jni/NativeBindings.kt +0 -2
- package/kotlin/JniTransportSources/dev/peach/jni/integration/JniTransport.kt +0 -2
- package/kotlin/README.md +6 -0
- package/package.json +22 -2
- package/runtime-companion.json +1 -0
- package/skills/contrast/SKILL.md +1 -0
- package/src/assetCatalogContract.ts +21 -0
- package/src/bridge-contract-input.ts +84 -0
- package/src/bridge-contract.ts +35 -3
- package/src/browser-launch-policy.ts +1 -0
- package/src/bundle-channel.mjs +4 -2
- package/src/cli-runtime.ts +55 -0
- package/src/crash-fingerprint.ts +26 -0
- package/src/dev-bundle-resolution.ts +50 -23
- package/src/device-catalog.ts +1159 -0
- package/src/host/bridge-host.ts +3 -26
- package/src/host/browser-pointer.ts +71 -0
- package/src/host/dev-server-package-versions.ts +23 -0
- package/src/host/fetch-proxy-handler.ts +17 -4
- package/src/installed-package-versions.ts +142 -38
- package/src/kotlin-host.ts +1 -1
- package/src/metro-plugin.ts +4 -4
- package/src/metro-project-root.ts +68 -0
- package/src/nitro-adapter.lock.json +26 -0
- package/src/nitro-adapter.ts +103 -0
- package/src/nitro-bundle.ts +24 -10
- package/src/nitro-compile.ts +33 -51
- package/src/nitro-source.ts +177 -96
- package/src/nitroAdapterContract.ts +217 -0
- package/src/nitroContract.ts +24 -11
- package/src/process-group.ts +41 -34
- package/src/react-bridge-importers.ts +28 -0
- package/src/reactNativeConfigurationContract.ts +36 -0
- package/src/runtime-assets.ts +7 -2
- package/src/runtime-delivery.ts +2 -0
- package/src/runtimePlatformContract.ts +70 -0
- package/src/screenshots/frame-compose.ts +42 -43
- package/src/screenshots/org-deck.ts +9 -4
- package/src/screenshots/preset-names.ts +29 -0
- package/src/screenshots/registry.ts +5 -5
- package/src/screenshots/schema.ts +1 -1
- package/src/screenshots/screenshotContract.ts +971 -0
- package/src/settings-flags.ts +107 -0
- package/src/settingsContract.ts +609 -0
- package/src/storageSnapshotContract.ts +344 -0
- package/src/stub-pattern-matcher.ts +550 -0
- package/src/swift-compile.ts +908 -40
- package/src/swift-compiler-digest.ts +13 -1
- package/src/swift-distribution.lock.json +49 -22
- package/src/swift-host.ts +167 -52
- package/src/swift-objc-compile.ts +54 -24
- package/src/swift-objc-export.ts +532 -0
- package/src/swift-objc-import.ts +769 -0
- package/src/swift-objc-metadata.ts +285 -10
- package/src/swift-objc-sdk.ts +13970 -158
- package/src/swift-objc-standin.ts +137 -1
- package/src/swift-package.ts +94 -0
- package/src/swift-packages.ts +5 -5
- package/src/swift-submit.ts +6 -0
- package/src/swiftContract.ts +99 -0
- package/src/target-matcher.ts +6 -1
- package/src/vite-plugin.ts +14 -40
- package/src/worker-system-chunks.ts +1 -1
- package/src/workerChunkContract.ts +5 -0
- package/src/worklets-babel.ts +24 -5
- package/src/xcode-project.ts +36 -7
- package/src/xcode-target-members.ts +10 -3
- package/cli/drivers/playwright-sim-host.ts +0 -825
- package/kotlin/fixtures/counter/Counter.d.kt.ts +0 -17
- package/kotlin/fixtures/counter/Counter.kt +0 -51
- package/kotlin/fixtures/counter/CounterApp.native.tsx +0 -61
- package/kotlin/fixtures/counter/CounterApp.tsx +0 -3
- package/kotlin/fixtures/counter/CounterScreen.d.kt.ts +0 -8
- package/kotlin/fixtures/counter/CounterScreen.kt +0 -56
- package/kotlin/fixtures/counter/app/_layout.tsx +0 -4
- package/kotlin/fixtures/counter/app/index+spa.tsx +0 -1
- package/kotlin/fixtures/counter/app/routes.d.ts +0 -18
- package/kotlin/fixtures/counter/package.json +0 -20
- package/kotlin/fixtures/counter/tsconfig.json +0 -19
- package/kotlin/fixtures/counter/vite.config.ts +0 -20
- package/kotlin/fixtures/headless-counter/Headless.kt +0 -234
- package/kotlin/fixtures/import-animation/Animation.d.kt.ts +0 -7
- package/kotlin/fixtures/import-animation/Animation.kt +0 -80
- package/kotlin/fixtures/import-animation/ImportAnimation.native.tsx +0 -13
- package/kotlin/fixtures/import-animation/README.md +0 -24
- package/kotlin/fixtures/import-animation/app/_layout.tsx +0 -4
- package/kotlin/fixtures/import-animation/app/index+spa.tsx +0 -1
- package/kotlin/fixtures/import-animation/app/routes.d.ts +0 -18
- package/kotlin/fixtures/import-animation/package.json +0 -23
- package/kotlin/fixtures/import-animation/tsconfig.json +0 -20
- package/kotlin/fixtures/import-animation/vite.config.ts +0 -20
- package/kotlin/fixtures/import-drawing/Drawing.d.kt.ts +0 -7
- package/kotlin/fixtures/import-drawing/Drawing.kt +0 -101
- package/kotlin/fixtures/import-drawing/ImportDrawing.native.tsx +0 -18
- package/kotlin/fixtures/import-drawing/README.md +0 -34
- package/kotlin/fixtures/import-drawing/app/_layout.tsx +0 -4
- package/kotlin/fixtures/import-drawing/app/index+spa.tsx +0 -1
- package/kotlin/fixtures/import-drawing/package.json +0 -23
- package/kotlin/fixtures/import-drawing/tsconfig.json +0 -20
- package/kotlin/fixtures/import-drawing/vite.config.ts +0 -20
- package/kotlin/fixtures/import-editor/Editor.d.kt.ts +0 -7
- package/kotlin/fixtures/import-editor/Editor.kt +0 -59
- package/kotlin/fixtures/import-editor/ImportEditor.native.tsx +0 -23
- package/kotlin/fixtures/import-editor/README.md +0 -27
- package/kotlin/fixtures/import-editor/app/_layout.tsx +0 -4
- package/kotlin/fixtures/import-editor/app/index+spa.tsx +0 -1
- package/kotlin/fixtures/import-editor/package.json +0 -23
- package/kotlin/fixtures/import-editor/tsconfig.json +0 -20
- package/kotlin/fixtures/import-editor/vite.config.ts +0 -20
- package/kotlin/fixtures/import-effects/Effects.d.kt.ts +0 -7
- package/kotlin/fixtures/import-effects/Effects.kt +0 -87
- package/kotlin/fixtures/import-effects/ImportEffects.native.tsx +0 -13
- package/kotlin/fixtures/import-effects/README.md +0 -19
- package/kotlin/fixtures/import-effects/app/_layout.tsx +0 -4
- package/kotlin/fixtures/import-effects/app/index+spa.tsx +0 -1
- package/kotlin/fixtures/import-effects/package.json +0 -23
- package/kotlin/fixtures/import-effects/tsconfig.json +0 -20
- package/kotlin/fixtures/import-effects/vite.config.ts +0 -20
- package/kotlin/fixtures/import-layout/ImportLayout.native.tsx +0 -13
- package/kotlin/fixtures/import-layout/Layout.d.kt.ts +0 -7
- package/kotlin/fixtures/import-layout/Layout.kt +0 -72
- package/kotlin/fixtures/import-layout/README.md +0 -24
- package/kotlin/fixtures/import-layout/app/_layout.tsx +0 -4
- package/kotlin/fixtures/import-layout/app/index+spa.tsx +0 -1
- package/kotlin/fixtures/import-layout/package.json +0 -23
- package/kotlin/fixtures/import-layout/tsconfig.json +0 -20
- package/kotlin/fixtures/import-layout/vite.config.ts +0 -20
- package/kotlin/fixtures/import-navigation/ImportNavigation.native.tsx +0 -18
- package/kotlin/fixtures/import-navigation/Navigation.d.kt.ts +0 -7
- package/kotlin/fixtures/import-navigation/Navigation.kt +0 -104
- package/kotlin/fixtures/import-navigation/README.md +0 -31
- package/kotlin/fixtures/import-navigation/app/_layout.tsx +0 -4
- package/kotlin/fixtures/import-navigation/app/index+spa.tsx +0 -1
- package/kotlin/fixtures/import-navigation/package.json +0 -23
- package/kotlin/fixtures/import-navigation/tsconfig.json +0 -20
- package/kotlin/fixtures/import-navigation/vite.config.ts +0 -20
- package/kotlin/fixtures/import-overlays/ImportOverlays.native.tsx +0 -29
- package/kotlin/fixtures/import-overlays/Overlays.d.kt.ts +0 -7
- package/kotlin/fixtures/import-overlays/Overlays.kt +0 -93
- package/kotlin/fixtures/import-overlays/README.md +0 -34
- package/kotlin/fixtures/import-overlays/app/_layout.tsx +0 -4
- package/kotlin/fixtures/import-overlays/app/index+spa.tsx +0 -1
- package/kotlin/fixtures/import-overlays/package.json +0 -23
- package/kotlin/fixtures/import-overlays/tsconfig.json +0 -20
- package/kotlin/fixtures/import-overlays/vite.config.ts +0 -20
- package/kotlin/fixtures/import-resources/ImportResources.native.tsx +0 -18
- package/kotlin/fixtures/import-resources/README.md +0 -26
- package/kotlin/fixtures/import-resources/Resources.d.kt.ts +0 -6
- package/kotlin/fixtures/import-resources/Resources.kt +0 -72
- package/kotlin/fixtures/import-resources/app/_layout.tsx +0 -4
- package/kotlin/fixtures/import-resources/app/index+spa.tsx +0 -1
- package/kotlin/fixtures/import-resources/package.json +0 -23
- package/kotlin/fixtures/import-resources/tsconfig.json +0 -20
- package/kotlin/fixtures/import-resources/vite.config.ts +0 -20
- package/kotlin/fixtures/import-scroll/ImportNested.native.tsx +0 -10
- package/kotlin/fixtures/import-scroll/ImportScroll.native.tsx +0 -13
- package/kotlin/fixtures/import-scroll/Nested.d.kt.ts +0 -4
- package/kotlin/fixtures/import-scroll/Nested.kt +0 -64
- package/kotlin/fixtures/import-scroll/README.md +0 -38
- package/kotlin/fixtures/import-scroll/Scroll.d.kt.ts +0 -7
- package/kotlin/fixtures/import-scroll/Scroll.kt +0 -91
- package/kotlin/fixtures/import-scroll/app/_layout.tsx +0 -4
- package/kotlin/fixtures/import-scroll/app/index+spa.tsx +0 -1
- package/kotlin/fixtures/import-scroll/app/nested+spa.tsx +0 -1
- package/kotlin/fixtures/import-scroll/package.json +0 -23
- package/kotlin/fixtures/import-scroll/tsconfig.json +0 -20
- package/kotlin/fixtures/import-scroll/vite.config.ts +0 -20
- package/kotlin/fixtures/import-selection/ImportSelection.native.tsx +0 -44
- package/kotlin/fixtures/import-selection/README.md +0 -32
- package/kotlin/fixtures/import-selection/Selection.d.kt.ts +0 -8
- package/kotlin/fixtures/import-selection/Selection.kt +0 -78
- package/kotlin/fixtures/import-selection/app/_layout.tsx +0 -4
- package/kotlin/fixtures/import-selection/app/index+spa.tsx +0 -1
- package/kotlin/fixtures/import-selection/package.json +0 -23
- package/kotlin/fixtures/import-selection/tsconfig.json +0 -20
- package/kotlin/fixtures/import-selection/vite.config.ts +0 -20
- package/kotlin/fixtures/import-surfaces/ImportSurfaces.native.tsx +0 -13
- package/kotlin/fixtures/import-surfaces/README.md +0 -22
- package/kotlin/fixtures/import-surfaces/Surfaces.d.kt.ts +0 -7
- package/kotlin/fixtures/import-surfaces/Surfaces.kt +0 -64
- package/kotlin/fixtures/import-surfaces/app/_layout.tsx +0 -4
- package/kotlin/fixtures/import-surfaces/app/index+spa.tsx +0 -1
- package/kotlin/fixtures/import-surfaces/package.json +0 -23
- package/kotlin/fixtures/import-surfaces/tsconfig.json +0 -20
- package/kotlin/fixtures/import-surfaces/vite.config.ts +0 -20
- package/kotlin/fixtures/import-values/ImportValues.native.tsx +0 -61
- package/kotlin/fixtures/import-values/README.md +0 -28
- package/kotlin/fixtures/import-values/Values.d.kt.ts +0 -15
- package/kotlin/fixtures/import-values/Values.kt +0 -84
- package/kotlin/fixtures/import-values/app/_layout.tsx +0 -4
- package/kotlin/fixtures/import-values/app/index+spa.tsx +0 -1
- package/kotlin/fixtures/import-values/package.json +0 -23
- package/kotlin/fixtures/import-values/tsconfig.json +0 -20
- package/kotlin/fixtures/import-values/vite.config.ts +0 -20
- package/kotlin/fixtures/kotlin-app/app/build.gradle.kts +0 -30
- package/kotlin/fixtures/kotlin-app/app/src/main/AndroidManifest.xml +0 -13
- package/kotlin/fixtures/kotlin-app/app/src/main/java/dev/contrast/kotlinapp/MainActivity.kt +0 -60
- package/kotlin/fixtures/kotlin-app/app/src/main/java/dev/contrast/kotlinapp/ProbeApplication.kt +0 -18
- package/kotlin/fixtures/kotlin-app/build.gradle.kts +0 -5
- package/kotlin/fixtures/kotlin-app/gradle.properties +0 -4
- package/kotlin/fixtures/kotlin-app/settings.gradle.kts +0 -4
- package/kotlin/fixtures/kotlin-app-variants/Anim.kt +0 -62
- package/kotlin/fixtures/kotlin-app-variants/BarBehavior.kt +0 -38
- package/kotlin/fixtures/kotlin-app-variants/BarVisibility.kt +0 -36
- package/kotlin/fixtures/kotlin-app-variants/Bitmaps.kt +0 -50
- package/kotlin/fixtures/kotlin-app-variants/Browse.kt +0 -73
- package/kotlin/fixtures/kotlin-app-variants/Colors.kt +0 -41
- package/kotlin/fixtures/kotlin-app-variants/Controls.kt +0 -62
- package/kotlin/fixtures/kotlin-app-variants/Drag.kt +0 -56
- package/kotlin/fixtures/kotlin-app-variants/Draw.kt +0 -74
- package/kotlin/fixtures/kotlin-app-variants/Drawables.kt +0 -53
- package/kotlin/fixtures/kotlin-app-variants/Focus.kt +0 -62
- package/kotlin/fixtures/kotlin-app-variants/Form.kt +0 -47
- package/kotlin/fixtures/kotlin-app-variants/Icons.kt +0 -59
- package/kotlin/fixtures/kotlin-app-variants/Ime.kt +0 -53
- package/kotlin/fixtures/kotlin-app-variants/Lists.kt +0 -57
- package/kotlin/fixtures/kotlin-app-variants/Nav.kt +0 -47
- package/kotlin/fixtures/kotlin-app-variants/Note.kt +0 -40
- package/kotlin/fixtures/kotlin-app-variants/Overlays.kt +0 -56
- package/kotlin/fixtures/kotlin-app-variants/Pan.kt +0 -38
- package/kotlin/fixtures/kotlin-app-variants/Pickers.kt +0 -44
- package/kotlin/fixtures/kotlin-app-variants/Press.kt +0 -43
- package/kotlin/fixtures/kotlin-app-variants/Scroll.kt +0 -63
- package/kotlin/fixtures/kotlin-app-variants/Sheet.kt +0 -43
- package/kotlin/fixtures/kotlin-app-variants/Strings.kt +0 -49
- package/kotlin/fixtures/kotlin-app-variants/Tabs.kt +0 -47
- package/kotlin/fixtures/kotlin-app-variants/TextWidth.kt +0 -45
- package/kotlin/fixtures/kotlin-app-variants/TransientInsets.kt +0 -50
- package/kotlin/fixtures/kotlin-app-variants/Transition.kt +0 -69
- package/kotlin/fixtures/kotlin-app-variants/ViewConfig.kt +0 -22
- package/kotlin/fixtures/kotlin-app-variants/Widgets.kt +0 -67
- package/kotlin/fixtures/runtime-state/RuntimeState.kt +0 -200
- package/kotlin/fork/README.md +0 -97
- package/kotlin/fork/build.sh +0 -176
- package/kotlin/fork/compose-worker-globals.patch +0 -1247
- package/kotlin/fork/fork.json +0 -46
- package/kotlin/fork/publish.ts +0 -99
- package/kotlin/fork/skia-android-shaping.patch +0 -189
- package/kotlin/fork/skiko-local.init.gradle +0 -10
- package/kotlin/fork/skiko-worker-clock.patch +0 -122
package/src/host/bridge-host.ts
CHANGED
|
@@ -13,6 +13,7 @@ import {
|
|
|
13
13
|
SOOTSIM_BRIDGE_SIM_CLOSE_CODE,
|
|
14
14
|
SOOTSIM_BRIDGE_SIM_CLOSE_REASON,
|
|
15
15
|
} from '../bridge-constants.ts'
|
|
16
|
+
import { commandWritesSim, type WsCommand } from '../bridge-contract.ts'
|
|
16
17
|
import { getCliVersion } from '../cli-version.ts'
|
|
17
18
|
import { activeDesktopHostApp } from '../desktop-host-delivery.ts'
|
|
18
19
|
import { handleExpoSwiftRequest } from '../expo-swift-host.ts'
|
|
@@ -69,7 +70,6 @@ import {
|
|
|
69
70
|
handleWebSocketProxyUpgrade,
|
|
70
71
|
rejectUntrustedBridgeUpgrade,
|
|
71
72
|
} from './websocket-proxy.ts'
|
|
72
|
-
import type { WsCommand } from '../bridge-contract.ts'
|
|
73
73
|
|
|
74
74
|
const SOOTSIM_CROSS_ORIGIN_EMBEDDER_POLICY = 'require-corp'
|
|
75
75
|
|
|
@@ -197,22 +197,6 @@ interface BridgeCliLease {
|
|
|
197
197
|
ownerSocket?: WebSocket
|
|
198
198
|
}
|
|
199
199
|
|
|
200
|
-
// interactive commands change app state and must respect the lease.
|
|
201
|
-
// observational/lifecycle commands (evaluate/tree/query/resolve/screenshot/capture/focus/call/close)
|
|
202
|
-
// pass through without taking or checking a lease so cleanup never gets stuck
|
|
203
|
-
// behind a stale cli owner.
|
|
204
|
-
// `call` used to acquire a lease too, but most call paths are queries
|
|
205
|
-
// (`__sootsimTest.findByTestId`, state reads, etc.). the CLI opts write
|
|
206
|
-
// calls into lease acquisition via msg.acquireLock=true.
|
|
207
|
-
const WRITE_COMMAND_TYPES = new Set([
|
|
208
|
-
'tap',
|
|
209
|
-
'keyboard',
|
|
210
|
-
'longPress',
|
|
211
|
-
'perform',
|
|
212
|
-
'reset',
|
|
213
|
-
'camera',
|
|
214
|
-
])
|
|
215
|
-
|
|
216
200
|
// how long a `close` waits for the sim page to tear itself down before the
|
|
217
201
|
// host disconnects the sim socket. the close code is part of the protocol:
|
|
218
202
|
// browser clients treat it as terminal and skip their normal reconnect loop.
|
|
@@ -223,13 +207,6 @@ const FORCE_CLOSE_TERMINATE_MS = 1000
|
|
|
223
207
|
// type). a duplicate copy used to live here from a concurrent edit and
|
|
224
208
|
// broke the standalone CLI esbuild bundle ("symbol already declared").
|
|
225
209
|
|
|
226
|
-
function shouldAcquireLease(msg: any): boolean {
|
|
227
|
-
if (!msg || typeof msg.type !== 'string') return false
|
|
228
|
-
if (msg.acquireLock === true) return true
|
|
229
|
-
if (msg.readOnly === true) return false
|
|
230
|
-
return WRITE_COMMAND_TYPES.has(msg.type)
|
|
231
|
-
}
|
|
232
|
-
|
|
233
210
|
interface BridgeRestorableSimState {
|
|
234
211
|
recentActions: BridgeRecentAction[]
|
|
235
212
|
lastActiveAt: number
|
|
@@ -1075,7 +1052,7 @@ export class SootSimBridgeHost {
|
|
|
1075
1052
|
}
|
|
1076
1053
|
|
|
1077
1054
|
const targetSim = await this.waitForSim(msg.simId)
|
|
1078
|
-
if (
|
|
1055
|
+
if (commandWritesSim(msg)) {
|
|
1079
1056
|
const outcome = this.tryAcquireLease(ws, targetSim)
|
|
1080
1057
|
if (!outcome.granted) {
|
|
1081
1058
|
if (ws.readyState === WebSocket.OPEN) {
|
|
@@ -2516,7 +2493,7 @@ export class SootSimBridgeHost {
|
|
|
2516
2493
|
// called when the sim reports a real user interaction (pointerdown,
|
|
2517
2494
|
// keydown, wheel, touch). creates or refreshes a short `user-active` lease
|
|
2518
2495
|
// that keeps agent writes from trampling a user who is driving the sim.
|
|
2519
|
-
// reads still pass through —
|
|
2496
|
+
// reads still pass through — commandWritesSim only blocks on writes.
|
|
2520
2497
|
private updateUserActivity(sim: BridgeSimConnection) {
|
|
2521
2498
|
const existing = this.getActiveLease(sim)
|
|
2522
2499
|
if (existing && existing.kind === 'cli') {
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
export interface BrowserPointerRequest {
|
|
2
|
+
phase: 'down' | 'move' | 'up' | 'cancel'
|
|
3
|
+
x: number
|
|
4
|
+
y: number
|
|
5
|
+
pointerId: number
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
// both browser hosts use chromium input so editable defaults and cross-origin
|
|
9
|
+
// iframe hit testing run in the browser, rather than simulated DOM events.
|
|
10
|
+
export function createBrowserPointerDispatcher(
|
|
11
|
+
send: (
|
|
12
|
+
method: 'Input.dispatchTouchEvent',
|
|
13
|
+
params: {
|
|
14
|
+
type: 'touchStart' | 'touchMove' | 'touchEnd' | 'touchCancel'
|
|
15
|
+
touchPoints: Array<{ x: number; y: number; id: number }>
|
|
16
|
+
},
|
|
17
|
+
) => Promise<unknown>,
|
|
18
|
+
) {
|
|
19
|
+
const points = new Map<number, { x: number; y: number; id: number }>()
|
|
20
|
+
return async (value: unknown): Promise<void> => {
|
|
21
|
+
if (!value || typeof value !== 'object') throw new Error('missing browser pointer')
|
|
22
|
+
const phase = Reflect.get(value, 'phase')
|
|
23
|
+
const x = Reflect.get(value, 'x')
|
|
24
|
+
const y = Reflect.get(value, 'y')
|
|
25
|
+
const pointerId = Reflect.get(value, 'pointerId')
|
|
26
|
+
if (phase !== 'down' && phase !== 'move' && phase !== 'up' && phase !== 'cancel')
|
|
27
|
+
throw new Error('invalid browser pointer phase')
|
|
28
|
+
if (
|
|
29
|
+
typeof x !== 'number' ||
|
|
30
|
+
!Number.isFinite(x) ||
|
|
31
|
+
typeof y !== 'number' ||
|
|
32
|
+
!Number.isFinite(y)
|
|
33
|
+
)
|
|
34
|
+
throw new Error('browser pointer coordinates must be finite')
|
|
35
|
+
if (
|
|
36
|
+
typeof pointerId !== 'number' ||
|
|
37
|
+
!Number.isSafeInteger(pointerId) ||
|
|
38
|
+
pointerId < 0
|
|
39
|
+
)
|
|
40
|
+
throw new Error('browser pointer id must be a nonnegative integer')
|
|
41
|
+
const request: BrowserPointerRequest = { phase, x, y, pointerId }
|
|
42
|
+
if (request.phase === 'down') {
|
|
43
|
+
if (points.has(request.pointerId)) throw new Error('browser pointer already down')
|
|
44
|
+
points.set(request.pointerId, { x: request.x, y: request.y, id: request.pointerId })
|
|
45
|
+
} else {
|
|
46
|
+
// chromium cancels the entire touch stream at once; the caller still
|
|
47
|
+
// releases each bound pointer while unwinding a multi-touch gesture.
|
|
48
|
+
if (request.phase === 'cancel' && points.size === 0) return
|
|
49
|
+
if (!points.has(request.pointerId)) throw new Error('browser pointer is not down')
|
|
50
|
+
if (request.phase === 'move')
|
|
51
|
+
points.set(request.pointerId, {
|
|
52
|
+
x: request.x,
|
|
53
|
+
y: request.y,
|
|
54
|
+
id: request.pointerId,
|
|
55
|
+
})
|
|
56
|
+
else if (request.phase === 'cancel') points.clear()
|
|
57
|
+
else points.delete(request.pointerId)
|
|
58
|
+
}
|
|
59
|
+
await send('Input.dispatchTouchEvent', {
|
|
60
|
+
type:
|
|
61
|
+
request.phase === 'down'
|
|
62
|
+
? 'touchStart'
|
|
63
|
+
: request.phase === 'move'
|
|
64
|
+
? 'touchMove'
|
|
65
|
+
: request.phase === 'up'
|
|
66
|
+
? 'touchEnd'
|
|
67
|
+
: 'touchCancel',
|
|
68
|
+
touchPoints: [...points.values()],
|
|
69
|
+
})
|
|
70
|
+
}
|
|
71
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import fs from 'fs'
|
|
2
|
+
import path from 'path'
|
|
3
|
+
import { readInstalledNativePackageVersionsAsync } from '../installed-package-versions.ts'
|
|
4
|
+
import { resolveMetroProjectRoot } from '../metro-project-root.ts'
|
|
5
|
+
import type { PackageVersions } from '../packageVersionsContract'
|
|
6
|
+
|
|
7
|
+
// a plain Metro or Expo dev server records no installed versions in its
|
|
8
|
+
// bundle. the bridge serving that bundle reads them from the project the
|
|
9
|
+
// server names, the way `peach open` reads its own project. a server that
|
|
10
|
+
// names no project, or one whose project is not on this machine, gets none.
|
|
11
|
+
export async function readDevServerPackageVersions(
|
|
12
|
+
bundleUrl: URL,
|
|
13
|
+
): Promise<PackageVersions | null> {
|
|
14
|
+
if (!bundleUrl.pathname.endsWith('.bundle')) return null
|
|
15
|
+
const projectRoot = await resolveMetroProjectRoot(bundleUrl.href)
|
|
16
|
+
if (!projectRoot) return null
|
|
17
|
+
try {
|
|
18
|
+
await fs.promises.access(path.join(projectRoot, 'package.json'))
|
|
19
|
+
} catch {
|
|
20
|
+
return null
|
|
21
|
+
}
|
|
22
|
+
return readInstalledNativePackageVersionsAsync(projectRoot)
|
|
23
|
+
}
|
|
@@ -33,6 +33,8 @@ import {
|
|
|
33
33
|
isTrustedBridgeRequest,
|
|
34
34
|
normalizeHostname,
|
|
35
35
|
} from '../backend-origin.ts'
|
|
36
|
+
import { PACKAGE_VERSIONS_HEADER } from '../packageVersionsContract'
|
|
37
|
+
import { readDevServerPackageVersions } from './dev-server-package-versions.ts'
|
|
36
38
|
import {
|
|
37
39
|
buildFetchProxyUpstreamHeaders,
|
|
38
40
|
FETCH_PROXY_FAILURE_HEADER,
|
|
@@ -218,7 +220,7 @@ export async function handleFetchProxyRequest(
|
|
|
218
220
|
|
|
219
221
|
await proxyUpstream(req, res, upstreamUrl, params.has(FETCH_PROXY_FAILURE_PARAM), {
|
|
220
222
|
requestHeaders: (target) => buildFetchProxyHeaders(req.headers, target),
|
|
221
|
-
respond: (upstream, setCookies) => {
|
|
223
|
+
respond: async (upstream, setCookies) => {
|
|
222
224
|
for (const [key, value] of Object.entries(upstream.headers)) {
|
|
223
225
|
const lowerKey = key.toLowerCase()
|
|
224
226
|
if (
|
|
@@ -240,6 +242,17 @@ export async function handleFetchProxyRequest(
|
|
|
240
242
|
}
|
|
241
243
|
res.setHeader(key, value)
|
|
242
244
|
}
|
|
245
|
+
// a bundle whose server records no install gets the one its project holds
|
|
246
|
+
if (
|
|
247
|
+
isBundleProxyRequestUrl(req.url) &&
|
|
248
|
+
req.method === 'GET' &&
|
|
249
|
+
upstream.statusCode === 200 &&
|
|
250
|
+
!res.hasHeader(PACKAGE_VERSIONS_HEADER)
|
|
251
|
+
) {
|
|
252
|
+
const packageVersions = await readDevServerPackageVersions(upstreamUrl)
|
|
253
|
+
if (packageVersions)
|
|
254
|
+
res.setHeader(PACKAGE_VERSIONS_HEADER, JSON.stringify(packageVersions))
|
|
255
|
+
}
|
|
243
256
|
applyFetchProxyCors(req, res)
|
|
244
257
|
if (setCookies.length > 0)
|
|
245
258
|
res.setHeader('x-sootsim-set-cookie', setCookies.join(', '))
|
|
@@ -345,7 +358,7 @@ async function proxyUpstream(
|
|
|
345
358
|
reportFailure: boolean,
|
|
346
359
|
route: {
|
|
347
360
|
requestHeaders: (targetUrl: URL) => Record<string, string | string[]>
|
|
348
|
-
respond: (upstream: IncomingMessage, setCookies: string[]) => void
|
|
361
|
+
respond: (upstream: IncomingMessage, setCookies: string[]) => void | Promise<void>
|
|
349
362
|
},
|
|
350
363
|
): Promise<void> {
|
|
351
364
|
const originalMethod = req.method || 'GET'
|
|
@@ -444,7 +457,7 @@ async function proxyUpstream(
|
|
|
444
457
|
redirectLimit: 10,
|
|
445
458
|
}
|
|
446
459
|
res.setHeader(FETCH_PROXY_NATIVE_COOKIE_RESPONSE_HEADER, nativeCookieHopHeader(hop))
|
|
447
|
-
route.respond(proxyRes, hopCookies)
|
|
460
|
+
await route.respond(proxyRes, hopCookies)
|
|
448
461
|
if (isNativeCookieRedirect(hop)) res.removeHeader('location')
|
|
449
462
|
res.statusCode = isNativeCookieRedirect(hop) ? 200 : status
|
|
450
463
|
await pipeline(proxyRes, res)
|
|
@@ -479,7 +492,7 @@ async function proxyUpstream(
|
|
|
479
492
|
}
|
|
480
493
|
|
|
481
494
|
if (redirects > 0) res.setHeader(FETCH_PROXY_RESPONSE_URL_HEADER, targetUrl.href)
|
|
482
|
-
route.respond(proxyRes, hopCookies)
|
|
495
|
+
await route.respond(proxyRes, hopCookies)
|
|
483
496
|
res.statusCode = status
|
|
484
497
|
await pipeline(proxyRes, res)
|
|
485
498
|
}
|
|
@@ -2,38 +2,144 @@
|
|
|
2
2
|
// compiles a package's native side from the copy autolinking finds, which is
|
|
3
3
|
// Node resolution from the project root, so that is the copy read here even
|
|
4
4
|
// when the graph also bundles a nested one.
|
|
5
|
+
//
|
|
6
|
+
// each walk yields the file system reads it needs. the sync driver answers
|
|
7
|
+
// them for one-shot callers; the async one for servers that must keep
|
|
8
|
+
// answering other requests while a large workspace is read.
|
|
5
9
|
|
|
6
10
|
import fs from 'fs'
|
|
7
11
|
import path from 'path'
|
|
8
12
|
import { LAZY_STUB_PATTERNS } from '@peach/compat/lazy-stub-patterns'
|
|
9
13
|
import { NATIVE_RUNTIME_PACKAGE_NAMES } from '@peach/compat/native-package-names'
|
|
10
14
|
import { COMPAT_STUBS } from '@peach/compat/stub-manifest'
|
|
11
|
-
import { extractPackageFromPath } from '
|
|
15
|
+
import { extractPackageFromPath } from './stub-pattern-matcher.ts'
|
|
12
16
|
import type { PackageVersions } from './packageVersionsContract'
|
|
13
17
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
18
|
+
type InstalledPackage = { root: string; manifest: object }
|
|
19
|
+
|
|
20
|
+
type FsStep =
|
|
21
|
+
| { op: 'exists'; path: string }
|
|
22
|
+
| { op: 'realpath'; path: string }
|
|
23
|
+
// the parsed package.json, or null when there is none or it is not an object
|
|
24
|
+
| { op: 'manifest'; path: string }
|
|
25
|
+
type FsAnswer = boolean | string | object | null
|
|
26
|
+
type FsWalk<T> = Generator<FsStep, T, FsAnswer>
|
|
27
|
+
|
|
28
|
+
function* exists(target: string): FsWalk<boolean> {
|
|
29
|
+
return (yield { op: 'exists', path: target }) === true
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function* realpath(target: string): FsWalk<string> {
|
|
33
|
+
const resolved = yield { op: 'realpath', path: target }
|
|
34
|
+
if (typeof resolved !== 'string') throw new Error(`could not resolve ${target}`)
|
|
35
|
+
return resolved
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function* readManifest(target: string): FsWalk<object | null> {
|
|
39
|
+
const manifest = yield { op: 'manifest', path: target }
|
|
40
|
+
return typeof manifest === 'object' ? manifest : null
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function parseManifest(source: string): object | null {
|
|
44
|
+
const manifest: unknown = JSON.parse(source)
|
|
45
|
+
return typeof manifest === 'object' && manifest !== null ? manifest : null
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function isMissing(error: unknown): boolean {
|
|
49
|
+
return error instanceof Error && 'code' in error && error.code === 'ENOENT'
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function answerSync(step: FsStep): FsAnswer {
|
|
53
|
+
if (step.op === 'exists') return fs.existsSync(step.path)
|
|
54
|
+
if (step.op === 'realpath') return fs.realpathSync(step.path)
|
|
55
|
+
try {
|
|
56
|
+
return parseManifest(fs.readFileSync(step.path, 'utf8'))
|
|
57
|
+
} catch (error) {
|
|
58
|
+
if (isMissing(error)) return null
|
|
59
|
+
throw error
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
async function answerAsync(step: FsStep): Promise<FsAnswer> {
|
|
64
|
+
if (step.op === 'exists')
|
|
65
|
+
return fs.promises.access(step.path).then(
|
|
66
|
+
() => true,
|
|
67
|
+
() => false,
|
|
68
|
+
)
|
|
69
|
+
if (step.op === 'realpath') return fs.promises.realpath(step.path)
|
|
70
|
+
try {
|
|
71
|
+
return parseManifest(await fs.promises.readFile(step.path, 'utf8'))
|
|
72
|
+
} catch (error) {
|
|
73
|
+
if (isMissing(error)) return null
|
|
74
|
+
throw error
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function runSync<T>(walk: FsWalk<T>): T {
|
|
79
|
+
for (let step = walk.next(); ; ) {
|
|
80
|
+
if (step.done) return step.value
|
|
81
|
+
step = walk.next(answerSync(step.value))
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
async function runAsync<T>(walk: FsWalk<T>): Promise<T> {
|
|
86
|
+
for (let step = walk.next(); ; ) {
|
|
87
|
+
if (step.done) return step.value
|
|
88
|
+
step = walk.next(await answerAsync(step.value))
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Node resolution looks in each ancestor's node_modules, skipping directories
|
|
93
|
+
// that are themselves node_modules. one walk asks the same ancestors for many
|
|
94
|
+
// names, so each directory's node_modules is checked once and each manifest
|
|
95
|
+
// read once.
|
|
96
|
+
function createInstalledPackageReader() {
|
|
97
|
+
const hasModules = new Map<string, boolean>()
|
|
98
|
+
const manifests = new Map<string, InstalledPackage | null>()
|
|
99
|
+
return function* readInstalledPackage(
|
|
100
|
+
fromDir: string,
|
|
101
|
+
name: string,
|
|
102
|
+
): FsWalk<InstalledPackage | null> {
|
|
103
|
+
for (let dir = fromDir; ; ) {
|
|
104
|
+
if (path.basename(dir) !== 'node_modules') {
|
|
105
|
+
const modules = path.join(dir, 'node_modules')
|
|
106
|
+
let present = hasModules.get(dir)
|
|
107
|
+
if (present === undefined) {
|
|
108
|
+
present = yield* exists(modules)
|
|
109
|
+
hasModules.set(dir, present)
|
|
110
|
+
}
|
|
111
|
+
if (present) {
|
|
112
|
+
const root = path.join(modules, name)
|
|
113
|
+
let installed = manifests.get(root)
|
|
114
|
+
if (installed === undefined) {
|
|
115
|
+
const manifest = yield* readManifest(path.join(root, 'package.json'))
|
|
116
|
+
installed = manifest ? { root, manifest } : null
|
|
117
|
+
manifests.set(root, installed)
|
|
118
|
+
}
|
|
119
|
+
if (installed) return installed
|
|
120
|
+
}
|
|
25
121
|
}
|
|
26
122
|
const parent = path.dirname(dir)
|
|
27
123
|
if (parent === dir) return null
|
|
28
124
|
dir = parent
|
|
29
|
-
continue
|
|
30
125
|
}
|
|
31
|
-
return typeof manifest === 'object' && manifest !== null
|
|
32
|
-
? { root: path.join(dir, 'node_modules', name), manifest }
|
|
33
|
-
: null
|
|
34
126
|
}
|
|
35
127
|
}
|
|
36
128
|
|
|
129
|
+
function* installedVersionsWalk(
|
|
130
|
+
projectRoot: string,
|
|
131
|
+
names: Iterable<string>,
|
|
132
|
+
): FsWalk<PackageVersions> {
|
|
133
|
+
const readInstalledPackage = createInstalledPackageReader()
|
|
134
|
+
const versions: PackageVersions = {}
|
|
135
|
+
for (const name of [...names].sort()) {
|
|
136
|
+
const installed = yield* readInstalledPackage(projectRoot, name)
|
|
137
|
+
const version = installed && Reflect.get(installed.manifest, 'version')
|
|
138
|
+
if (typeof version === 'string' && version.length > 0) versions[name] = version
|
|
139
|
+
}
|
|
140
|
+
return versions
|
|
141
|
+
}
|
|
142
|
+
|
|
37
143
|
export function readInstalledPackageVersions(
|
|
38
144
|
projectRoot: string,
|
|
39
145
|
modulePaths: Iterable<string>,
|
|
@@ -43,20 +149,14 @@ export function readInstalledPackageVersions(
|
|
|
43
149
|
const name = extractPackageFromPath(modulePath.replaceAll(path.sep, '/'))
|
|
44
150
|
if (name) names.add(name)
|
|
45
151
|
}
|
|
46
|
-
|
|
47
|
-
for (const name of [...names].sort()) {
|
|
48
|
-
const installed = readInstalledPackage(projectRoot, name)
|
|
49
|
-
const version = installed && Reflect.get(installed.manifest, 'version')
|
|
50
|
-
if (typeof version === 'string' && version.length > 0) versions[name] = version
|
|
51
|
-
}
|
|
52
|
-
return versions
|
|
152
|
+
return runSync(installedVersionsWalk(projectRoot, names))
|
|
53
153
|
}
|
|
54
154
|
|
|
55
155
|
// plain expo and one servers need no peach plugin. the launcher reads their
|
|
56
156
|
// installed native packages from the app's dependency graph. an unrelated
|
|
57
157
|
// package hoisted beside a workspace app is resolvable but is not linked.
|
|
58
|
-
|
|
59
|
-
const appRoot =
|
|
158
|
+
function* nativePackageVersionsWalk(projectRoot: string): FsWalk<PackageVersions> {
|
|
159
|
+
const appRoot = yield* realpath(projectRoot)
|
|
60
160
|
const nativeNames = new Set<string>()
|
|
61
161
|
for (const specifier of [
|
|
62
162
|
'react-native',
|
|
@@ -67,17 +167,14 @@ export function readInstalledNativePackageVersions(projectRoot: string): Package
|
|
|
67
167
|
const name = extractPackageFromPath(`node_modules/${specifier}`)
|
|
68
168
|
if (name) nativeNames.add(name)
|
|
69
169
|
}
|
|
70
|
-
const manifest
|
|
71
|
-
|
|
72
|
-
)
|
|
73
|
-
|
|
74
|
-
throw new Error('app package.json must contain an object')
|
|
75
|
-
}
|
|
76
|
-
const pending = [{ root: appRoot, manifest }]
|
|
170
|
+
const manifest = yield* readManifest(path.join(appRoot, 'package.json'))
|
|
171
|
+
if (!manifest) throw new Error('app package.json must contain an object')
|
|
172
|
+
const readInstalledPackage = createInstalledPackageReader()
|
|
173
|
+
const pending: InstalledPackage[] = [{ root: appRoot, manifest }]
|
|
77
174
|
const visited = new Set<string>()
|
|
78
175
|
const needed = new Set<string>()
|
|
79
176
|
for (let next = pending.pop(); next; next = pending.pop()) {
|
|
80
|
-
const root =
|
|
177
|
+
const root = yield* realpath(next.root)
|
|
81
178
|
if (visited.has(root)) continue
|
|
82
179
|
visited.add(root)
|
|
83
180
|
const fields = ['dependencies', 'optionalDependencies', 'peerDependencies']
|
|
@@ -92,15 +189,22 @@ export function readInstalledNativePackageVersions(projectRoot: string): Package
|
|
|
92
189
|
if (typeof peer === 'object' && peer !== null && Reflect.get(peer, 'optional'))
|
|
93
190
|
continue
|
|
94
191
|
}
|
|
95
|
-
const installed = readInstalledPackage(root, name)
|
|
192
|
+
const installed = yield* readInstalledPackage(root, name)
|
|
96
193
|
if (!installed) continue
|
|
97
194
|
if (nativeNames.has(name)) needed.add(name)
|
|
98
195
|
pending.push(installed)
|
|
99
196
|
}
|
|
100
197
|
}
|
|
101
198
|
}
|
|
102
|
-
return
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
199
|
+
return yield* installedVersionsWalk(projectRoot, needed)
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
export function readInstalledNativePackageVersions(projectRoot: string): PackageVersions {
|
|
203
|
+
return runSync(nativePackageVersionsWalk(projectRoot))
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
export function readInstalledNativePackageVersionsAsync(
|
|
207
|
+
projectRoot: string,
|
|
208
|
+
): Promise<PackageVersions> {
|
|
209
|
+
return runAsync(nativePackageVersionsWalk(projectRoot))
|
|
106
210
|
}
|
package/src/kotlin-host.ts
CHANGED
|
@@ -325,7 +325,7 @@ function entrySource(ids: string[]): string {
|
|
|
325
325
|
'@JsExport',
|
|
326
326
|
'fun peachSetAndroidBuildInfo(model: String, release: String) = Build.setDevice(model, release)',
|
|
327
327
|
'',
|
|
328
|
-
'@OptIn(kotlin.js.ExperimentalJsExport::class,
|
|
328
|
+
'@OptIn(kotlin.js.ExperimentalJsExport::class, kotlinx.coroutines.DelicateCoroutinesApi::class)',
|
|
329
329
|
'@JsExport',
|
|
330
330
|
'fun peachNativeCall(module: String, method: String, argsJson: String, contractHash: String): Promise<JsAny?> =',
|
|
331
331
|
' GlobalScope.promise(Dispatchers.Main) {',
|
package/src/metro-plugin.ts
CHANGED
|
@@ -12,10 +12,6 @@ import fs from 'fs'
|
|
|
12
12
|
import { createRequire } from 'module'
|
|
13
13
|
import { randomUUID } from 'node:crypto'
|
|
14
14
|
import path from 'path'
|
|
15
|
-
import {
|
|
16
|
-
getRuntimePlatformAdapter,
|
|
17
|
-
isRuntimePlatform,
|
|
18
|
-
} from '../../peach-engine/src/platform/adapter'
|
|
19
15
|
import { resolveAppProject } from '../cli/app-project'
|
|
20
16
|
import { collectAndroidAutolinkedPackages } from './android-autolinking'
|
|
21
17
|
import { insertAndroidAutolinkingFooter } from './androidAutolinkingContract'
|
|
@@ -51,6 +47,10 @@ import {
|
|
|
51
47
|
serveRuntimeFile,
|
|
52
48
|
SOOTSIM_RUNTIME_MISSING_MESSAGE,
|
|
53
49
|
} from './runtime-assets'
|
|
50
|
+
import {
|
|
51
|
+
getRuntimePlatformAdapter,
|
|
52
|
+
isRuntimePlatform,
|
|
53
|
+
} from './runtimePlatformContract.ts'
|
|
54
54
|
|
|
55
55
|
const prefix = '/__peachsim'
|
|
56
56
|
export { toPeachDevelopmentBundleUrl, toPeachProductionBundleUrl }
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { resolveListeningPid, resolveProcessCwd } from '../scripts/dev-server-scanner'
|
|
2
|
+
import { loopbackOriginOf } from './backend-origin'
|
|
3
|
+
import { MANIFEST_PROBE_TIMEOUT_MS } from './dev-bundle-resolution'
|
|
4
|
+
import { parseExpoManifestBody } from './expo-manifest-body'
|
|
5
|
+
|
|
6
|
+
// resolve a metro dev server's project root. Expo's middleware advertises it
|
|
7
|
+
// in X-React-Native-Project-Root, encoded with encodeURI. Older servers name it
|
|
8
|
+
// in extra.expoClient._internal.projectRoot. The local peach open path runs from the
|
|
9
|
+
// CLI's cwd, which almost never owns the bundle being opened (e.g.
|
|
10
|
+
// `peach open 8081` run from ~/contrast against a 3pc metro), so scanning cwd for
|
|
11
|
+
// font declarations finds nothing.
|
|
12
|
+
//
|
|
13
|
+
// a bare react-native packager serves no such manifest, so the same resolver
|
|
14
|
+
// asks the OS for the listening process's cwd. that is still the development
|
|
15
|
+
// server's project identity; the invoking CLI's cwd is never consulted.
|
|
16
|
+
//
|
|
17
|
+
// it waits on the same budget as the manifest resolution that found this dev
|
|
18
|
+
// server. a cold Expo Metro answers /status in 2-4s while it builds a bundle,
|
|
19
|
+
// and dropping the project there opens the app without its fonts, splash or
|
|
20
|
+
// Firebase config. a server that stays silent past the budget fails the open.
|
|
21
|
+
export async function resolveMetroProjectRoot(bundleUrl: string): Promise<string | null> {
|
|
22
|
+
const origin = loopbackOriginOf(bundleUrl)
|
|
23
|
+
if (!origin) return null
|
|
24
|
+
const controller = new AbortController()
|
|
25
|
+
const timer = setTimeout(() => controller.abort(), MANIFEST_PROBE_TIMEOUT_MS)
|
|
26
|
+
let servedManifest = false
|
|
27
|
+
let metroRunning = false
|
|
28
|
+
try {
|
|
29
|
+
const status = await fetch(`${origin}/status`, { signal: controller.signal })
|
|
30
|
+
const advertisedRoot = status.headers.get('X-React-Native-Project-Root')
|
|
31
|
+
if (status.ok && advertisedRoot) return decodeURI(advertisedRoot)
|
|
32
|
+
metroRunning = status.ok && (await status.text()).trim() === 'packager-status:running'
|
|
33
|
+
const res = await fetch(`${origin}/`, {
|
|
34
|
+
headers: { 'expo-platform': 'ios', Accept: 'application/json' },
|
|
35
|
+
signal: controller.signal,
|
|
36
|
+
})
|
|
37
|
+
if (res.ok) {
|
|
38
|
+
const manifest: unknown = parseExpoManifestBody(await res.text())
|
|
39
|
+
servedManifest = true
|
|
40
|
+
let root: unknown = manifest
|
|
41
|
+
for (const key of ['extra', 'expoClient', '_internal', 'projectRoot']) {
|
|
42
|
+
root =
|
|
43
|
+
typeof root === 'object' && root !== null ? Reflect.get(root, key) : undefined
|
|
44
|
+
}
|
|
45
|
+
if (typeof root === 'string' && root.length > 0) return root
|
|
46
|
+
}
|
|
47
|
+
} catch {
|
|
48
|
+
if (controller.signal.aborted)
|
|
49
|
+
throw new Error(
|
|
50
|
+
`Metro project root request timed out after ${MANIFEST_PROBE_TIMEOUT_MS / 1000}s: ${origin}. Wait for the dev server to finish starting or pass --project-root.`,
|
|
51
|
+
)
|
|
52
|
+
} finally {
|
|
53
|
+
clearTimeout(timer)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// a server that answered with a manifest has already told us everything it
|
|
57
|
+
// knows. if it did not name a project root there is none to learn, and asking
|
|
58
|
+
// the OS about the listening process would answer with whatever directory
|
|
59
|
+
// that process happens to sit in — which is the CLI's own cwd trap this
|
|
60
|
+
// function exists to avoid. only a server whose status identifies Metro
|
|
61
|
+
// and which served no manifest gets the process lookup.
|
|
62
|
+
if (servedManifest || !metroRunning) return null
|
|
63
|
+
|
|
64
|
+
const port = Number(new URL(origin).port)
|
|
65
|
+
if (!Number.isFinite(port) || port <= 0) return null
|
|
66
|
+
const pid = await resolveListeningPid(port)
|
|
67
|
+
return pid === null ? null : resolveProcessCwd(pid)
|
|
68
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": 1,
|
|
3
|
+
"platform": "ios",
|
|
4
|
+
"target": "wasm32-unknown-wasip1",
|
|
5
|
+
"recipe": "93ec12de28e70ccd6a0ff72c91fe59add61930da9b9f0c981c35b8ff64abdf8e",
|
|
6
|
+
"adapter": {
|
|
7
|
+
"sha256": "051a6905f1194aa18075d68e0444d30e69b4e52dc6017f3e70815a2403e3c306"
|
|
8
|
+
},
|
|
9
|
+
"headers": {
|
|
10
|
+
"reactNativeJsi": "96db4e758dd53e9320cef7cad485e00aa06e7a982cefd920f17007de8a5bd9f9",
|
|
11
|
+
"nitroModules": "372b6f69fc063a0b316792eec9b26f36063868dc206f169acbb5d993c6572f65"
|
|
12
|
+
},
|
|
13
|
+
"compiler": "swift-6.4.0-RELEASE-custom-0d775d32d7c74eae",
|
|
14
|
+
"sdk": {
|
|
15
|
+
"id": "swift-6.4.0-RELEASE_wasm-peach-f02bd198",
|
|
16
|
+
"checksum": "1e19ea768fd4e821aae34b8966c4ddcee45615c4b3cf018979b061aee2fb5504"
|
|
17
|
+
},
|
|
18
|
+
"framework": {
|
|
19
|
+
"distribution": "e3bdd3d8fa4f9993",
|
|
20
|
+
"wireAbi": "ed0b01fcc0a79236d88ef9ac7950ac30932dfc19c19112c69d1d6a039a489292"
|
|
21
|
+
},
|
|
22
|
+
"archive": {
|
|
23
|
+
"sha256": "1cf000ee821aaf65b04a3d6702c7d4341e450371cfd199e5887c6056f80af899",
|
|
24
|
+
"size": 31175
|
|
25
|
+
}
|
|
26
|
+
}
|