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
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
// the prebuilt Nitro adapter archive's shapes and identity rules, shared by its
|
|
2
|
+
// builder (packages/sootsim-swift/scripts/build-nitro-adapter-archive.ts), its
|
|
3
|
+
// publisher (scripts/ops/nitro-adapter-publish.ts) and the installed CLI that
|
|
4
|
+
// downloads and verifies it. nothing here reads adapter sources: an installed
|
|
5
|
+
// CLI carries this file and checks an archive against the lock it was built with.
|
|
6
|
+
import { createHash } from 'node:crypto'
|
|
7
|
+
import { readdirSync, readFileSync } from 'node:fs'
|
|
8
|
+
import path from 'node:path'
|
|
9
|
+
import { isRecord } from './is-record'
|
|
10
|
+
|
|
11
|
+
/** the file at the root of an unpacked adapter, and its install marker. */
|
|
12
|
+
export const NITRO_ADAPTER_MANIFEST = 'manifest.json'
|
|
13
|
+
export const NITRO_ADAPTER_ARCHIVE = 'libPeachNitroAdapter.a'
|
|
14
|
+
|
|
15
|
+
// header staging the collector exposes: JSI without the dynamic and test
|
|
16
|
+
// pieces, and Nitro's cpp tree without views, copied to bare and nested names.
|
|
17
|
+
export const HEADER_STAGE = {
|
|
18
|
+
jsi: {
|
|
19
|
+
from: 'ReactCommon/jsi/jsi',
|
|
20
|
+
skip: ['test'],
|
|
21
|
+
keep: '\\.h$',
|
|
22
|
+
exclude: 'JSIDynamic.h',
|
|
23
|
+
to: 'jsi',
|
|
24
|
+
},
|
|
25
|
+
nitro: {
|
|
26
|
+
from: 'cpp',
|
|
27
|
+
skip: ['views'],
|
|
28
|
+
keep: '\\.(?:h|hpp|hxx|inl)$',
|
|
29
|
+
to: ['core', 'core/NitroModules'],
|
|
30
|
+
},
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface NitroAdapterRoots {
|
|
34
|
+
nitroModules: string
|
|
35
|
+
reactNative: string
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** what the installed CLI needs to trust an archive; no private provenance. */
|
|
39
|
+
export interface NitroAdapterManifest {
|
|
40
|
+
schema: 1
|
|
41
|
+
/** the guest platform the producer built for; every consumer matches it against the lock or its own recomputed identity. */
|
|
42
|
+
platform: string
|
|
43
|
+
target: string
|
|
44
|
+
recipe: string
|
|
45
|
+
adapter: { sha256: string }
|
|
46
|
+
headers: { reactNativeJsi: string; nitroModules: string }
|
|
47
|
+
compiler: string
|
|
48
|
+
sdk: { id: string; checksum: string }
|
|
49
|
+
framework: { distribution: string; wireAbi: string }
|
|
50
|
+
archive: { path: string; size: number; sha256: string }
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** the published tarball one CLI build installs, committed beside swift-distribution.lock.json. */
|
|
54
|
+
export interface NitroAdapterLock extends Omit<NitroAdapterManifest, 'archive'> {
|
|
55
|
+
/** the downloaded .tar.gz, which installVerifiedTarball checks. */
|
|
56
|
+
archive: { sha256: string; size: number }
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export const sha256Hex = (data: Uint8Array | string) =>
|
|
60
|
+
createHash('sha256').update(data).digest('hex')
|
|
61
|
+
|
|
62
|
+
export function digest(entries: Record<string, string>) {
|
|
63
|
+
const hash = createHash('sha256')
|
|
64
|
+
for (const key of Object.keys(entries).sort()) hash.update(`${key}\0${entries[key]}\n`)
|
|
65
|
+
return hash.digest('hex')
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function headerFiles(base: string, directory: string, skip: string[], keep: RegExp) {
|
|
69
|
+
const files: string[] = []
|
|
70
|
+
const walk = (relative: string) => {
|
|
71
|
+
for (const entry of readdirSync(path.join(base, relative), { withFileTypes: true })) {
|
|
72
|
+
if (entry.name.startsWith('.') || skip.includes(entry.name)) continue
|
|
73
|
+
const next = path.posix.join(relative, entry.name)
|
|
74
|
+
if (entry.isDirectory()) walk(next)
|
|
75
|
+
else if (keep.test(entry.name)) files.push(next)
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
walk(directory)
|
|
79
|
+
return files.sort()
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/** the original header closures the collector exposes, with per-file hashes. */
|
|
83
|
+
export function headerClosure(roots: NitroAdapterRoots) {
|
|
84
|
+
const { jsi: j, nitro: n } = HEADER_STAGE
|
|
85
|
+
const jsiFiles = headerFiles(
|
|
86
|
+
roots.reactNative,
|
|
87
|
+
j.from,
|
|
88
|
+
j.skip,
|
|
89
|
+
new RegExp(j.keep),
|
|
90
|
+
).filter((file) => !file.endsWith(`/${j.exclude}`))
|
|
91
|
+
const nitroFiles = headerFiles(roots.nitroModules, n.from, n.skip, new RegExp(n.keep))
|
|
92
|
+
const hashes = (base: string, files: string[]) =>
|
|
93
|
+
Object.fromEntries(
|
|
94
|
+
files.map((file) => [file, sha256Hex(readFileSync(path.join(base, file)))]),
|
|
95
|
+
)
|
|
96
|
+
return {
|
|
97
|
+
jsi: hashes(roots.reactNative, jsiFiles),
|
|
98
|
+
nitro: hashes(roots.nitroModules, nitroFiles),
|
|
99
|
+
nitroFiles,
|
|
100
|
+
jsiFiles,
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/** the digests an app's original React Native and Nitro headers must match. */
|
|
105
|
+
export function headerDigests(roots: NitroAdapterRoots) {
|
|
106
|
+
const closure = headerClosure(roots)
|
|
107
|
+
return { reactNativeJsi: digest(closure.jsi), nitroModules: digest(closure.nitro) }
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const hex64 = (value: unknown): value is string =>
|
|
111
|
+
typeof value === 'string' && /^[a-f0-9]{64}$/.test(value)
|
|
112
|
+
|
|
113
|
+
function text(value: unknown, what: string): string {
|
|
114
|
+
if (typeof value !== 'string' || !value)
|
|
115
|
+
throw new Error(`invalid Nitro adapter ${what}`)
|
|
116
|
+
return value
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function digestField(value: unknown, what: string): string {
|
|
120
|
+
if (!hex64(value)) throw new Error(`invalid Nitro adapter ${what}`)
|
|
121
|
+
return value
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function identity(value: unknown) {
|
|
125
|
+
if (!isRecord(value) || value.schema !== 1)
|
|
126
|
+
throw new Error('invalid Nitro adapter manifest')
|
|
127
|
+
const { adapter, headers, sdk, framework } = value
|
|
128
|
+
if (!isRecord(adapter) || !isRecord(headers) || !isRecord(sdk) || !isRecord(framework))
|
|
129
|
+
throw new Error('invalid Nitro adapter manifest')
|
|
130
|
+
return {
|
|
131
|
+
schema: 1 as const,
|
|
132
|
+
platform: text(value.platform, 'platform'),
|
|
133
|
+
target: text(value.target, 'target'),
|
|
134
|
+
recipe: digestField(value.recipe, 'recipe'),
|
|
135
|
+
adapter: { sha256: digestField(adapter.sha256, 'adapter digest') },
|
|
136
|
+
headers: {
|
|
137
|
+
reactNativeJsi: digestField(headers.reactNativeJsi, 'JSI header digest'),
|
|
138
|
+
nitroModules: digestField(headers.nitroModules, 'Nitro header digest'),
|
|
139
|
+
},
|
|
140
|
+
compiler: text(value.compiler, 'compiler'),
|
|
141
|
+
sdk: {
|
|
142
|
+
id: text(sdk.id, 'sdk id'),
|
|
143
|
+
checksum: digestField(sdk.checksum, 'sdk checksum'),
|
|
144
|
+
},
|
|
145
|
+
framework: {
|
|
146
|
+
distribution: text(framework.distribution, 'distribution'),
|
|
147
|
+
wireAbi: digestField(framework.wireAbi, 'wire abi'),
|
|
148
|
+
},
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/** keeps only the public fields, so a producer's private provenance never
|
|
153
|
+
* reaches a packed manifest. */
|
|
154
|
+
export function parseNitroAdapterManifest(value: unknown): NitroAdapterManifest {
|
|
155
|
+
const archive = isRecord(value) ? value.archive : undefined
|
|
156
|
+
if (
|
|
157
|
+
!isRecord(archive) ||
|
|
158
|
+
typeof archive.path !== 'string' ||
|
|
159
|
+
archive.path !== NITRO_ADAPTER_ARCHIVE ||
|
|
160
|
+
typeof archive.size !== 'number'
|
|
161
|
+
)
|
|
162
|
+
throw new Error('invalid Nitro adapter archive record')
|
|
163
|
+
return {
|
|
164
|
+
...identity(value),
|
|
165
|
+
archive: {
|
|
166
|
+
path: archive.path,
|
|
167
|
+
size: archive.size,
|
|
168
|
+
sha256: digestField(archive.sha256, 'archive digest'),
|
|
169
|
+
},
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
export function parseNitroAdapterLock(value: unknown): NitroAdapterLock {
|
|
174
|
+
const archive = isRecord(value) ? value.archive : undefined
|
|
175
|
+
if (!isRecord(archive) || typeof archive.size !== 'number')
|
|
176
|
+
throw new Error('invalid Nitro adapter lock archive')
|
|
177
|
+
return {
|
|
178
|
+
...identity(value),
|
|
179
|
+
archive: {
|
|
180
|
+
sha256: digestField(archive.sha256, 'lock archive digest'),
|
|
181
|
+
size: archive.size,
|
|
182
|
+
},
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/** the lock one published manifest and its tarball produce. */
|
|
187
|
+
export function nitroAdapterLock(
|
|
188
|
+
manifest: NitroAdapterManifest,
|
|
189
|
+
tarball: { sha256: string; size: number },
|
|
190
|
+
): NitroAdapterLock {
|
|
191
|
+
const { archive: _library, ...rest } = manifest
|
|
192
|
+
return { ...rest, archive: tarball }
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/** the tarball's path under PEACH_SWIFT_ENDPOINT: content addressed, so immutable. */
|
|
196
|
+
export function nitroAdapterArchiveKey(lock: NitroAdapterLock): string {
|
|
197
|
+
return `nitro-adapter/${lock.archive.sha256}.tar.gz`
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/** throws unless an unpacked adapter is the one the lock pins and its library
|
|
201
|
+
* bytes are the ones its manifest records. needs no adapter source. */
|
|
202
|
+
export function verifyInstalledNitroAdapter(
|
|
203
|
+
directory: string,
|
|
204
|
+
lock: NitroAdapterLock,
|
|
205
|
+
): NitroAdapterManifest {
|
|
206
|
+
const manifest = parseNitroAdapterManifest(
|
|
207
|
+
JSON.parse(readFileSync(path.join(directory, NITRO_ADAPTER_MANIFEST), 'utf8')),
|
|
208
|
+
)
|
|
209
|
+
const { archive, ...recorded } = manifest
|
|
210
|
+
const { archive: _tarball, ...pinned } = lock
|
|
211
|
+
if (JSON.stringify(recorded) !== JSON.stringify(pinned))
|
|
212
|
+
throw new Error('Nitro adapter manifest does not match the lock this build carries')
|
|
213
|
+
const bytes = readFileSync(path.join(directory, archive.path))
|
|
214
|
+
if (bytes.length !== archive.size || sha256Hex(bytes) !== archive.sha256)
|
|
215
|
+
throw new Error('Nitro adapter library does not match its manifest')
|
|
216
|
+
return manifest
|
|
217
|
+
}
|
package/src/nitroContract.ts
CHANGED
|
@@ -3,33 +3,46 @@ import {
|
|
|
3
3
|
readBundleMetadataFooter,
|
|
4
4
|
} from './bundleGlobalFooter'
|
|
5
5
|
|
|
6
|
+
/** the guest platform every Nitro compile targets. */
|
|
7
|
+
export const NITRO_GUEST_PLATFORM = 'ios'
|
|
8
|
+
|
|
6
9
|
export interface NitroCompiledModule {
|
|
7
|
-
platform:
|
|
8
|
-
|
|
9
|
-
|
|
10
|
+
platform: typeof NITRO_GUEST_PLATFORM
|
|
11
|
+
/** the original providers this one executable registers, by package name. */
|
|
12
|
+
packages: { name: string; version: string }[]
|
|
10
13
|
url: string
|
|
11
14
|
hash: string
|
|
12
15
|
icuUrl: string
|
|
13
16
|
}
|
|
14
17
|
|
|
18
|
+
function readNitroPackage(
|
|
19
|
+
value: unknown,
|
|
20
|
+
): NitroCompiledModule['packages'][number] | null {
|
|
21
|
+
if (typeof value !== 'object' || value === null) return null
|
|
22
|
+
const name = Reflect.get(value, 'name')
|
|
23
|
+
const version = Reflect.get(value, 'version')
|
|
24
|
+
return typeof name === 'string' && name && typeof version === 'string' && version
|
|
25
|
+
? { name, version }
|
|
26
|
+
: null
|
|
27
|
+
}
|
|
28
|
+
|
|
15
29
|
export function readNitroMetadata(value: unknown): NitroCompiledModule | null {
|
|
16
30
|
if (value === null || value === undefined) return null
|
|
17
31
|
if (
|
|
18
32
|
typeof value !== 'object' ||
|
|
19
33
|
Array.isArray(value) ||
|
|
20
|
-
Reflect.get(value, 'platform') !==
|
|
34
|
+
Reflect.get(value, 'platform') !== NITRO_GUEST_PLATFORM
|
|
21
35
|
)
|
|
22
36
|
throw new Error('invalid Nitro compilation metadata')
|
|
23
|
-
const
|
|
24
|
-
const
|
|
37
|
+
const listed = Reflect.get(value, 'packages')
|
|
38
|
+
const packages = Array.isArray(listed) ? listed.map(readNitroPackage) : []
|
|
25
39
|
const url = Reflect.get(value, 'url')
|
|
26
40
|
const hash = Reflect.get(value, 'hash')
|
|
27
41
|
const icuUrl = Reflect.get(value, 'icuUrl')
|
|
28
42
|
if (
|
|
29
|
-
|
|
30
|
-
!
|
|
31
|
-
|
|
32
|
-
!packageVersion ||
|
|
43
|
+
packages.length === 0 ||
|
|
44
|
+
!packages.every((entry) => entry !== null) ||
|
|
45
|
+
new Set(packages.map(({ name }) => name)).size !== packages.length ||
|
|
33
46
|
typeof url !== 'string' ||
|
|
34
47
|
!url ||
|
|
35
48
|
typeof hash !== 'string' ||
|
|
@@ -38,7 +51,7 @@ export function readNitroMetadata(value: unknown): NitroCompiledModule | null {
|
|
|
38
51
|
!icuUrl
|
|
39
52
|
)
|
|
40
53
|
throw new Error('invalid Nitro compilation metadata')
|
|
41
|
-
return { platform: 'ios',
|
|
54
|
+
return { platform: 'ios', packages, url, hash, icuUrl }
|
|
42
55
|
}
|
|
43
56
|
|
|
44
57
|
export function readNitroFooter(source: string): NitroCompiledModule | null {
|
package/src/process-group.ts
CHANGED
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
} from 'node:fs'
|
|
10
10
|
import { tmpdir } from 'node:os'
|
|
11
11
|
import { join } from 'node:path'
|
|
12
|
+
import { Duplex } from 'node:stream'
|
|
12
13
|
import { setTimeout as sleep } from 'node:timers/promises'
|
|
13
14
|
|
|
14
15
|
const GRACEFUL_TIMEOUT_MS = 3_000
|
|
@@ -90,6 +91,7 @@ async function protectProcessFreeze(rootPid: number) {
|
|
|
90
91
|
[
|
|
91
92
|
'-c',
|
|
92
93
|
`
|
|
94
|
+
(
|
|
93
95
|
journal=$1
|
|
94
96
|
cleanup() {
|
|
95
97
|
trap '' HUP INT TERM
|
|
@@ -106,26 +108,53 @@ async function protectProcessFreeze(rootPid: number) {
|
|
|
106
108
|
trap 'cleanup; exit 0' HUP INT TERM
|
|
107
109
|
trap 'rm -f "$journal"; rmdir "\${journal%/*}"' EXIT
|
|
108
110
|
printf 'ready\n'
|
|
109
|
-
if ! IFS= read -r command || [ "$command" != disarm ]; then cleanup; fi
|
|
111
|
+
if ! IFS= read -r command <&3 || [ "$command" != disarm ]; then cleanup; fi
|
|
112
|
+
) &
|
|
110
113
|
`,
|
|
111
114
|
FREEZE_GUARD_NAME,
|
|
112
115
|
journal,
|
|
113
116
|
],
|
|
114
117
|
{
|
|
115
118
|
detached: true,
|
|
116
|
-
|
|
119
|
+
// the launcher exits before capture, reparenting the guard outside any
|
|
120
|
+
// nested target tree. fd 3 survives that exit, unlike child.stdin.
|
|
121
|
+
stdio: ['ignore', 'pipe', 'ignore', 'pipe'],
|
|
117
122
|
},
|
|
118
123
|
)
|
|
124
|
+
let guardClosed = false
|
|
119
125
|
const closed = new Promise<void>((resolveClose) =>
|
|
120
|
-
guard.once('close', () =>
|
|
126
|
+
guard.once('close', () => {
|
|
127
|
+
guardClosed = true
|
|
128
|
+
resolveClose()
|
|
129
|
+
}),
|
|
121
130
|
)
|
|
122
|
-
|
|
131
|
+
const control = guard.stdio[3]
|
|
132
|
+
const output = guard.stdout
|
|
133
|
+
if (!(control instanceof Duplex) || !output) {
|
|
134
|
+
guard.kill()
|
|
135
|
+
await closed
|
|
136
|
+
rmSync(directory, { recursive: true, force: true })
|
|
137
|
+
throw new Error('process freeze guard control pipe is unavailable')
|
|
138
|
+
}
|
|
139
|
+
control.on('error', () => {})
|
|
123
140
|
try {
|
|
124
141
|
await new Promise<void>((resolveReady, reject) => {
|
|
125
|
-
let
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
if (
|
|
142
|
+
let readyOutput = ''
|
|
143
|
+
let launcherExited = false
|
|
144
|
+
const ready = () => {
|
|
145
|
+
if (launcherExited && readyOutput.includes('ready\n')) resolveReady()
|
|
146
|
+
}
|
|
147
|
+
output.on('data', (bytes: Buffer) => {
|
|
148
|
+
readyOutput += bytes.toString()
|
|
149
|
+
ready()
|
|
150
|
+
})
|
|
151
|
+
guard.once('exit', (code, signal) => {
|
|
152
|
+
if (code !== 0 || signal !== null) {
|
|
153
|
+
reject(new Error('process freeze guard launcher failed'))
|
|
154
|
+
return
|
|
155
|
+
}
|
|
156
|
+
launcherExited = true
|
|
157
|
+
ready()
|
|
129
158
|
})
|
|
130
159
|
guard.once('error', reject)
|
|
131
160
|
guard.once('close', () =>
|
|
@@ -133,47 +162,25 @@ async function protectProcessFreeze(rootPid: number) {
|
|
|
133
162
|
)
|
|
134
163
|
})
|
|
135
164
|
} catch (error) {
|
|
136
|
-
|
|
165
|
+
control.destroy()
|
|
137
166
|
await closed
|
|
138
167
|
rmSync(directory, { recursive: true, force: true })
|
|
139
168
|
throw error
|
|
140
169
|
}
|
|
141
170
|
return {
|
|
142
171
|
record(pid: number) {
|
|
143
|
-
if (
|
|
172
|
+
if (guardClosed || control.destroyed)
|
|
144
173
|
throw new Error('process freeze guard exited during capture')
|
|
145
174
|
appendFileSync(journal, `pid ${pid}\n`)
|
|
146
175
|
},
|
|
147
176
|
async release(disarm: boolean) {
|
|
148
|
-
|
|
177
|
+
control.end(disarm ? 'disarm\n' : undefined)
|
|
149
178
|
await closed
|
|
150
179
|
rmSync(directory, { recursive: true, force: true })
|
|
151
180
|
},
|
|
152
181
|
}
|
|
153
182
|
}
|
|
154
183
|
|
|
155
|
-
// a nested capture's guard is a descendant of this tree but must keep running
|
|
156
|
-
// to resume its own targets, so a freeze never reaches it. ps exits 1 when
|
|
157
|
-
// some pids already vanished, so only a spawn failure or timeout is an error.
|
|
158
|
-
function withoutFreezeGuards(pids: number[]): number[] {
|
|
159
|
-
if (pids.length === 0) return pids
|
|
160
|
-
const result = spawnSync('ps', ['-o', 'pid=,command=', '-p', pids.join(',')], {
|
|
161
|
-
encoding: 'utf8',
|
|
162
|
-
stdio: ['ignore', 'pipe', 'pipe'],
|
|
163
|
-
timeout: FORCED_EXIT_TIMEOUT_MS,
|
|
164
|
-
killSignal: 'SIGKILL',
|
|
165
|
-
})
|
|
166
|
-
if (result.error || (result.status !== 0 && result.status !== 1))
|
|
167
|
-
throw new Error(result.error?.message || `ps exited ${result.status}`)
|
|
168
|
-
const guards = new Set(
|
|
169
|
-
result.stdout
|
|
170
|
-
.split('\n')
|
|
171
|
-
.filter((line) => line.includes(FREEZE_GUARD_NAME))
|
|
172
|
-
.map((line) => Number(line.trim().split(/\s+/)[0])),
|
|
173
|
-
)
|
|
174
|
-
return pids.filter((pid) => !guards.has(pid))
|
|
175
|
-
}
|
|
176
|
-
|
|
177
184
|
// reparented members remain in the group; detached descendants need their
|
|
178
185
|
// recorded pids. both can leave zombies, which signal zero cannot distinguish
|
|
179
186
|
// from running processes. inspect their states together before confirming exit.
|
|
@@ -266,7 +273,7 @@ export async function terminateProcessGroup(
|
|
|
266
273
|
}
|
|
267
274
|
let children: number[]
|
|
268
275
|
try {
|
|
269
|
-
children =
|
|
276
|
+
children = listProcessChildren(parents, remaining)
|
|
270
277
|
} catch (error) {
|
|
271
278
|
inspectionError = new Error(`could not inspect descendants: ${String(error)}`)
|
|
272
279
|
break
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// which importers of `react` are routed through the peach-kit react bridge.
|
|
2
|
+
// shared by the vite plugins and the esbuild browser artifacts.
|
|
3
|
+
|
|
4
|
+
// the engine, compat, kit and reconciler sources the renderer shares a React with
|
|
5
|
+
export function isEngineReactImporter(importer: string): boolean {
|
|
6
|
+
return (
|
|
7
|
+
importer.includes('/peachsim/src/') ||
|
|
8
|
+
importer.includes('/peach-engine/src/') ||
|
|
9
|
+
importer.includes('/peach-compat/src/') ||
|
|
10
|
+
importer.includes('/peach-compat/dist-pressability/') ||
|
|
11
|
+
importer.includes('/peach-kit/src/') ||
|
|
12
|
+
importer.includes('react-reconciler')
|
|
13
|
+
)
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// the bridge's own import of react would loop, and the stub registry needs the
|
|
17
|
+
// real React (with __CLIENT_INTERNALS) for bundle stubs. these match the files,
|
|
18
|
+
// not any path containing the name, so a checkout directory cannot trip them.
|
|
19
|
+
export function keepsRealReact(importer: string): boolean {
|
|
20
|
+
return /\/(react-bridge|stub-registry)\.[cm]?[jt]sx?$/.test(importer)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// workers are built, so any pure-JS RN-ecosystem package in node_modules is
|
|
24
|
+
// bridged too. the bridge and the stub registry keep the real React.
|
|
25
|
+
export function isWorkerReactBridgeImporter(importer: string): boolean {
|
|
26
|
+
if (keepsRealReact(importer)) return false
|
|
27
|
+
return isEngineReactImporter(importer) || importer.includes('/node_modules/')
|
|
28
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { SettingsValues } from './settingsContract.ts'
|
|
2
|
+
|
|
3
|
+
// render workers mirror only these host-owned values. importing the settings
|
|
4
|
+
// store here would also boot device selection, persistence and the ui schema.
|
|
5
|
+
export const DEFAULT_REACT_NATIVE_CONFIGURATION = {
|
|
6
|
+
// the appearance setting itself (automatic, light or dark); the resolved
|
|
7
|
+
// scheme reaches workers through Appearance
|
|
8
|
+
colorScheme: 'auto',
|
|
9
|
+
language: 'en',
|
|
10
|
+
region: 'US',
|
|
11
|
+
fontSize: 1,
|
|
12
|
+
boldText: false,
|
|
13
|
+
reduceMotion: false,
|
|
14
|
+
largerAccessibilitySizes: false,
|
|
15
|
+
glassTintAmount: 0.5,
|
|
16
|
+
reduceTransparency: false,
|
|
17
|
+
increaseContrast: false,
|
|
18
|
+
showBorders: false,
|
|
19
|
+
onOffLabels: false,
|
|
20
|
+
differentiateWithoutColor: false,
|
|
21
|
+
smartInvert: false,
|
|
22
|
+
preferCrossFadeTransitions: false,
|
|
23
|
+
} satisfies Partial<SettingsValues>
|
|
24
|
+
|
|
25
|
+
export type ReactNativeConfigurationKey = keyof typeof DEFAULT_REACT_NATIVE_CONFIGURATION
|
|
26
|
+
|
|
27
|
+
export type ReactNativeConfigurationSnapshot = Pick<
|
|
28
|
+
SettingsValues,
|
|
29
|
+
ReactNativeConfigurationKey
|
|
30
|
+
>
|
|
31
|
+
|
|
32
|
+
export const REACT_NATIVE_CONFIGURATION_KEYS = Object.keys(
|
|
33
|
+
DEFAULT_REACT_NATIVE_CONFIGURATION,
|
|
34
|
+
).filter(
|
|
35
|
+
(key): key is ReactNativeConfigurationKey => key in DEFAULT_REACT_NATIVE_CONFIGURATION,
|
|
36
|
+
)
|
package/src/runtime-assets.ts
CHANGED
|
@@ -54,7 +54,7 @@ export function findMonorepoRoot(): string | null {
|
|
|
54
54
|
/** the fresh dev-stack engine build to serve when running inside the Contrast
|
|
55
55
|
* monorepo dev checkout, or null when the installed runtime should serve
|
|
56
56
|
* (published CLI, packaged electron, or an isolated PEACH_HOME). */
|
|
57
|
-
export function
|
|
57
|
+
export function resolveDevCheckoutRuntimeAssetRoot(): string | null {
|
|
58
58
|
// an explicit home that has a STAGED/active runtime is the isolation the
|
|
59
59
|
// CI/local-publish path sets up to validate the installed-runtime code path —
|
|
60
60
|
// honor that staged runtime. an explicit home with NO active runtime is just
|
|
@@ -65,7 +65,12 @@ export function resolveDevCheckoutRuntimeRoot(): string | null {
|
|
|
65
65
|
if (process.env.PEACH_HOME && readActiveRuntime()) return null
|
|
66
66
|
const root = findMonorepoRoot()
|
|
67
67
|
if (!root) return null
|
|
68
|
-
|
|
68
|
+
return path.join(root, 'public/sootsim')
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export function resolveDevCheckoutRuntimeRoot(): string | null {
|
|
72
|
+
const devBuild = resolveDevCheckoutRuntimeAssetRoot()
|
|
73
|
+
if (!devBuild) return null
|
|
69
74
|
// require the runtime shape the installed runtime also has, so serving it is
|
|
70
75
|
// a drop-in (index.html shell + engine/ + both engine-tenant workers).
|
|
71
76
|
if (
|
package/src/runtime-delivery.ts
CHANGED
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
// out as a bare require.
|
|
12
12
|
|
|
13
13
|
import { createRuntimeDelivery, type RuntimeProduct } from '@contrast/runtime-delivery'
|
|
14
|
+
import { verifyCliCompanion } from './cli-runtime'
|
|
14
15
|
import {
|
|
15
16
|
cacheDir,
|
|
16
17
|
configFilePath,
|
|
@@ -37,6 +38,7 @@ export const RNX_RUNTIME_PRODUCT: RuntimeProduct = {
|
|
|
37
38
|
// engine-tenant/ beneath it. index.html is what the daemon and the
|
|
38
39
|
// vite/metro plugins serve, so its absence means the tarball is not one.
|
|
39
40
|
installedMarker: 'index.html',
|
|
41
|
+
verifyInstall: verifyCliCompanion,
|
|
40
42
|
env: {
|
|
41
43
|
cdnOrigin: 'PEACH_CDN_ORIGIN',
|
|
42
44
|
channel: 'PEACH_RUNTIME_CHANNEL',
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type { RuntimePlatform } from './device-catalog.ts'
|
|
2
|
+
|
|
3
|
+
export interface RuntimePlatformAdapterRegistry<Value> {
|
|
4
|
+
readonly ios: Value
|
|
5
|
+
readonly android: Value
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
interface IOSRuntimePlatformAdapter {
|
|
9
|
+
readonly id: 'ios'
|
|
10
|
+
readonly displayName: 'iOS'
|
|
11
|
+
readonly isIOS: true
|
|
12
|
+
readonly isAndroid: false
|
|
13
|
+
select<Value>(registry: RuntimePlatformAdapterRegistry<Value>): Value
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
interface AndroidRuntimePlatformAdapter {
|
|
17
|
+
readonly id: 'android'
|
|
18
|
+
readonly displayName: 'Android'
|
|
19
|
+
readonly isIOS: false
|
|
20
|
+
readonly isAndroid: true
|
|
21
|
+
select<Value>(registry: RuntimePlatformAdapterRegistry<Value>): Value
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export type RuntimePlatformAdapter =
|
|
25
|
+
| IOSRuntimePlatformAdapter
|
|
26
|
+
| AndroidRuntimePlatformAdapter
|
|
27
|
+
|
|
28
|
+
const IOS_ADAPTER = Object.freeze({
|
|
29
|
+
id: 'ios',
|
|
30
|
+
displayName: 'iOS',
|
|
31
|
+
isIOS: true,
|
|
32
|
+
isAndroid: false,
|
|
33
|
+
select: <Value>(registry: RuntimePlatformAdapterRegistry<Value>) => registry.ios,
|
|
34
|
+
} satisfies IOSRuntimePlatformAdapter)
|
|
35
|
+
|
|
36
|
+
const ANDROID_ADAPTER = Object.freeze({
|
|
37
|
+
id: 'android',
|
|
38
|
+
displayName: 'Android',
|
|
39
|
+
isIOS: false,
|
|
40
|
+
isAndroid: true,
|
|
41
|
+
select: <Value>(registry: RuntimePlatformAdapterRegistry<Value>) => registry.android,
|
|
42
|
+
} satisfies AndroidRuntimePlatformAdapter)
|
|
43
|
+
|
|
44
|
+
const RUNTIME_PLATFORM_ADAPTERS = Object.freeze({
|
|
45
|
+
ios: IOS_ADAPTER,
|
|
46
|
+
android: ANDROID_ADAPTER,
|
|
47
|
+
} satisfies Record<RuntimePlatform, RuntimePlatformAdapter>)
|
|
48
|
+
|
|
49
|
+
export function isRuntimePlatform(value: unknown): value is RuntimePlatform {
|
|
50
|
+
return value === 'ios' || value === 'android'
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export function parseRuntimePlatform(
|
|
54
|
+
value: unknown,
|
|
55
|
+
boundary = 'runtime platform',
|
|
56
|
+
): RuntimePlatform {
|
|
57
|
+
if (!isRuntimePlatform(value)) {
|
|
58
|
+
const received = typeof value === 'string' ? JSON.stringify(value) : String(value)
|
|
59
|
+
throw new Error(
|
|
60
|
+
`invalid ${boundary}: expected "ios" or "android", received ${received}`,
|
|
61
|
+
)
|
|
62
|
+
}
|
|
63
|
+
return value
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export function getRuntimePlatformAdapter<Platform extends RuntimePlatform>(
|
|
67
|
+
platform: Platform,
|
|
68
|
+
): (typeof RUNTIME_PLATFORM_ADAPTERS)[Platform] {
|
|
69
|
+
return RUNTIME_PLATFORM_ADAPTERS[platform]
|
|
70
|
+
}
|