peachsim 0.1.940 → 0.1.1400
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +28 -22
- package/cli/app-catalog.ts +29 -14
- package/cli/app-fonts.ts +17 -8
- package/cli/bridge-flow-runner.ts +40 -29
- package/cli/cloud-client.ts +57 -21
- package/cli/cloud-test-tunnel.ts +12 -18
- package/cli/commands/agent.ts +1 -1
- package/cli/commands/app-fonts.ts +3 -3
- package/cli/commands/assert.ts +8 -8
- package/cli/commands/auth.ts +8 -3
- package/cli/commands/box/bundle-plane.ts +13 -1
- package/cli/commands/box.ts +16 -5
- package/cli/commands/compat.ts +1 -1
- package/cli/commands/config.ts +2 -2
- package/cli/commands/control.ts +125 -71
- package/cli/commands/cpu-profile.ts +45 -1
- package/cli/commands/daemon.ts +131 -33
- package/cli/commands/debug.ts +24 -17
- package/cli/commands/desktop.ts +7 -1
- package/cli/commands/detect.ts +101 -0
- package/cli/commands/detox.ts +6 -6
- package/cli/commands/device.ts +12 -12
- package/cli/commands/electron.ts +32 -14
- package/cli/commands/flow.ts +49 -41
- package/cli/commands/guest-host.ts +39 -1
- package/cli/commands/inspect/core.ts +14 -8
- package/cli/commands/inspect/list.ts +1 -1
- package/cli/commands/inspect/settle.ts +5 -3
- package/cli/commands/inspect/settling.ts +229 -44
- package/cli/commands/inspect/wait-idle.ts +3 -2
- package/cli/commands/inspect.ts +107 -95
- package/cli/commands/install-cli.ts +36 -15
- package/cli/commands/install-desktop.ts +68 -195
- package/cli/commands/kotlin.ts +6 -5
- package/cli/commands/login.ts +5 -5
- package/cli/commands/maestro-compare.ts +554 -0
- package/cli/commands/maestro-generate.ts +6 -3
- package/cli/commands/maestro.ts +22 -0
- package/cli/commands/mode.ts +2 -2
- package/cli/commands/no-bridge-hint.ts +6 -2
- package/cli/commands/platform.ts +35 -6
- package/cli/commands/preview.ts +6 -0
- package/cli/commands/project-report.ts +10 -12
- package/cli/commands/record.ts +37 -37
- package/cli/commands/runtime.ts +9 -9
- package/cli/commands/screenshot-layers.ts +4 -4
- package/cli/commands/screenshot-mode.ts +2 -2
- package/cli/commands/screenshot.ts +19 -16
- package/cli/commands/screenshots-capture.ts +2 -2
- package/cli/commands/serve.ts +9 -12
- package/cli/commands/setup.ts +29 -14
- package/cli/commands/shell-boolean-mode.ts +2 -2
- package/cli/commands/show-touches-mode.ts +2 -2
- package/cli/commands/skills.ts +11 -11
- package/cli/commands/swift.ts +29 -11
- package/cli/commands/telemetry.ts +2 -2
- package/cli/commands/test.ts +5 -0
- package/cli/commands/three-mode.ts +3 -3
- package/cli/commands/timeline.ts +4 -4
- package/cli/commands/upgrade.ts +2 -2
- package/cli/commands/upload.ts +15 -15
- package/cli/commands/what-happened.ts +2 -2
- package/cli/current-sim.ts +6 -3
- package/cli/desktop-companion.ts +55 -149
- package/cli/dev-build-freshness.ts +2 -2
- package/cli/drivers/desktop.ts +17 -9
- package/cli/drivers/electron.ts +1 -2
- package/cli/drivers/playwright-sim-host.ts +11 -2
- package/cli/drivers/playwright.ts +35 -2
- package/cli/drivers/types.ts +8 -0
- package/cli/maestro-compare.ts +670 -0
- package/cli/outbound-endpoints.ts +50 -8
- package/cli/recording-access.ts +6 -6
- package/cli/run-registry.ts +1 -1
- package/cli/runtime-compat.ts +5 -1
- package/cli/screenshot-output.ts +17 -0
- package/cli/send-to-box.ts +3 -3
- package/cli/shell-init.ts +2 -1
- package/cli/ws-bridge.ts +9 -5
- package/detox/element-types.ts +1 -0
- package/detox/gestures.ts +3 -3
- package/detox/index.ts +67 -38
- package/detox/navigation-lifecycle.ts +9 -6
- package/detox/proof-frame.cjs +6 -4
- package/dist-lib/agent-daemon-client.cjs +1 -1
- package/dist-lib/agent-events.cjs +1 -1
- package/dist-lib/attached-projects.cjs +1 -1
- package/dist-lib/auth/shared-session.cjs +1 -1
- package/dist-lib/backend-origin.cjs +1 -1
- package/dist-lib/beta.cjs +1 -1
- package/dist-lib/beta.mjs +1 -1
- package/dist-lib/bridge-constants.cjs +1 -1
- package/dist-lib/bridge-contract-input.cjs +42 -17
- package/dist-lib/bridge-contract-input.mjs +41 -16
- package/dist-lib/bridge-contract.cjs +1 -4
- package/dist-lib/bridge-contract.mjs +1 -3
- package/dist-lib/bundle-channel.cjs +2918 -550
- package/dist-lib/capture-contract.cjs +65 -24
- package/dist-lib/capture-contract.mjs +63 -24
- package/dist-lib/cloud-contract.cjs +2 -2
- package/dist-lib/cloud-contract.mjs +2 -2
- package/dist-lib/cloud-test-args.cjs +1 -1
- package/dist-lib/cloud-test-args.mjs +1 -1
- package/dist-lib/cloud.cjs +3 -3
- package/dist-lib/cloud.mjs +3 -3
- package/dist-lib/config.cjs +15 -5
- package/dist-lib/config.mjs +154 -0
- package/dist-lib/detox/index.cjs +495 -139
- package/dist-lib/dev-bundle-resolution.cjs +3 -1
- package/dist-lib/expo-swift-bundle.cjs +1168 -238
- package/dist-lib/expo-swift-metadata.cjs +34 -23
- package/dist-lib/expo-swift-metadata.mjs +32 -23
- package/dist-lib/home-paths.cjs +2 -2
- package/dist-lib/host/bridge-host.cjs +2938 -654
- package/dist-lib/host/fetch-proxy-handler.cjs +14 -1
- package/dist-lib/host/fetch-proxy-overrides.cjs +7 -1
- package/dist-lib/host/fetch-proxy-overrides.mjs +5 -1
- package/dist-lib/host/replacement-module-handler.cjs +2 -2
- package/dist-lib/host/websocket-proxy.cjs +1 -1
- package/dist-lib/index.cjs +981 -353
- package/dist-lib/jump-to-source-babel.cjs +1 -1
- package/dist-lib/jump-to-source-native.cjs +1 -1
- package/dist-lib/kotlin-host.cjs +332 -19
- package/dist-lib/menu.cjs +1 -1
- package/dist-lib/menu.mjs +1 -1
- package/dist-lib/metro-fingerprint-registry.cjs +1 -1
- package/dist-lib/metro-fingerprint-registry.mjs +1 -1
- package/dist-lib/metro-production-bundle.cjs +7 -7
- package/dist-lib/metro-production-bundle.mjs +5 -5
- package/dist-lib/metro.cjs +670 -250
- package/dist-lib/native-app-identity-project.cjs +2647 -0
- package/dist-lib/native-app-identity-project.mjs +1257 -0
- package/dist-lib/native-app-identity.cjs +304 -25
- package/dist-lib/native-app-identity.mjs +302 -25
- package/dist-lib/native-firebase-metadata.cjs +1 -1
- package/dist-lib/native-firebase-metadata.mjs +1 -1
- package/dist-lib/plist.cjs +1 -1
- package/dist-lib/plist.mjs +1 -1
- package/dist-lib/profiles.cjs +1 -1
- package/dist-lib/public-brand.cjs +1 -1
- package/dist-lib/react-native-host-modules.cjs +5 -1
- package/dist-lib/react-native-host-modules.mjs +5 -1
- package/dist-lib/scripts/dev-server-scanner.cjs +57 -32
- package/dist-lib/sdk.cjs +231 -51
- package/dist-lib/sdk.mjs +231 -51
- package/dist-lib/skills.cjs +4114 -1376
- package/dist-lib/swift-compile.cjs +290 -30
- package/dist-lib/swift-compile.mjs +290 -30
- package/dist-lib/swift-package.cjs +143 -12
- package/dist-lib/swift-package.mjs +137 -11
- package/dist-lib/swift-submit.cjs +47 -5
- package/dist-lib/swift-submit.mjs +42 -5
- package/dist-lib/swift-toolchain.cjs +7 -2
- package/dist-lib/swift.cjs +1 -1
- package/dist-lib/vite-swift.cjs +1392 -458
- package/dist-lib/vite.cjs +13 -17
- package/dist-lib/worklet-executable.cjs +248 -33
- package/dist-lib/worklet-executable.mjs +248 -33
- package/install.sh +10 -1
- package/kotlin/{AppSources → AndroidViewSources}/android/content/res/Resources.kt +9 -9
- package/kotlin/AndroidViewSources/android/graphics/Canvas.kt +20 -0
- package/kotlin/AndroidViewSources/android/view/View.kt +211 -0
- package/kotlin/AndroidViewSources/android/widget/FrameLayout.kt +61 -0
- package/kotlin/AndroidViewSources/android/widget/LinearLayout.kt +49 -0
- package/kotlin/AppSources/android/view/Window.kt +36 -0
- package/kotlin/AppSources/android/view/WindowInsets.kt +9 -0
- package/kotlin/AppSources/android/view/WindowInsetsController.kt +5 -0
- package/kotlin/AppSources/android/window/OnBackInvokedDispatcher.kt +48 -0
- package/kotlin/AppSources/androidx/activity/OnBackPressedDispatcher.kt +20 -5
- package/kotlin/AppSources/androidx/compose/foundation/layout/WindowInsets.kt +15 -0
- package/kotlin/AppSources/androidx/compose/ui/platform/ComposeView.kt +2 -1
- package/kotlin/AppSources/dev/peach/app/PeachApp.kt +42 -50
- package/kotlin/ComposeSources/PeachComposeHost.kt +200 -84
- package/kotlin/ExpoComposeSources/PeachAndroidView.kt +87 -0
- package/kotlin/ExpoComposeSources/PeachExpoViewMount.kt +24 -0
- package/kotlin/ExpoComposeSources/dev/peach/expo/PeachExpoCompose.kt +28 -0
- package/kotlin/ExpoComposeSources/expo/modules/kotlin/views/ExpoComposeView.kt +70 -0
- package/kotlin/ExpoSources/dev/peach/expo/PeachExpoRuntime.kt +513 -0
- package/kotlin/ExpoSources/dev/peach/expo/PeachExpoTypes.kt +173 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/AppContext.kt +20 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/Promise.kt +19 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/classcomponent/ClassComponentBuilder.kt +198 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/exception/CodedException.kt +126 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/functions/Functions.kt +132 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/jni/JavaScriptTypedArray.kt +81 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/modules/Module.kt +98 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/objects/ObjectDefinitionBuilder.kt +236 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/records/Record.kt +12 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/runtime/Runtime.kt +9 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/sharedobjects/SharedObject.kt +50 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/sharedobjects/SharedObjectRegistry.kt +57 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/sharedobjects/SharedRef.kt +19 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/typedarray/ConcreteTypedArrays.kt +158 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/typedarray/GenericTypedArray.kt +8 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/typedarray/TypedArray.kt +29 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/typedarray/TypedArrayIterator.kt +9 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/types/AnyType.kt +155 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/types/Either.kt +91 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/types/Enumerable.kt +6 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/viewevent/ViewEvent.kt +54 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/views/ExpoView.kt +23 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/views/ViewDefinitionBuilder.kt +71 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/views/ViewProps.kt +35 -0
- package/kotlin/README.md +13 -3
- package/kotlin/Sources/android/os/Build.kt +17 -0
- package/kotlin/Sources/android/os/Handler.kt +35 -0
- package/kotlin/Sources/android/os/Looper.kt +17 -0
- package/kotlin/Sources/android/os/MessageQueue.kt +56 -0
- package/kotlin/Sources/android/os/SystemClock.kt +14 -0
- package/kotlin/Sources/android/util/Log.kt +64 -0
- package/kotlin/Sources/java/security/MessageDigest.kt +114 -0
- package/kotlin/Sources/kotlin/text/StringFormat.kt +9 -0
- package/kotlin/Sources/org/json/JSON.kt +44 -0
- package/kotlin/fixtures/counter/Counter.d.kt.ts +1 -0
- package/kotlin/fixtures/counter/Counter.kt +10 -3
- package/kotlin/fixtures/counter/CounterApp.native.tsx +1 -1
- package/kotlin/fixtures/counter/vite.config.ts +2 -2
- package/kotlin/fixtures/headless-counter/Headless.kt +7 -6
- package/kotlin/fixtures/import-animation/Animation.d.kt.ts +7 -0
- package/kotlin/fixtures/import-animation/Animation.kt +80 -0
- package/kotlin/fixtures/import-animation/ImportAnimation.native.tsx +13 -0
- package/kotlin/fixtures/import-animation/README.md +24 -0
- package/kotlin/fixtures/import-animation/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-animation/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-animation/app/routes.d.ts +18 -0
- package/kotlin/fixtures/import-animation/package.json +23 -0
- package/kotlin/fixtures/import-animation/tsconfig.json +20 -0
- package/kotlin/fixtures/import-animation/vite.config.ts +20 -0
- package/kotlin/fixtures/import-editor/Editor.d.kt.ts +7 -0
- package/kotlin/fixtures/import-editor/Editor.kt +59 -0
- package/kotlin/fixtures/import-editor/ImportEditor.native.tsx +23 -0
- package/kotlin/fixtures/import-editor/README.md +27 -0
- package/kotlin/fixtures/import-editor/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-editor/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-editor/package.json +23 -0
- package/kotlin/fixtures/import-editor/tsconfig.json +20 -0
- package/kotlin/fixtures/import-editor/vite.config.ts +20 -0
- package/kotlin/fixtures/import-effects/Effects.d.kt.ts +7 -0
- package/kotlin/fixtures/import-effects/Effects.kt +87 -0
- package/kotlin/fixtures/import-effects/ImportEffects.native.tsx +13 -0
- package/kotlin/fixtures/import-effects/README.md +19 -0
- package/kotlin/fixtures/import-effects/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-effects/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-effects/package.json +23 -0
- package/kotlin/fixtures/import-effects/tsconfig.json +20 -0
- package/kotlin/fixtures/import-effects/vite.config.ts +20 -0
- package/kotlin/fixtures/import-layout/ImportLayout.native.tsx +13 -0
- package/kotlin/fixtures/import-layout/Layout.d.kt.ts +7 -0
- package/kotlin/fixtures/import-layout/Layout.kt +72 -0
- package/kotlin/fixtures/import-layout/README.md +24 -0
- package/kotlin/fixtures/import-layout/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-layout/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-layout/package.json +23 -0
- package/kotlin/fixtures/import-layout/tsconfig.json +20 -0
- package/kotlin/fixtures/import-layout/vite.config.ts +20 -0
- package/kotlin/fixtures/import-navigation/ImportNavigation.native.tsx +18 -0
- package/kotlin/fixtures/import-navigation/Navigation.d.kt.ts +7 -0
- package/kotlin/fixtures/import-navigation/Navigation.kt +104 -0
- package/kotlin/fixtures/import-navigation/README.md +31 -0
- package/kotlin/fixtures/import-navigation/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-navigation/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-navigation/package.json +23 -0
- package/kotlin/fixtures/import-navigation/tsconfig.json +20 -0
- package/kotlin/fixtures/import-navigation/vite.config.ts +20 -0
- package/kotlin/fixtures/import-overlays/ImportOverlays.native.tsx +29 -0
- package/kotlin/fixtures/import-overlays/Overlays.d.kt.ts +7 -0
- package/kotlin/fixtures/import-overlays/Overlays.kt +93 -0
- package/kotlin/fixtures/import-overlays/README.md +34 -0
- package/kotlin/fixtures/import-overlays/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-overlays/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-overlays/package.json +23 -0
- package/kotlin/fixtures/import-overlays/tsconfig.json +20 -0
- package/kotlin/fixtures/import-overlays/vite.config.ts +20 -0
- package/kotlin/fixtures/import-scroll/ImportScroll.native.tsx +13 -0
- package/kotlin/fixtures/import-scroll/README.md +23 -0
- package/kotlin/fixtures/import-scroll/Scroll.d.kt.ts +7 -0
- package/kotlin/fixtures/import-scroll/Scroll.kt +91 -0
- package/kotlin/fixtures/import-scroll/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-scroll/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-scroll/package.json +23 -0
- package/kotlin/fixtures/import-scroll/tsconfig.json +20 -0
- package/kotlin/fixtures/import-scroll/vite.config.ts +20 -0
- package/kotlin/fixtures/import-selection/ImportSelection.native.tsx +44 -0
- package/kotlin/fixtures/import-selection/README.md +32 -0
- package/kotlin/fixtures/import-selection/Selection.d.kt.ts +8 -0
- package/kotlin/fixtures/import-selection/Selection.kt +78 -0
- package/kotlin/fixtures/import-selection/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-selection/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-selection/package.json +23 -0
- package/kotlin/fixtures/import-selection/tsconfig.json +20 -0
- package/kotlin/fixtures/import-selection/vite.config.ts +20 -0
- package/kotlin/fixtures/import-surfaces/ImportSurfaces.native.tsx +13 -0
- package/kotlin/fixtures/import-surfaces/README.md +22 -0
- package/kotlin/fixtures/import-surfaces/Surfaces.d.kt.ts +7 -0
- package/kotlin/fixtures/import-surfaces/Surfaces.kt +64 -0
- package/kotlin/fixtures/import-surfaces/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-surfaces/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-surfaces/package.json +23 -0
- package/kotlin/fixtures/import-surfaces/tsconfig.json +20 -0
- package/kotlin/fixtures/import-surfaces/vite.config.ts +20 -0
- package/kotlin/fixtures/import-values/ImportValues.native.tsx +35 -0
- package/kotlin/fixtures/import-values/README.md +23 -0
- package/kotlin/fixtures/import-values/Values.d.kt.ts +11 -0
- package/kotlin/fixtures/import-values/Values.kt +66 -0
- package/kotlin/fixtures/import-values/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-values/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-values/package.json +23 -0
- package/kotlin/fixtures/import-values/tsconfig.json +20 -0
- package/kotlin/fixtures/import-values/vite.config.ts +20 -0
- package/kotlin/fixtures/kotlin-app-variants/BarBehavior.kt +38 -0
- package/kotlin/fixtures/kotlin-app-variants/BarVisibility.kt +36 -0
- package/kotlin/fixtures/kotlin-app-variants/Ime.kt +3 -1
- package/kotlin/fixtures/kotlin-app-variants/TransientInsets.kt +50 -0
- package/kotlin/fork/NOTICE +6 -1
- package/kotlin/fork/README.md +15 -7
- package/kotlin/fork/build.sh +2 -0
- package/kotlin/fork/compose-worker-globals.patch +186 -4
- package/kotlin/fork/fork.json +2 -2
- package/kotlin/fork/skiko-worker-clock.patch +12 -0
- package/kotlin/toolchain.json +12 -12
- package/kotlin/tools/expo-types.main.kts +115 -0
- package/package.json +17 -23
- package/scripts/dev-server-scanner.ts +92 -66
- package/skills/contrast/SKILL.md +2 -2
- package/skills/peach-debug/SKILL.md +1 -1
- package/skills/peach-perf/SKILL.md +1 -1
- package/skills/peach-setup/SKILL.md +2 -1
- package/skills/peach-test/SKILL.md +8 -0
- package/src/assetCatalogContract.ts +43 -1
- package/src/bridge-contract-input.ts +46 -19
- package/src/bridge-contract.ts +0 -1
- package/src/bundle-channel.mjs +197 -84
- package/src/bundleGlobalFooter.ts +38 -0
- package/src/capture-contract.ts +107 -33
- package/src/cloud-contract.ts +5 -1
- package/src/cloud.ts +5 -2
- package/src/config.ts +22 -3
- package/src/configured-bundle-producer.ts +1 -1
- package/src/desktop-host-delivery.ts +95 -1
- package/src/dev-bundle-resolution.ts +1 -1
- package/src/expo-kotlin-bundle.ts +29 -0
- package/src/expo-kotlin-host.ts +201 -0
- package/src/expo-swift-host.ts +96 -76
- package/src/expoKotlinContract.ts +70 -0
- package/src/expoSwiftContract.ts +4 -25
- package/src/home-paths.ts +7 -4
- package/src/host/bridge-host.ts +23 -3
- package/src/host/fetch-proxy-handler.ts +13 -0
- package/src/host/fetch-proxy-overrides.ts +11 -0
- package/src/host/replacement-module-handler.ts +5 -2
- package/src/index.ts +3 -1
- package/src/kotlin-host.ts +463 -19
- package/src/metro-plugin.ts +56 -28
- package/src/metro-production-bundle.ts +2 -2
- package/src/native-app-identity-project.ts +190 -0
- package/src/native-app-identity.ts +367 -34
- package/src/native-firebase-config.ts +69 -15
- package/src/native-seam-manifest.ts +6 -0
- package/src/one-widget-discovery.ts +2 -1
- package/src/openstep-plist.ts +107 -0
- package/src/react-native-host-modules.ts +4 -0
- package/src/runtime-assets.ts +2 -2
- package/src/sim-client.ts +2 -2
- package/src/swift-binary-modules.ts +3 -1
- package/src/swift-compile.ts +286 -38
- package/src/swift-distribution-contract.ts +4 -0
- package/src/swift-distribution.lock.json +123 -12
- package/src/swift-distribution.ts +7 -3
- package/src/swift-host.ts +298 -83
- package/src/swift-package-manifest.ts +29 -2
- package/src/swift-package.ts +180 -10
- package/src/swift-packages.ts +4 -0
- package/src/swift-standin-emit.ts +4 -1
- package/src/swift-standins.ts +274 -15
- package/src/swift-submit.ts +62 -7
- package/src/swift-toolchain.ts +6 -1
- package/src/swiftContract.ts +126 -3
- package/src/vite-plugin-one.ts +13 -16
- package/src/vite-plugin-swift.ts +4 -5
- package/src/vite-plugin.ts +360 -144
- package/src/vite.d.ts +1 -1
- package/src/worker-system-chunks.ts +221 -0
- package/src/worklet-executable.ts +348 -38
- package/src/worklets-babel.ts +1 -1
- package/src/xcode-project.ts +243 -127
- package/dist-lib/agent-identity.cjs +0 -39
- package/dist-lib/agent-sessions.cjs +0 -760
- package/dist-lib/cli-constants.cjs +0 -32
- package/dist-lib/render-mode.cjs +0 -44
- package/kotlin/AppSources/android/view/View.kt +0 -74
- package/kotlin/AppSources/android/widget/FrameLayout.kt +0 -6
- package/src/render-mode.ts +0 -15
- /package/kotlin/{AppSources → AndroidViewSources}/android/content/Context.kt +0 -0
- /package/kotlin/{AppSources → AndroidViewSources}/android/content/res/Configuration.kt +0 -0
- /package/kotlin/{AppSources → AndroidViewSources}/android/graphics/Color.kt +0 -0
- /package/kotlin/{AppSources → AndroidViewSources}/android/util/DisplayMetrics.kt +0 -0
- /package/kotlin/{AppSources → AndroidViewSources}/dev/peach/app/JavaFormat.kt +0 -0
- /package/kotlin/{AppSources → Sources}/java/lang/Runnable.kt +0 -0
|
@@ -1,4 +1,96 @@
|
|
|
1
|
-
/*!
|
|
1
|
+
/*! peach v0.1.1400 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
|
|
2
|
+
|
|
3
|
+
// src/openstep-plist.ts
|
|
4
|
+
function parseOpenStepPlist(text) {
|
|
5
|
+
let i = 0;
|
|
6
|
+
const fail = (message) => {
|
|
7
|
+
const line = text.slice(0, i).split("\n").length;
|
|
8
|
+
throw new Error(`project.pbxproj line ${line}: ${message}`);
|
|
9
|
+
};
|
|
10
|
+
const skip = () => {
|
|
11
|
+
for (; ; ) {
|
|
12
|
+
const ch = text[i];
|
|
13
|
+
if (ch === " " || ch === " " || ch === "\n" || ch === "\r") i++;
|
|
14
|
+
else if (ch === "/" && text[i + 1] === "*") {
|
|
15
|
+
const end = text.indexOf("*/", i + 2);
|
|
16
|
+
if (end < 0) fail("unterminated comment");
|
|
17
|
+
i = end + 2;
|
|
18
|
+
} else if (ch === "/" && text[i + 1] === "/") {
|
|
19
|
+
const end = text.indexOf("\n", i);
|
|
20
|
+
i = end < 0 ? text.length : end + 1;
|
|
21
|
+
} else return;
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
const quoted = () => {
|
|
25
|
+
i++;
|
|
26
|
+
let out = "";
|
|
27
|
+
for (; ; ) {
|
|
28
|
+
const ch = text[i++];
|
|
29
|
+
if (ch === void 0) fail("unterminated string");
|
|
30
|
+
if (ch === '"') return out;
|
|
31
|
+
if (ch !== "\\") {
|
|
32
|
+
out += ch;
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
const next = text[i++];
|
|
36
|
+
if (next === "n") out += "\n";
|
|
37
|
+
else if (next === "t") out += " ";
|
|
38
|
+
else if (next === "r") out += "\r";
|
|
39
|
+
else if (next === "U") {
|
|
40
|
+
out += String.fromCharCode(parseInt(text.slice(i, i + 4), 16));
|
|
41
|
+
i += 4;
|
|
42
|
+
} else out += next;
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
const value = () => {
|
|
46
|
+
skip();
|
|
47
|
+
const ch = text[i];
|
|
48
|
+
if (ch === "{") {
|
|
49
|
+
i++;
|
|
50
|
+
const dict = {};
|
|
51
|
+
for (; ; ) {
|
|
52
|
+
skip();
|
|
53
|
+
if (text[i] === "}") {
|
|
54
|
+
i++;
|
|
55
|
+
return dict;
|
|
56
|
+
}
|
|
57
|
+
const key = value();
|
|
58
|
+
if (typeof key !== "string") fail("dictionary key is not a string");
|
|
59
|
+
skip();
|
|
60
|
+
if (text[i++] !== "=") fail("expected =");
|
|
61
|
+
if (Object.hasOwn(dict, key)) fail(`duplicate key ${key}`);
|
|
62
|
+
dict[key] = value();
|
|
63
|
+
skip();
|
|
64
|
+
if (text[i++] !== ";") fail("expected ;");
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
if (ch === "(") {
|
|
68
|
+
i++;
|
|
69
|
+
const list = [];
|
|
70
|
+
for (; ; ) {
|
|
71
|
+
skip();
|
|
72
|
+
if (text[i] === ")") {
|
|
73
|
+
i++;
|
|
74
|
+
return list;
|
|
75
|
+
}
|
|
76
|
+
list.push(value());
|
|
77
|
+
skip();
|
|
78
|
+
if (text[i] === ",") i++;
|
|
79
|
+
else if (text[i] !== ")") fail("expected , or )");
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
if (ch === '"') return quoted();
|
|
83
|
+
const start = i;
|
|
84
|
+
while (i < text.length && /[A-Za-z0-9_$+/:.\-<>]/.test(text[i])) i++;
|
|
85
|
+
if (i === start) fail(`unexpected ${JSON.stringify(ch ?? "end of file")}`);
|
|
86
|
+
return text.slice(start, i);
|
|
87
|
+
};
|
|
88
|
+
if (text.startsWith("// !$*UTF8*$!")) i = text.indexOf("\n") + 1;
|
|
89
|
+
const root = value();
|
|
90
|
+
skip();
|
|
91
|
+
if (i !== text.length) fail("trailing content");
|
|
92
|
+
return root;
|
|
93
|
+
}
|
|
2
94
|
|
|
3
95
|
// src/native-app-identity.ts
|
|
4
96
|
var NATIVE_APP_IDENTITY_PREFIX = "globalThis.__sootsimNativeAppIdentity=";
|
|
@@ -12,12 +104,37 @@ function nonEmptyString(value) {
|
|
|
12
104
|
}
|
|
13
105
|
function isNativeAppIdentity(value) {
|
|
14
106
|
if (!isRecord(value)) return false;
|
|
107
|
+
const oneUpdates = value.oneUpdates;
|
|
108
|
+
if (oneUpdates !== void 0 && (!isRecord(oneUpdates) || typeof oneUpdates.enabled !== "boolean" || oneUpdates.url !== null && typeof oneUpdates.url !== "string" || oneUpdates.runtimeVersion !== null && typeof oneUpdates.runtimeVersion !== "string" || oneUpdates.embeddedManifestJson !== null && typeof oneUpdates.embeddedManifestJson !== "string" || oneUpdates.enabled && (typeof oneUpdates.url !== "string" || oneUpdates.url.length === 0 || typeof oneUpdates.runtimeVersion !== "string" || oneUpdates.runtimeVersion.length === 0))) {
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
15
111
|
const descriptions = value.permissionUsageDescriptions;
|
|
16
112
|
if (descriptions !== void 0 && !isRecord(descriptions)) return false;
|
|
17
113
|
if (value.urlQuerySchemes !== void 0 && !Array.isArray(value.urlQuerySchemes))
|
|
18
114
|
return false;
|
|
19
115
|
if (value.appIntentIdentifiers !== void 0 && (!Array.isArray(value.appIntentIdentifiers) || !value.appIntentIdentifiers.every((identifier) => typeof identifier === "string")))
|
|
20
116
|
return false;
|
|
117
|
+
if (value.backgroundTaskIdentifiers !== void 0 && (!Array.isArray(value.backgroundTaskIdentifiers) || !value.backgroundTaskIdentifiers.every(
|
|
118
|
+
(identifier) => typeof identifier === "string"
|
|
119
|
+
)))
|
|
120
|
+
return false;
|
|
121
|
+
if (value.backgroundModes !== void 0 && (!Array.isArray(value.backgroundModes) || !value.backgroundModes.every((mode) => typeof mode === "string")))
|
|
122
|
+
return false;
|
|
123
|
+
if (value.shareIntoAppGroupId !== void 0 && typeof value.shareIntoAppGroupId !== "string")
|
|
124
|
+
return false;
|
|
125
|
+
if (value.applicationDisplayName !== void 0 && typeof value.applicationDisplayName !== "string")
|
|
126
|
+
return false;
|
|
127
|
+
if (value.rootViewBackgroundColor !== void 0 && (typeof value.rootViewBackgroundColor !== "number" || !Number.isInteger(value.rootViewBackgroundColor)))
|
|
128
|
+
return false;
|
|
129
|
+
for (const orientations of [
|
|
130
|
+
value.supportedInterfaceOrientations,
|
|
131
|
+
value.ipadSupportedInterfaceOrientations
|
|
132
|
+
]) {
|
|
133
|
+
if (orientations !== void 0 && (!Array.isArray(orientations) || !orientations.every((orientation) => typeof orientation === "string")))
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
if (value.defaultScreenOrientationMask !== void 0 && typeof value.defaultScreenOrientationMask !== "string")
|
|
137
|
+
return false;
|
|
21
138
|
const platform = value.platform;
|
|
22
139
|
if (value.alternateIconNames !== void 0 && (!Array.isArray(value.alternateIconNames) || !value.alternateIconNames.every((name) => typeof name === "string")))
|
|
23
140
|
return false;
|
|
@@ -40,6 +157,8 @@ function readNativeAppIdentity(value) {
|
|
|
40
157
|
}
|
|
41
158
|
return {
|
|
42
159
|
applicationName: value.applicationName,
|
|
160
|
+
...value.applicationDisplayName === void 0 ? {} : { applicationDisplayName: value.applicationDisplayName },
|
|
161
|
+
...value.rootViewBackgroundColor === void 0 ? {} : { rootViewBackgroundColor: value.rootViewBackgroundColor },
|
|
43
162
|
...value.bundleName === void 0 ? {} : { bundleName: value.bundleName },
|
|
44
163
|
appVersion: value.appVersion,
|
|
45
164
|
buildVersion: value.buildVersion,
|
|
@@ -50,7 +169,27 @@ function readNativeAppIdentity(value) {
|
|
|
50
169
|
permissionUsageDescriptions: { ...value.permissionUsageDescriptions }
|
|
51
170
|
},
|
|
52
171
|
...value.appIntentIdentifiers === void 0 ? {} : { appIntentIdentifiers: [...value.appIntentIdentifiers] },
|
|
53
|
-
...value.
|
|
172
|
+
...value.backgroundTaskIdentifiers === void 0 ? {} : { backgroundTaskIdentifiers: [...value.backgroundTaskIdentifiers] },
|
|
173
|
+
...value.supportedInterfaceOrientations === void 0 ? {} : {
|
|
174
|
+
supportedInterfaceOrientations: [...value.supportedInterfaceOrientations]
|
|
175
|
+
},
|
|
176
|
+
...value.ipadSupportedInterfaceOrientations === void 0 ? {} : {
|
|
177
|
+
ipadSupportedInterfaceOrientations: [
|
|
178
|
+
...value.ipadSupportedInterfaceOrientations
|
|
179
|
+
]
|
|
180
|
+
},
|
|
181
|
+
...value.defaultScreenOrientationMask === void 0 ? {} : { defaultScreenOrientationMask: value.defaultScreenOrientationMask },
|
|
182
|
+
...value.backgroundModes === void 0 ? {} : { backgroundModes: [...value.backgroundModes] },
|
|
183
|
+
...value.shareIntoAppGroupId === void 0 ? {} : { shareIntoAppGroupId: value.shareIntoAppGroupId },
|
|
184
|
+
...value.urlQuerySchemes === void 0 ? {} : { urlQuerySchemes: [...value.urlQuerySchemes] },
|
|
185
|
+
...value.oneUpdates === void 0 ? {} : {
|
|
186
|
+
oneUpdates: {
|
|
187
|
+
enabled: value.oneUpdates.enabled,
|
|
188
|
+
url: value.oneUpdates.url,
|
|
189
|
+
runtimeVersion: value.oneUpdates.runtimeVersion,
|
|
190
|
+
embeddedManifestJson: value.oneUpdates.embeddedManifestJson
|
|
191
|
+
}
|
|
192
|
+
}
|
|
54
193
|
};
|
|
55
194
|
}
|
|
56
195
|
function createNativeAppIdentityHeader(identity) {
|
|
@@ -78,7 +217,10 @@ function readNativeAppIdentityFromBundle(source, header) {
|
|
|
78
217
|
}
|
|
79
218
|
const identity = readNativeAppIdentity(value);
|
|
80
219
|
if (!identity) throw new Error("native app identity response header is malformed");
|
|
81
|
-
|
|
220
|
+
const footerIdentity = footer ? readNativeAppIdentity(footer) : null;
|
|
221
|
+
const headerBase = { ...identity, oneUpdates: void 0 };
|
|
222
|
+
const footerBase = footerIdentity && { ...footerIdentity, oneUpdates: void 0 };
|
|
223
|
+
if (footerIdentity && !equalIdentityValues(headerBase, footerBase)) {
|
|
82
224
|
throw new Error("native app identity response header conflicts with bundle footer");
|
|
83
225
|
}
|
|
84
226
|
return identity;
|
|
@@ -93,7 +235,9 @@ function getAppliedNativeAppIdentity() {
|
|
|
93
235
|
return isNativeAppIdentity(value) ? value : null;
|
|
94
236
|
}
|
|
95
237
|
function createNativeAppIdentityFooter(identity) {
|
|
96
|
-
const
|
|
238
|
+
const footerIdentity = { ...identity };
|
|
239
|
+
delete footerIdentity.oneUpdates;
|
|
240
|
+
const payload = JSON.stringify(footerIdentity).replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029").replace(/<\//g, "<\\/");
|
|
97
241
|
return `
|
|
98
242
|
${NATIVE_APP_IDENTITY_PREFIX}${payload};`;
|
|
99
243
|
}
|
|
@@ -118,6 +262,9 @@ function readNativeAppIdentityFooter(source) {
|
|
|
118
262
|
if (!isNativeAppIdentity(parsed)) {
|
|
119
263
|
throw new Error("native app identity footer is malformed");
|
|
120
264
|
}
|
|
265
|
+
if (parsed.oneUpdates !== void 0) {
|
|
266
|
+
throw new Error("native app identity footer cannot contain one updates receipt");
|
|
267
|
+
}
|
|
121
268
|
return parsed;
|
|
122
269
|
}
|
|
123
270
|
function detachNativeAppIdentityFooter(source) {
|
|
@@ -221,30 +368,119 @@ function appTargetReleaseSettings(pbxproj, targetName, infoPlistRelativePath) {
|
|
|
221
368
|
(candidate) => candidate.name === "Release" && named(candidate.settings)
|
|
222
369
|
)?.settings ?? null;
|
|
223
370
|
}
|
|
224
|
-
function nativeAppIdentityFromIos(files, parseInfoPlist) {
|
|
371
|
+
function nativeAppIdentityFromIos(files, parseInfoPlist, iosTarget) {
|
|
225
372
|
const pbxprojPath = Object.keys(files).find(
|
|
226
373
|
(path) => /(?:^|\/)ios\/[^/]+\.xcodeproj\/project\.pbxproj$/.test(path)
|
|
227
|
-
)
|
|
374
|
+
) ?? Object.keys(files).find(
|
|
375
|
+
(path) => /(?:^|\/)[^/]+\.xcodeproj\/project\.pbxproj$/.test(path)
|
|
376
|
+
) ?? Object.keys(files).find((path) => /(?:^|\/)project\.pbxproj$/.test(path));
|
|
228
377
|
if (!pbxprojPath) return null;
|
|
229
378
|
const pbxproj = files[pbxprojPath];
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
)
|
|
235
|
-
|
|
379
|
+
let objects = {};
|
|
380
|
+
try {
|
|
381
|
+
const parsed = parseOpenStepPlist(pbxproj);
|
|
382
|
+
if (isRecord(parsed)) {
|
|
383
|
+
objects = isRecord(parsed.objects) ? parsed.objects : parsed;
|
|
384
|
+
}
|
|
385
|
+
} catch {
|
|
386
|
+
}
|
|
387
|
+
const targets = [];
|
|
388
|
+
for (const [id, obj] of Object.entries(objects)) {
|
|
389
|
+
if (isRecord(obj) && obj.isa === "PBXNativeTarget" && typeof obj.name === "string") {
|
|
390
|
+
targets.push({
|
|
391
|
+
id,
|
|
392
|
+
name: obj.name,
|
|
393
|
+
productType: typeof obj.productType === "string" ? obj.productType : void 0,
|
|
394
|
+
buildConfigurationList: typeof obj.buildConfigurationList === "string" ? obj.buildConfigurationList : void 0
|
|
395
|
+
});
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
const applicationTargetNames = new Set(
|
|
399
|
+
targets.filter((t) => t.productType === "com.apple.product-type.application").map((t) => t.name)
|
|
236
400
|
);
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
401
|
+
if (applicationTargetNames.size === 0) {
|
|
402
|
+
for (const match of pbxproj.matchAll(
|
|
403
|
+
/isa = PBXNativeTarget;[^}]*?name = "?([^";]+)"?;[^}]*?productType = "com\.apple\.product-type\.application";/g
|
|
404
|
+
)) {
|
|
405
|
+
applicationTargetNames.add(match[1]);
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
let targetName = null;
|
|
409
|
+
if (iosTarget) {
|
|
410
|
+
if (applicationTargetNames.has(iosTarget)) {
|
|
411
|
+
targetName = iosTarget;
|
|
412
|
+
} else {
|
|
413
|
+
return null;
|
|
414
|
+
}
|
|
415
|
+
} else if (applicationTargetNames.size === 1) {
|
|
416
|
+
targetName = [...applicationTargetNames][0];
|
|
417
|
+
} else if (applicationTargetNames.size > 1) {
|
|
418
|
+
const appDelegatePattern = /(?:^|\/)ios\/([^/]+)\/AppDelegate\.(?:swift|mm|m)$/;
|
|
419
|
+
const delegateTargets = Object.keys(files).filter((path) => !path.includes("/Pods/")).map((path) => path.match(appDelegatePattern)?.[1]).filter(
|
|
420
|
+
(name) => typeof name === "string" && applicationTargetNames.has(name)
|
|
421
|
+
);
|
|
422
|
+
if (delegateTargets.length === 1) {
|
|
423
|
+
targetName = delegateTargets[0];
|
|
424
|
+
} else {
|
|
425
|
+
return null;
|
|
426
|
+
}
|
|
427
|
+
} else {
|
|
428
|
+
return null;
|
|
429
|
+
}
|
|
430
|
+
const selectedTarget = targets.find((t) => t.name === targetName);
|
|
431
|
+
const settings = {
|
|
432
|
+
TARGET_NAME: targetName,
|
|
433
|
+
PRODUCT_NAME: targetName
|
|
434
|
+
};
|
|
435
|
+
for (const obj of Object.values(objects)) {
|
|
436
|
+
if (isRecord(obj) && obj.isa === "PBXProject" && typeof obj.buildConfigurationList === "string") {
|
|
437
|
+
const listObj = objects[obj.buildConfigurationList];
|
|
438
|
+
if (isRecord(listObj) && Array.isArray(listObj.buildConfigurations)) {
|
|
439
|
+
for (const configId of listObj.buildConfigurations) {
|
|
440
|
+
if (typeof configId === "string") {
|
|
441
|
+
const configObj = objects[configId];
|
|
442
|
+
if (isRecord(configObj) && configObj.name === "Release" && isRecord(configObj.buildSettings)) {
|
|
443
|
+
for (const [k, v] of Object.entries(configObj.buildSettings)) {
|
|
444
|
+
if (typeof v === "string") settings[k] = v;
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
if (selectedTarget?.buildConfigurationList) {
|
|
453
|
+
const listObj = objects[selectedTarget.buildConfigurationList];
|
|
454
|
+
if (isRecord(listObj) && Array.isArray(listObj.buildConfigurations)) {
|
|
455
|
+
for (const configId of listObj.buildConfigurations) {
|
|
456
|
+
if (typeof configId === "string") {
|
|
457
|
+
const configObj = objects[configId];
|
|
458
|
+
if (isRecord(configObj) && configObj.name === "Release" && isRecord(configObj.buildSettings)) {
|
|
459
|
+
for (const [k, v] of Object.entries(configObj.buildSettings)) {
|
|
460
|
+
if (typeof v === "string") settings[k] = v;
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
} else {
|
|
467
|
+
const legacy = appTargetReleaseSettings(
|
|
468
|
+
pbxproj,
|
|
469
|
+
targetName,
|
|
470
|
+
`${targetName}/Info.plist`
|
|
471
|
+
);
|
|
472
|
+
if (legacy) Object.assign(settings, legacy);
|
|
473
|
+
}
|
|
474
|
+
let plist;
|
|
475
|
+
const infoPlistPath = settings.INFOPLIST_FILE;
|
|
476
|
+
if (infoPlistPath) {
|
|
477
|
+
const normalized = infoPlistPath.replace(/^"|"$/g, "");
|
|
478
|
+
plist = files[`ios/${normalized}`] ?? files[normalized] ?? Object.entries(files).find(([k]) => k.endsWith(`/${normalized}`))?.[1];
|
|
479
|
+
}
|
|
480
|
+
if (!plist) {
|
|
481
|
+
plist = files[`ios/${targetName}/Info.plist`] ?? files[`${targetName}/Info.plist`] ?? Object.entries(files).find(([k]) => k.endsWith(`/${targetName}/Info.plist`))?.[1];
|
|
482
|
+
}
|
|
241
483
|
if (!plist) return null;
|
|
242
|
-
const settings = appTargetReleaseSettings(
|
|
243
|
-
pbxproj,
|
|
244
|
-
targetName,
|
|
245
|
-
`${targetName}/Info.plist`
|
|
246
|
-
);
|
|
247
|
-
if (!settings) return null;
|
|
248
484
|
const bundleIdentifier = identityFieldFrom(
|
|
249
485
|
settings,
|
|
250
486
|
plistString(plist, "CFBundleIdentifier"),
|
|
@@ -271,6 +507,12 @@ function nativeAppIdentityFromIos(files, parseInfoPlist) {
|
|
|
271
507
|
const applicationName = identityFieldFrom(settings, plistString(plist, "CFBundleDisplayName"), void 0) ?? bundleName;
|
|
272
508
|
const dictionary = parseInfoPlist(plist);
|
|
273
509
|
if (!isRecord(dictionary)) throw new Error("native app Info.plist is not a dictionary");
|
|
510
|
+
const declaredDisplayName = dictionary.CFBundleDisplayName;
|
|
511
|
+
const applicationDisplayName = typeof declaredDisplayName === "string" ? resolveBuildSetting(declaredDisplayName, settings) : void 0;
|
|
512
|
+
if (applicationDisplayName === null)
|
|
513
|
+
throw new Error("native app Info.plist CFBundleDisplayName is unresolved");
|
|
514
|
+
const declaredBackgroundColor = dictionary.RCTRootViewBackgroundColor;
|
|
515
|
+
const rootViewBackgroundColor = typeof declaredBackgroundColor === "number" && Number.isInteger(declaredBackgroundColor) ? declaredBackgroundColor : void 0;
|
|
274
516
|
const icons = dictionary.CFBundleIcons;
|
|
275
517
|
const alternates = isRecord(icons) ? icons.CFBundleAlternateIcons : void 0;
|
|
276
518
|
const alternateIconNames = /* @__PURE__ */ new Set();
|
|
@@ -290,6 +532,32 @@ function nativeAppIdentityFromIos(files, parseInfoPlist) {
|
|
|
290
532
|
}
|
|
291
533
|
const intentIds = dictionary.OneAppIntentIdentifiers;
|
|
292
534
|
const appIntentIdentifiers = Array.isArray(intentIds) && intentIds.every((value) => typeof value === "string") ? intentIds.map((value) => resolveBuildSetting(value, settings)) : [];
|
|
535
|
+
const backgroundIds = dictionary.BGTaskSchedulerPermittedIdentifiers;
|
|
536
|
+
const backgroundTaskIdentifiers = Array.isArray(backgroundIds) && backgroundIds.every((value) => typeof value === "string") ? backgroundIds.map((value) => resolveBuildSetting(value, settings)) : [];
|
|
537
|
+
const declaredModes = dictionary.UIBackgroundModes;
|
|
538
|
+
const backgroundModes = Array.isArray(declaredModes) && declaredModes.every((value) => typeof value === "string") ? declaredModes.map((value) => resolveBuildSetting(value, settings)) : [];
|
|
539
|
+
const screenOrientationLists = [
|
|
540
|
+
"UISupportedInterfaceOrientations",
|
|
541
|
+
"UISupportedInterfaceOrientations~ipad"
|
|
542
|
+
].map((key) => {
|
|
543
|
+
const list = dictionary[key];
|
|
544
|
+
if (!Array.isArray(list) || !list.every((value) => typeof value === "string"))
|
|
545
|
+
return [];
|
|
546
|
+
return list.map((value) => {
|
|
547
|
+
const resolved = resolveBuildSetting(value, settings);
|
|
548
|
+
if (resolved === null) throw new Error(`native app Info.plist ${key} is unresolved`);
|
|
549
|
+
return resolved;
|
|
550
|
+
});
|
|
551
|
+
});
|
|
552
|
+
const [supportedInterfaceOrientations, ipadSupportedInterfaceOrientations] = screenOrientationLists;
|
|
553
|
+
const declaredDefaultOrientationMask = dictionary.EXDefaultScreenOrientationMask;
|
|
554
|
+
const defaultScreenOrientationMask = typeof declaredDefaultOrientationMask === "string" ? resolveBuildSetting(declaredDefaultOrientationMask, settings) : void 0;
|
|
555
|
+
if (defaultScreenOrientationMask === null)
|
|
556
|
+
throw new Error("native app Info.plist EXDefaultScreenOrientationMask is unresolved");
|
|
557
|
+
const declaredShareGroup = dictionary.ExpoShareIntoAppGroupId;
|
|
558
|
+
const shareIntoAppGroupId = typeof declaredShareGroup === "string" ? resolveBuildSetting(declaredShareGroup, settings) : void 0;
|
|
559
|
+
if (shareIntoAppGroupId === null)
|
|
560
|
+
throw new Error("native app Info.plist ExpoShareIntoAppGroupId is unresolved");
|
|
293
561
|
const querySchemes = dictionary.LSApplicationQueriesSchemes;
|
|
294
562
|
if (querySchemes !== void 0 && !Array.isArray(querySchemes)) {
|
|
295
563
|
throw new Error("native app Info.plist LSApplicationQueriesSchemes is not an array");
|
|
@@ -303,7 +571,8 @@ function nativeAppIdentityFromIos(files, parseInfoPlist) {
|
|
|
303
571
|
});
|
|
304
572
|
const permissionUsageDescriptions = {};
|
|
305
573
|
for (const [key, value] of Object.entries(dictionary)) {
|
|
306
|
-
if (!/^NS.*UsageDescription$/.test(key))
|
|
574
|
+
if (!/^NS.*UsageDescription$/.test(key) && key !== "NSLocationTemporaryUsageDescriptionDictionary")
|
|
575
|
+
continue;
|
|
307
576
|
if (typeof value !== "string") {
|
|
308
577
|
permissionUsageDescriptions[key] = value;
|
|
309
578
|
continue;
|
|
@@ -324,22 +593,30 @@ function nativeAppIdentityFromIos(files, parseInfoPlist) {
|
|
|
324
593
|
}
|
|
325
594
|
return {
|
|
326
595
|
applicationName,
|
|
596
|
+
...applicationDisplayName === void 0 ? {} : { applicationDisplayName },
|
|
597
|
+
...rootViewBackgroundColor === void 0 ? {} : { rootViewBackgroundColor },
|
|
327
598
|
bundleName,
|
|
328
599
|
appVersion,
|
|
329
600
|
buildVersion,
|
|
330
601
|
bundleIdentifier,
|
|
331
602
|
platform: "ios",
|
|
603
|
+
supportedInterfaceOrientations,
|
|
604
|
+
ipadSupportedInterfaceOrientations,
|
|
605
|
+
...defaultScreenOrientationMask === void 0 ? {} : { defaultScreenOrientationMask },
|
|
332
606
|
alternateIconNames: [...alternateIconNames],
|
|
333
607
|
permissionUsageDescriptions,
|
|
334
608
|
urlQuerySchemes,
|
|
609
|
+
...shareIntoAppGroupId === void 0 ? {} : { shareIntoAppGroupId },
|
|
610
|
+
backgroundTaskIdentifiers: backgroundTaskIdentifiers.every((value) => value !== null) ? backgroundTaskIdentifiers : [],
|
|
611
|
+
backgroundModes: backgroundModes.every((value) => value !== null) ? backgroundModes : [],
|
|
335
612
|
appIntentIdentifiers: appIntentIdentifiers.every((value) => value !== null) ? appIntentIdentifiers : []
|
|
336
613
|
};
|
|
337
614
|
}
|
|
338
615
|
function canExtractNativeAppIdentity(platform) {
|
|
339
616
|
return platform === "ios";
|
|
340
617
|
}
|
|
341
|
-
function extractNativeAppIdentityFromFiles(files, platform, parseInfoPlist) {
|
|
342
|
-
return canExtractNativeAppIdentity(platform) ? nativeAppIdentityFromIos(files, parseInfoPlist) : null;
|
|
618
|
+
function extractNativeAppIdentityFromFiles(files, platform, parseInfoPlist, iosTarget) {
|
|
619
|
+
return canExtractNativeAppIdentity(platform) ? nativeAppIdentityFromIos(files, parseInfoPlist, iosTarget) : null;
|
|
343
620
|
}
|
|
344
621
|
export {
|
|
345
622
|
NATIVE_APP_IDENTITY_HEADER,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*!
|
|
1
|
+
/*! peach v0.1.1400 | (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/plist.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*!
|
|
1
|
+
/*! peach v0.1.1400 | (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 __create = Object.create;
|
package/dist-lib/plist.mjs
CHANGED
package/dist-lib/profiles.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*!
|
|
1
|
+
/*! peach v0.1.1400 | (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 __create = Object.create;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*!
|
|
1
|
+
/*! peach v0.1.1400 | (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;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*!
|
|
1
|
+
/*! peach v0.1.1400 | (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;
|
|
@@ -27,6 +27,10 @@ __export(react_native_host_modules_exports, {
|
|
|
27
27
|
});
|
|
28
28
|
module.exports = __toCommonJS(react_native_host_modules_exports);
|
|
29
29
|
var REACT_NATIVE_PASSTHROUGH_SPECIFIERS = [
|
|
30
|
+
// sdk 58 reads these upstream getters and wraps the original metro logger.
|
|
31
|
+
"react-native/unstable-internals-do-not-use",
|
|
32
|
+
"react-native/src/unstable-internals-do-not-use",
|
|
33
|
+
"react-native/Libraries/Utilities/HMRClient",
|
|
30
34
|
"react-native/Libraries/vendor/emitter",
|
|
31
35
|
"react-native/Libraries/Components/View/ReactNativeStyleAttributes",
|
|
32
36
|
"react-native/Libraries/StyleSheet",
|
|
@@ -1,7 +1,11 @@
|
|
|
1
|
-
/*!
|
|
1
|
+
/*! peach v0.1.1400 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
|
|
2
2
|
|
|
3
3
|
// src/react-native-host-modules.ts
|
|
4
4
|
var REACT_NATIVE_PASSTHROUGH_SPECIFIERS = [
|
|
5
|
+
// sdk 58 reads these upstream getters and wraps the original metro logger.
|
|
6
|
+
"react-native/unstable-internals-do-not-use",
|
|
7
|
+
"react-native/src/unstable-internals-do-not-use",
|
|
8
|
+
"react-native/Libraries/Utilities/HMRClient",
|
|
5
9
|
"react-native/Libraries/vendor/emitter",
|
|
6
10
|
"react-native/Libraries/Components/View/ReactNativeStyleAttributes",
|
|
7
11
|
"react-native/Libraries/StyleSheet",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*!
|
|
1
|
+
/*! peach v0.1.1400 | (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 __create = Object.create;
|
|
@@ -280,7 +280,6 @@ __export(dev_server_scanner_exports, {
|
|
|
280
280
|
__shouldReuseScannerCacheEntry: () => __shouldReuseScannerCacheEntry,
|
|
281
281
|
discoverListeningPorts: () => discoverListeningPorts,
|
|
282
282
|
discoverListeningProcesses: () => discoverListeningProcesses,
|
|
283
|
-
pidFromNetstat: () => pidFromNetstat,
|
|
284
283
|
probePort: () => probePort,
|
|
285
284
|
resolveListeningPid: () => resolveListeningPid,
|
|
286
285
|
resolveProcessCwd: () => resolveProcessCwd,
|
|
@@ -470,7 +469,7 @@ function hasOwnKeys(value) {
|
|
|
470
469
|
}
|
|
471
470
|
function hasPeachConfig(config) {
|
|
472
471
|
if (!config) return false;
|
|
473
|
-
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);
|
|
472
|
+
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);
|
|
474
473
|
}
|
|
475
474
|
function applyPeachConfigToUrl(url, config) {
|
|
476
475
|
const parsed = new URL(url);
|
|
@@ -590,9 +589,9 @@ function configuredWidgetFromScan(value, bundleUrl) {
|
|
|
590
589
|
}
|
|
591
590
|
|
|
592
591
|
// src/one-widget-discovery.ts
|
|
593
|
-
async function readConfiguredOneWidget(bundleUrl) {
|
|
592
|
+
async function readConfiguredOneWidget(bundleUrl, fetchScan = fetch) {
|
|
594
593
|
try {
|
|
595
|
-
const response = await
|
|
594
|
+
const response = await fetchScan(new URL("/__server-scan", bundleUrl).href, {
|
|
596
595
|
signal: AbortSignal.timeout(3e4)
|
|
597
596
|
});
|
|
598
597
|
if (!response.ok || !response.headers.get("content-type")?.includes("json"))
|
|
@@ -1215,30 +1214,19 @@ async function discoverListeningPorts(excludePorts = []) {
|
|
|
1215
1214
|
const processes = await discoverListeningProcesses(excludePorts);
|
|
1216
1215
|
return processes.map((p) => p.port);
|
|
1217
1216
|
}
|
|
1218
|
-
function pidFromNetstat(stdout, port) {
|
|
1219
|
-
for (const line of stdout.split("\n")) {
|
|
1220
|
-
if (!line.includes("LISTEN")) continue;
|
|
1221
|
-
const parts = line.trim().split(/\s+/);
|
|
1222
|
-
if (!parts[3]?.endsWith(`.${port}`)) continue;
|
|
1223
|
-
for (const token of parts) {
|
|
1224
|
-
const owner = token.match(/^\S+:(\d+)$/);
|
|
1225
|
-
if (owner) {
|
|
1226
|
-
const pid = Number(owner[1]);
|
|
1227
|
-
if (pid > 0) return pid;
|
|
1228
|
-
}
|
|
1229
|
-
}
|
|
1230
|
-
}
|
|
1231
|
-
return null;
|
|
1232
|
-
}
|
|
1233
1217
|
async function resolveListeningPid(port) {
|
|
1234
1218
|
if (!Number.isInteger(port) || port <= 0) return null;
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1219
|
+
if (process.platform === "darwin") {
|
|
1220
|
+
try {
|
|
1221
|
+
const { stdout } = await execGuarded(
|
|
1222
|
+
`lsof -nP -a -iTCP:${port} -sTCP:LISTEN -t 2>/dev/null`,
|
|
1223
|
+
8e3
|
|
1224
|
+
);
|
|
1225
|
+
const pids = [...new Set(stdout.trim().split(/\s+/).map(Number))];
|
|
1226
|
+
return pids.length === 1 && Number.isInteger(pids[0]) && pids[0] > 0 ? pids[0] : null;
|
|
1227
|
+
} catch {
|
|
1228
|
+
return null;
|
|
1229
|
+
}
|
|
1242
1230
|
}
|
|
1243
1231
|
try {
|
|
1244
1232
|
const { stdout } = await execGuarded(`ss -tlnp 2>/dev/null`, 8e3, {
|
|
@@ -1482,15 +1470,53 @@ async function probePort(port, buildIconProxyUrl, listeningProcess) {
|
|
|
1482
1470
|
...ownerCwd ? { cwd: ownerCwd } : {}
|
|
1483
1471
|
};
|
|
1484
1472
|
const onePath = `/node_modules/one/metro-entry.bundle?platform=ios&dev=true`;
|
|
1485
|
-
const [sootsimRes, statusRes, manifestRes, expoRes, swiftRes] = await Promise.all([
|
|
1486
|
-
knownNonPatched.has(port) ? Promise.resolve(null) : httpGet(probeHostname, port, "/
|
|
1473
|
+
const [sootsimRes, statusRes, manifestRes, expoRes, swiftRes, oneScanRes] = await Promise.all([
|
|
1474
|
+
knownNonPatched.has(port) ? Promise.resolve(null) : httpGet(probeHostname, port, "/__peachsim/"),
|
|
1487
1475
|
httpGet(probeHostname, port, "/status"),
|
|
1488
1476
|
knownOne.has(port) ? Promise.resolve(null) : httpGet(probeHostname, port, "/", "GET", MANIFEST_TIMEOUT_MS, {
|
|
1489
1477
|
"expo-platform": "ios"
|
|
1490
1478
|
}),
|
|
1491
1479
|
knownNonExpo.has(port) ? Promise.resolve(null) : httpGet(probeHostname, port, "/_expo/status"),
|
|
1492
|
-
httpGet(probeHostname, port, SWIFT_DISCOVERY_PATH)
|
|
1480
|
+
httpGet(probeHostname, port, SWIFT_DISCOVERY_PATH),
|
|
1481
|
+
httpGet(probeHostname, port, "/__server-scan", "GET", MANIFEST_TIMEOUT_MS)
|
|
1493
1482
|
]);
|
|
1483
|
+
const oneScan = oneScanRes?.statusCode === 200 ? safeParseManifest(oneScanRes.body) : null;
|
|
1484
|
+
if (Array.isArray(oneScan)) {
|
|
1485
|
+
for (const entry of oneScan) {
|
|
1486
|
+
if (!entry || typeof entry !== "object" || entry.framework !== "one" || entry.port !== port || typeof entry.bundleUrl !== "string")
|
|
1487
|
+
continue;
|
|
1488
|
+
let bundle;
|
|
1489
|
+
try {
|
|
1490
|
+
bundle = new URL(entry.bundleUrl);
|
|
1491
|
+
} catch {
|
|
1492
|
+
continue;
|
|
1493
|
+
}
|
|
1494
|
+
if (bundle.protocol !== "http:" || !isLoopbackHost(bundle.hostname) || bundle.port !== String(port) || !bundle.pathname.endsWith("/one/metro-entry.bundle"))
|
|
1495
|
+
continue;
|
|
1496
|
+
knownOne.add(port);
|
|
1497
|
+
return enrichWithManifest(
|
|
1498
|
+
applyManifest(
|
|
1499
|
+
{
|
|
1500
|
+
port,
|
|
1501
|
+
framework: "one",
|
|
1502
|
+
bundleUrl: withRuntimeConfig(
|
|
1503
|
+
port,
|
|
1504
|
+
alignLoopbackBundleUrlWithProbe(
|
|
1505
|
+
bundle.href,
|
|
1506
|
+
buildLoopbackProbeBaseUrl("http:", probeHostname, port)
|
|
1507
|
+
),
|
|
1508
|
+
owner.cwd
|
|
1509
|
+
),
|
|
1510
|
+
lastSeen: Date.now(),
|
|
1511
|
+
...owner
|
|
1512
|
+
},
|
|
1513
|
+
manifestRes,
|
|
1514
|
+
buildIconProxyUrl
|
|
1515
|
+
),
|
|
1516
|
+
buildIconProxyUrl
|
|
1517
|
+
);
|
|
1518
|
+
}
|
|
1519
|
+
}
|
|
1494
1520
|
const swift = swiftRes?.statusCode === 200 ? parseSwiftHostDiscovery(safeParseManifest(swiftRes.body)) : null;
|
|
1495
1521
|
if (swift) {
|
|
1496
1522
|
const base = buildLoopbackProbeBaseUrl("http:", probeHostname, port);
|
|
@@ -1560,7 +1586,7 @@ async function probePort(port, buildIconProxyUrl, listeningProcess) {
|
|
|
1560
1586
|
framework: "one",
|
|
1561
1587
|
bundleUrl: withRuntimeConfig(
|
|
1562
1588
|
port,
|
|
1563
|
-
`${buildLoopbackProbeBaseUrl("http:", probeHostname, port)}/
|
|
1589
|
+
`${buildLoopbackProbeBaseUrl("http:", probeHostname, port)}/__peachsim/bundle.js`,
|
|
1564
1590
|
owner.cwd
|
|
1565
1591
|
),
|
|
1566
1592
|
hmrUrl: `${buildLoopbackProbeBaseUrl("ws:", probeHostname, port)}/hot`,
|
|
@@ -1753,7 +1779,6 @@ async function scanDevServers(opts = {}) {
|
|
|
1753
1779
|
__shouldReuseScannerCacheEntry,
|
|
1754
1780
|
discoverListeningPorts,
|
|
1755
1781
|
discoverListeningProcesses,
|
|
1756
|
-
pidFromNetstat,
|
|
1757
1782
|
probePort,
|
|
1758
1783
|
resolveListeningPid,
|
|
1759
1784
|
resolveProcessCwd,
|