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
package/src/metro-plugin.ts
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
// when active changes, so one loaded shell cannot mix runtime chunk trees.
|
|
6
6
|
//
|
|
7
7
|
// usage in metro.config.js:
|
|
8
|
-
// const {
|
|
9
|
-
// module.exports =
|
|
8
|
+
// const { withPeach } = require('peachsim/metro')
|
|
9
|
+
// module.exports = withPeach(getDefaultConfig(__dirname))
|
|
10
10
|
|
|
11
11
|
import fs from 'fs'
|
|
12
12
|
import { createRequire } from 'module'
|
|
@@ -21,8 +21,8 @@ import {
|
|
|
21
21
|
import {
|
|
22
22
|
appendRNXMetroModuleIdentityFooter,
|
|
23
23
|
RNX_METRO_MODULE_IDENTITY_VERSION,
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
toPeachDevelopmentBundleUrl,
|
|
25
|
+
toPeachProductionBundleUrl,
|
|
26
26
|
type RNXMetroModuleIdentityMetadata,
|
|
27
27
|
} from './metro-production-bundle'
|
|
28
28
|
import {
|
|
@@ -30,6 +30,7 @@ import {
|
|
|
30
30
|
extractNativeAppIdentityFromFiles,
|
|
31
31
|
insertNativeAppIdentityFooter,
|
|
32
32
|
} from './native-app-identity'
|
|
33
|
+
import { readNativeAppIdentityFromProject } from './native-app-identity-project'
|
|
33
34
|
import { readNativeFirebaseConfig } from './native-firebase-config'
|
|
34
35
|
import {
|
|
35
36
|
insertNativeFirebaseFooter,
|
|
@@ -44,8 +45,8 @@ import {
|
|
|
44
45
|
SOOTSIM_RUNTIME_MISSING_MESSAGE,
|
|
45
46
|
} from './runtime-assets'
|
|
46
47
|
|
|
47
|
-
const prefix = '/
|
|
48
|
-
export {
|
|
48
|
+
const prefix = '/__peachsim'
|
|
49
|
+
export { toPeachDevelopmentBundleUrl, toPeachProductionBundleUrl }
|
|
49
50
|
|
|
50
51
|
type MetroSerializerModule = {
|
|
51
52
|
path: string
|
|
@@ -64,6 +65,7 @@ type MetroSerializerGraph = {
|
|
|
64
65
|
}
|
|
65
66
|
|
|
66
67
|
type MetroSerializerOptions = {
|
|
68
|
+
asyncRequireModulePath: string
|
|
67
69
|
createModuleId?: (modulePath: string) => number
|
|
68
70
|
dev?: boolean
|
|
69
71
|
[key: string]: unknown
|
|
@@ -107,8 +109,9 @@ function readCallableMetroExport(
|
|
|
107
109
|
return (...args) => Reflect.apply(callable, undefined, args)
|
|
108
110
|
}
|
|
109
111
|
|
|
110
|
-
function createMetroDefaultSerializer(
|
|
111
|
-
|
|
112
|
+
function createMetroDefaultSerializer(asyncRequireModulePath: string): MetroSerializer {
|
|
113
|
+
// metro supplies this absolute runtime path from its resolved configuration.
|
|
114
|
+
const projectRequire = createRequire(asyncRequireModulePath)
|
|
112
115
|
const metroRoot = path.dirname(projectRequire.resolve('metro/package.json'))
|
|
113
116
|
const baseJSBundle = readCallableMetroExport(
|
|
114
117
|
projectRequire(path.join(metroRoot, 'src/DeltaBundler/Serializers/baseJSBundle.js')),
|
|
@@ -195,7 +198,10 @@ function appendRNXModulePaths(
|
|
|
195
198
|
: { ...result, code: appendRNXMetroModuleIdentityFooter(result.code, identity) }
|
|
196
199
|
}
|
|
197
200
|
|
|
198
|
-
export function
|
|
201
|
+
export function withPeach<T extends Record<string, unknown>>(
|
|
202
|
+
config: T,
|
|
203
|
+
options: { iosTarget?: string } = {},
|
|
204
|
+
): T {
|
|
199
205
|
const cfgProjectRoot = (config as MetroConfigWithServer).projectRoot || process.cwd()
|
|
200
206
|
const configuredBundleUrl = '/index.bundle?platform=ios&dev=true&hot=true&minify=false'
|
|
201
207
|
|
|
@@ -225,7 +231,9 @@ export function withRNX<T extends Record<string, unknown>>(config: T): T {
|
|
|
225
231
|
) => {
|
|
226
232
|
const serializer =
|
|
227
233
|
existingSerializer ||
|
|
228
|
-
(defaultSerializer ||= createMetroDefaultSerializer(
|
|
234
|
+
(defaultSerializer ||= createMetroDefaultSerializer(
|
|
235
|
+
serializerOptions.asyncRequireModulePath,
|
|
236
|
+
))
|
|
229
237
|
const result = await serializer(entryPoint, preModules, graph, serializerOptions)
|
|
230
238
|
let annotated = appendRNXModulePaths(
|
|
231
239
|
result,
|
|
@@ -236,23 +244,38 @@ export function withRNX<T extends Record<string, unknown>>(config: T): T {
|
|
|
236
244
|
const iosRoot = path.join(cfgProjectRoot, 'ios')
|
|
237
245
|
const bundlePlatform = graph.transformOptions?.platform
|
|
238
246
|
if (canExtractNativeAppIdentity(bundlePlatform) && fs.existsSync(iosRoot)) {
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
if (!entry.isDirectory() || entry.name === 'Pods') continue
|
|
242
|
-
const names = entry.name.endsWith('.xcodeproj')
|
|
243
|
-
? ['project.pbxproj']
|
|
244
|
-
: ['Info.plist', 'AppDelegate.swift', 'AppDelegate.mm', 'AppDelegate.m']
|
|
245
|
-
for (const name of names) {
|
|
246
|
-
const relative = `ios/${entry.name}/${name}`
|
|
247
|
-
const file = path.join(cfgProjectRoot, relative)
|
|
248
|
-
if (fs.existsSync(file)) files[relative] = fs.readFileSync(file, 'utf8')
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
const identity = extractNativeAppIdentityFromFiles(
|
|
252
|
-
files,
|
|
247
|
+
let identity = readNativeAppIdentityFromProject(
|
|
248
|
+
cfgProjectRoot,
|
|
253
249
|
bundlePlatform,
|
|
254
250
|
parsePlistSource,
|
|
251
|
+
options.iosTarget,
|
|
255
252
|
)
|
|
253
|
+
if (!identity) {
|
|
254
|
+
const files: Record<string, string> = {}
|
|
255
|
+
for (const entry of fs.readdirSync(iosRoot, { withFileTypes: true })) {
|
|
256
|
+
if (entry.name === 'Pods') continue
|
|
257
|
+
if (entry.isDirectory()) {
|
|
258
|
+
const names = entry.name.endsWith('.xcodeproj')
|
|
259
|
+
? ['project.pbxproj']
|
|
260
|
+
: ['Info.plist', 'AppDelegate.swift', 'AppDelegate.mm', 'AppDelegate.m']
|
|
261
|
+
for (const name of names) {
|
|
262
|
+
const relative = `ios/${entry.name}/${name}`
|
|
263
|
+
const file = path.join(cfgProjectRoot, relative)
|
|
264
|
+
if (fs.existsSync(file)) files[relative] = fs.readFileSync(file, 'utf8')
|
|
265
|
+
}
|
|
266
|
+
} else if (/AppDelegate\.(?:swift|mm|m)$/.test(entry.name)) {
|
|
267
|
+
const relative = `ios/${entry.name}`
|
|
268
|
+
const file = path.join(cfgProjectRoot, relative)
|
|
269
|
+
if (fs.existsSync(file)) files[relative] = fs.readFileSync(file, 'utf8')
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
identity = extractNativeAppIdentityFromFiles(
|
|
273
|
+
files,
|
|
274
|
+
bundlePlatform,
|
|
275
|
+
parsePlistSource,
|
|
276
|
+
options.iosTarget,
|
|
277
|
+
)
|
|
278
|
+
}
|
|
256
279
|
if (identity) {
|
|
257
280
|
annotated =
|
|
258
281
|
typeof annotated === 'string'
|
|
@@ -272,6 +295,7 @@ export function withRNX<T extends Record<string, unknown>>(config: T): T {
|
|
|
272
295
|
readNativeFirebaseConfig(
|
|
273
296
|
cfgProjectRoot,
|
|
274
297
|
typeof bundlePlatform === 'string' ? [bundlePlatform] : undefined,
|
|
298
|
+
options.iosTarget,
|
|
275
299
|
),
|
|
276
300
|
)
|
|
277
301
|
if (firebase)
|
|
@@ -349,7 +373,11 @@ export function withRNX<T extends Record<string, unknown>>(config: T): T {
|
|
|
349
373
|
res.setHeader('Content-Type', 'application/json')
|
|
350
374
|
res.setHeader('Cache-Control', 'no-store')
|
|
351
375
|
res.setHeader('Access-Control-Allow-Origin', '*')
|
|
352
|
-
res.end(
|
|
376
|
+
res.end(
|
|
377
|
+
JSON.stringify(
|
|
378
|
+
readNativeFirebaseConfig(cfgProjectRoot, undefined, options.iosTarget),
|
|
379
|
+
),
|
|
380
|
+
)
|
|
353
381
|
} catch (error) {
|
|
354
382
|
res.statusCode = 400
|
|
355
383
|
res.end(
|
|
@@ -388,7 +416,7 @@ export function withRNX<T extends Record<string, unknown>>(config: T): T {
|
|
|
388
416
|
}
|
|
389
417
|
}
|
|
390
418
|
|
|
391
|
-
// /
|
|
419
|
+
// /__peachsim/* — serve runtime assets
|
|
392
420
|
if (pathname.startsWith(prefix + '/')) {
|
|
393
421
|
const fullPath = resolveRuntimeFilePath(
|
|
394
422
|
runtimeRoot,
|
|
@@ -400,7 +428,7 @@ export function withRNX<T extends Record<string, unknown>>(config: T): T {
|
|
|
400
428
|
}
|
|
401
429
|
}
|
|
402
430
|
|
|
403
|
-
// serve HTML shell for /
|
|
431
|
+
// serve HTML shell for /__peachsim and extensionless in-shell routes.
|
|
404
432
|
if (
|
|
405
433
|
pathname === prefix ||
|
|
406
434
|
pathname === prefix + '/' ||
|
|
@@ -450,4 +478,4 @@ function resolveMetroPort(server: MetroConfigWithServer['server']): number {
|
|
|
450
478
|
return port
|
|
451
479
|
}
|
|
452
480
|
|
|
453
|
-
export default
|
|
481
|
+
export default withPeach
|
|
@@ -28,7 +28,7 @@ export interface RNXMetroModuleIdentity extends RNXMetroModuleIdentityMetadata {
|
|
|
28
28
|
// nothing about resolution changes, so these are plain Metro production
|
|
29
29
|
// options and the artifact is byte-identical to what the app ships apart
|
|
30
30
|
// from the identity footer the plugin's serializer appends.
|
|
31
|
-
export function
|
|
31
|
+
export function toPeachProductionBundleUrl(bundleUrl: string): string {
|
|
32
32
|
const relative = bundleUrl.startsWith('/')
|
|
33
33
|
const url = new URL(bundleUrl, 'http://peachsim.local')
|
|
34
34
|
url.searchParams.set('dev', 'false')
|
|
@@ -42,7 +42,7 @@ export function toRNXProductionBundleUrl(bundleUrl: string): string {
|
|
|
42
42
|
* module names, and its source map. `hot` stays false because the artifact is
|
|
43
43
|
* immutable once produced.
|
|
44
44
|
*/
|
|
45
|
-
export function
|
|
45
|
+
export function toPeachDevelopmentBundleUrl(bundleUrl: string): string {
|
|
46
46
|
const relative = bundleUrl.startsWith('/')
|
|
47
47
|
const url = new URL(bundleUrl, 'http://peachsim.local')
|
|
48
48
|
url.searchParams.set('dev', 'true')
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import fs from 'node:fs'
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import {
|
|
4
|
+
canExtractNativeAppIdentity,
|
|
5
|
+
type NativeAppIdentity,
|
|
6
|
+
type NativeAppIdentityPlatform,
|
|
7
|
+
} from './native-app-identity'
|
|
8
|
+
import { parsePlistSource } from './plist'
|
|
9
|
+
import {
|
|
10
|
+
listXcodeAppTargets,
|
|
11
|
+
readXcodeAppTarget,
|
|
12
|
+
type XcodeAppTarget,
|
|
13
|
+
} from './xcode-project'
|
|
14
|
+
|
|
15
|
+
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
16
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value)
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function nonEmptyString(value: unknown): string | undefined {
|
|
20
|
+
return typeof value === 'string' && value.length > 0 ? value : undefined
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function readNativeAppIdentityFromXcodeTarget(
|
|
24
|
+
app: XcodeAppTarget,
|
|
25
|
+
parseInfoPlist: (source: string) => unknown = parsePlistSource,
|
|
26
|
+
): NativeAppIdentity {
|
|
27
|
+
const dictionary = parseInfoPlist(app.infoPlist)
|
|
28
|
+
if (!isRecord(dictionary)) throw new Error('native app Info.plist is not a dictionary')
|
|
29
|
+
const settings = app.settings
|
|
30
|
+
|
|
31
|
+
const bundleIdentifier =
|
|
32
|
+
nonEmptyString(dictionary.CFBundleIdentifier) ??
|
|
33
|
+
nonEmptyString(settings?.('PRODUCT_BUNDLE_IDENTIFIER'))
|
|
34
|
+
if (!bundleIdentifier) throw new Error('native app has no bundle identifier')
|
|
35
|
+
|
|
36
|
+
const appVersion =
|
|
37
|
+
nonEmptyString(dictionary.CFBundleShortVersionString) ??
|
|
38
|
+
nonEmptyString(settings?.('MARKETING_VERSION'))
|
|
39
|
+
const buildVersion =
|
|
40
|
+
nonEmptyString(dictionary.CFBundleVersion) ??
|
|
41
|
+
nonEmptyString(settings?.('CURRENT_PROJECT_VERSION'))
|
|
42
|
+
if (!appVersion || !buildVersion) {
|
|
43
|
+
throw new Error('native app has no version or build version')
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const bundleName =
|
|
47
|
+
nonEmptyString(dictionary.CFBundleName) ??
|
|
48
|
+
nonEmptyString(settings?.('PRODUCT_NAME')) ??
|
|
49
|
+
app.name
|
|
50
|
+
const applicationDisplayName = nonEmptyString(dictionary.CFBundleDisplayName)
|
|
51
|
+
const applicationName = applicationDisplayName ?? bundleName
|
|
52
|
+
|
|
53
|
+
const declaredBackgroundColor = dictionary.RCTRootViewBackgroundColor
|
|
54
|
+
const rootViewBackgroundColor =
|
|
55
|
+
typeof declaredBackgroundColor === 'number' &&
|
|
56
|
+
Number.isInteger(declaredBackgroundColor)
|
|
57
|
+
? declaredBackgroundColor
|
|
58
|
+
: undefined
|
|
59
|
+
|
|
60
|
+
const alternateIconNames = new Set<string>()
|
|
61
|
+
const icons = dictionary.CFBundleIcons
|
|
62
|
+
const alternates = isRecord(icons) ? icons.CFBundleAlternateIcons : undefined
|
|
63
|
+
if (isRecord(alternates)) {
|
|
64
|
+
for (const name of Object.keys(alternates)) {
|
|
65
|
+
if (name) alternateIconNames.add(name)
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
const alternateSetting =
|
|
69
|
+
settings?.('ASSETCATALOG_COMPILER_ALTERNATE_APPICON_NAMES') ?? ''
|
|
70
|
+
for (const match of alternateSetting
|
|
71
|
+
.replace(/\\"/g, '"')
|
|
72
|
+
.matchAll(/"([^"]*)"|([^\s(),]+)/g)) {
|
|
73
|
+
const val = match[1] ?? match[2]
|
|
74
|
+
if (val) alternateIconNames.add(val)
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const permissionUsageDescriptions: Record<string, unknown> = {}
|
|
78
|
+
for (const [key, value] of Object.entries(dictionary)) {
|
|
79
|
+
if (
|
|
80
|
+
!/^NS.*UsageDescription$/.test(key) &&
|
|
81
|
+
key !== 'NSLocationTemporaryUsageDescriptionDictionary'
|
|
82
|
+
) {
|
|
83
|
+
continue
|
|
84
|
+
}
|
|
85
|
+
permissionUsageDescriptions[key] = value
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const querySchemes = dictionary.LSApplicationQueriesSchemes
|
|
89
|
+
const urlQuerySchemes = Array.isArray(querySchemes) ? querySchemes : []
|
|
90
|
+
|
|
91
|
+
const intentIds = dictionary.OneAppIntentIdentifiers
|
|
92
|
+
const appIntentIdentifiers =
|
|
93
|
+
Array.isArray(intentIds) && intentIds.every((v) => typeof v === 'string')
|
|
94
|
+
? intentIds
|
|
95
|
+
: []
|
|
96
|
+
|
|
97
|
+
const backgroundIds = dictionary.BGTaskSchedulerPermittedIdentifiers
|
|
98
|
+
const backgroundTaskIdentifiers =
|
|
99
|
+
Array.isArray(backgroundIds) && backgroundIds.every((v) => typeof v === 'string')
|
|
100
|
+
? backgroundIds
|
|
101
|
+
: []
|
|
102
|
+
|
|
103
|
+
const declaredModes = dictionary.UIBackgroundModes
|
|
104
|
+
const backgroundModes =
|
|
105
|
+
Array.isArray(declaredModes) && declaredModes.every((v) => typeof v === 'string')
|
|
106
|
+
? declaredModes
|
|
107
|
+
: []
|
|
108
|
+
|
|
109
|
+
const supportedInterfaceOrientations =
|
|
110
|
+
Array.isArray(dictionary.UISupportedInterfaceOrientations) &&
|
|
111
|
+
dictionary.UISupportedInterfaceOrientations.every((v) => typeof v === 'string')
|
|
112
|
+
? dictionary.UISupportedInterfaceOrientations
|
|
113
|
+
: []
|
|
114
|
+
|
|
115
|
+
const ipadSupportedInterfaceOrientations =
|
|
116
|
+
Array.isArray(dictionary['UISupportedInterfaceOrientations~ipad']) &&
|
|
117
|
+
dictionary['UISupportedInterfaceOrientations~ipad'].every(
|
|
118
|
+
(v) => typeof v === 'string',
|
|
119
|
+
)
|
|
120
|
+
? dictionary['UISupportedInterfaceOrientations~ipad']
|
|
121
|
+
: []
|
|
122
|
+
|
|
123
|
+
const defaultScreenOrientationMask = nonEmptyString(
|
|
124
|
+
dictionary.EXDefaultScreenOrientationMask,
|
|
125
|
+
)
|
|
126
|
+
const shareIntoAppGroupId = nonEmptyString(dictionary.ExpoShareIntoAppGroupId)
|
|
127
|
+
|
|
128
|
+
return {
|
|
129
|
+
applicationName,
|
|
130
|
+
...(applicationDisplayName ? { applicationDisplayName } : {}),
|
|
131
|
+
...(rootViewBackgroundColor !== undefined ? { rootViewBackgroundColor } : {}),
|
|
132
|
+
bundleName,
|
|
133
|
+
appVersion,
|
|
134
|
+
buildVersion,
|
|
135
|
+
bundleIdentifier,
|
|
136
|
+
platform: 'ios',
|
|
137
|
+
supportedInterfaceOrientations,
|
|
138
|
+
ipadSupportedInterfaceOrientations,
|
|
139
|
+
...(defaultScreenOrientationMask ? { defaultScreenOrientationMask } : {}),
|
|
140
|
+
alternateIconNames: [...alternateIconNames],
|
|
141
|
+
permissionUsageDescriptions,
|
|
142
|
+
urlQuerySchemes,
|
|
143
|
+
...(shareIntoAppGroupId ? { shareIntoAppGroupId } : {}),
|
|
144
|
+
backgroundTaskIdentifiers,
|
|
145
|
+
backgroundModes,
|
|
146
|
+
appIntentIdentifiers,
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
export function readNativeAppIdentityFromProject(
|
|
151
|
+
projectRoot: string,
|
|
152
|
+
platform: unknown,
|
|
153
|
+
parseInfoPlist: (source: string) => unknown = parsePlistSource,
|
|
154
|
+
iosTarget?: string,
|
|
155
|
+
): NativeAppIdentity | null {
|
|
156
|
+
if (!canExtractNativeAppIdentity(platform)) return null
|
|
157
|
+
const iosRoot = path.join(projectRoot, 'ios')
|
|
158
|
+
if (!fs.existsSync(iosRoot)) return null
|
|
159
|
+
const projects = fs
|
|
160
|
+
.readdirSync(iosRoot, { withFileTypes: true })
|
|
161
|
+
.filter((entry) => entry.isDirectory() && entry.name.endsWith('.xcodeproj'))
|
|
162
|
+
if (projects.length === 0) return null
|
|
163
|
+
if (projects.length > 1 && !iosTarget) {
|
|
164
|
+
throw new Error('native app identity requires a selected Xcode project')
|
|
165
|
+
}
|
|
166
|
+
let project = projects[0]!
|
|
167
|
+
if (iosTarget && projects.length > 1) {
|
|
168
|
+
const matches = projects.filter((entry) =>
|
|
169
|
+
listXcodeAppTargets(path.join(iosRoot, entry.name)).includes(iosTarget),
|
|
170
|
+
)
|
|
171
|
+
if (matches.length === 0) {
|
|
172
|
+
throw new Error(`native app identity has no application target ${iosTarget}`)
|
|
173
|
+
}
|
|
174
|
+
if (matches.length > 1) {
|
|
175
|
+
throw new Error(
|
|
176
|
+
`native app identity target ${iosTarget} is ambiguous across ${matches.map((entry) => entry.name).join(', ')}`,
|
|
177
|
+
)
|
|
178
|
+
}
|
|
179
|
+
project = matches[0]!
|
|
180
|
+
}
|
|
181
|
+
const xcodeproj = path.join(iosRoot, project.name)
|
|
182
|
+
const appTargets = listXcodeAppTargets(xcodeproj)
|
|
183
|
+
if (!iosTarget && appTargets.length > 1) {
|
|
184
|
+
throw new Error('native app identity requires a selected app target')
|
|
185
|
+
}
|
|
186
|
+
const app = readXcodeAppTarget(xcodeproj, iosTarget ?? appTargets[0], 'Release', {
|
|
187
|
+
requireSources: false,
|
|
188
|
+
})
|
|
189
|
+
return readNativeAppIdentityFromXcodeTarget(app, parseInfoPlist)
|
|
190
|
+
}
|