peachsim 0.1.1641 → 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-bundle-resources.ts +57 -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 +105 -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 +40 -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 +15 -5
- 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 +52 -118
- package/detox/motion-change.d.cts +6 -27
- package/detox/motion-leg-starts.cjs +20 -0
- package/detox/motion-leg-starts.d.cts +8 -0
- 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 +3 -3
- 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 +38332 -14940
- 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 +1247 -4511
- 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 +35243 -13172
- 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 +45285 -63163
- 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 +1997 -2069
- 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 +14 -6
- package/dist-lib/menu.mjs +14 -6
- 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 +468 -563
- package/dist-lib/native-app-identity-project.cjs +128 -292
- package/dist-lib/native-app-identity-project.mjs +1262 -51
- 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 +84 -16
- package/dist-lib/sdk.mjs +82 -15
- package/dist-lib/skills.cjs +51248 -75450
- package/dist-lib/swift-compile.cjs +26154 -1245
- package/dist-lib/swift-compile.mjs +26151 -1230
- 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 +34394 -12323
- 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/appBundleResourcesContract.ts +51 -0
- package/src/assetCatalogContract.ts +21 -0
- package/src/backend-origin.ts +3 -1
- 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 +20 -37
- 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/host/staged-host-files.ts +28 -4
- package/src/installed-package-versions.ts +142 -38
- package/src/kotlin-host.ts +1 -1
- package/src/launchMetadataContract.ts +1 -0
- package/src/menu.ts +12 -4
- package/src/metro-plugin.ts +4 -4
- package/src/metro-project-root.ts +68 -0
- package/src/native-app-identity-project.ts +47 -38
- 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 +8 -7
- 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 +926 -47
- package/src/swift-compiler-digest.ts +17 -3
- package/src/swift-distribution.lock.json +49 -22
- package/src/swift-host.ts +167 -52
- package/src/swift-objc-compile.ts +86 -26
- 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-root-lock.ts +241 -92
- 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 +103 -11
- 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/swift-root-lock.ts
CHANGED
|
@@ -1,67 +1,120 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
spawn,
|
|
3
|
+
spawnSync,
|
|
4
|
+
type ChildProcess,
|
|
5
|
+
type ChildProcessByStdio,
|
|
6
|
+
type SpawnOptions,
|
|
7
|
+
} from 'node:child_process'
|
|
2
8
|
import { createHash, randomUUID } from 'node:crypto'
|
|
3
9
|
import {
|
|
4
10
|
linkSync,
|
|
5
11
|
mkdirSync,
|
|
12
|
+
readdirSync,
|
|
6
13
|
readFileSync,
|
|
7
|
-
renameSync,
|
|
8
14
|
rmSync,
|
|
9
15
|
writeFileSync,
|
|
10
16
|
} from 'node:fs'
|
|
11
17
|
import path from 'node:path'
|
|
12
18
|
import { rnxHomeDir } from './home-paths'
|
|
19
|
+
import { terminateProcessGroup } from './process-group'
|
|
20
|
+
import type { Readable, Writable } from 'node:stream'
|
|
13
21
|
|
|
14
22
|
const POLL_MS = 250
|
|
23
|
+
// ps derives a start time from the boot time, which drifts by a second or two
|
|
24
|
+
// on linux; a reused pid starts later than this.
|
|
25
|
+
const START_TOLERANCE_MS = 2_000
|
|
15
26
|
|
|
16
|
-
interface
|
|
27
|
+
interface ProcessRow {
|
|
17
28
|
pid: number
|
|
18
|
-
|
|
29
|
+
pgid: number
|
|
30
|
+
zombie: boolean
|
|
31
|
+
start: number
|
|
19
32
|
}
|
|
20
33
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
34
|
+
interface Identity {
|
|
35
|
+
pid: number
|
|
36
|
+
start: number
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
interface Generation {
|
|
40
|
+
number: number
|
|
41
|
+
holder: Identity
|
|
42
|
+
released: boolean
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function errorCode(error: unknown): string | undefined {
|
|
46
|
+
return error instanceof Error && 'code' in error && typeof error.code === 'string'
|
|
47
|
+
? error.code
|
|
48
|
+
: undefined
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// ps prints start times without a zone, so every reader asks for utc: a
|
|
52
|
+
// holder and a waiter then agree whatever their own time zones are.
|
|
53
|
+
function parseStart(text: string): number {
|
|
54
|
+
const start = Date.parse(`${text} UTC`)
|
|
55
|
+
if (Number.isNaN(start)) throw new Error(`unreadable process start time "${text}"`)
|
|
56
|
+
return start
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// the whole table in one read. an unreadable table throws: a lock that cannot
|
|
60
|
+
// tell whether its holder is gone must not guess.
|
|
61
|
+
function processTable(): ProcessRow[] {
|
|
62
|
+
const result = spawnSync('ps', ['-A', '-o', 'pid=,pgid=,stat=,lstart='], {
|
|
63
|
+
encoding: 'utf8',
|
|
64
|
+
env: { ...process.env, LC_ALL: 'C', TZ: 'UTC' },
|
|
65
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
66
|
+
timeout: 10_000,
|
|
67
|
+
killSignal: 'SIGKILL',
|
|
68
|
+
})
|
|
69
|
+
if (result.error || result.status !== 0) {
|
|
70
|
+
throw new Error(
|
|
71
|
+
`swift root lock cannot read the process table: ${
|
|
72
|
+
result.error?.message || result.stderr.trim() || `ps exited ${result.status}`
|
|
73
|
+
}`,
|
|
29
74
|
)
|
|
30
|
-
} catch {
|
|
31
|
-
return null
|
|
32
75
|
}
|
|
76
|
+
return result.stdout
|
|
77
|
+
.split('\n')
|
|
78
|
+
.filter((line) => line.trim())
|
|
79
|
+
.map((line) => {
|
|
80
|
+
const match = /^\s*(\d+)\s+(\d+)\s+(\S+)\s+(.+?)\s*$/.exec(line)
|
|
81
|
+
if (!match)
|
|
82
|
+
throw new Error(`swift root lock cannot parse a process table row: ${line}`)
|
|
83
|
+
return {
|
|
84
|
+
pid: Number(match[1]),
|
|
85
|
+
pgid: Number(match[2]),
|
|
86
|
+
zombie: match[3]!.startsWith('Z'),
|
|
87
|
+
start: parseStart(match[4]!),
|
|
88
|
+
}
|
|
89
|
+
})
|
|
33
90
|
}
|
|
34
91
|
|
|
35
|
-
function
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
value &&
|
|
40
|
-
typeof value === 'object' &&
|
|
41
|
-
'pid' in value &&
|
|
42
|
-
typeof value.pid === 'number' &&
|
|
43
|
-
'start' in value &&
|
|
44
|
-
(typeof value.start === 'string' || value.start === null)
|
|
45
|
-
)
|
|
46
|
-
return { pid: value.pid, start: value.start }
|
|
47
|
-
} catch {}
|
|
48
|
-
return null
|
|
92
|
+
function sameProcess(row: ProcessRow, identity: Identity): boolean {
|
|
93
|
+
return (
|
|
94
|
+
row.pid === identity.pid && Math.abs(row.start - identity.start) <= START_TOLERANCE_MS
|
|
95
|
+
)
|
|
49
96
|
}
|
|
50
97
|
|
|
51
|
-
function
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
}
|
|
98
|
+
function ownIdentity(pid: number): Identity {
|
|
99
|
+
const row = processTable().find(
|
|
100
|
+
(candidate) => candidate.pid === pid && !candidate.zombie,
|
|
101
|
+
)
|
|
102
|
+
if (!row) throw new Error(`swift root lock cannot find process ${pid}`)
|
|
103
|
+
return { pid, start: row.start }
|
|
58
104
|
}
|
|
59
105
|
|
|
60
|
-
function
|
|
61
|
-
const
|
|
62
|
-
if (
|
|
63
|
-
|
|
64
|
-
|
|
106
|
+
function parseIdentity(text: string): Identity {
|
|
107
|
+
const value: unknown = JSON.parse(text)
|
|
108
|
+
if (
|
|
109
|
+
value &&
|
|
110
|
+
typeof value === 'object' &&
|
|
111
|
+
'pid' in value &&
|
|
112
|
+
typeof value.pid === 'number' &&
|
|
113
|
+
'start' in value &&
|
|
114
|
+
typeof value.start === 'number'
|
|
115
|
+
)
|
|
116
|
+
return { pid: value.pid, start: value.start }
|
|
117
|
+
throw new Error(`swift root lock record is not a process identity: ${text}`)
|
|
65
118
|
}
|
|
66
119
|
|
|
67
120
|
function pause(ms: number, signal?: AbortSignal): Promise<void> {
|
|
@@ -76,78 +129,174 @@ function pause(ms: number, signal?: AbortSignal): Promise<void> {
|
|
|
76
129
|
})
|
|
77
130
|
}
|
|
78
131
|
|
|
132
|
+
const name = (number: number, suffix: string) =>
|
|
133
|
+
`${String(number).padStart(12, '0')}.${suffix}`
|
|
134
|
+
|
|
135
|
+
function generationNumbers(directory: string): number[] {
|
|
136
|
+
const numbers = new Set<number>()
|
|
137
|
+
for (const entry of readdirSync(directory)) {
|
|
138
|
+
const match = /^(\d{12})\./.exec(entry)
|
|
139
|
+
if (match) numbers.add(Number(match[1]))
|
|
140
|
+
}
|
|
141
|
+
return [...numbers].sort((a, b) => a - b)
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
function readGeneration(directory: string, number: number): Generation | null {
|
|
145
|
+
let owner: string
|
|
146
|
+
try {
|
|
147
|
+
owner = readFileSync(path.join(directory, name(number, 'owner')), 'utf8')
|
|
148
|
+
} catch (error) {
|
|
149
|
+
// a newer holder cleaned this generation after it was listed.
|
|
150
|
+
if (errorCode(error) === 'ENOENT') return null
|
|
151
|
+
throw error
|
|
152
|
+
}
|
|
153
|
+
return {
|
|
154
|
+
number,
|
|
155
|
+
holder: parseIdentity(owner),
|
|
156
|
+
released: readdirSync(directory).includes(name(number, 'released')),
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// children are registered before they run and only while the holder lives, so
|
|
161
|
+
// reading them after the holder is seen dead lists every one it started.
|
|
162
|
+
function readChildren(directory: string, number: number): Identity[] {
|
|
163
|
+
const prefix = name(number, 'child.')
|
|
164
|
+
return readdirSync(directory)
|
|
165
|
+
.filter((entry) => entry.startsWith(prefix))
|
|
166
|
+
.map((entry) => parseIdentity(readFileSync(path.join(directory, entry), 'utf8')))
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// a child leads its own session, so its group is its pid; a group id stays
|
|
170
|
+
// taken while any member lives, so a leader started later is another process.
|
|
171
|
+
function groupAlive(table: ProcessRow[], leader: Identity): boolean {
|
|
172
|
+
const row = table.find((candidate) => candidate.pid === leader.pid)
|
|
173
|
+
if (row && !sameProcess(row, leader)) return false
|
|
174
|
+
return table.some((candidate) => candidate.pgid === leader.pid && !candidate.zombie)
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/** compiler processes whose lifetime the root lock covers. */
|
|
178
|
+
export interface SwiftRootLease {
|
|
179
|
+
/** starts `command` in its own process group, recorded under the lock before
|
|
180
|
+
* it runs, so the root stays held while that group lives even if this
|
|
181
|
+
* process dies. */
|
|
182
|
+
spawn(
|
|
183
|
+
command: string,
|
|
184
|
+
args: string[],
|
|
185
|
+
options: SpawnOptions,
|
|
186
|
+
): ChildProcessByStdio<Writable, Readable, Readable>
|
|
187
|
+
}
|
|
188
|
+
|
|
79
189
|
/** runs `work` as the only process using a swift build root. the in-process
|
|
80
190
|
* queue orders one process's requests; two processes sharing a root each
|
|
81
191
|
* rewrite its sources and manifest, and swiftpm's own build lock only orders
|
|
82
192
|
* the builds, so a build can compile the other process's sources and then
|
|
83
|
-
* read back that process's executable.
|
|
84
|
-
*
|
|
85
|
-
*
|
|
193
|
+
* read back that process's executable.
|
|
194
|
+
*
|
|
195
|
+
* holders are numbered. the newest generation holds the root; claiming the
|
|
196
|
+
* next number is one exclusive link, so exactly one claimant wins and no
|
|
197
|
+
* record is ever moved or replaced. a generation is free once its holder
|
|
198
|
+
* released it, or once its holder process and every compiler group it
|
|
199
|
+
* recorded are gone. an unreadable process table or an unkillable compiler
|
|
200
|
+
* keeps the root held. the lock lives beside the root's tree, never inside
|
|
201
|
+
* it: a write sweeps every file of the tree it does not name. */
|
|
86
202
|
export async function withSwiftRootLock<T>(
|
|
87
203
|
root: string,
|
|
88
|
-
work: () => Promise<T>,
|
|
204
|
+
work: (lease: SwiftRootLease) => Promise<T>,
|
|
89
205
|
signal?: AbortSignal,
|
|
90
206
|
): Promise<T> {
|
|
91
|
-
const directory = path.join(
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
207
|
+
const directory = path.join(
|
|
208
|
+
rnxHomeDir(),
|
|
209
|
+
'cache',
|
|
210
|
+
'swift-root-locks',
|
|
211
|
+
createHash('sha256').update(root).digest('hex').slice(0, 32),
|
|
96
212
|
)
|
|
213
|
+
mkdirSync(directory, { recursive: true })
|
|
97
214
|
const token = randomUUID()
|
|
98
|
-
const owner = JSON.stringify(
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
linkSync(pending, lock)
|
|
112
|
-
break
|
|
113
|
-
} catch (error) {
|
|
114
|
-
if (!(error instanceof Error && 'code' in error && error.code === 'EEXIST'))
|
|
115
|
-
throw error
|
|
215
|
+
const owner = JSON.stringify(ownIdentity(process.pid))
|
|
216
|
+
const pending = path.join(directory, `pending.${token}`)
|
|
217
|
+
let held = 0
|
|
218
|
+
for (;;) {
|
|
219
|
+
signal?.throwIfAborted()
|
|
220
|
+
const newest = generationNumbers(directory).at(-1) ?? 0
|
|
221
|
+
const current = newest > 0 ? readGeneration(directory, newest) : null
|
|
222
|
+
if (newest > 0 && !current) continue
|
|
223
|
+
if (current && !current.released) {
|
|
224
|
+
const table = processTable()
|
|
225
|
+
if (table.some((row) => !row.zombie && sameProcess(row, current.holder))) {
|
|
226
|
+
await pause(POLL_MS, signal)
|
|
227
|
+
continue
|
|
116
228
|
}
|
|
117
|
-
const
|
|
118
|
-
if (
|
|
119
|
-
if (holderAlive(held)) {
|
|
229
|
+
const children = readChildren(directory, newest)
|
|
230
|
+
if (children.some((child) => groupAlive(table, child))) {
|
|
120
231
|
await pause(POLL_MS, signal)
|
|
121
232
|
continue
|
|
122
233
|
}
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
234
|
+
}
|
|
235
|
+
// the record is complete before it takes the number, so a waiter never
|
|
236
|
+
// reads half a record.
|
|
237
|
+
writeFileSync(pending, owner)
|
|
238
|
+
try {
|
|
239
|
+
linkSync(pending, path.join(directory, name(newest + 1, 'owner')))
|
|
240
|
+
} catch (error) {
|
|
241
|
+
if (errorCode(error) === 'EEXIST') continue
|
|
242
|
+
throw error
|
|
243
|
+
} finally {
|
|
244
|
+
rmSync(pending, { force: true })
|
|
245
|
+
}
|
|
246
|
+
// a claimant that listed the directory before older generations were
|
|
247
|
+
// cleaned can take a number below the newest; it never held the root.
|
|
248
|
+
const numbers = generationNumbers(directory)
|
|
249
|
+
if (numbers.at(-1) !== newest + 1) {
|
|
250
|
+
rmSync(path.join(directory, name(newest + 1, 'owner')), { force: true })
|
|
251
|
+
continue
|
|
252
|
+
}
|
|
253
|
+
held = newest + 1
|
|
254
|
+
for (const number of numbers)
|
|
255
|
+
if (number < held)
|
|
256
|
+
for (const entry of readdirSync(directory))
|
|
257
|
+
if (entry.startsWith(name(number, '')))
|
|
258
|
+
rmSync(path.join(directory, entry), { force: true })
|
|
259
|
+
break
|
|
260
|
+
}
|
|
261
|
+
const children: ChildProcess[] = []
|
|
262
|
+
const lease: SwiftRootLease = {
|
|
263
|
+
spawn(command, args, options) {
|
|
264
|
+
// the child waits for its registration before it runs, and exits without
|
|
265
|
+
// running if this process dies first.
|
|
266
|
+
const child = spawn(
|
|
267
|
+
'/bin/sh',
|
|
268
|
+
['-c', 'IFS= read -r go || exit 1; exec "$@" </dev/null', 'sh', command, ...args],
|
|
269
|
+
{ ...options, detached: true, stdio: ['pipe', 'pipe', 'pipe'] },
|
|
270
|
+
)
|
|
271
|
+
child.stdin!.on('error', () => {})
|
|
272
|
+
children.push(child)
|
|
126
273
|
try {
|
|
127
|
-
|
|
274
|
+
if (child.pid === undefined) {
|
|
275
|
+
child.once('error', () => {})
|
|
276
|
+
throw new Error(`could not start ${command}`)
|
|
277
|
+
}
|
|
278
|
+
const childPending = `${pending}.child.${child.pid}`
|
|
279
|
+
try {
|
|
280
|
+
// publish a complete identity before opening the compiler gate. a
|
|
281
|
+
// crash or failed write leaves only an ignored pending file.
|
|
282
|
+
writeFileSync(childPending, JSON.stringify(ownIdentity(child.pid)))
|
|
283
|
+
linkSync(childPending, path.join(directory, name(held, `child.${child.pid}`)))
|
|
284
|
+
} finally {
|
|
285
|
+
rmSync(childPending, { force: true })
|
|
286
|
+
}
|
|
128
287
|
} catch (error) {
|
|
129
|
-
|
|
288
|
+
child.stdin!.destroy()
|
|
130
289
|
throw error
|
|
131
290
|
}
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
linkSync(dead, lock)
|
|
136
|
-
} catch (error) {
|
|
137
|
-
if (!(error instanceof Error && 'code' in error && error.code === 'EEXIST'))
|
|
138
|
-
throw error
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
} finally {
|
|
142
|
-
rmSync(dead, { force: true })
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
} finally {
|
|
146
|
-
rmSync(pending, { force: true })
|
|
291
|
+
child.stdin!.end('go\n')
|
|
292
|
+
return child
|
|
293
|
+
},
|
|
147
294
|
}
|
|
148
295
|
try {
|
|
149
|
-
return await work()
|
|
296
|
+
return await work(lease)
|
|
150
297
|
} finally {
|
|
151
|
-
|
|
298
|
+
// a compiler that outlives its caller would still read the root.
|
|
299
|
+
await Promise.all(children.map((child) => terminateProcessGroup(child, 'SIGKILL', 0)))
|
|
300
|
+
writeFileSync(path.join(directory, name(held, 'released')), '')
|
|
152
301
|
}
|
|
153
302
|
}
|
package/src/swift-submit.ts
CHANGED
|
@@ -25,6 +25,8 @@ import {
|
|
|
25
25
|
isSwiftMetalLibrarySources,
|
|
26
26
|
type SwiftMetalLibrarySource,
|
|
27
27
|
type SwiftResourceBundle,
|
|
28
|
+
type SwiftNativeTarget,
|
|
29
|
+
type SwiftObjCPeerStartup,
|
|
28
30
|
} from './swiftContract'
|
|
29
31
|
|
|
30
32
|
export const SWIFT_COMPILE_PATH = '/api/swift-compile'
|
|
@@ -234,6 +236,8 @@ export interface SwiftCompileContext {
|
|
|
234
236
|
|
|
235
237
|
export type SwiftCompileSubmit = (work: {
|
|
236
238
|
files: Record<string, string>
|
|
239
|
+
nativeTargets?: SwiftNativeTarget[]
|
|
240
|
+
objcPeerStartup?: SwiftObjCPeerStartup
|
|
237
241
|
metalSources?: Record<string, string>
|
|
238
242
|
/** the bundle pack; absent means the project packs none. */
|
|
239
243
|
resources?: Record<string, string>
|
|
@@ -399,6 +403,8 @@ export async function compileSwiftProject(
|
|
|
399
403
|
submit: SwiftCompileSubmit,
|
|
400
404
|
work: {
|
|
401
405
|
files: Record<string, string>
|
|
406
|
+
nativeTargets?: SwiftNativeTarget[]
|
|
407
|
+
objcPeerStartup?: SwiftObjCPeerStartup
|
|
402
408
|
metalSources?: Record<string, string>
|
|
403
409
|
resources?: Record<string, string>
|
|
404
410
|
/** project-relative resource paths used to associate implicit resources with targets. */
|
package/src/swiftContract.ts
CHANGED
|
@@ -22,6 +22,105 @@ export interface SwiftObjCPeerClass {
|
|
|
22
22
|
header: string
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
+
/** generated registration source whose call must precede the application entry. */
|
|
26
|
+
export interface SwiftObjCPeerStartup {
|
|
27
|
+
registration: string
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export function isSwiftObjCPeerStartup(value: unknown): value is SwiftObjCPeerStartup {
|
|
31
|
+
return (
|
|
32
|
+
value !== null &&
|
|
33
|
+
typeof value === 'object' &&
|
|
34
|
+
'registration' in value &&
|
|
35
|
+
isSwiftResourcePath(value.registration) &&
|
|
36
|
+
value.registration.endsWith('.swift') &&
|
|
37
|
+
Object.keys(value).length === 1
|
|
38
|
+
)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export const SWIFT_NATIVE_INPUT_ROOT = '$(PEACH_INPUT_ROOT)'
|
|
42
|
+
export const SWIFT_NATIVE_SDK_INCLUDE = '$(PEACH_SDK_INCLUDE)'
|
|
43
|
+
|
|
44
|
+
export interface SwiftObjCImplementationPlan {
|
|
45
|
+
owner: string
|
|
46
|
+
registeredClasses: string[]
|
|
47
|
+
units: string[]
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export interface SwiftProjectPreparation {
|
|
51
|
+
headerProducers: string[]
|
|
52
|
+
objcImplementations?: SwiftObjCImplementationPlan
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** project-relative original clang inputs; no host paths cross the compile boundary. */
|
|
56
|
+
export interface SwiftNativeTarget {
|
|
57
|
+
name: string
|
|
58
|
+
deploymentTarget: string | null
|
|
59
|
+
headers: string[]
|
|
60
|
+
publicHeaders: string[]
|
|
61
|
+
bridgingHeader: string | null
|
|
62
|
+
prefixHeader: string | null
|
|
63
|
+
headerSearchPaths: string[]
|
|
64
|
+
frameworkSearchPaths: string[]
|
|
65
|
+
flags: string[]
|
|
66
|
+
cxxFlags: string[]
|
|
67
|
+
fileFlags: Record<string, string[]>
|
|
68
|
+
sourceDirectories: Record<string, string>
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export function isSwiftNativeTargets(value: unknown): value is SwiftNativeTarget[] {
|
|
72
|
+
const strings = (value: unknown): value is string[] =>
|
|
73
|
+
Array.isArray(value) &&
|
|
74
|
+
value.every((item: unknown) => typeof item === 'string' && !item.includes('\0'))
|
|
75
|
+
const paths = (value: unknown): value is string[] =>
|
|
76
|
+
strings(value) && value.every(isSwiftResourcePath)
|
|
77
|
+
return (
|
|
78
|
+
Array.isArray(value) &&
|
|
79
|
+
value.length <= 128 &&
|
|
80
|
+
value.every((target: unknown) => {
|
|
81
|
+
if (!target || typeof target !== 'object') return false
|
|
82
|
+
const field = (name: string): unknown => Reflect.get(target, name)
|
|
83
|
+
const nullablePath = (name: string) =>
|
|
84
|
+
field(name) === null || isSwiftResourcePath(field(name))
|
|
85
|
+
const perFile = field('fileFlags')
|
|
86
|
+
const directories = field('sourceDirectories')
|
|
87
|
+
const searches = field('headerSearchPaths')
|
|
88
|
+
const frameworks = field('frameworkSearchPaths')
|
|
89
|
+
const deployment = field('deploymentTarget')
|
|
90
|
+
return (
|
|
91
|
+
typeof field('name') === 'string' &&
|
|
92
|
+
/^[A-Za-z_]\w*$/.test(String(field('name'))) &&
|
|
93
|
+
(deployment === null ||
|
|
94
|
+
(typeof deployment === 'string' && /^\d+(?:\.\d+){0,2}$/.test(deployment))) &&
|
|
95
|
+
paths(field('headers')) &&
|
|
96
|
+
paths(field('publicHeaders')) &&
|
|
97
|
+
nullablePath('bridgingHeader') &&
|
|
98
|
+
nullablePath('prefixHeader') &&
|
|
99
|
+
strings(searches) &&
|
|
100
|
+
searches.every((item) => item === '.' || isSwiftResourcePath(item)) &&
|
|
101
|
+
strings(frameworks) &&
|
|
102
|
+
frameworks.every((item) => item === '.' || isSwiftResourcePath(item)) &&
|
|
103
|
+
strings(field('flags')) &&
|
|
104
|
+
strings(field('cxxFlags')) &&
|
|
105
|
+
!!perFile &&
|
|
106
|
+
typeof perFile === 'object' &&
|
|
107
|
+
!Array.isArray(perFile) &&
|
|
108
|
+
Object.entries(perFile).every(
|
|
109
|
+
([file, flags]) => isSwiftResourcePath(file) && strings(flags),
|
|
110
|
+
) &&
|
|
111
|
+
!!directories &&
|
|
112
|
+
typeof directories === 'object' &&
|
|
113
|
+
!Array.isArray(directories) &&
|
|
114
|
+
Object.entries(directories).every(
|
|
115
|
+
([file, directory]) =>
|
|
116
|
+
isSwiftResourcePath(file) &&
|
|
117
|
+
(directory === '.' || isSwiftResourcePath(directory)),
|
|
118
|
+
)
|
|
119
|
+
)
|
|
120
|
+
})
|
|
121
|
+
)
|
|
122
|
+
}
|
|
123
|
+
|
|
25
124
|
export interface SwiftObjCImplementationPreparation {
|
|
26
125
|
receipt: string
|
|
27
126
|
objects: { target: string; source: string; file: string }[]
|
package/src/target-matcher.ts
CHANGED
|
@@ -43,7 +43,12 @@ export function filterTargetNodes<
|
|
|
43
43
|
)
|
|
44
44
|
return false
|
|
45
45
|
if (!regex) return matcher.type !== 'text' || node.text === matcher.value
|
|
46
|
-
|
|
46
|
+
// detox iOS compares its first regex match's range with the entire value.
|
|
47
|
+
const matches = (value: unknown) => {
|
|
48
|
+
if (typeof value !== 'string') return false
|
|
49
|
+
const match = regex.exec(value)
|
|
50
|
+
return match !== null && match.index === 0 && match[0].length === value.length
|
|
51
|
+
}
|
|
47
52
|
if (matcher.type === 'id') return matches(node.testID) || matches(node.id)
|
|
48
53
|
if (matcher.type === 'text') return matches(node.text)
|
|
49
54
|
return matches(node.accessibilityLabel || (node.accessible ? node.text : null))
|
package/src/vite-plugin.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import crypto from 'crypto'
|
|
1
2
|
// peach vite plugin — use in any vite project to get react-native resolution,
|
|
2
3
|
// native dep stubbing, and external app support.
|
|
3
4
|
//
|
|
@@ -7,8 +8,6 @@
|
|
|
7
8
|
//
|
|
8
9
|
// // with external app:
|
|
9
10
|
// export default defineConfig({ plugins: [sootsim({ app: '~/my-rn-app' })] })
|
|
10
|
-
|
|
11
|
-
import crypto from 'crypto'
|
|
12
11
|
import fs from 'fs'
|
|
13
12
|
import { createRequire } from 'module'
|
|
14
13
|
import { runInNewContext, Script } from 'node:vm'
|
|
@@ -19,6 +18,12 @@ import { minifySync, transformSync } from 'rolldown/utils'
|
|
|
19
18
|
import { type Plugin, transformWithOxc } from 'vite'
|
|
20
19
|
import { resolveOneNativeBackend } from '../../contrast-bundler/src/oneFramework.ts'
|
|
21
20
|
import { transformFlowSource } from '../../peach-compat/src/flow-strip.ts'
|
|
21
|
+
import { getCliRuntime } from './cli-runtime.ts'
|
|
22
|
+
import {
|
|
23
|
+
isEngineReactImporter,
|
|
24
|
+
isWorkerReactBridgeImporter,
|
|
25
|
+
keepsRealReact,
|
|
26
|
+
} from './react-bridge-importers.ts'
|
|
22
27
|
import { renderWorkerSystemChunk } from './worker-system-chunks.ts'
|
|
23
28
|
|
|
24
29
|
declare module '@babel/core' {
|
|
@@ -41,12 +46,6 @@ import {
|
|
|
41
46
|
compatStubsForBuildResolver,
|
|
42
47
|
reactNativeDeepStubsForBuildResolver,
|
|
43
48
|
} from '../../peach-compat/src/stub-manifest.ts'
|
|
44
|
-
import { WEBVIEW_SAME_ORIGIN_BOOTSTRAP_SOURCE } from '../../peach-engine/src/components/native-ui/webview-frame-bridge.ts'
|
|
45
|
-
import {
|
|
46
|
-
isExpoHostSocketModule,
|
|
47
|
-
isReactNativeEnvironmentSetupModule,
|
|
48
|
-
} from '../../peach-engine/src/guest-module-overrides.ts'
|
|
49
|
-
import { readPeachWarmManifest } from '../../peach-engine/src/peach-warm-manifest.ts'
|
|
50
49
|
import {
|
|
51
50
|
assertPeachPortEnvironment,
|
|
52
51
|
resolveSootsimBridgePort,
|
|
@@ -420,9 +419,9 @@ export function sootsim(options: SootSimOptions = {}): Plugin[] {
|
|
|
420
419
|
function hostEnvironmentBootstrapRedirect(): Plugin {
|
|
421
420
|
const target = '\0peach:host-environment-bootstrap'
|
|
422
421
|
const isHostBootstrap = (id: string) =>
|
|
423
|
-
isExpoHostSocketModule(id) ||
|
|
422
|
+
getCliRuntime().guest_module_overrides.isExpoHostSocketModule(id) ||
|
|
424
423
|
((id.startsWith('react-native/') || id.includes('/react-native/')) &&
|
|
425
|
-
isReactNativeEnvironmentSetupModule(id))
|
|
424
|
+
getCliRuntime().guest_module_overrides.isReactNativeEnvironmentSetupModule(id))
|
|
426
425
|
return {
|
|
427
426
|
name: 'peach-host-environment-bootstrap',
|
|
428
427
|
enforce: 'pre',
|
|
@@ -546,7 +545,7 @@ function warmManifestJsonPlugin(): Plugin {
|
|
|
546
545
|
const filename = id.slice(marker.length, -3)
|
|
547
546
|
this.addWatchFile(filename)
|
|
548
547
|
const value: unknown = JSON.parse(fs.readFileSync(filename, 'utf8'))
|
|
549
|
-
const manifest = readPeachWarmManifest(value)
|
|
548
|
+
const manifest = getCliRuntime().peach_warm_manifest.readPeachWarmManifest(value)
|
|
550
549
|
const entries = [
|
|
551
550
|
manifest.home,
|
|
552
551
|
...Object.values(manifest.launches),
|
|
@@ -1805,21 +1804,11 @@ function reactBridgePlugin(): Plugin {
|
|
|
1805
1804
|
if ((options as { scan?: boolean })?.scan || options?.ssr) return null
|
|
1806
1805
|
|
|
1807
1806
|
// only redirect imports from peachsim, peach-engine, peach-compat, and react-reconciler
|
|
1808
|
-
const shouldRedirect =
|
|
1809
|
-
importer.includes('/peachsim/src/') ||
|
|
1810
|
-
importer.includes('/peach-engine/src/') ||
|
|
1811
|
-
importer.includes('/peach-compat/src/') ||
|
|
1812
|
-
importer.includes('/peach-compat/dist-pressability/') ||
|
|
1813
|
-
importer.includes('/peach-kit/src/') ||
|
|
1814
|
-
importer.includes('react-reconciler')
|
|
1807
|
+
const shouldRedirect = isEngineReactImporter(importer)
|
|
1815
1808
|
|
|
1816
1809
|
if (!shouldRedirect) return null
|
|
1817
1810
|
|
|
1818
|
-
|
|
1819
|
-
if (importer.includes('react-bridge')) return null
|
|
1820
|
-
|
|
1821
|
-
// stub-registry needs the real React (with __CLIENT_INTERNALS) for bundle stubs
|
|
1822
|
-
if (importer.includes('stub-registry')) return null
|
|
1811
|
+
if (keepsRealReact(importer)) return null
|
|
1823
1812
|
|
|
1824
1813
|
redirectCount++
|
|
1825
1814
|
if (redirectCount <= 10) {
|
|
@@ -1851,28 +1840,13 @@ export function workerReactBridgePlugin(): Plugin {
|
|
|
1851
1840
|
// skip during dep scanning / SSR
|
|
1852
1841
|
if ((options as { scan?: boolean })?.scan || options?.ssr) return null
|
|
1853
1842
|
|
|
1854
|
-
// don't redirect react-bridge's own import of react (avoid infinite loop)
|
|
1855
|
-
if (importer.includes('react-bridge')) return null
|
|
1856
|
-
|
|
1857
|
-
// stub-registry needs the real React (with __CLIENT_INTERNALS) for bundle stubs
|
|
1858
|
-
if (importer.includes('stub-registry')) return null
|
|
1859
|
-
|
|
1860
1843
|
// redirect react imports from peachsim, peach-engine, peach-compat, react-reconciler,
|
|
1861
1844
|
// and any pure-JS RN-ecosystem package the bundle pulls in. without this
|
|
1862
1845
|
// redirect, packages like react-native-drawer-layout / use-latest-callback
|
|
1863
1846
|
// call into a separate React instance than the renderer/bridge does, so
|
|
1864
1847
|
// their useRef/useEffect refs collide with the engine's hooks state and
|
|
1865
1848
|
// we hit "Maximum update depth exceeded" infinite-loop renders.
|
|
1866
|
-
|
|
1867
|
-
importer.includes('/peachsim/src/') ||
|
|
1868
|
-
importer.includes('/peach-engine/src/') ||
|
|
1869
|
-
importer.includes('/peach-compat/src/') ||
|
|
1870
|
-
importer.includes('/peach-compat/dist-pressability/') ||
|
|
1871
|
-
importer.includes('/peach-kit/src/') ||
|
|
1872
|
-
importer.includes('react-reconciler') ||
|
|
1873
|
-
importer.includes('/node_modules/')
|
|
1874
|
-
|
|
1875
|
-
if (!shouldRedirect) return null
|
|
1849
|
+
if (!isWorkerReactBridgeImporter(importer)) return null
|
|
1876
1850
|
|
|
1877
1851
|
return { id: reactBridgePath, external: false }
|
|
1878
1852
|
},
|
|
@@ -2719,7 +2693,7 @@ export function expoDomComponentsPlugin(
|
|
|
2719
2693
|
window.process.env = window.process.env || {};
|
|
2720
2694
|
window.process.env.NODE_ENV = window.process.env.NODE_ENV || 'development';
|
|
2721
2695
|
window.process.env.EXPO_OS = 'web';
|
|
2722
|
-
${WEBVIEW_SAME_ORIGIN_BOOTSTRAP_SOURCE}
|
|
2696
|
+
${getCliRuntime().components_native_ui_webview_frame_bridge.WEBVIEW_SAME_ORIGIN_BOOTSTRAP_SOURCE}
|
|
2723
2697
|
(function () {
|
|
2724
2698
|
// metro-style require shim for expo's dom closure: classic scripts
|
|
2725
2699
|
// run before module imports evaluate, so this covers eval-time
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import fs from 'node:fs'
|
|
2
2
|
import { createRequire } from 'node:module'
|
|
3
3
|
import { Worker } from 'node:worker_threads'
|
|
4
|
-
import { PAGE_DELIVERED_CHUNKS_NAME_SUFFIX } from '../../peach-engine/src/render-worker/boot-worker-kickoff.ts'
|
|
5
4
|
import { isRecord } from './is-record'
|
|
5
|
+
import { PAGE_DELIVERED_CHUNKS_NAME_SUFFIX } from './workerChunkContract.ts'
|
|
6
6
|
|
|
7
7
|
const require = createRequire(import.meta.url)
|
|
8
8
|
const systemRuntime = fs.readFileSync(require.resolve('systemjs/dist/s.min.js'), 'utf8')
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// the kickoff ends the name of each worker it starts with this suffix. that
|
|
2
|
+
// worker's loader then links each Home chunk from the body the kickoff posts
|
|
3
|
+
// (`peach-chunk-list`, then one `peach-chunk-body` per url) instead of
|
|
4
|
+
// downloading it again (worker-system-chunks.ts).
|
|
5
|
+
export const PAGE_DELIVERED_CHUNKS_NAME_SUFFIX = ':page-chunks'
|