peachsim 0.1.939 → 0.1.1399
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +28 -22
- package/cli/app-catalog.ts +29 -14
- package/cli/app-fonts.ts +5 -3
- package/cli/bridge-flow-runner.ts +40 -29
- package/cli/cloud-client.ts +57 -21
- package/cli/cloud-test-tunnel.ts +12 -18
- package/cli/commands/agent.ts +1 -1
- package/cli/commands/app-fonts.ts +3 -3
- package/cli/commands/assert.ts +8 -8
- package/cli/commands/auth.ts +8 -3
- package/cli/commands/box/bundle-plane.ts +13 -1
- package/cli/commands/box.ts +16 -5
- package/cli/commands/compat.ts +1 -1
- package/cli/commands/config.ts +2 -2
- package/cli/commands/control.ts +125 -71
- package/cli/commands/cpu-profile.ts +45 -1
- package/cli/commands/daemon.ts +131 -33
- package/cli/commands/debug.ts +24 -17
- package/cli/commands/desktop.ts +7 -1
- package/cli/commands/detect.ts +101 -0
- package/cli/commands/detox.ts +6 -6
- package/cli/commands/device.ts +12 -12
- package/cli/commands/electron.ts +32 -14
- package/cli/commands/flow.ts +49 -41
- package/cli/commands/guest-host.ts +39 -1
- package/cli/commands/inspect/core.ts +14 -8
- package/cli/commands/inspect/list.ts +1 -1
- package/cli/commands/inspect/settle.ts +5 -3
- package/cli/commands/inspect/settling.ts +229 -44
- package/cli/commands/inspect/wait-idle.ts +3 -2
- package/cli/commands/inspect.ts +105 -93
- package/cli/commands/install-cli.ts +36 -15
- package/cli/commands/install-desktop.ts +68 -195
- package/cli/commands/kotlin.ts +6 -5
- package/cli/commands/login.ts +5 -5
- package/cli/commands/maestro-compare.ts +554 -0
- package/cli/commands/maestro-generate.ts +6 -3
- package/cli/commands/maestro.ts +22 -0
- package/cli/commands/mode.ts +2 -2
- package/cli/commands/no-bridge-hint.ts +6 -2
- package/cli/commands/platform.ts +35 -6
- package/cli/commands/preview.ts +6 -0
- package/cli/commands/project-report.ts +10 -12
- package/cli/commands/record.ts +37 -37
- package/cli/commands/runtime.ts +9 -9
- package/cli/commands/screenshot-layers.ts +4 -4
- package/cli/commands/screenshot-mode.ts +2 -2
- package/cli/commands/screenshot.ts +8 -8
- package/cli/commands/screenshots-capture.ts +2 -2
- package/cli/commands/serve.ts +9 -12
- package/cli/commands/setup.ts +29 -14
- package/cli/commands/shell-boolean-mode.ts +2 -2
- package/cli/commands/show-touches-mode.ts +2 -2
- package/cli/commands/skills.ts +11 -11
- package/cli/commands/swift.ts +29 -11
- package/cli/commands/telemetry.ts +2 -2
- package/cli/commands/test.ts +5 -0
- package/cli/commands/three-mode.ts +3 -3
- package/cli/commands/timeline.ts +4 -4
- package/cli/commands/upgrade.ts +2 -2
- package/cli/commands/upload.ts +15 -15
- package/cli/commands/what-happened.ts +2 -2
- package/cli/current-sim.ts +6 -3
- package/cli/desktop-companion.ts +55 -149
- package/cli/dev-build-freshness.ts +2 -2
- package/cli/drivers/desktop.ts +17 -9
- package/cli/drivers/electron.ts +1 -2
- package/cli/drivers/playwright-sim-host.ts +11 -2
- package/cli/drivers/playwright.ts +35 -2
- package/cli/drivers/types.ts +8 -0
- package/cli/maestro-compare.ts +670 -0
- package/cli/outbound-endpoints.ts +46 -8
- package/cli/recording-access.ts +6 -6
- package/cli/run-registry.ts +1 -1
- package/cli/runtime-compat.ts +5 -1
- package/cli/send-to-box.ts +3 -3
- package/cli/shell-init.ts +2 -1
- package/cli/ws-bridge.ts +9 -5
- package/detox/element-types.ts +1 -0
- package/detox/gestures.ts +3 -3
- package/detox/index.ts +67 -38
- package/detox/navigation-lifecycle.ts +9 -6
- package/detox/proof-frame.cjs +6 -4
- package/dist-lib/agent-daemon-client.cjs +1 -1
- package/dist-lib/agent-events.cjs +1 -1
- package/dist-lib/attached-projects.cjs +1 -1
- package/dist-lib/auth/shared-session.cjs +1 -1
- package/dist-lib/backend-origin.cjs +1 -1
- package/dist-lib/beta.cjs +1 -1
- package/dist-lib/beta.mjs +1 -1
- package/dist-lib/bridge-constants.cjs +1 -1
- package/dist-lib/bridge-contract-input.cjs +42 -17
- package/dist-lib/bridge-contract-input.mjs +41 -16
- package/dist-lib/bridge-contract.cjs +1 -4
- package/dist-lib/bridge-contract.mjs +1 -3
- package/dist-lib/bundle-channel.cjs +2918 -550
- package/dist-lib/capture-contract.cjs +65 -24
- package/dist-lib/capture-contract.mjs +63 -24
- package/dist-lib/cloud-contract.cjs +2 -2
- package/dist-lib/cloud-contract.mjs +2 -2
- package/dist-lib/cloud-test-args.cjs +1 -1
- package/dist-lib/cloud-test-args.mjs +1 -1
- package/dist-lib/cloud.cjs +3 -3
- package/dist-lib/cloud.mjs +3 -3
- package/dist-lib/config.cjs +15 -5
- package/dist-lib/config.mjs +154 -0
- package/dist-lib/detox/index.cjs +495 -139
- package/dist-lib/dev-bundle-resolution.cjs +1 -1
- package/dist-lib/expo-swift-bundle.cjs +1168 -238
- package/dist-lib/expo-swift-metadata.cjs +34 -23
- package/dist-lib/expo-swift-metadata.mjs +32 -23
- package/dist-lib/home-paths.cjs +2 -2
- package/dist-lib/host/bridge-host.cjs +2938 -654
- package/dist-lib/host/fetch-proxy-handler.cjs +14 -1
- package/dist-lib/host/fetch-proxy-overrides.cjs +7 -1
- package/dist-lib/host/fetch-proxy-overrides.mjs +5 -1
- package/dist-lib/host/replacement-module-handler.cjs +2 -2
- package/dist-lib/host/websocket-proxy.cjs +1 -1
- package/dist-lib/index.cjs +999 -353
- package/dist-lib/jump-to-source-babel.cjs +1 -1
- package/dist-lib/jump-to-source-native.cjs +1 -1
- package/dist-lib/kotlin-host.cjs +332 -19
- package/dist-lib/menu.cjs +1 -1
- package/dist-lib/menu.mjs +1 -1
- package/dist-lib/metro-fingerprint-registry.cjs +1 -1
- package/dist-lib/metro-fingerprint-registry.mjs +1 -1
- package/dist-lib/metro-production-bundle.cjs +7 -7
- package/dist-lib/metro-production-bundle.mjs +5 -5
- package/dist-lib/metro.cjs +688 -250
- package/dist-lib/native-app-identity-project.cjs +2647 -0
- package/dist-lib/native-app-identity-project.mjs +1257 -0
- package/dist-lib/native-app-identity.cjs +325 -25
- package/dist-lib/native-app-identity.mjs +323 -25
- package/dist-lib/native-firebase-metadata.cjs +1 -1
- package/dist-lib/native-firebase-metadata.mjs +1 -1
- package/dist-lib/plist.cjs +1 -1
- package/dist-lib/plist.mjs +1 -1
- package/dist-lib/profiles.cjs +1 -1
- package/dist-lib/public-brand.cjs +1 -1
- package/dist-lib/react-native-host-modules.cjs +5 -1
- package/dist-lib/react-native-host-modules.mjs +5 -1
- package/dist-lib/scripts/dev-server-scanner.cjs +57 -32
- package/dist-lib/sdk.cjs +231 -51
- package/dist-lib/sdk.mjs +231 -51
- package/dist-lib/skills.cjs +4107 -1374
- package/dist-lib/swift-compile.cjs +290 -30
- package/dist-lib/swift-compile.mjs +290 -30
- package/dist-lib/swift-package.cjs +143 -12
- package/dist-lib/swift-package.mjs +137 -11
- package/dist-lib/swift-submit.cjs +47 -5
- package/dist-lib/swift-submit.mjs +42 -5
- package/dist-lib/swift-toolchain.cjs +7 -2
- package/dist-lib/swift.cjs +1 -1
- package/dist-lib/vite-swift.cjs +1392 -458
- package/dist-lib/vite.cjs +13 -17
- package/dist-lib/worklet-executable.cjs +248 -33
- package/dist-lib/worklet-executable.mjs +248 -33
- package/install.sh +10 -1
- package/kotlin/{AppSources → AndroidViewSources}/android/content/res/Resources.kt +9 -9
- package/kotlin/AndroidViewSources/android/graphics/Canvas.kt +20 -0
- package/kotlin/AndroidViewSources/android/view/View.kt +211 -0
- package/kotlin/AndroidViewSources/android/widget/FrameLayout.kt +61 -0
- package/kotlin/AndroidViewSources/android/widget/LinearLayout.kt +49 -0
- package/kotlin/AppSources/android/view/Window.kt +36 -0
- package/kotlin/AppSources/android/view/WindowInsets.kt +9 -0
- package/kotlin/AppSources/android/view/WindowInsetsController.kt +5 -0
- package/kotlin/AppSources/android/window/OnBackInvokedDispatcher.kt +48 -0
- package/kotlin/AppSources/androidx/activity/OnBackPressedDispatcher.kt +20 -5
- package/kotlin/AppSources/androidx/compose/foundation/layout/WindowInsets.kt +15 -0
- package/kotlin/AppSources/androidx/compose/ui/platform/ComposeView.kt +2 -1
- package/kotlin/AppSources/dev/peach/app/PeachApp.kt +42 -50
- package/kotlin/ComposeSources/PeachComposeHost.kt +200 -84
- package/kotlin/ExpoComposeSources/PeachAndroidView.kt +87 -0
- package/kotlin/ExpoComposeSources/PeachExpoViewMount.kt +24 -0
- package/kotlin/ExpoComposeSources/dev/peach/expo/PeachExpoCompose.kt +28 -0
- package/kotlin/ExpoComposeSources/expo/modules/kotlin/views/ExpoComposeView.kt +70 -0
- package/kotlin/ExpoSources/dev/peach/expo/PeachExpoRuntime.kt +513 -0
- package/kotlin/ExpoSources/dev/peach/expo/PeachExpoTypes.kt +173 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/AppContext.kt +20 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/Promise.kt +19 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/classcomponent/ClassComponentBuilder.kt +198 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/exception/CodedException.kt +126 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/functions/Functions.kt +132 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/jni/JavaScriptTypedArray.kt +81 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/modules/Module.kt +98 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/objects/ObjectDefinitionBuilder.kt +236 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/records/Record.kt +12 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/runtime/Runtime.kt +9 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/sharedobjects/SharedObject.kt +50 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/sharedobjects/SharedObjectRegistry.kt +57 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/sharedobjects/SharedRef.kt +19 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/typedarray/ConcreteTypedArrays.kt +158 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/typedarray/GenericTypedArray.kt +8 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/typedarray/TypedArray.kt +29 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/typedarray/TypedArrayIterator.kt +9 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/types/AnyType.kt +155 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/types/Either.kt +91 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/types/Enumerable.kt +6 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/viewevent/ViewEvent.kt +54 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/views/ExpoView.kt +23 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/views/ViewDefinitionBuilder.kt +71 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/views/ViewProps.kt +35 -0
- package/kotlin/README.md +13 -3
- package/kotlin/Sources/android/os/Build.kt +17 -0
- package/kotlin/Sources/android/os/Handler.kt +35 -0
- package/kotlin/Sources/android/os/Looper.kt +17 -0
- package/kotlin/Sources/android/os/MessageQueue.kt +56 -0
- package/kotlin/Sources/android/os/SystemClock.kt +14 -0
- package/kotlin/Sources/android/util/Log.kt +64 -0
- package/kotlin/Sources/java/security/MessageDigest.kt +114 -0
- package/kotlin/Sources/kotlin/text/StringFormat.kt +9 -0
- package/kotlin/Sources/org/json/JSON.kt +44 -0
- package/kotlin/fixtures/counter/Counter.d.kt.ts +1 -0
- package/kotlin/fixtures/counter/Counter.kt +10 -3
- package/kotlin/fixtures/counter/CounterApp.native.tsx +1 -1
- package/kotlin/fixtures/counter/vite.config.ts +2 -2
- package/kotlin/fixtures/headless-counter/Headless.kt +7 -6
- package/kotlin/fixtures/import-animation/Animation.d.kt.ts +7 -0
- package/kotlin/fixtures/import-animation/Animation.kt +80 -0
- package/kotlin/fixtures/import-animation/ImportAnimation.native.tsx +13 -0
- package/kotlin/fixtures/import-animation/README.md +24 -0
- package/kotlin/fixtures/import-animation/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-animation/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-animation/app/routes.d.ts +18 -0
- package/kotlin/fixtures/import-animation/package.json +23 -0
- package/kotlin/fixtures/import-animation/tsconfig.json +20 -0
- package/kotlin/fixtures/import-animation/vite.config.ts +20 -0
- package/kotlin/fixtures/import-editor/Editor.d.kt.ts +7 -0
- package/kotlin/fixtures/import-editor/Editor.kt +59 -0
- package/kotlin/fixtures/import-editor/ImportEditor.native.tsx +23 -0
- package/kotlin/fixtures/import-editor/README.md +27 -0
- package/kotlin/fixtures/import-editor/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-editor/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-editor/package.json +23 -0
- package/kotlin/fixtures/import-editor/tsconfig.json +20 -0
- package/kotlin/fixtures/import-editor/vite.config.ts +20 -0
- package/kotlin/fixtures/import-effects/Effects.d.kt.ts +7 -0
- package/kotlin/fixtures/import-effects/Effects.kt +87 -0
- package/kotlin/fixtures/import-effects/ImportEffects.native.tsx +13 -0
- package/kotlin/fixtures/import-effects/README.md +19 -0
- package/kotlin/fixtures/import-effects/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-effects/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-effects/package.json +23 -0
- package/kotlin/fixtures/import-effects/tsconfig.json +20 -0
- package/kotlin/fixtures/import-effects/vite.config.ts +20 -0
- package/kotlin/fixtures/import-layout/ImportLayout.native.tsx +13 -0
- package/kotlin/fixtures/import-layout/Layout.d.kt.ts +7 -0
- package/kotlin/fixtures/import-layout/Layout.kt +72 -0
- package/kotlin/fixtures/import-layout/README.md +24 -0
- package/kotlin/fixtures/import-layout/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-layout/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-layout/package.json +23 -0
- package/kotlin/fixtures/import-layout/tsconfig.json +20 -0
- package/kotlin/fixtures/import-layout/vite.config.ts +20 -0
- package/kotlin/fixtures/import-navigation/ImportNavigation.native.tsx +18 -0
- package/kotlin/fixtures/import-navigation/Navigation.d.kt.ts +7 -0
- package/kotlin/fixtures/import-navigation/Navigation.kt +104 -0
- package/kotlin/fixtures/import-navigation/README.md +31 -0
- package/kotlin/fixtures/import-navigation/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-navigation/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-navigation/package.json +23 -0
- package/kotlin/fixtures/import-navigation/tsconfig.json +20 -0
- package/kotlin/fixtures/import-navigation/vite.config.ts +20 -0
- package/kotlin/fixtures/import-overlays/ImportOverlays.native.tsx +29 -0
- package/kotlin/fixtures/import-overlays/Overlays.d.kt.ts +7 -0
- package/kotlin/fixtures/import-overlays/Overlays.kt +93 -0
- package/kotlin/fixtures/import-overlays/README.md +34 -0
- package/kotlin/fixtures/import-overlays/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-overlays/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-overlays/package.json +23 -0
- package/kotlin/fixtures/import-overlays/tsconfig.json +20 -0
- package/kotlin/fixtures/import-overlays/vite.config.ts +20 -0
- package/kotlin/fixtures/import-scroll/ImportScroll.native.tsx +13 -0
- package/kotlin/fixtures/import-scroll/README.md +23 -0
- package/kotlin/fixtures/import-scroll/Scroll.d.kt.ts +7 -0
- package/kotlin/fixtures/import-scroll/Scroll.kt +91 -0
- package/kotlin/fixtures/import-scroll/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-scroll/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-scroll/package.json +23 -0
- package/kotlin/fixtures/import-scroll/tsconfig.json +20 -0
- package/kotlin/fixtures/import-scroll/vite.config.ts +20 -0
- package/kotlin/fixtures/import-selection/ImportSelection.native.tsx +44 -0
- package/kotlin/fixtures/import-selection/README.md +32 -0
- package/kotlin/fixtures/import-selection/Selection.d.kt.ts +8 -0
- package/kotlin/fixtures/import-selection/Selection.kt +78 -0
- package/kotlin/fixtures/import-selection/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-selection/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-selection/package.json +23 -0
- package/kotlin/fixtures/import-selection/tsconfig.json +20 -0
- package/kotlin/fixtures/import-selection/vite.config.ts +20 -0
- package/kotlin/fixtures/import-surfaces/ImportSurfaces.native.tsx +13 -0
- package/kotlin/fixtures/import-surfaces/README.md +22 -0
- package/kotlin/fixtures/import-surfaces/Surfaces.d.kt.ts +7 -0
- package/kotlin/fixtures/import-surfaces/Surfaces.kt +64 -0
- package/kotlin/fixtures/import-surfaces/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-surfaces/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-surfaces/package.json +23 -0
- package/kotlin/fixtures/import-surfaces/tsconfig.json +20 -0
- package/kotlin/fixtures/import-surfaces/vite.config.ts +20 -0
- package/kotlin/fixtures/import-values/ImportValues.native.tsx +35 -0
- package/kotlin/fixtures/import-values/README.md +23 -0
- package/kotlin/fixtures/import-values/Values.d.kt.ts +11 -0
- package/kotlin/fixtures/import-values/Values.kt +66 -0
- package/kotlin/fixtures/import-values/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-values/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-values/package.json +23 -0
- package/kotlin/fixtures/import-values/tsconfig.json +20 -0
- package/kotlin/fixtures/import-values/vite.config.ts +20 -0
- package/kotlin/fixtures/kotlin-app-variants/BarBehavior.kt +38 -0
- package/kotlin/fixtures/kotlin-app-variants/BarVisibility.kt +36 -0
- package/kotlin/fixtures/kotlin-app-variants/Ime.kt +3 -1
- package/kotlin/fixtures/kotlin-app-variants/TransientInsets.kt +50 -0
- package/kotlin/fork/NOTICE +6 -1
- package/kotlin/fork/README.md +15 -7
- package/kotlin/fork/build.sh +2 -0
- package/kotlin/fork/compose-worker-globals.patch +186 -4
- package/kotlin/fork/fork.json +2 -2
- package/kotlin/fork/skiko-worker-clock.patch +12 -0
- package/kotlin/toolchain.json +12 -12
- package/kotlin/tools/expo-types.main.kts +115 -0
- package/package.json +17 -23
- package/scripts/dev-server-scanner.ts +92 -66
- package/skills/contrast/SKILL.md +2 -2
- package/skills/peach-debug/SKILL.md +1 -1
- package/skills/peach-perf/SKILL.md +1 -1
- package/skills/peach-setup/SKILL.md +2 -1
- package/skills/peach-test/SKILL.md +8 -0
- package/src/assetCatalogContract.ts +43 -1
- package/src/bridge-contract-input.ts +46 -19
- package/src/bridge-contract.ts +0 -1
- package/src/bundle-channel.mjs +197 -84
- package/src/bundleGlobalFooter.ts +38 -0
- package/src/capture-contract.ts +107 -33
- package/src/cloud-contract.ts +5 -1
- package/src/cloud.ts +5 -2
- package/src/config.ts +22 -3
- package/src/configured-bundle-producer.ts +1 -1
- package/src/desktop-host-delivery.ts +95 -1
- package/src/expo-kotlin-bundle.ts +29 -0
- package/src/expo-kotlin-host.ts +201 -0
- package/src/expo-swift-host.ts +96 -76
- package/src/expoKotlinContract.ts +70 -0
- package/src/expoSwiftContract.ts +4 -25
- package/src/home-paths.ts +7 -4
- package/src/host/bridge-host.ts +23 -3
- package/src/host/fetch-proxy-handler.ts +13 -0
- package/src/host/fetch-proxy-overrides.ts +11 -0
- package/src/host/replacement-module-handler.ts +5 -2
- package/src/index.ts +3 -1
- package/src/kotlin-host.ts +463 -19
- package/src/metro-plugin.ts +56 -28
- package/src/metro-production-bundle.ts +2 -2
- package/src/native-app-identity-project.ts +190 -0
- package/src/native-app-identity.ts +398 -34
- package/src/native-firebase-config.ts +69 -15
- package/src/native-seam-manifest.ts +6 -0
- package/src/one-widget-discovery.ts +2 -1
- package/src/openstep-plist.ts +107 -0
- package/src/react-native-host-modules.ts +4 -0
- package/src/runtime-assets.ts +2 -2
- package/src/sim-client.ts +2 -2
- package/src/swift-binary-modules.ts +3 -1
- package/src/swift-compile.ts +286 -38
- package/src/swift-distribution-contract.ts +4 -0
- package/src/swift-distribution.lock.json +123 -12
- package/src/swift-distribution.ts +7 -3
- package/src/swift-host.ts +298 -83
- package/src/swift-package-manifest.ts +29 -2
- package/src/swift-package.ts +180 -10
- package/src/swift-packages.ts +4 -0
- package/src/swift-standin-emit.ts +4 -1
- package/src/swift-standins.ts +274 -15
- package/src/swift-submit.ts +62 -7
- package/src/swift-toolchain.ts +6 -1
- package/src/swiftContract.ts +126 -3
- package/src/vite-plugin-one.ts +13 -16
- package/src/vite-plugin-swift.ts +4 -5
- package/src/vite-plugin.ts +360 -144
- package/src/vite.d.ts +1 -1
- package/src/worker-system-chunks.ts +221 -0
- package/src/worklet-executable.ts +348 -38
- package/src/worklets-babel.ts +1 -1
- package/src/xcode-project.ts +243 -127
- package/dist-lib/agent-identity.cjs +0 -39
- package/dist-lib/agent-sessions.cjs +0 -760
- package/dist-lib/cli-constants.cjs +0 -32
- package/dist-lib/render-mode.cjs +0 -44
- package/kotlin/AppSources/android/view/View.kt +0 -74
- package/kotlin/AppSources/android/widget/FrameLayout.kt +0 -6
- package/src/render-mode.ts +0 -15
- /package/kotlin/{AppSources → AndroidViewSources}/android/content/Context.kt +0 -0
- /package/kotlin/{AppSources → AndroidViewSources}/android/content/res/Configuration.kt +0 -0
- /package/kotlin/{AppSources → AndroidViewSources}/android/graphics/Color.kt +0 -0
- /package/kotlin/{AppSources → AndroidViewSources}/android/util/DisplayMetrics.kt +0 -0
- /package/kotlin/{AppSources → AndroidViewSources}/dev/peach/app/JavaFormat.kt +0 -0
- /package/kotlin/{AppSources → Sources}/java/lang/Runnable.kt +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*!
|
|
1
|
+
/*! peach v0.1.1399 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -23,11 +23,13 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
23
23
|
var capture_contract_exports = {};
|
|
24
24
|
__export(capture_contract_exports, {
|
|
25
25
|
RNX_SCREEN_CAPTURE_VERSION: () => RNX_SCREEN_CAPTURE_VERSION,
|
|
26
|
+
isGpuSceneSource: () => isGpuSceneSource,
|
|
26
27
|
isRnxCaptureRegionAtlas: () => isRnxCaptureRegionAtlas,
|
|
27
28
|
isRnxScreenCapture: () => isRnxScreenCapture,
|
|
28
29
|
packRnxCaptureRegions: () => packRnxCaptureRegions,
|
|
29
30
|
rnxCaptureRasterRegions: () => rnxCaptureRasterRegions,
|
|
30
31
|
rnxRasterFrames: () => rnxRasterFrames,
|
|
32
|
+
rnxRasterRegionRequests: () => rnxRasterRegionRequests,
|
|
31
33
|
selectRnxRasterNodeIds: () => selectRnxRasterNodeIds
|
|
32
34
|
});
|
|
33
35
|
module.exports = __toCommonJS(capture_contract_exports);
|
|
@@ -36,26 +38,50 @@ function isLiveRasterSource(node) {
|
|
|
36
38
|
const source = node.props?.source;
|
|
37
39
|
return node.type === "image" && !!source && typeof source === "object" && "uri" in source && typeof source.uri === "string" && source.uri.startsWith("live:");
|
|
38
40
|
}
|
|
41
|
+
function rasterLayerFrame(node) {
|
|
42
|
+
const visible = node.visibleFrame;
|
|
43
|
+
if (isLiveRasterSource(node) && visible && visible.width > 0 && visible.height > 0) {
|
|
44
|
+
return { x: visible.x, y: visible.y, width: visible.width, height: visible.height };
|
|
45
|
+
}
|
|
46
|
+
return node.frame ?? {
|
|
47
|
+
x: node.absolutePosition.x,
|
|
48
|
+
y: node.absolutePosition.y,
|
|
49
|
+
width: node.layout.width,
|
|
50
|
+
height: node.layout.height
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
function isGpuSceneSource(node) {
|
|
54
|
+
if (!isLiveRasterSource(node)) return false;
|
|
55
|
+
const source = node.props?.source;
|
|
56
|
+
const uri = source && typeof source === "object" ? Reflect.get(source, "uri") : null;
|
|
57
|
+
return typeof uri === "string" && (uri.startsWith("live:expo-gl-") || uri.startsWith("live:wgpu-"));
|
|
58
|
+
}
|
|
39
59
|
function selectRnxRasterNodeIds(tree) {
|
|
40
60
|
const nodesById = new Map(tree.nodes.map((node) => [node.nodeId, node]));
|
|
41
61
|
const maxLayerArea = tree.width * tree.height * 0.25;
|
|
42
62
|
const eligible = /* @__PURE__ */ new Map();
|
|
43
63
|
for (const node of tree.nodes) {
|
|
44
64
|
const liveVideo = isLiveRasterSource(node);
|
|
45
|
-
const visibleFrame = liveVideo
|
|
65
|
+
const visibleFrame = liveVideo ? rasterLayerFrame(node) : node.visibleFrame ?? node.frame;
|
|
46
66
|
if (!visibleFrame || visibleFrame.width <= 0 || visibleFrame.height <= 0) continue;
|
|
67
|
+
const glass = node.style._liquidGlass !== void 0 || node.style._liquidGlassEdge !== void 0 || node.style._liquidGlassMaterialTint !== void 0;
|
|
47
68
|
const unsupported = node.type === "masked-view" || liveVideo || node.type === "text" && typeof node.text === "string" && (new RegExp("\\p{Emoji_Presentation}", "u").test(node.text) || new RegExp("\\uFE0F|\\u200D|\\u20E3|\\p{Emoji_Modifier}|\\p{Regional_Indicator}", "u").test(
|
|
48
69
|
node.text
|
|
49
|
-
)) ||
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
70
|
+
)) || glass;
|
|
71
|
+
if (!unsupported) continue;
|
|
72
|
+
const captured = rasterLayerFrame(node);
|
|
73
|
+
const area = captured.width * captured.height;
|
|
74
|
+
if (liveVideo || area <= maxLayerArea) {
|
|
75
|
+
eligible.set(node.nodeId, { nodeId: node.nodeId, area, liveVideo, ownPaint: false });
|
|
76
|
+
} else if (glass) {
|
|
77
|
+
eligible.set(node.nodeId, { nodeId: node.nodeId, area, liveVideo, ownPaint: true });
|
|
53
78
|
}
|
|
54
79
|
}
|
|
55
80
|
for (const nodeId of [...eligible.keys()]) {
|
|
56
81
|
let parentNodeId = nodesById.get(nodeId)?.parentNodeId ?? null;
|
|
57
82
|
while (parentNodeId !== null) {
|
|
58
|
-
|
|
83
|
+
const parent = eligible.get(parentNodeId);
|
|
84
|
+
if (parent && !parent.ownPaint) {
|
|
59
85
|
eligible.delete(nodeId);
|
|
60
86
|
break;
|
|
61
87
|
}
|
|
@@ -63,29 +89,29 @@ function selectRnxRasterNodeIds(tree) {
|
|
|
63
89
|
}
|
|
64
90
|
}
|
|
65
91
|
const candidates = [...eligible.values()].sort(
|
|
66
|
-
(left, right) => Number(right.liveVideo) - Number(left.liveVideo) || left.area - right.area || left.nodeId - right.nodeId
|
|
92
|
+
(left, right) => Number(right.liveVideo) - Number(left.liveVideo) || Number(right.ownPaint) - Number(left.ownPaint) || left.area - right.area || left.nodeId - right.nodeId
|
|
67
93
|
);
|
|
68
94
|
const screenArea = tree.width * tree.height;
|
|
69
|
-
const
|
|
95
|
+
const selection = { nodeIds: /* @__PURE__ */ new Set(), ownPaint: /* @__PURE__ */ new Set() };
|
|
70
96
|
let atlasArea = 0;
|
|
97
|
+
let layerArea = 0;
|
|
71
98
|
for (const candidate of candidates) {
|
|
72
|
-
const
|
|
73
|
-
if (atlasArea + candidate.area >
|
|
74
|
-
|
|
99
|
+
const leading = candidate.liveVideo || candidate.ownPaint;
|
|
100
|
+
if (atlasArea + candidate.area > screenArea * (leading ? 1 : 1.25) || !leading && layerArea + candidate.area > screenArea * 0.5) {
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
selection.nodeIds.add(candidate.nodeId);
|
|
104
|
+
if (candidate.ownPaint) selection.ownPaint.add(candidate.nodeId);
|
|
75
105
|
atlasArea += candidate.area;
|
|
106
|
+
if (!leading) layerArea += candidate.area;
|
|
76
107
|
}
|
|
77
|
-
return
|
|
108
|
+
return selection;
|
|
78
109
|
}
|
|
79
110
|
function rnxRasterFrames(tree, nodeIds) {
|
|
80
111
|
const frames = /* @__PURE__ */ new Map();
|
|
81
112
|
for (const node of tree.nodes) {
|
|
82
113
|
if (!nodeIds.has(node.nodeId)) continue;
|
|
83
|
-
const frame = node
|
|
84
|
-
x: node.absolutePosition.x,
|
|
85
|
-
y: node.absolutePosition.y,
|
|
86
|
-
width: node.layout.width,
|
|
87
|
-
height: node.layout.height
|
|
88
|
-
};
|
|
114
|
+
const frame = rasterLayerFrame(node);
|
|
89
115
|
const glassOutset = liquidGlassPaintOutset(node.style._liquidGlass, frame);
|
|
90
116
|
const shadowRadius = typeof node.style.shadowRadius === "number" ? node.style.shadowRadius : 0;
|
|
91
117
|
const shadowOffset = node.style.shadowOffset;
|
|
@@ -159,11 +185,22 @@ function rnxCaptureRasterRegions(capture) {
|
|
|
159
185
|
visibleFrame: node.layout.visibleFrame
|
|
160
186
|
}))
|
|
161
187
|
};
|
|
162
|
-
const
|
|
163
|
-
|
|
164
|
-
|
|
188
|
+
const selection = selectRnxRasterNodeIds(tree);
|
|
189
|
+
return rnxRasterRegionRequests(tree, selection);
|
|
190
|
+
}
|
|
191
|
+
function rnxRasterRegionRequests(tree, selection) {
|
|
192
|
+
const frames = rnxRasterFrames(tree, selection.nodeIds);
|
|
193
|
+
return [...selection.nodeIds].flatMap((nodeId) => {
|
|
165
194
|
const frame = frames.get(nodeId);
|
|
166
|
-
|
|
195
|
+
if (!frame) return [];
|
|
196
|
+
return [
|
|
197
|
+
{
|
|
198
|
+
key: String(nodeId),
|
|
199
|
+
nodeId,
|
|
200
|
+
frame,
|
|
201
|
+
...selection.ownPaint.has(nodeId) ? { ownPaint: true } : {}
|
|
202
|
+
}
|
|
203
|
+
];
|
|
167
204
|
});
|
|
168
205
|
}
|
|
169
206
|
function packRnxCaptureRegions(regions, pixelRatio, surface) {
|
|
@@ -184,6 +221,7 @@ function packRnxCaptureRegions(regions, pixelRatio, surface) {
|
|
|
184
221
|
return {
|
|
185
222
|
key: region.key,
|
|
186
223
|
nodeId: region.nodeId,
|
|
224
|
+
...region.ownPaint ? { ownPaint: true } : {},
|
|
187
225
|
frame: {
|
|
188
226
|
x: left / pixelRatio,
|
|
189
227
|
y: top / pixelRatio,
|
|
@@ -249,6 +287,7 @@ function packRnxCaptureRegions(regions, pixelRatio, surface) {
|
|
|
249
287
|
atlasRegions: best.regions.map((region) => ({
|
|
250
288
|
key: region.key,
|
|
251
289
|
nodeId: region.nodeId,
|
|
290
|
+
...region.ownPaint ? { ownPaint: true } : {},
|
|
252
291
|
frame: region.frame,
|
|
253
292
|
// a region flush with the far edge is anchored to the logical edge so
|
|
254
293
|
// its source never runs past the atlas by a rounding hair
|
|
@@ -325,7 +364,7 @@ function isRnxCaptureRegionAtlas(value) {
|
|
|
325
364
|
}
|
|
326
365
|
const keys = /* @__PURE__ */ new Set();
|
|
327
366
|
for (const region of value.regions) {
|
|
328
|
-
if (!captureRecord(region) || typeof region.key !== "string" || region.key.length === 0 || keys.has(region.key) || !captureInteger(region.nodeId) || region.nodeId <= 0 || !captureRect(region.frame) || region.frame.width <= 0 || region.frame.height <= 0 || !captureRect(region.source) || region.source.x < 0 || region.source.y < 0 || region.source.width !== region.frame.width || region.source.height !== region.frame.height || region.source.x + region.source.width > value.width || region.source.y + region.source.height > value.height) {
|
|
367
|
+
if (!captureRecord(region) || typeof region.key !== "string" || region.key.length === 0 || keys.has(region.key) || !captureInteger(region.nodeId) || region.nodeId <= 0 || region.ownPaint !== void 0 && region.ownPaint !== true || !captureRect(region.frame) || region.frame.width <= 0 || region.frame.height <= 0 || !captureRect(region.source) || region.source.x < 0 || region.source.y < 0 || region.source.width !== region.frame.width || region.source.height !== region.frame.height || region.source.x + region.source.width > value.width || region.source.y + region.source.height > value.height) {
|
|
329
368
|
return false;
|
|
330
369
|
}
|
|
331
370
|
keys.add(region.key);
|
|
@@ -335,10 +374,12 @@ function isRnxCaptureRegionAtlas(value) {
|
|
|
335
374
|
// Annotate the CommonJS export names for ESM import in node:
|
|
336
375
|
0 && (module.exports = {
|
|
337
376
|
RNX_SCREEN_CAPTURE_VERSION,
|
|
377
|
+
isGpuSceneSource,
|
|
338
378
|
isRnxCaptureRegionAtlas,
|
|
339
379
|
isRnxScreenCapture,
|
|
340
380
|
packRnxCaptureRegions,
|
|
341
381
|
rnxCaptureRasterRegions,
|
|
342
382
|
rnxRasterFrames,
|
|
383
|
+
rnxRasterRegionRequests,
|
|
343
384
|
selectRnxRasterNodeIds
|
|
344
385
|
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*!
|
|
1
|
+
/*! peach v0.1.1399 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
|
|
2
2
|
|
|
3
3
|
// src/capture-contract.ts
|
|
4
4
|
var RNX_SCREEN_CAPTURE_VERSION = 1;
|
|
@@ -6,26 +6,50 @@ function isLiveRasterSource(node) {
|
|
|
6
6
|
const source = node.props?.source;
|
|
7
7
|
return node.type === "image" && !!source && typeof source === "object" && "uri" in source && typeof source.uri === "string" && source.uri.startsWith("live:");
|
|
8
8
|
}
|
|
9
|
+
function rasterLayerFrame(node) {
|
|
10
|
+
const visible = node.visibleFrame;
|
|
11
|
+
if (isLiveRasterSource(node) && visible && visible.width > 0 && visible.height > 0) {
|
|
12
|
+
return { x: visible.x, y: visible.y, width: visible.width, height: visible.height };
|
|
13
|
+
}
|
|
14
|
+
return node.frame ?? {
|
|
15
|
+
x: node.absolutePosition.x,
|
|
16
|
+
y: node.absolutePosition.y,
|
|
17
|
+
width: node.layout.width,
|
|
18
|
+
height: node.layout.height
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
function isGpuSceneSource(node) {
|
|
22
|
+
if (!isLiveRasterSource(node)) return false;
|
|
23
|
+
const source = node.props?.source;
|
|
24
|
+
const uri = source && typeof source === "object" ? Reflect.get(source, "uri") : null;
|
|
25
|
+
return typeof uri === "string" && (uri.startsWith("live:expo-gl-") || uri.startsWith("live:wgpu-"));
|
|
26
|
+
}
|
|
9
27
|
function selectRnxRasterNodeIds(tree) {
|
|
10
28
|
const nodesById = new Map(tree.nodes.map((node) => [node.nodeId, node]));
|
|
11
29
|
const maxLayerArea = tree.width * tree.height * 0.25;
|
|
12
30
|
const eligible = /* @__PURE__ */ new Map();
|
|
13
31
|
for (const node of tree.nodes) {
|
|
14
32
|
const liveVideo = isLiveRasterSource(node);
|
|
15
|
-
const visibleFrame = liveVideo
|
|
33
|
+
const visibleFrame = liveVideo ? rasterLayerFrame(node) : node.visibleFrame ?? node.frame;
|
|
16
34
|
if (!visibleFrame || visibleFrame.width <= 0 || visibleFrame.height <= 0) continue;
|
|
35
|
+
const glass = node.style._liquidGlass !== void 0 || node.style._liquidGlassEdge !== void 0 || node.style._liquidGlassMaterialTint !== void 0;
|
|
17
36
|
const unsupported = node.type === "masked-view" || liveVideo || node.type === "text" && typeof node.text === "string" && (/\p{Emoji_Presentation}/u.test(node.text) || /\uFE0F|\u200D|\u20E3|\p{Emoji_Modifier}|\p{Regional_Indicator}/u.test(
|
|
18
37
|
node.text
|
|
19
|
-
)) ||
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
38
|
+
)) || glass;
|
|
39
|
+
if (!unsupported) continue;
|
|
40
|
+
const captured = rasterLayerFrame(node);
|
|
41
|
+
const area = captured.width * captured.height;
|
|
42
|
+
if (liveVideo || area <= maxLayerArea) {
|
|
43
|
+
eligible.set(node.nodeId, { nodeId: node.nodeId, area, liveVideo, ownPaint: false });
|
|
44
|
+
} else if (glass) {
|
|
45
|
+
eligible.set(node.nodeId, { nodeId: node.nodeId, area, liveVideo, ownPaint: true });
|
|
23
46
|
}
|
|
24
47
|
}
|
|
25
48
|
for (const nodeId of [...eligible.keys()]) {
|
|
26
49
|
let parentNodeId = nodesById.get(nodeId)?.parentNodeId ?? null;
|
|
27
50
|
while (parentNodeId !== null) {
|
|
28
|
-
|
|
51
|
+
const parent = eligible.get(parentNodeId);
|
|
52
|
+
if (parent && !parent.ownPaint) {
|
|
29
53
|
eligible.delete(nodeId);
|
|
30
54
|
break;
|
|
31
55
|
}
|
|
@@ -33,29 +57,29 @@ function selectRnxRasterNodeIds(tree) {
|
|
|
33
57
|
}
|
|
34
58
|
}
|
|
35
59
|
const candidates = [...eligible.values()].sort(
|
|
36
|
-
(left, right) => Number(right.liveVideo) - Number(left.liveVideo) || left.area - right.area || left.nodeId - right.nodeId
|
|
60
|
+
(left, right) => Number(right.liveVideo) - Number(left.liveVideo) || Number(right.ownPaint) - Number(left.ownPaint) || left.area - right.area || left.nodeId - right.nodeId
|
|
37
61
|
);
|
|
38
62
|
const screenArea = tree.width * tree.height;
|
|
39
|
-
const
|
|
63
|
+
const selection = { nodeIds: /* @__PURE__ */ new Set(), ownPaint: /* @__PURE__ */ new Set() };
|
|
40
64
|
let atlasArea = 0;
|
|
65
|
+
let layerArea = 0;
|
|
41
66
|
for (const candidate of candidates) {
|
|
42
|
-
const
|
|
43
|
-
if (atlasArea + candidate.area >
|
|
44
|
-
|
|
67
|
+
const leading = candidate.liveVideo || candidate.ownPaint;
|
|
68
|
+
if (atlasArea + candidate.area > screenArea * (leading ? 1 : 1.25) || !leading && layerArea + candidate.area > screenArea * 0.5) {
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
selection.nodeIds.add(candidate.nodeId);
|
|
72
|
+
if (candidate.ownPaint) selection.ownPaint.add(candidate.nodeId);
|
|
45
73
|
atlasArea += candidate.area;
|
|
74
|
+
if (!leading) layerArea += candidate.area;
|
|
46
75
|
}
|
|
47
|
-
return
|
|
76
|
+
return selection;
|
|
48
77
|
}
|
|
49
78
|
function rnxRasterFrames(tree, nodeIds) {
|
|
50
79
|
const frames = /* @__PURE__ */ new Map();
|
|
51
80
|
for (const node of tree.nodes) {
|
|
52
81
|
if (!nodeIds.has(node.nodeId)) continue;
|
|
53
|
-
const frame = node
|
|
54
|
-
x: node.absolutePosition.x,
|
|
55
|
-
y: node.absolutePosition.y,
|
|
56
|
-
width: node.layout.width,
|
|
57
|
-
height: node.layout.height
|
|
58
|
-
};
|
|
82
|
+
const frame = rasterLayerFrame(node);
|
|
59
83
|
const glassOutset = liquidGlassPaintOutset(node.style._liquidGlass, frame);
|
|
60
84
|
const shadowRadius = typeof node.style.shadowRadius === "number" ? node.style.shadowRadius : 0;
|
|
61
85
|
const shadowOffset = node.style.shadowOffset;
|
|
@@ -129,11 +153,22 @@ function rnxCaptureRasterRegions(capture) {
|
|
|
129
153
|
visibleFrame: node.layout.visibleFrame
|
|
130
154
|
}))
|
|
131
155
|
};
|
|
132
|
-
const
|
|
133
|
-
|
|
134
|
-
|
|
156
|
+
const selection = selectRnxRasterNodeIds(tree);
|
|
157
|
+
return rnxRasterRegionRequests(tree, selection);
|
|
158
|
+
}
|
|
159
|
+
function rnxRasterRegionRequests(tree, selection) {
|
|
160
|
+
const frames = rnxRasterFrames(tree, selection.nodeIds);
|
|
161
|
+
return [...selection.nodeIds].flatMap((nodeId) => {
|
|
135
162
|
const frame = frames.get(nodeId);
|
|
136
|
-
|
|
163
|
+
if (!frame) return [];
|
|
164
|
+
return [
|
|
165
|
+
{
|
|
166
|
+
key: String(nodeId),
|
|
167
|
+
nodeId,
|
|
168
|
+
frame,
|
|
169
|
+
...selection.ownPaint.has(nodeId) ? { ownPaint: true } : {}
|
|
170
|
+
}
|
|
171
|
+
];
|
|
137
172
|
});
|
|
138
173
|
}
|
|
139
174
|
function packRnxCaptureRegions(regions, pixelRatio, surface) {
|
|
@@ -154,6 +189,7 @@ function packRnxCaptureRegions(regions, pixelRatio, surface) {
|
|
|
154
189
|
return {
|
|
155
190
|
key: region.key,
|
|
156
191
|
nodeId: region.nodeId,
|
|
192
|
+
...region.ownPaint ? { ownPaint: true } : {},
|
|
157
193
|
frame: {
|
|
158
194
|
x: left / pixelRatio,
|
|
159
195
|
y: top / pixelRatio,
|
|
@@ -219,6 +255,7 @@ function packRnxCaptureRegions(regions, pixelRatio, surface) {
|
|
|
219
255
|
atlasRegions: best.regions.map((region) => ({
|
|
220
256
|
key: region.key,
|
|
221
257
|
nodeId: region.nodeId,
|
|
258
|
+
...region.ownPaint ? { ownPaint: true } : {},
|
|
222
259
|
frame: region.frame,
|
|
223
260
|
// a region flush with the far edge is anchored to the logical edge so
|
|
224
261
|
// its source never runs past the atlas by a rounding hair
|
|
@@ -295,7 +332,7 @@ function isRnxCaptureRegionAtlas(value) {
|
|
|
295
332
|
}
|
|
296
333
|
const keys = /* @__PURE__ */ new Set();
|
|
297
334
|
for (const region of value.regions) {
|
|
298
|
-
if (!captureRecord(region) || typeof region.key !== "string" || region.key.length === 0 || keys.has(region.key) || !captureInteger(region.nodeId) || region.nodeId <= 0 || !captureRect(region.frame) || region.frame.width <= 0 || region.frame.height <= 0 || !captureRect(region.source) || region.source.x < 0 || region.source.y < 0 || region.source.width !== region.frame.width || region.source.height !== region.frame.height || region.source.x + region.source.width > value.width || region.source.y + region.source.height > value.height) {
|
|
335
|
+
if (!captureRecord(region) || typeof region.key !== "string" || region.key.length === 0 || keys.has(region.key) || !captureInteger(region.nodeId) || region.nodeId <= 0 || region.ownPaint !== void 0 && region.ownPaint !== true || !captureRect(region.frame) || region.frame.width <= 0 || region.frame.height <= 0 || !captureRect(region.source) || region.source.x < 0 || region.source.y < 0 || region.source.width !== region.frame.width || region.source.height !== region.frame.height || region.source.x + region.source.width > value.width || region.source.y + region.source.height > value.height) {
|
|
299
336
|
return false;
|
|
300
337
|
}
|
|
301
338
|
keys.add(region.key);
|
|
@@ -304,10 +341,12 @@ function isRnxCaptureRegionAtlas(value) {
|
|
|
304
341
|
}
|
|
305
342
|
export {
|
|
306
343
|
RNX_SCREEN_CAPTURE_VERSION,
|
|
344
|
+
isGpuSceneSource,
|
|
307
345
|
isRnxCaptureRegionAtlas,
|
|
308
346
|
isRnxScreenCapture,
|
|
309
347
|
packRnxCaptureRegions,
|
|
310
348
|
rnxCaptureRasterRegions,
|
|
311
349
|
rnxRasterFrames,
|
|
350
|
+
rnxRasterRegionRequests,
|
|
312
351
|
selectRnxRasterNodeIds
|
|
313
352
|
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*!
|
|
1
|
+
/*! peach v0.1.1399 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -49,7 +49,7 @@ __export(cloud_contract_exports, {
|
|
|
49
49
|
rnxCloudScopesAllowCommand: () => rnxCloudScopesAllowCommand
|
|
50
50
|
});
|
|
51
51
|
module.exports = __toCommonJS(cloud_contract_exports);
|
|
52
|
-
var RNX_CLOUD_MAX_ARTIFACT_BYTES =
|
|
52
|
+
var RNX_CLOUD_MAX_ARTIFACT_BYTES = 40761776;
|
|
53
53
|
var RNX_CLOUD_DESIGN_MAX_STORAGE_ENTRIES = 256;
|
|
54
54
|
var RNX_CLOUD_DESIGN_MAX_STORAGE_BYTES = 1024 * 1024;
|
|
55
55
|
var RNX_CLOUD_TEST_FILES_MAX_COUNT = 256;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
/*!
|
|
1
|
+
/*! peach v0.1.1399 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
|
|
2
2
|
|
|
3
3
|
// src/cloud-contract.ts
|
|
4
|
-
var RNX_CLOUD_MAX_ARTIFACT_BYTES =
|
|
4
|
+
var RNX_CLOUD_MAX_ARTIFACT_BYTES = 40761776;
|
|
5
5
|
var RNX_CLOUD_DESIGN_MAX_STORAGE_ENTRIES = 256;
|
|
6
6
|
var RNX_CLOUD_DESIGN_MAX_STORAGE_BYTES = 1024 * 1024;
|
|
7
7
|
var RNX_CLOUD_TEST_FILES_MAX_COUNT = 256;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*!
|
|
1
|
+
/*! peach v0.1.1399 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
package/dist-lib/cloud.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*!
|
|
1
|
+
/*! peach v0.1.1399 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -100,7 +100,7 @@ function isRnxScreenCapture(value) {
|
|
|
100
100
|
}
|
|
101
101
|
|
|
102
102
|
// src/cloud-contract.ts
|
|
103
|
-
var RNX_CLOUD_MAX_ARTIFACT_BYTES =
|
|
103
|
+
var RNX_CLOUD_MAX_ARTIFACT_BYTES = 40761776;
|
|
104
104
|
var RNX_CLOUD_DESIGN_MAX_STORAGE_BYTES = 1024 * 1024;
|
|
105
105
|
var RNX_CLOUD_COMMAND_SCOPE_SET = /* @__PURE__ */ new Set([
|
|
106
106
|
"read",
|
|
@@ -387,7 +387,7 @@ var RemoteSimulator = class {
|
|
|
387
387
|
do: (command) => this.sendCommand(command),
|
|
388
388
|
wait: (condition, options) => {
|
|
389
389
|
const timeoutMs = options?.maxMs ?? DEFAULT_WAIT_READY_MS;
|
|
390
|
-
const waitCondition = condition === "ready" ? { type: "ready" } : condition;
|
|
390
|
+
const waitCondition = condition === "ready" ? { type: "ready" } : { type: "present", selector: { testID: condition.selector } };
|
|
391
391
|
return this.sendCommand(
|
|
392
392
|
{
|
|
393
393
|
type: "waitFor",
|
package/dist-lib/cloud.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*!
|
|
1
|
+
/*! peach v0.1.1399 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
|
|
2
2
|
var __defProp = Object.defineProperty;
|
|
3
3
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
4
4
|
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
@@ -70,7 +70,7 @@ function isRnxScreenCapture(value) {
|
|
|
70
70
|
}
|
|
71
71
|
|
|
72
72
|
// src/cloud-contract.ts
|
|
73
|
-
var RNX_CLOUD_MAX_ARTIFACT_BYTES =
|
|
73
|
+
var RNX_CLOUD_MAX_ARTIFACT_BYTES = 40761776;
|
|
74
74
|
var RNX_CLOUD_DESIGN_MAX_STORAGE_BYTES = 1024 * 1024;
|
|
75
75
|
var RNX_CLOUD_COMMAND_SCOPE_SET = /* @__PURE__ */ new Set([
|
|
76
76
|
"read",
|
|
@@ -357,7 +357,7 @@ var RemoteSimulator = class {
|
|
|
357
357
|
do: (command) => this.sendCommand(command),
|
|
358
358
|
wait: (condition, options) => {
|
|
359
359
|
const timeoutMs = options?.maxMs ?? DEFAULT_WAIT_READY_MS;
|
|
360
|
-
const waitCondition = condition === "ready" ? { type: "ready" } : condition;
|
|
360
|
+
const waitCondition = condition === "ready" ? { type: "ready" } : { type: "present", selector: { testID: condition.selector } };
|
|
361
361
|
return this.sendCommand(
|
|
362
362
|
{
|
|
363
363
|
type: "waitFor",
|
package/dist-lib/config.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*!
|
|
1
|
+
/*! peach v0.1.1399 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -32,6 +32,7 @@ __export(config_exports, {
|
|
|
32
32
|
hasPeachConfig: () => hasPeachConfig,
|
|
33
33
|
isPeachConfig: () => isPeachConfig,
|
|
34
34
|
mergePeachConfig: () => mergePeachConfig,
|
|
35
|
+
readNativeRenderer: () => readNativeRenderer,
|
|
35
36
|
readPeachBundleConfig: () => readPeachBundleConfig,
|
|
36
37
|
readPeachBundleConfigFooter: () => readPeachBundleConfigFooter,
|
|
37
38
|
readPeachConfigFromSearchParams: () => readPeachConfigFromSearchParams
|
|
@@ -49,6 +50,11 @@ function isRecord(value) {
|
|
|
49
50
|
}
|
|
50
51
|
|
|
51
52
|
// src/config.ts
|
|
53
|
+
function readNativeRenderer(value) {
|
|
54
|
+
if (value === void 0) return void 0;
|
|
55
|
+
if (value === "paper" || value === "fabric") return value;
|
|
56
|
+
throw new Error("nativeRenderer must be paper or fabric");
|
|
57
|
+
}
|
|
52
58
|
var PEACH_CONFIG_QUERY_PARAM = "peachConfig";
|
|
53
59
|
function collectConfiguredFileModules(config) {
|
|
54
60
|
return [
|
|
@@ -65,7 +71,7 @@ function collectConfiguredFileModules(config) {
|
|
|
65
71
|
}
|
|
66
72
|
function isPeachConfig(value) {
|
|
67
73
|
if (!isRecord(value)) return false;
|
|
68
|
-
return (value.runtimeVersion === void 0 || typeof value.runtimeVersion === "string" && value.runtimeVersion === value.runtimeVersion.trim() && isValidRuntimeVersion(value.runtimeVersion)) && [
|
|
74
|
+
return (value.nativeRenderer === void 0 || value.nativeRenderer === "paper" || value.nativeRenderer === "fabric") && (value.runtimeVersion === void 0 || typeof value.runtimeVersion === "string" && value.runtimeVersion === value.runtimeVersion.trim() && isValidRuntimeVersion(value.runtimeVersion)) && [
|
|
69
75
|
"modules",
|
|
70
76
|
"turboModules",
|
|
71
77
|
"nativeModules",
|
|
@@ -121,7 +127,7 @@ function hasOwnKeys(value) {
|
|
|
121
127
|
}
|
|
122
128
|
function hasPeachConfig(config) {
|
|
123
129
|
if (!config) return false;
|
|
124
|
-
return typeof config.runtimeVersion === "string" && config.runtimeVersion.length > 0 || hasOwnKeys(config.modules) || hasOwnKeys(config.turboModules) || hasOwnKeys(config.nativeModules) || hasOwnKeys(config.nativeViews) || hasOwnKeys(config.env) || hasOwnKeys(config.network?.remap) || hasOwnKeys(config.settings) || hasOwnKeys(config.initialState);
|
|
130
|
+
return config.nativeRenderer !== void 0 || typeof config.runtimeVersion === "string" && config.runtimeVersion.length > 0 || hasOwnKeys(config.modules) || hasOwnKeys(config.turboModules) || hasOwnKeys(config.nativeModules) || hasOwnKeys(config.nativeViews) || hasOwnKeys(config.env) || hasOwnKeys(config.network?.remap) || hasOwnKeys(config.settings) || hasOwnKeys(config.initialState);
|
|
125
131
|
}
|
|
126
132
|
function mergePeachConfig(base, override) {
|
|
127
133
|
if (!hasPeachConfig(base) && !hasPeachConfig(override)) return void 0;
|
|
@@ -129,6 +135,7 @@ function mergePeachConfig(base, override) {
|
|
|
129
135
|
if (!hasPeachConfig(override)) return base ? { ...base } : void 0;
|
|
130
136
|
return {
|
|
131
137
|
runtimeVersion: override.runtimeVersion ?? base.runtimeVersion,
|
|
138
|
+
nativeRenderer: override.nativeRenderer ?? base.nativeRenderer,
|
|
132
139
|
modules: { ...base.modules || {}, ...override.modules || {} },
|
|
133
140
|
turboModules: { ...base.turboModules || {}, ...override.turboModules || {} },
|
|
134
141
|
nativeModules: {
|
|
@@ -150,14 +157,16 @@ function mergePeachConfig(base, override) {
|
|
|
150
157
|
function readPeachConfigFromSearchParams(searchParams) {
|
|
151
158
|
const raw = searchParams.get(PEACH_CONFIG_QUERY_PARAM);
|
|
152
159
|
if (!raw) return void 0;
|
|
160
|
+
let parsed;
|
|
153
161
|
try {
|
|
154
|
-
|
|
155
|
-
return hasPeachConfig(parsed) ? parsed : void 0;
|
|
162
|
+
parsed = JSON.parse(raw);
|
|
156
163
|
} catch (error) {
|
|
157
164
|
const message = error instanceof Error ? error.message : String(error);
|
|
158
165
|
console.warn(`[peach] invalid ${PEACH_CONFIG_QUERY_PARAM}: ${message}`);
|
|
159
166
|
return void 0;
|
|
160
167
|
}
|
|
168
|
+
if (isRecord(parsed)) readNativeRenderer(parsed.nativeRenderer);
|
|
169
|
+
return isPeachConfig(parsed) && hasPeachConfig(parsed) ? parsed : void 0;
|
|
161
170
|
}
|
|
162
171
|
function applyPeachConfigToUrl(url, config) {
|
|
163
172
|
const parsed = new URL(url);
|
|
@@ -180,6 +189,7 @@ function applyPeachConfigToUrl(url, config) {
|
|
|
180
189
|
hasPeachConfig,
|
|
181
190
|
isPeachConfig,
|
|
182
191
|
mergePeachConfig,
|
|
192
|
+
readNativeRenderer,
|
|
183
193
|
readPeachBundleConfig,
|
|
184
194
|
readPeachBundleConfigFooter,
|
|
185
195
|
readPeachConfigFromSearchParams
|