peachsim 0.1.940 → 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 +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 +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 +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
package/dist-lib/metro.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*!
|
|
1
|
+
/*! peach v0.1.1399 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -471,6 +471,7 @@ async function handleReplacementModuleRequest(req, res, options = {}) {
|
|
|
471
471
|
} catch {
|
|
472
472
|
return false;
|
|
473
473
|
}
|
|
474
|
+
if (url.pathname !== REPLACEMENT_MODULE_ROUTE) return false;
|
|
474
475
|
if (options.requireLoopbackOrigin) {
|
|
475
476
|
const origin = req.headers.origin;
|
|
476
477
|
const remoteAddress = req.socket.remoteAddress?.replace(/^::ffff:/, "");
|
|
@@ -488,7 +489,6 @@ async function handleReplacementModuleRequest(req, res, options = {}) {
|
|
|
488
489
|
return true;
|
|
489
490
|
}
|
|
490
491
|
}
|
|
491
|
-
if (url.pathname !== REPLACEMENT_MODULE_ROUTE) return false;
|
|
492
492
|
if (options.requestToken && url.searchParams.get("token") !== options.requestToken) {
|
|
493
493
|
res.writeHead(403, { "Content-Type": "text/plain; charset=utf-8" });
|
|
494
494
|
res.end("replacement module request token is invalid");
|
|
@@ -582,16 +582,6 @@ var init_replacement_module_handler = __esm({
|
|
|
582
582
|
}
|
|
583
583
|
});
|
|
584
584
|
|
|
585
|
-
// src/is-record.ts
|
|
586
|
-
function isRecord2(value) {
|
|
587
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
588
|
-
}
|
|
589
|
-
var init_is_record = __esm({
|
|
590
|
-
"src/is-record.ts"() {
|
|
591
|
-
"use strict";
|
|
592
|
-
}
|
|
593
|
-
});
|
|
594
|
-
|
|
595
585
|
// ../../node_modules/plist/lib/parse.js
|
|
596
586
|
var require_parse = __commonJS({
|
|
597
587
|
"../../node_modules/plist/lib/parse.js"(exports2) {
|
|
@@ -1943,6 +1933,16 @@ var require_lib = __commonJS({
|
|
|
1943
1933
|
}
|
|
1944
1934
|
});
|
|
1945
1935
|
|
|
1936
|
+
// src/is-record.ts
|
|
1937
|
+
function isRecord3(value) {
|
|
1938
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
1939
|
+
}
|
|
1940
|
+
var init_is_record = __esm({
|
|
1941
|
+
"src/is-record.ts"() {
|
|
1942
|
+
"use strict";
|
|
1943
|
+
}
|
|
1944
|
+
});
|
|
1945
|
+
|
|
1946
1946
|
// ../contrast-runtime-delivery/src/version.ts
|
|
1947
1947
|
function isValidRuntimeVersion(value) {
|
|
1948
1948
|
return value.length <= 100 && /^[0-9A-Za-z][0-9A-Za-z._+-]*$/.test(value);
|
|
@@ -1966,26 +1966,32 @@ __export(config_exports, {
|
|
|
1966
1966
|
hasPeachConfig: () => hasPeachConfig,
|
|
1967
1967
|
isPeachConfig: () => isPeachConfig,
|
|
1968
1968
|
mergePeachConfig: () => mergePeachConfig,
|
|
1969
|
+
readNativeRenderer: () => readNativeRenderer,
|
|
1969
1970
|
readPeachBundleConfig: () => readPeachBundleConfig,
|
|
1970
1971
|
readPeachBundleConfigFooter: () => readPeachBundleConfigFooter,
|
|
1971
1972
|
readPeachConfigFromSearchParams: () => readPeachConfigFromSearchParams
|
|
1972
1973
|
});
|
|
1974
|
+
function readNativeRenderer(value) {
|
|
1975
|
+
if (value === void 0) return void 0;
|
|
1976
|
+
if (value === "paper" || value === "fabric") return value;
|
|
1977
|
+
throw new Error("nativeRenderer must be paper or fabric");
|
|
1978
|
+
}
|
|
1973
1979
|
function collectConfiguredFileModules(config) {
|
|
1974
1980
|
return [
|
|
1975
1981
|
...new Set(
|
|
1976
1982
|
["modules", "turboModules", "nativeModules", "nativeViews"].flatMap((key) => {
|
|
1977
1983
|
const entries = config && Reflect.get(config, key);
|
|
1978
|
-
if (!
|
|
1984
|
+
if (!isRecord3(entries)) return [];
|
|
1979
1985
|
return Object.values(entries).flatMap(
|
|
1980
|
-
(entry) =>
|
|
1986
|
+
(entry) => isRecord3(entry) && typeof entry.file === "string" ? [entry.file] : []
|
|
1981
1987
|
);
|
|
1982
1988
|
})
|
|
1983
1989
|
)
|
|
1984
1990
|
];
|
|
1985
1991
|
}
|
|
1986
1992
|
function isPeachConfig(value) {
|
|
1987
|
-
if (!
|
|
1988
|
-
return (value.runtimeVersion === void 0 || typeof value.runtimeVersion === "string" && value.runtimeVersion === value.runtimeVersion.trim() && isValidRuntimeVersion(value.runtimeVersion)) && [
|
|
1993
|
+
if (!isRecord3(value)) return false;
|
|
1994
|
+
return (value.nativeRenderer === void 0 || value.nativeRenderer === "paper" || value.nativeRenderer === "fabric") && (value.runtimeVersion === void 0 || typeof value.runtimeVersion === "string" && value.runtimeVersion === value.runtimeVersion.trim() && isValidRuntimeVersion(value.runtimeVersion)) && [
|
|
1989
1995
|
"modules",
|
|
1990
1996
|
"turboModules",
|
|
1991
1997
|
"nativeModules",
|
|
@@ -1994,13 +2000,13 @@ function isPeachConfig(value) {
|
|
|
1994
2000
|
"network",
|
|
1995
2001
|
"settings",
|
|
1996
2002
|
"initialState"
|
|
1997
|
-
].every((key) => value[key] === void 0 ||
|
|
1998
|
-
(entry) => entry === "noop" ||
|
|
2003
|
+
].every((key) => value[key] === void 0 || isRecord3(value[key])) && (value.nativeViews === void 0 || isRecord3(value.nativeViews) && Object.values(value.nativeViews).every(
|
|
2004
|
+
(entry) => entry === "noop" || isRecord3(entry) && typeof entry.file === "string" && entry.file.length > 0
|
|
1999
2005
|
));
|
|
2000
2006
|
}
|
|
2001
2007
|
function readPeachBundleConfig(value) {
|
|
2002
2008
|
if (value === void 0 || value === null) return null;
|
|
2003
|
-
if (!
|
|
2009
|
+
if (!isRecord3(value) || !isPeachConfig(value.config) || !Array.isArray(value.runtimePackages) || !value.runtimePackages.every((name2) => typeof name2 === "string")) {
|
|
2004
2010
|
throw new Error("configured bundle metadata is malformed");
|
|
2005
2011
|
}
|
|
2006
2012
|
return { config: value.config, runtimePackages: [...value.runtimePackages] };
|
|
@@ -2039,7 +2045,7 @@ function hasOwnKeys(value) {
|
|
|
2039
2045
|
}
|
|
2040
2046
|
function hasPeachConfig(config) {
|
|
2041
2047
|
if (!config) return false;
|
|
2042
|
-
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);
|
|
2048
|
+
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);
|
|
2043
2049
|
}
|
|
2044
2050
|
function mergePeachConfig(base, override) {
|
|
2045
2051
|
if (!hasPeachConfig(base) && !hasPeachConfig(override)) return void 0;
|
|
@@ -2047,6 +2053,7 @@ function mergePeachConfig(base, override) {
|
|
|
2047
2053
|
if (!hasPeachConfig(override)) return base ? { ...base } : void 0;
|
|
2048
2054
|
return {
|
|
2049
2055
|
runtimeVersion: override.runtimeVersion ?? base.runtimeVersion,
|
|
2056
|
+
nativeRenderer: override.nativeRenderer ?? base.nativeRenderer,
|
|
2050
2057
|
modules: { ...base.modules || {}, ...override.modules || {} },
|
|
2051
2058
|
turboModules: { ...base.turboModules || {}, ...override.turboModules || {} },
|
|
2052
2059
|
nativeModules: {
|
|
@@ -2068,14 +2075,16 @@ function mergePeachConfig(base, override) {
|
|
|
2068
2075
|
function readPeachConfigFromSearchParams(searchParams) {
|
|
2069
2076
|
const raw = searchParams.get(PEACH_CONFIG_QUERY_PARAM);
|
|
2070
2077
|
if (!raw) return void 0;
|
|
2078
|
+
let parsed;
|
|
2071
2079
|
try {
|
|
2072
|
-
|
|
2073
|
-
return hasPeachConfig(parsed) ? parsed : void 0;
|
|
2080
|
+
parsed = JSON.parse(raw);
|
|
2074
2081
|
} catch (error) {
|
|
2075
2082
|
const message = error instanceof Error ? error.message : String(error);
|
|
2076
2083
|
console.warn(`[peach] invalid ${PEACH_CONFIG_QUERY_PARAM}: ${message}`);
|
|
2077
2084
|
return void 0;
|
|
2078
2085
|
}
|
|
2086
|
+
if (isRecord3(parsed)) readNativeRenderer(parsed.nativeRenderer);
|
|
2087
|
+
return isPeachConfig(parsed) && hasPeachConfig(parsed) ? parsed : void 0;
|
|
2079
2088
|
}
|
|
2080
2089
|
function applyPeachConfigToUrl(url, config) {
|
|
2081
2090
|
const parsed = new URL(url);
|
|
@@ -2126,12 +2135,12 @@ function resolveFileEntries(entries, configDir) {
|
|
|
2126
2135
|
return Object.fromEntries(
|
|
2127
2136
|
Object.entries(entries).map(([name2, resolution]) => [
|
|
2128
2137
|
name2,
|
|
2129
|
-
resolution && typeof resolution === "object" && "file" in resolution && typeof resolution.file === "string" ? { ...resolution, file:
|
|
2138
|
+
resolution && typeof resolution === "object" && "file" in resolution && typeof resolution.file === "string" ? { ...resolution, file: import_node_path8.default.resolve(configDir, resolution.file) } : resolution
|
|
2130
2139
|
])
|
|
2131
2140
|
);
|
|
2132
2141
|
}
|
|
2133
2142
|
function resolveConfigReplacementFiles(config, configPath) {
|
|
2134
|
-
const configDir =
|
|
2143
|
+
const configDir = import_node_path8.default.dirname(configPath);
|
|
2135
2144
|
return {
|
|
2136
2145
|
...config,
|
|
2137
2146
|
modules: resolveFileEntries(config.modules, configDir),
|
|
@@ -2166,11 +2175,11 @@ async function resolveRNXAppConfig(startDir = process.cwd()) {
|
|
|
2166
2175
|
const project = resolveAppProject(startDir);
|
|
2167
2176
|
return { project, config: await loadRNXAppConfig(project) };
|
|
2168
2177
|
}
|
|
2169
|
-
var
|
|
2178
|
+
var import_node_path8, import_jiti;
|
|
2170
2179
|
var init_app_config = __esm({
|
|
2171
2180
|
"cli/app-config.ts"() {
|
|
2172
2181
|
"use strict";
|
|
2173
|
-
|
|
2182
|
+
import_node_path8 = __toESM(require("node:path"), 1);
|
|
2174
2183
|
import_jiti = require("jiti");
|
|
2175
2184
|
init_config();
|
|
2176
2185
|
init_config();
|
|
@@ -2200,14 +2209,14 @@ async function produceConfiguredBundle(source, config, runtimePackages) {
|
|
|
2200
2209
|
const neededPackages = /* @__PURE__ */ new Set();
|
|
2201
2210
|
const factories = [];
|
|
2202
2211
|
const visit = (filePath) => {
|
|
2203
|
-
const real =
|
|
2212
|
+
const real = import_node_fs8.default.realpathSync(filePath);
|
|
2204
2213
|
const previous = files.get(real);
|
|
2205
2214
|
if (previous !== void 0) return previous;
|
|
2206
2215
|
const id = "peach-config-file:" + files.size;
|
|
2207
2216
|
files.set(real, id);
|
|
2208
2217
|
const compiled = compileReplacementModule({
|
|
2209
2218
|
filePath: real,
|
|
2210
|
-
source:
|
|
2219
|
+
source: import_node_fs8.default.readFileSync(real, "utf8"),
|
|
2211
2220
|
runtimePackages,
|
|
2212
2221
|
localModuleUrl: (specifier) => visit(resolveReplacementModuleFile(real, specifier))
|
|
2213
2222
|
});
|
|
@@ -2223,7 +2232,7 @@ async function produceConfiguredBundle(source, config, runtimePackages) {
|
|
|
2223
2232
|
if (!entries || typeof entries !== "object") continue;
|
|
2224
2233
|
for (const resolution of Object.values(entries)) {
|
|
2225
2234
|
if (resolution && typeof resolution === "object" && "file" in resolution && typeof resolution.file === "string") {
|
|
2226
|
-
resolution.file = visit(
|
|
2235
|
+
resolution.file = visit(import_node_path9.default.resolve(resolution.file));
|
|
2227
2236
|
}
|
|
2228
2237
|
}
|
|
2229
2238
|
}
|
|
@@ -2234,7 +2243,7 @@ async function produceConfiguredBundle(source, config, runtimePackages) {
|
|
|
2234
2243
|
const compact = await (0, import_terser.minify)(code, {
|
|
2235
2244
|
compress: false,
|
|
2236
2245
|
mangle: false,
|
|
2237
|
-
format: { comments: false
|
|
2246
|
+
format: { comments: false }
|
|
2238
2247
|
});
|
|
2239
2248
|
if (!compact.code || /[\n\r]/.test(compact.code))
|
|
2240
2249
|
throw new Error("configured bundle prefix must preserve the guest source lines");
|
|
@@ -2247,12 +2256,12 @@ async function produceConfiguredBundle(source, config, runtimePackages) {
|
|
|
2247
2256
|
const identityStart = source.lastIndexOf("\nglobalThis.__sootsimModulePaths=");
|
|
2248
2257
|
return prefix2 + (identityStart < 0 ? source + footer : source.slice(0, identityStart) + footer + source.slice(identityStart));
|
|
2249
2258
|
}
|
|
2250
|
-
var
|
|
2259
|
+
var import_node_fs8, import_node_path9, import_sucrase, import_terser;
|
|
2251
2260
|
var init_configured_bundle_producer = __esm({
|
|
2252
2261
|
"src/configured-bundle-producer.ts"() {
|
|
2253
2262
|
"use strict";
|
|
2254
|
-
|
|
2255
|
-
|
|
2263
|
+
import_node_fs8 = __toESM(require("node:fs"), 1);
|
|
2264
|
+
import_node_path9 = __toESM(require("node:path"), 1);
|
|
2256
2265
|
import_sucrase = require("sucrase");
|
|
2257
2266
|
import_terser = require("terser");
|
|
2258
2267
|
init_replacementModule();
|
|
@@ -2265,9 +2274,9 @@ var init_configured_bundle_producer = __esm({
|
|
|
2265
2274
|
var metro_plugin_exports = {};
|
|
2266
2275
|
__export(metro_plugin_exports, {
|
|
2267
2276
|
default: () => metro_plugin_default,
|
|
2268
|
-
|
|
2269
|
-
|
|
2270
|
-
|
|
2277
|
+
toPeachDevelopmentBundleUrl: () => toPeachDevelopmentBundleUrl,
|
|
2278
|
+
toPeachProductionBundleUrl: () => toPeachProductionBundleUrl,
|
|
2279
|
+
withPeach: () => withPeach
|
|
2271
2280
|
});
|
|
2272
2281
|
module.exports = __toCommonJS(metro_plugin_exports);
|
|
2273
2282
|
var import_fs2 = __toESM(require("fs"), 1);
|
|
@@ -2300,7 +2309,7 @@ init_replacement_module_handler();
|
|
|
2300
2309
|
// src/metro-production-bundle.ts
|
|
2301
2310
|
var RNXSIM_METRO_MODULE_PATHS_PREFIX = "globalThis.__sootsimModulePaths=";
|
|
2302
2311
|
var RNX_METRO_MODULE_IDENTITY_VERSION = 2;
|
|
2303
|
-
function
|
|
2312
|
+
function toPeachProductionBundleUrl(bundleUrl) {
|
|
2304
2313
|
const relative2 = bundleUrl.startsWith("/");
|
|
2305
2314
|
const url = new URL(bundleUrl, "http://peachsim.local");
|
|
2306
2315
|
url.searchParams.set("dev", "false");
|
|
@@ -2308,7 +2317,7 @@ function toRNXProductionBundleUrl(bundleUrl) {
|
|
|
2308
2317
|
url.searchParams.set("minify", "true");
|
|
2309
2318
|
return relative2 ? `${url.pathname}${url.search}${url.hash}` : url.toString();
|
|
2310
2319
|
}
|
|
2311
|
-
function
|
|
2320
|
+
function toPeachDevelopmentBundleUrl(bundleUrl) {
|
|
2312
2321
|
const relative2 = bundleUrl.startsWith("/");
|
|
2313
2322
|
const url = new URL(bundleUrl, "http://peachsim.local");
|
|
2314
2323
|
url.searchParams.set("dev", "true");
|
|
@@ -2338,6 +2347,101 @@ function appendRNXMetroModuleIdentityFooter(bundleText, identity) {
|
|
|
2338
2347
|
${RNXSIM_METRO_SOURCE_MAP_COMMENT}${detached.sourceMappingUrl}`;
|
|
2339
2348
|
}
|
|
2340
2349
|
|
|
2350
|
+
// src/openstep-plist.ts
|
|
2351
|
+
var isDict = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
2352
|
+
var str = (value) => typeof value === "string" ? value : void 0;
|
|
2353
|
+
var list = (value) => Array.isArray(value) ? value.filter((item) => typeof item === "string") : [];
|
|
2354
|
+
function parseOpenStepPlist(text2) {
|
|
2355
|
+
let i = 0;
|
|
2356
|
+
const fail = (message) => {
|
|
2357
|
+
const line = text2.slice(0, i).split("\n").length;
|
|
2358
|
+
throw new Error(`project.pbxproj line ${line}: ${message}`);
|
|
2359
|
+
};
|
|
2360
|
+
const skip = () => {
|
|
2361
|
+
for (; ; ) {
|
|
2362
|
+
const ch = text2[i];
|
|
2363
|
+
if (ch === " " || ch === " " || ch === "\n" || ch === "\r") i++;
|
|
2364
|
+
else if (ch === "/" && text2[i + 1] === "*") {
|
|
2365
|
+
const end = text2.indexOf("*/", i + 2);
|
|
2366
|
+
if (end < 0) fail("unterminated comment");
|
|
2367
|
+
i = end + 2;
|
|
2368
|
+
} else if (ch === "/" && text2[i + 1] === "/") {
|
|
2369
|
+
const end = text2.indexOf("\n", i);
|
|
2370
|
+
i = end < 0 ? text2.length : end + 1;
|
|
2371
|
+
} else return;
|
|
2372
|
+
}
|
|
2373
|
+
};
|
|
2374
|
+
const quoted = () => {
|
|
2375
|
+
i++;
|
|
2376
|
+
let out = "";
|
|
2377
|
+
for (; ; ) {
|
|
2378
|
+
const ch = text2[i++];
|
|
2379
|
+
if (ch === void 0) fail("unterminated string");
|
|
2380
|
+
if (ch === '"') return out;
|
|
2381
|
+
if (ch !== "\\") {
|
|
2382
|
+
out += ch;
|
|
2383
|
+
continue;
|
|
2384
|
+
}
|
|
2385
|
+
const next = text2[i++];
|
|
2386
|
+
if (next === "n") out += "\n";
|
|
2387
|
+
else if (next === "t") out += " ";
|
|
2388
|
+
else if (next === "r") out += "\r";
|
|
2389
|
+
else if (next === "U") {
|
|
2390
|
+
out += String.fromCharCode(parseInt(text2.slice(i, i + 4), 16));
|
|
2391
|
+
i += 4;
|
|
2392
|
+
} else out += next;
|
|
2393
|
+
}
|
|
2394
|
+
};
|
|
2395
|
+
const value = () => {
|
|
2396
|
+
skip();
|
|
2397
|
+
const ch = text2[i];
|
|
2398
|
+
if (ch === "{") {
|
|
2399
|
+
i++;
|
|
2400
|
+
const dict = {};
|
|
2401
|
+
for (; ; ) {
|
|
2402
|
+
skip();
|
|
2403
|
+
if (text2[i] === "}") {
|
|
2404
|
+
i++;
|
|
2405
|
+
return dict;
|
|
2406
|
+
}
|
|
2407
|
+
const key = value();
|
|
2408
|
+
if (typeof key !== "string") fail("dictionary key is not a string");
|
|
2409
|
+
skip();
|
|
2410
|
+
if (text2[i++] !== "=") fail("expected =");
|
|
2411
|
+
if (Object.hasOwn(dict, key)) fail(`duplicate key ${key}`);
|
|
2412
|
+
dict[key] = value();
|
|
2413
|
+
skip();
|
|
2414
|
+
if (text2[i++] !== ";") fail("expected ;");
|
|
2415
|
+
}
|
|
2416
|
+
}
|
|
2417
|
+
if (ch === "(") {
|
|
2418
|
+
i++;
|
|
2419
|
+
const list2 = [];
|
|
2420
|
+
for (; ; ) {
|
|
2421
|
+
skip();
|
|
2422
|
+
if (text2[i] === ")") {
|
|
2423
|
+
i++;
|
|
2424
|
+
return list2;
|
|
2425
|
+
}
|
|
2426
|
+
list2.push(value());
|
|
2427
|
+
skip();
|
|
2428
|
+
if (text2[i] === ",") i++;
|
|
2429
|
+
else if (text2[i] !== ")") fail("expected , or )");
|
|
2430
|
+
}
|
|
2431
|
+
}
|
|
2432
|
+
if (ch === '"') return quoted();
|
|
2433
|
+
const start = i;
|
|
2434
|
+
while (i < text2.length && /[A-Za-z0-9_$+/:.\-<>]/.test(text2[i])) i++;
|
|
2435
|
+
if (i === start) fail(`unexpected ${JSON.stringify(ch ?? "end of file")}`);
|
|
2436
|
+
return text2.slice(start, i);
|
|
2437
|
+
};
|
|
2438
|
+
if (text2.startsWith("// !$*UTF8*$!")) i = text2.indexOf("\n") + 1;
|
|
2439
|
+
const root = value();
|
|
2440
|
+
skip();
|
|
2441
|
+
if (i !== text2.length) fail("trailing content");
|
|
2442
|
+
return root;
|
|
2443
|
+
}
|
|
2444
|
+
|
|
2341
2445
|
// src/native-app-identity.ts
|
|
2342
2446
|
var NATIVE_APP_IDENTITY_PREFIX = "globalThis.__sootsimNativeAppIdentity=";
|
|
2343
2447
|
var METRO_MODULE_PATHS_PREFIX = "globalThis.__sootsimModulePaths=";
|
|
@@ -2348,7 +2452,9 @@ function nonEmptyString(value) {
|
|
|
2348
2452
|
return typeof value === "string" && value.length > 0 ? value : null;
|
|
2349
2453
|
}
|
|
2350
2454
|
function createNativeAppIdentityFooter(identity) {
|
|
2351
|
-
const
|
|
2455
|
+
const footerIdentity = { ...identity };
|
|
2456
|
+
delete footerIdentity.oneUpdates;
|
|
2457
|
+
const payload = JSON.stringify(footerIdentity).replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029").replace(/<\//g, "<\\/");
|
|
2352
2458
|
return `
|
|
2353
2459
|
${NATIVE_APP_IDENTITY_PREFIX}${payload};`;
|
|
2354
2460
|
}
|
|
@@ -2449,30 +2555,119 @@ function appTargetReleaseSettings(pbxproj, targetName, infoPlistRelativePath) {
|
|
|
2449
2555
|
(candidate) => candidate.name === "Release" && named(candidate.settings)
|
|
2450
2556
|
)?.settings ?? null;
|
|
2451
2557
|
}
|
|
2452
|
-
function nativeAppIdentityFromIos(files, parseInfoPlist) {
|
|
2558
|
+
function nativeAppIdentityFromIos(files, parseInfoPlist, iosTarget) {
|
|
2453
2559
|
const pbxprojPath = Object.keys(files).find(
|
|
2454
|
-
(
|
|
2455
|
-
)
|
|
2560
|
+
(path12) => /(?:^|\/)ios\/[^/]+\.xcodeproj\/project\.pbxproj$/.test(path12)
|
|
2561
|
+
) ?? Object.keys(files).find(
|
|
2562
|
+
(path12) => /(?:^|\/)[^/]+\.xcodeproj\/project\.pbxproj$/.test(path12)
|
|
2563
|
+
) ?? Object.keys(files).find((path12) => /(?:^|\/)project\.pbxproj$/.test(path12));
|
|
2456
2564
|
if (!pbxprojPath) return null;
|
|
2457
2565
|
const pbxproj = files[pbxprojPath];
|
|
2458
|
-
|
|
2459
|
-
|
|
2460
|
-
|
|
2461
|
-
|
|
2462
|
-
)
|
|
2463
|
-
|
|
2566
|
+
let objects = {};
|
|
2567
|
+
try {
|
|
2568
|
+
const parsed = parseOpenStepPlist(pbxproj);
|
|
2569
|
+
if (isRecord(parsed)) {
|
|
2570
|
+
objects = isRecord(parsed.objects) ? parsed.objects : parsed;
|
|
2571
|
+
}
|
|
2572
|
+
} catch {
|
|
2573
|
+
}
|
|
2574
|
+
const targets = [];
|
|
2575
|
+
for (const [id, obj] of Object.entries(objects)) {
|
|
2576
|
+
if (isRecord(obj) && obj.isa === "PBXNativeTarget" && typeof obj.name === "string") {
|
|
2577
|
+
targets.push({
|
|
2578
|
+
id,
|
|
2579
|
+
name: obj.name,
|
|
2580
|
+
productType: typeof obj.productType === "string" ? obj.productType : void 0,
|
|
2581
|
+
buildConfigurationList: typeof obj.buildConfigurationList === "string" ? obj.buildConfigurationList : void 0
|
|
2582
|
+
});
|
|
2583
|
+
}
|
|
2584
|
+
}
|
|
2585
|
+
const applicationTargetNames = new Set(
|
|
2586
|
+
targets.filter((t) => t.productType === "com.apple.product-type.application").map((t) => t.name)
|
|
2464
2587
|
);
|
|
2465
|
-
|
|
2466
|
-
|
|
2467
|
-
|
|
2468
|
-
|
|
2588
|
+
if (applicationTargetNames.size === 0) {
|
|
2589
|
+
for (const match of pbxproj.matchAll(
|
|
2590
|
+
/isa = PBXNativeTarget;[^}]*?name = "?([^";]+)"?;[^}]*?productType = "com\.apple\.product-type\.application";/g
|
|
2591
|
+
)) {
|
|
2592
|
+
applicationTargetNames.add(match[1]);
|
|
2593
|
+
}
|
|
2594
|
+
}
|
|
2595
|
+
let targetName = null;
|
|
2596
|
+
if (iosTarget) {
|
|
2597
|
+
if (applicationTargetNames.has(iosTarget)) {
|
|
2598
|
+
targetName = iosTarget;
|
|
2599
|
+
} else {
|
|
2600
|
+
return null;
|
|
2601
|
+
}
|
|
2602
|
+
} else if (applicationTargetNames.size === 1) {
|
|
2603
|
+
targetName = [...applicationTargetNames][0];
|
|
2604
|
+
} else if (applicationTargetNames.size > 1) {
|
|
2605
|
+
const appDelegatePattern = /(?:^|\/)ios\/([^/]+)\/AppDelegate\.(?:swift|mm|m)$/;
|
|
2606
|
+
const delegateTargets = Object.keys(files).filter((path12) => !path12.includes("/Pods/")).map((path12) => path12.match(appDelegatePattern)?.[1]).filter(
|
|
2607
|
+
(name2) => typeof name2 === "string" && applicationTargetNames.has(name2)
|
|
2608
|
+
);
|
|
2609
|
+
if (delegateTargets.length === 1) {
|
|
2610
|
+
targetName = delegateTargets[0];
|
|
2611
|
+
} else {
|
|
2612
|
+
return null;
|
|
2613
|
+
}
|
|
2614
|
+
} else {
|
|
2615
|
+
return null;
|
|
2616
|
+
}
|
|
2617
|
+
const selectedTarget = targets.find((t) => t.name === targetName);
|
|
2618
|
+
const settings = {
|
|
2619
|
+
TARGET_NAME: targetName,
|
|
2620
|
+
PRODUCT_NAME: targetName
|
|
2621
|
+
};
|
|
2622
|
+
for (const obj of Object.values(objects)) {
|
|
2623
|
+
if (isRecord(obj) && obj.isa === "PBXProject" && typeof obj.buildConfigurationList === "string") {
|
|
2624
|
+
const listObj = objects[obj.buildConfigurationList];
|
|
2625
|
+
if (isRecord(listObj) && Array.isArray(listObj.buildConfigurations)) {
|
|
2626
|
+
for (const configId of listObj.buildConfigurations) {
|
|
2627
|
+
if (typeof configId === "string") {
|
|
2628
|
+
const configObj = objects[configId];
|
|
2629
|
+
if (isRecord(configObj) && configObj.name === "Release" && isRecord(configObj.buildSettings)) {
|
|
2630
|
+
for (const [k, v] of Object.entries(configObj.buildSettings)) {
|
|
2631
|
+
if (typeof v === "string") settings[k] = v;
|
|
2632
|
+
}
|
|
2633
|
+
}
|
|
2634
|
+
}
|
|
2635
|
+
}
|
|
2636
|
+
}
|
|
2637
|
+
}
|
|
2638
|
+
}
|
|
2639
|
+
if (selectedTarget?.buildConfigurationList) {
|
|
2640
|
+
const listObj = objects[selectedTarget.buildConfigurationList];
|
|
2641
|
+
if (isRecord(listObj) && Array.isArray(listObj.buildConfigurations)) {
|
|
2642
|
+
for (const configId of listObj.buildConfigurations) {
|
|
2643
|
+
if (typeof configId === "string") {
|
|
2644
|
+
const configObj = objects[configId];
|
|
2645
|
+
if (isRecord(configObj) && configObj.name === "Release" && isRecord(configObj.buildSettings)) {
|
|
2646
|
+
for (const [k, v] of Object.entries(configObj.buildSettings)) {
|
|
2647
|
+
if (typeof v === "string") settings[k] = v;
|
|
2648
|
+
}
|
|
2649
|
+
}
|
|
2650
|
+
}
|
|
2651
|
+
}
|
|
2652
|
+
}
|
|
2653
|
+
} else {
|
|
2654
|
+
const legacy = appTargetReleaseSettings(
|
|
2655
|
+
pbxproj,
|
|
2656
|
+
targetName,
|
|
2657
|
+
`${targetName}/Info.plist`
|
|
2658
|
+
);
|
|
2659
|
+
if (legacy) Object.assign(settings, legacy);
|
|
2660
|
+
}
|
|
2661
|
+
let plist3;
|
|
2662
|
+
const infoPlistPath = settings.INFOPLIST_FILE;
|
|
2663
|
+
if (infoPlistPath) {
|
|
2664
|
+
const normalized = infoPlistPath.replace(/^"|"$/g, "");
|
|
2665
|
+
plist3 = files[`ios/${normalized}`] ?? files[normalized] ?? Object.entries(files).find(([k]) => k.endsWith(`/${normalized}`))?.[1];
|
|
2666
|
+
}
|
|
2667
|
+
if (!plist3) {
|
|
2668
|
+
plist3 = files[`ios/${targetName}/Info.plist`] ?? files[`${targetName}/Info.plist`] ?? Object.entries(files).find(([k]) => k.endsWith(`/${targetName}/Info.plist`))?.[1];
|
|
2669
|
+
}
|
|
2469
2670
|
if (!plist3) return null;
|
|
2470
|
-
const settings = appTargetReleaseSettings(
|
|
2471
|
-
pbxproj,
|
|
2472
|
-
targetName,
|
|
2473
|
-
`${targetName}/Info.plist`
|
|
2474
|
-
);
|
|
2475
|
-
if (!settings) return null;
|
|
2476
2671
|
const bundleIdentifier = identityFieldFrom(
|
|
2477
2672
|
settings,
|
|
2478
2673
|
plistString(plist3, "CFBundleIdentifier"),
|
|
@@ -2499,6 +2694,12 @@ function nativeAppIdentityFromIos(files, parseInfoPlist) {
|
|
|
2499
2694
|
const applicationName = identityFieldFrom(settings, plistString(plist3, "CFBundleDisplayName"), void 0) ?? bundleName;
|
|
2500
2695
|
const dictionary = parseInfoPlist(plist3);
|
|
2501
2696
|
if (!isRecord(dictionary)) throw new Error("native app Info.plist is not a dictionary");
|
|
2697
|
+
const declaredDisplayName = dictionary.CFBundleDisplayName;
|
|
2698
|
+
const applicationDisplayName = typeof declaredDisplayName === "string" ? resolveBuildSetting(declaredDisplayName, settings) : void 0;
|
|
2699
|
+
if (applicationDisplayName === null)
|
|
2700
|
+
throw new Error("native app Info.plist CFBundleDisplayName is unresolved");
|
|
2701
|
+
const declaredBackgroundColor = dictionary.RCTRootViewBackgroundColor;
|
|
2702
|
+
const rootViewBackgroundColor = typeof declaredBackgroundColor === "number" && Number.isInteger(declaredBackgroundColor) ? declaredBackgroundColor : void 0;
|
|
2502
2703
|
const icons = dictionary.CFBundleIcons;
|
|
2503
2704
|
const alternates = isRecord(icons) ? icons.CFBundleAlternateIcons : void 0;
|
|
2504
2705
|
const alternateIconNames = /* @__PURE__ */ new Set();
|
|
@@ -2518,6 +2719,32 @@ function nativeAppIdentityFromIos(files, parseInfoPlist) {
|
|
|
2518
2719
|
}
|
|
2519
2720
|
const intentIds = dictionary.OneAppIntentIdentifiers;
|
|
2520
2721
|
const appIntentIdentifiers = Array.isArray(intentIds) && intentIds.every((value) => typeof value === "string") ? intentIds.map((value) => resolveBuildSetting(value, settings)) : [];
|
|
2722
|
+
const backgroundIds = dictionary.BGTaskSchedulerPermittedIdentifiers;
|
|
2723
|
+
const backgroundTaskIdentifiers = Array.isArray(backgroundIds) && backgroundIds.every((value) => typeof value === "string") ? backgroundIds.map((value) => resolveBuildSetting(value, settings)) : [];
|
|
2724
|
+
const declaredModes = dictionary.UIBackgroundModes;
|
|
2725
|
+
const backgroundModes = Array.isArray(declaredModes) && declaredModes.every((value) => typeof value === "string") ? declaredModes.map((value) => resolveBuildSetting(value, settings)) : [];
|
|
2726
|
+
const screenOrientationLists = [
|
|
2727
|
+
"UISupportedInterfaceOrientations",
|
|
2728
|
+
"UISupportedInterfaceOrientations~ipad"
|
|
2729
|
+
].map((key) => {
|
|
2730
|
+
const list2 = dictionary[key];
|
|
2731
|
+
if (!Array.isArray(list2) || !list2.every((value) => typeof value === "string"))
|
|
2732
|
+
return [];
|
|
2733
|
+
return list2.map((value) => {
|
|
2734
|
+
const resolved = resolveBuildSetting(value, settings);
|
|
2735
|
+
if (resolved === null) throw new Error(`native app Info.plist ${key} is unresolved`);
|
|
2736
|
+
return resolved;
|
|
2737
|
+
});
|
|
2738
|
+
});
|
|
2739
|
+
const [supportedInterfaceOrientations, ipadSupportedInterfaceOrientations] = screenOrientationLists;
|
|
2740
|
+
const declaredDefaultOrientationMask = dictionary.EXDefaultScreenOrientationMask;
|
|
2741
|
+
const defaultScreenOrientationMask = typeof declaredDefaultOrientationMask === "string" ? resolveBuildSetting(declaredDefaultOrientationMask, settings) : void 0;
|
|
2742
|
+
if (defaultScreenOrientationMask === null)
|
|
2743
|
+
throw new Error("native app Info.plist EXDefaultScreenOrientationMask is unresolved");
|
|
2744
|
+
const declaredShareGroup = dictionary.ExpoShareIntoAppGroupId;
|
|
2745
|
+
const shareIntoAppGroupId = typeof declaredShareGroup === "string" ? resolveBuildSetting(declaredShareGroup, settings) : void 0;
|
|
2746
|
+
if (shareIntoAppGroupId === null)
|
|
2747
|
+
throw new Error("native app Info.plist ExpoShareIntoAppGroupId is unresolved");
|
|
2521
2748
|
const querySchemes = dictionary.LSApplicationQueriesSchemes;
|
|
2522
2749
|
if (querySchemes !== void 0 && !Array.isArray(querySchemes)) {
|
|
2523
2750
|
throw new Error("native app Info.plist LSApplicationQueriesSchemes is not an array");
|
|
@@ -2531,7 +2758,8 @@ function nativeAppIdentityFromIos(files, parseInfoPlist) {
|
|
|
2531
2758
|
});
|
|
2532
2759
|
const permissionUsageDescriptions = {};
|
|
2533
2760
|
for (const [key, value] of Object.entries(dictionary)) {
|
|
2534
|
-
if (!/^NS.*UsageDescription$/.test(key))
|
|
2761
|
+
if (!/^NS.*UsageDescription$/.test(key) && key !== "NSLocationTemporaryUsageDescriptionDictionary")
|
|
2762
|
+
continue;
|
|
2535
2763
|
if (typeof value !== "string") {
|
|
2536
2764
|
permissionUsageDescriptions[key] = value;
|
|
2537
2765
|
continue;
|
|
@@ -2552,29 +2780,35 @@ function nativeAppIdentityFromIos(files, parseInfoPlist) {
|
|
|
2552
2780
|
}
|
|
2553
2781
|
return {
|
|
2554
2782
|
applicationName,
|
|
2783
|
+
...applicationDisplayName === void 0 ? {} : { applicationDisplayName },
|
|
2784
|
+
...rootViewBackgroundColor === void 0 ? {} : { rootViewBackgroundColor },
|
|
2555
2785
|
bundleName,
|
|
2556
2786
|
appVersion,
|
|
2557
2787
|
buildVersion,
|
|
2558
2788
|
bundleIdentifier,
|
|
2559
2789
|
platform: "ios",
|
|
2790
|
+
supportedInterfaceOrientations,
|
|
2791
|
+
ipadSupportedInterfaceOrientations,
|
|
2792
|
+
...defaultScreenOrientationMask === void 0 ? {} : { defaultScreenOrientationMask },
|
|
2560
2793
|
alternateIconNames: [...alternateIconNames],
|
|
2561
2794
|
permissionUsageDescriptions,
|
|
2562
2795
|
urlQuerySchemes,
|
|
2796
|
+
...shareIntoAppGroupId === void 0 ? {} : { shareIntoAppGroupId },
|
|
2797
|
+
backgroundTaskIdentifiers: backgroundTaskIdentifiers.every((value) => value !== null) ? backgroundTaskIdentifiers : [],
|
|
2798
|
+
backgroundModes: backgroundModes.every((value) => value !== null) ? backgroundModes : [],
|
|
2563
2799
|
appIntentIdentifiers: appIntentIdentifiers.every((value) => value !== null) ? appIntentIdentifiers : []
|
|
2564
2800
|
};
|
|
2565
2801
|
}
|
|
2566
2802
|
function canExtractNativeAppIdentity(platform) {
|
|
2567
2803
|
return platform === "ios";
|
|
2568
2804
|
}
|
|
2569
|
-
function extractNativeAppIdentityFromFiles(files, platform, parseInfoPlist) {
|
|
2570
|
-
return canExtractNativeAppIdentity(platform) ? nativeAppIdentityFromIos(files, parseInfoPlist) : null;
|
|
2805
|
+
function extractNativeAppIdentityFromFiles(files, platform, parseInfoPlist, iosTarget) {
|
|
2806
|
+
return canExtractNativeAppIdentity(platform) ? nativeAppIdentityFromIos(files, parseInfoPlist, iosTarget) : null;
|
|
2571
2807
|
}
|
|
2572
2808
|
|
|
2573
|
-
// src/native-
|
|
2809
|
+
// src/native-app-identity-project.ts
|
|
2574
2810
|
var import_node_fs5 = __toESM(require("node:fs"), 1);
|
|
2575
|
-
var import_node_module = require("node:module");
|
|
2576
2811
|
var import_node_path5 = __toESM(require("node:path"), 1);
|
|
2577
|
-
init_is_record();
|
|
2578
2812
|
|
|
2579
2813
|
// src/plist.ts
|
|
2580
2814
|
var import_plist = __toESM(require_plist(), 1);
|
|
@@ -2921,98 +3155,6 @@ function isJsonObject(value) {
|
|
|
2921
3155
|
}
|
|
2922
3156
|
|
|
2923
3157
|
// src/xcode-project.ts
|
|
2924
|
-
function parseOpenStepPlist(text2) {
|
|
2925
|
-
let i = 0;
|
|
2926
|
-
const fail = (message) => {
|
|
2927
|
-
const line = text2.slice(0, i).split("\n").length;
|
|
2928
|
-
throw new Error(`project.pbxproj line ${line}: ${message}`);
|
|
2929
|
-
};
|
|
2930
|
-
const skip = () => {
|
|
2931
|
-
for (; ; ) {
|
|
2932
|
-
const ch = text2[i];
|
|
2933
|
-
if (ch === " " || ch === " " || ch === "\n" || ch === "\r") i++;
|
|
2934
|
-
else if (ch === "/" && text2[i + 1] === "*") {
|
|
2935
|
-
const end = text2.indexOf("*/", i + 2);
|
|
2936
|
-
if (end < 0) fail("unterminated comment");
|
|
2937
|
-
i = end + 2;
|
|
2938
|
-
} else if (ch === "/" && text2[i + 1] === "/") {
|
|
2939
|
-
const end = text2.indexOf("\n", i);
|
|
2940
|
-
i = end < 0 ? text2.length : end + 1;
|
|
2941
|
-
} else return;
|
|
2942
|
-
}
|
|
2943
|
-
};
|
|
2944
|
-
const quoted = () => {
|
|
2945
|
-
i++;
|
|
2946
|
-
let out = "";
|
|
2947
|
-
for (; ; ) {
|
|
2948
|
-
const ch = text2[i++];
|
|
2949
|
-
if (ch === void 0) fail("unterminated string");
|
|
2950
|
-
if (ch === '"') return out;
|
|
2951
|
-
if (ch !== "\\") {
|
|
2952
|
-
out += ch;
|
|
2953
|
-
continue;
|
|
2954
|
-
}
|
|
2955
|
-
const next = text2[i++];
|
|
2956
|
-
if (next === "n") out += "\n";
|
|
2957
|
-
else if (next === "t") out += " ";
|
|
2958
|
-
else if (next === "r") out += "\r";
|
|
2959
|
-
else if (next === "U") {
|
|
2960
|
-
out += String.fromCharCode(parseInt(text2.slice(i, i + 4), 16));
|
|
2961
|
-
i += 4;
|
|
2962
|
-
} else out += next;
|
|
2963
|
-
}
|
|
2964
|
-
};
|
|
2965
|
-
const value = () => {
|
|
2966
|
-
skip();
|
|
2967
|
-
const ch = text2[i];
|
|
2968
|
-
if (ch === "{") {
|
|
2969
|
-
i++;
|
|
2970
|
-
const dict = {};
|
|
2971
|
-
for (; ; ) {
|
|
2972
|
-
skip();
|
|
2973
|
-
if (text2[i] === "}") {
|
|
2974
|
-
i++;
|
|
2975
|
-
return dict;
|
|
2976
|
-
}
|
|
2977
|
-
const key = value();
|
|
2978
|
-
if (typeof key !== "string") fail("dictionary key is not a string");
|
|
2979
|
-
skip();
|
|
2980
|
-
if (text2[i++] !== "=") fail("expected =");
|
|
2981
|
-
dict[key] = value();
|
|
2982
|
-
skip();
|
|
2983
|
-
if (text2[i++] !== ";") fail("expected ;");
|
|
2984
|
-
}
|
|
2985
|
-
}
|
|
2986
|
-
if (ch === "(") {
|
|
2987
|
-
i++;
|
|
2988
|
-
const list2 = [];
|
|
2989
|
-
for (; ; ) {
|
|
2990
|
-
skip();
|
|
2991
|
-
if (text2[i] === ")") {
|
|
2992
|
-
i++;
|
|
2993
|
-
return list2;
|
|
2994
|
-
}
|
|
2995
|
-
list2.push(value());
|
|
2996
|
-
skip();
|
|
2997
|
-
if (text2[i] === ",") i++;
|
|
2998
|
-
else if (text2[i] !== ")") fail("expected , or )");
|
|
2999
|
-
}
|
|
3000
|
-
}
|
|
3001
|
-
if (ch === '"') return quoted();
|
|
3002
|
-
const start = i;
|
|
3003
|
-
while (i < text2.length && /[A-Za-z0-9_$+/:.\-<>]/.test(text2[i])) i++;
|
|
3004
|
-
if (i === start) fail(`unexpected ${JSON.stringify(ch ?? "end of file")}`);
|
|
3005
|
-
return text2.slice(start, i);
|
|
3006
|
-
};
|
|
3007
|
-
if (text2.startsWith("// !$*UTF8*$!")) i = text2.indexOf("\n") + 1;
|
|
3008
|
-
const root = value();
|
|
3009
|
-
skip();
|
|
3010
|
-
if (i !== text2.length) fail("trailing content");
|
|
3011
|
-
return root;
|
|
3012
|
-
}
|
|
3013
|
-
var isDict = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
3014
|
-
var str = (value) => typeof value === "string" ? value : void 0;
|
|
3015
|
-
var list = (value) => Array.isArray(value) ? value.filter((item) => typeof item === "string") : [];
|
|
3016
3158
|
var APPLICATION = "com.apple.product-type.application";
|
|
3017
3159
|
var MODULE_PRODUCTS = /* @__PURE__ */ new Set([
|
|
3018
3160
|
"com.apple.product-type.framework",
|
|
@@ -3039,9 +3181,9 @@ function walkFiles(dir) {
|
|
|
3039
3181
|
return out;
|
|
3040
3182
|
}
|
|
3041
3183
|
var isDirectory = (dir) => import_node_fs4.default.existsSync(dir) && import_node_fs4.default.statSync(dir).isDirectory();
|
|
3042
|
-
function readXcconfig(file,
|
|
3043
|
-
if (
|
|
3044
|
-
|
|
3184
|
+
function readXcconfig(file, read) {
|
|
3185
|
+
if (read.includes(file) || !import_node_fs4.default.existsSync(file)) return {};
|
|
3186
|
+
read.push(file);
|
|
3045
3187
|
const settings = {};
|
|
3046
3188
|
for (const raw of import_node_fs4.default.readFileSync(file, "utf8").split("\n")) {
|
|
3047
3189
|
const line = raw.replace(/\/\/.*$/, "").trim();
|
|
@@ -3049,7 +3191,7 @@ function readXcconfig(file, seen = /* @__PURE__ */ new Set()) {
|
|
|
3049
3191
|
if (include) {
|
|
3050
3192
|
Object.assign(
|
|
3051
3193
|
settings,
|
|
3052
|
-
readXcconfig(import_node_path4.default.resolve(import_node_path4.default.dirname(file), include[1]),
|
|
3194
|
+
readXcconfig(import_node_path4.default.resolve(import_node_path4.default.dirname(file), include[1]), read)
|
|
3053
3195
|
);
|
|
3054
3196
|
continue;
|
|
3055
3197
|
}
|
|
@@ -3197,17 +3339,30 @@ function loadProject(xcodeproj) {
|
|
|
3197
3339
|
loaded.set(projectFile, { mtimeMs, project: result });
|
|
3198
3340
|
return result;
|
|
3199
3341
|
}
|
|
3200
|
-
function
|
|
3342
|
+
function defaultConfiguration(project) {
|
|
3343
|
+
const configList = project.object(str(project.project.buildConfigurationList));
|
|
3344
|
+
const names = list(configList?.buildConfigurations).flatMap(
|
|
3345
|
+
(id) => str(project.object(id)?.name) ?? []
|
|
3346
|
+
);
|
|
3347
|
+
return names.includes("Debug") ? "Debug" : str(configList?.defaultConfigurationName) ?? names[0] ?? "Debug";
|
|
3348
|
+
}
|
|
3349
|
+
function targetSettings(ref, configuration, builtins) {
|
|
3201
3350
|
const { project, target } = ref;
|
|
3351
|
+
const xcconfigs = [];
|
|
3202
3352
|
const level = (listId) => {
|
|
3203
|
-
const
|
|
3204
|
-
const
|
|
3353
|
+
const configList = project.object(listId);
|
|
3354
|
+
const configs = list(configList?.buildConfigurations).map(project.object);
|
|
3355
|
+
const config = configs.find((entry) => entry?.name === configuration) ?? configs.find((entry) => entry?.name === str(configList?.defaultConfigurationName));
|
|
3205
3356
|
if (!config) return [];
|
|
3206
|
-
const name2 = str(config.name) ??
|
|
3357
|
+
const name2 = str(config.name) ?? configuration;
|
|
3207
3358
|
const base = str(config.baseConfigurationReference);
|
|
3208
3359
|
const own = isDict(config.buildSettings) ? config.buildSettings : {};
|
|
3360
|
+
const baseFile = base ? project.resolvePath(base) : null;
|
|
3361
|
+
const read = [];
|
|
3362
|
+
const fromFile = baseFile ? readXcconfig(baseFile, read) : {};
|
|
3363
|
+
xcconfigs.push(...read);
|
|
3209
3364
|
return [
|
|
3210
|
-
applyConditions(
|
|
3365
|
+
applyConditions(fromFile, name2),
|
|
3211
3366
|
applyConditions(
|
|
3212
3367
|
Object.fromEntries(
|
|
3213
3368
|
Object.entries(own).flatMap(
|
|
@@ -3219,7 +3374,7 @@ function targetSettings(ref, builtins) {
|
|
|
3219
3374
|
];
|
|
3220
3375
|
};
|
|
3221
3376
|
const levels = [
|
|
3222
|
-
builtins,
|
|
3377
|
+
{ ...builtins, CONFIGURATION: configuration },
|
|
3223
3378
|
...level(str(project.project.buildConfigurationList)),
|
|
3224
3379
|
...level(str(target.buildConfigurationList))
|
|
3225
3380
|
];
|
|
@@ -3258,9 +3413,30 @@ function targetSettings(ref, builtins) {
|
|
|
3258
3413
|
};
|
|
3259
3414
|
return {
|
|
3260
3415
|
get: (key) => valueAt(key, levels.length - 1),
|
|
3261
|
-
keys: new Set(levels.flatMap((values) => Object.keys(values)))
|
|
3416
|
+
keys: new Set(levels.flatMap((values) => Object.keys(values))),
|
|
3417
|
+
xcconfigs
|
|
3262
3418
|
};
|
|
3263
3419
|
}
|
|
3420
|
+
function settingList(value) {
|
|
3421
|
+
const items2 = [];
|
|
3422
|
+
for (const [, quoted, plain] of value.matchAll(
|
|
3423
|
+
/"((?:\\.|[^"\\])*)"|((?:\\.|[^\s"])+)/g
|
|
3424
|
+
))
|
|
3425
|
+
items2.push((quoted ?? plain).replace(/\\(.)/g, "$1"));
|
|
3426
|
+
return items2;
|
|
3427
|
+
}
|
|
3428
|
+
function compilationConditions(settings) {
|
|
3429
|
+
const flags = settingList(settings("OTHER_SWIFT_FLAGS"));
|
|
3430
|
+
const defined = flags.flatMap(
|
|
3431
|
+
(flag, index) => flag === "-D" ? flags[index + 1] ?? [] : flag.startsWith("-D") ? flag.slice(2) : []
|
|
3432
|
+
);
|
|
3433
|
+
return [
|
|
3434
|
+
.../* @__PURE__ */ new Set([
|
|
3435
|
+
...settingList(settings("SWIFT_ACTIVE_COMPILATION_CONDITIONS")),
|
|
3436
|
+
...defined
|
|
3437
|
+
])
|
|
3438
|
+
];
|
|
3439
|
+
}
|
|
3264
3440
|
function expand(value, lookup) {
|
|
3265
3441
|
return value.replace(
|
|
3266
3442
|
/\$(?:\(([A-Za-z_][A-Za-z0-9_]*)((?::[^)]*)?)\)|\{([A-Za-z_][A-Za-z0-9_]*)((?::[^}]*)?)\}|([A-Za-z_][A-Za-z0-9_]*))/g,
|
|
@@ -3271,8 +3447,9 @@ function expand(value, lookup) {
|
|
|
3271
3447
|
}
|
|
3272
3448
|
);
|
|
3273
3449
|
}
|
|
3274
|
-
function targetMembers(ref) {
|
|
3450
|
+
function targetMembers(ref, settings, options = {}) {
|
|
3275
3451
|
const { project, target, id: targetId } = ref;
|
|
3452
|
+
const targetName = str(target.name) ?? targetId;
|
|
3276
3453
|
const sources = /* @__PURE__ */ new Set();
|
|
3277
3454
|
const allSources = /* @__PURE__ */ new Set();
|
|
3278
3455
|
const resources = /* @__PURE__ */ new Set();
|
|
@@ -3293,6 +3470,29 @@ function targetMembers(ref) {
|
|
|
3293
3470
|
const resolved = project.resolvePath(refId);
|
|
3294
3471
|
return resolved ? [resolved] : [];
|
|
3295
3472
|
};
|
|
3473
|
+
const scriptForOutput = /* @__PURE__ */ new Map();
|
|
3474
|
+
const noteScriptOutput = (raw, script) => {
|
|
3475
|
+
const expanded = expand(raw, settings);
|
|
3476
|
+
if (!expanded.endsWith(".swift")) return;
|
|
3477
|
+
const absolute = import_node_path4.default.isAbsolute(expanded) ? import_node_path4.default.normalize(expanded) : import_node_path4.default.resolve(project.projectDir, expanded);
|
|
3478
|
+
if (!scriptForOutput.has(absolute)) scriptForOutput.set(absolute, script);
|
|
3479
|
+
};
|
|
3480
|
+
for (const phaseId of list(target.buildPhases)) {
|
|
3481
|
+
const phase = project.object(phaseId);
|
|
3482
|
+
if (phase?.isa !== "PBXShellScriptBuildPhase") continue;
|
|
3483
|
+
const script = str(phase.name) ?? phaseId;
|
|
3484
|
+
for (const raw of list(phase.outputPaths)) noteScriptOutput(raw, script);
|
|
3485
|
+
for (const listPath of list(phase.outputFileListPaths)) {
|
|
3486
|
+
const expandedList = expand(listPath, settings);
|
|
3487
|
+
const absoluteList = import_node_path4.default.isAbsolute(expandedList) ? expandedList : import_node_path4.default.resolve(project.projectDir, expandedList);
|
|
3488
|
+
if (!import_node_fs4.default.existsSync(absoluteList)) continue;
|
|
3489
|
+
for (const line of import_node_fs4.default.readFileSync(absoluteList, "utf8").split("\n")) {
|
|
3490
|
+
const trimmed = line.trim();
|
|
3491
|
+
if (trimmed === "" || trimmed.startsWith("#")) continue;
|
|
3492
|
+
noteScriptOutput(trimmed, script);
|
|
3493
|
+
}
|
|
3494
|
+
}
|
|
3495
|
+
}
|
|
3296
3496
|
for (const phaseId of list(target.buildPhases)) {
|
|
3297
3497
|
const phase = project.object(phaseId);
|
|
3298
3498
|
if (phase?.isa !== "PBXSourcesBuildPhase" && phase?.isa !== "PBXResourcesBuildPhase")
|
|
@@ -3300,13 +3500,30 @@ function targetMembers(ref) {
|
|
|
3300
3500
|
for (const buildFileId of list(phase.files)) {
|
|
3301
3501
|
for (const file of fileRefPaths(str(project.object(buildFileId)?.fileRef) ?? "")) {
|
|
3302
3502
|
if (phase.isa === "PBXSourcesBuildPhase") {
|
|
3303
|
-
if (!import_node_fs4.default.existsSync(file))
|
|
3503
|
+
if (!import_node_fs4.default.existsSync(file)) {
|
|
3504
|
+
if (options.requireSources === false) continue;
|
|
3505
|
+
const script = scriptForOutput.get(import_node_path4.default.normalize(file));
|
|
3506
|
+
throw new Error(
|
|
3507
|
+
script ? `${targetName}: missing generated source ${file} (Run Script "${script}" declares it in outputPaths; run the script or check in its output)` : `${targetName}: missing source ${file}`
|
|
3508
|
+
);
|
|
3509
|
+
}
|
|
3304
3510
|
allSources.add(file);
|
|
3305
3511
|
if (file.endsWith(".swift")) sources.add(file);
|
|
3306
3512
|
} else if (phase.isa === "PBXResourcesBuildPhase") addResource(file);
|
|
3307
3513
|
}
|
|
3308
3514
|
}
|
|
3309
3515
|
}
|
|
3516
|
+
for (const [file, script] of scriptForOutput) {
|
|
3517
|
+
if (sources.has(file) || allSources.has(file)) continue;
|
|
3518
|
+
if (!import_node_fs4.default.existsSync(file)) {
|
|
3519
|
+
if (options.requireSources === false) continue;
|
|
3520
|
+
throw new Error(
|
|
3521
|
+
`${targetName}: missing generated source ${file} (Run Script "${script}" declares it in outputPaths; run the script or check in its output)`
|
|
3522
|
+
);
|
|
3523
|
+
}
|
|
3524
|
+
allSources.add(file);
|
|
3525
|
+
sources.add(file);
|
|
3526
|
+
}
|
|
3310
3527
|
const addSynchronized = (folder, relative2) => {
|
|
3311
3528
|
const file = import_node_path4.default.join(folder, relative2);
|
|
3312
3529
|
if (NEVER_MEMBER.test(relative2)) return;
|
|
@@ -3409,7 +3626,7 @@ function nativeTargets(project) {
|
|
|
3409
3626
|
function listXcodeAppTargets(xcodeprojOrWorkspace) {
|
|
3410
3627
|
return workspaceProjects(xcodeprojOrWorkspace).projects.flatMap(nativeTargets).filter((ref) => ref.target.productType === APPLICATION).map((ref) => str(ref.target.name) ?? ref.id);
|
|
3411
3628
|
}
|
|
3412
|
-
function readXcodeAppTarget(input, targetName) {
|
|
3629
|
+
function readXcodeAppTarget(input, targetName, configurationName, options = {}) {
|
|
3413
3630
|
const xcodeprojOrWorkspace = import_node_fs4.default.realpathSync(input);
|
|
3414
3631
|
const workspace = xcodeprojOrWorkspace.endsWith(".xcworkspace") ? xcodeprojOrWorkspace : null;
|
|
3415
3632
|
const { listed, projects, projectAt } = workspaceProjects(xcodeprojOrWorkspace);
|
|
@@ -3424,6 +3641,7 @@ function readXcodeAppTarget(input, targetName) {
|
|
|
3424
3641
|
);
|
|
3425
3642
|
}
|
|
3426
3643
|
const app = named[0];
|
|
3644
|
+
const configuration = configurationName ?? defaultConfiguration(app.project);
|
|
3427
3645
|
const byProduct = /* @__PURE__ */ new Map();
|
|
3428
3646
|
for (const ref of allTargets) {
|
|
3429
3647
|
const product = ref.project.object(str(ref.target.productReference));
|
|
@@ -3474,9 +3692,14 @@ function readXcodeAppTarget(input, targetName) {
|
|
|
3474
3692
|
order.push(ref);
|
|
3475
3693
|
};
|
|
3476
3694
|
visit(app);
|
|
3695
|
+
const xcconfigs = /* @__PURE__ */ new Set();
|
|
3477
3696
|
const moduleTarget = (ref) => {
|
|
3478
3697
|
const name2 = str(ref.target.name) ?? ref.id;
|
|
3479
|
-
const {
|
|
3698
|
+
const {
|
|
3699
|
+
get: settings2,
|
|
3700
|
+
keys,
|
|
3701
|
+
xcconfigs: read
|
|
3702
|
+
} = targetSettings(ref, configuration, {
|
|
3480
3703
|
TARGET_NAME: name2,
|
|
3481
3704
|
PROJECT_NAME: import_node_path4.default.basename(ref.project.xcodeproj, ".xcodeproj"),
|
|
3482
3705
|
SRCROOT: ref.project.projectDir,
|
|
@@ -3484,6 +3707,7 @@ function readXcodeAppTarget(input, targetName) {
|
|
|
3484
3707
|
PROJECT_DIR: ref.project.projectDir,
|
|
3485
3708
|
DEVELOPMENT_LANGUAGE: str(ref.project.project.developmentRegion) ?? "en"
|
|
3486
3709
|
});
|
|
3710
|
+
for (const file of read) xcconfigs.add(file);
|
|
3487
3711
|
const swiftVersion = Number.parseFloat(settings2("SWIFT_VERSION") || "5");
|
|
3488
3712
|
return {
|
|
3489
3713
|
settings: settings2,
|
|
@@ -3491,9 +3715,10 @@ function readXcodeAppTarget(input, targetName) {
|
|
|
3491
3715
|
module: {
|
|
3492
3716
|
name: name2,
|
|
3493
3717
|
moduleName: applyOperator(settings2("PRODUCT_MODULE_NAME"), "c99extidentifier"),
|
|
3494
|
-
...targetMembers(ref),
|
|
3718
|
+
...targetMembers(ref, settings2, options),
|
|
3495
3719
|
languageMode: swiftVersion >= 6 ? 6 : 5,
|
|
3496
|
-
mainActorIsolation: settings2("SWIFT_DEFAULT_ACTOR_ISOLATION") === "MainActor"
|
|
3720
|
+
mainActorIsolation: settings2("SWIFT_DEFAULT_ACTOR_ISOLATION") === "MainActor",
|
|
3721
|
+
defines: compilationConditions(settings2)
|
|
3497
3722
|
}
|
|
3498
3723
|
};
|
|
3499
3724
|
};
|
|
@@ -3599,7 +3824,9 @@ function readXcodeAppTarget(input, targetName) {
|
|
|
3599
3824
|
)
|
|
3600
3825
|
].map((dir) => import_node_fs4.default.realpathSync(dir))
|
|
3601
3826
|
),
|
|
3602
|
-
projectFiles: [
|
|
3827
|
+
projectFiles: [
|
|
3828
|
+
.../* @__PURE__ */ new Set([...used.map((project) => project.projectFile), ...xcconfigs])
|
|
3829
|
+
].sort(),
|
|
3603
3830
|
appIconName: settings("ASSETCATALOG_COMPILER_APPICON_NAME"),
|
|
3604
3831
|
infoPlist: import_plist2.default.build(info),
|
|
3605
3832
|
infoPlistFile,
|
|
@@ -3610,59 +3837,216 @@ function readXcodeAppTarget(input, targetName) {
|
|
|
3610
3837
|
].sort(),
|
|
3611
3838
|
binaryFrameworks: [...binaryFrameworks].map(([name2, file]) => ({ name: name2, path: file })).sort((left, right) => left.name.localeCompare(right.name)),
|
|
3612
3839
|
packageResolved: import_node_fs4.default.existsSync(resolvedFile) ? resolvedFile : null,
|
|
3613
|
-
appTargets: appTargetNames
|
|
3840
|
+
appTargets: appTargetNames,
|
|
3841
|
+
configuration,
|
|
3842
|
+
settings
|
|
3843
|
+
};
|
|
3844
|
+
}
|
|
3845
|
+
|
|
3846
|
+
// src/native-app-identity-project.ts
|
|
3847
|
+
function isRecord2(value) {
|
|
3848
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
3849
|
+
}
|
|
3850
|
+
function nonEmptyString2(value) {
|
|
3851
|
+
return typeof value === "string" && value.length > 0 ? value : void 0;
|
|
3852
|
+
}
|
|
3853
|
+
function readNativeAppIdentityFromXcodeTarget(app, parseInfoPlist = parsePlistSource) {
|
|
3854
|
+
const dictionary = parseInfoPlist(app.infoPlist);
|
|
3855
|
+
if (!isRecord2(dictionary)) throw new Error("native app Info.plist is not a dictionary");
|
|
3856
|
+
const settings = app.settings;
|
|
3857
|
+
const bundleIdentifier = nonEmptyString2(dictionary.CFBundleIdentifier) ?? nonEmptyString2(settings?.("PRODUCT_BUNDLE_IDENTIFIER"));
|
|
3858
|
+
if (!bundleIdentifier) throw new Error("native app has no bundle identifier");
|
|
3859
|
+
const appVersion = nonEmptyString2(dictionary.CFBundleShortVersionString) ?? nonEmptyString2(settings?.("MARKETING_VERSION"));
|
|
3860
|
+
const buildVersion = nonEmptyString2(dictionary.CFBundleVersion) ?? nonEmptyString2(settings?.("CURRENT_PROJECT_VERSION"));
|
|
3861
|
+
if (!appVersion || !buildVersion) {
|
|
3862
|
+
throw new Error("native app has no version or build version");
|
|
3863
|
+
}
|
|
3864
|
+
const bundleName = nonEmptyString2(dictionary.CFBundleName) ?? nonEmptyString2(settings?.("PRODUCT_NAME")) ?? app.name;
|
|
3865
|
+
const applicationDisplayName = nonEmptyString2(dictionary.CFBundleDisplayName);
|
|
3866
|
+
const applicationName = applicationDisplayName ?? bundleName;
|
|
3867
|
+
const declaredBackgroundColor = dictionary.RCTRootViewBackgroundColor;
|
|
3868
|
+
const rootViewBackgroundColor = typeof declaredBackgroundColor === "number" && Number.isInteger(declaredBackgroundColor) ? declaredBackgroundColor : void 0;
|
|
3869
|
+
const alternateIconNames = /* @__PURE__ */ new Set();
|
|
3870
|
+
const icons = dictionary.CFBundleIcons;
|
|
3871
|
+
const alternates = isRecord2(icons) ? icons.CFBundleAlternateIcons : void 0;
|
|
3872
|
+
if (isRecord2(alternates)) {
|
|
3873
|
+
for (const name2 of Object.keys(alternates)) {
|
|
3874
|
+
if (name2) alternateIconNames.add(name2);
|
|
3875
|
+
}
|
|
3876
|
+
}
|
|
3877
|
+
const alternateSetting = settings?.("ASSETCATALOG_COMPILER_ALTERNATE_APPICON_NAMES") ?? "";
|
|
3878
|
+
for (const match of alternateSetting.replace(/\\"/g, '"').matchAll(/"([^"]*)"|([^\s(),]+)/g)) {
|
|
3879
|
+
const val = match[1] ?? match[2];
|
|
3880
|
+
if (val) alternateIconNames.add(val);
|
|
3881
|
+
}
|
|
3882
|
+
const permissionUsageDescriptions = {};
|
|
3883
|
+
for (const [key, value] of Object.entries(dictionary)) {
|
|
3884
|
+
if (!/^NS.*UsageDescription$/.test(key) && key !== "NSLocationTemporaryUsageDescriptionDictionary") {
|
|
3885
|
+
continue;
|
|
3886
|
+
}
|
|
3887
|
+
permissionUsageDescriptions[key] = value;
|
|
3888
|
+
}
|
|
3889
|
+
const querySchemes = dictionary.LSApplicationQueriesSchemes;
|
|
3890
|
+
const urlQuerySchemes = Array.isArray(querySchemes) ? querySchemes : [];
|
|
3891
|
+
const intentIds = dictionary.OneAppIntentIdentifiers;
|
|
3892
|
+
const appIntentIdentifiers = Array.isArray(intentIds) && intentIds.every((v) => typeof v === "string") ? intentIds : [];
|
|
3893
|
+
const backgroundIds = dictionary.BGTaskSchedulerPermittedIdentifiers;
|
|
3894
|
+
const backgroundTaskIdentifiers = Array.isArray(backgroundIds) && backgroundIds.every((v) => typeof v === "string") ? backgroundIds : [];
|
|
3895
|
+
const declaredModes = dictionary.UIBackgroundModes;
|
|
3896
|
+
const backgroundModes = Array.isArray(declaredModes) && declaredModes.every((v) => typeof v === "string") ? declaredModes : [];
|
|
3897
|
+
const supportedInterfaceOrientations = Array.isArray(dictionary.UISupportedInterfaceOrientations) && dictionary.UISupportedInterfaceOrientations.every((v) => typeof v === "string") ? dictionary.UISupportedInterfaceOrientations : [];
|
|
3898
|
+
const ipadSupportedInterfaceOrientations = Array.isArray(dictionary["UISupportedInterfaceOrientations~ipad"]) && dictionary["UISupportedInterfaceOrientations~ipad"].every(
|
|
3899
|
+
(v) => typeof v === "string"
|
|
3900
|
+
) ? dictionary["UISupportedInterfaceOrientations~ipad"] : [];
|
|
3901
|
+
const defaultScreenOrientationMask = nonEmptyString2(
|
|
3902
|
+
dictionary.EXDefaultScreenOrientationMask
|
|
3903
|
+
);
|
|
3904
|
+
const shareIntoAppGroupId = nonEmptyString2(dictionary.ExpoShareIntoAppGroupId);
|
|
3905
|
+
return {
|
|
3906
|
+
applicationName,
|
|
3907
|
+
...applicationDisplayName ? { applicationDisplayName } : {},
|
|
3908
|
+
...rootViewBackgroundColor !== void 0 ? { rootViewBackgroundColor } : {},
|
|
3909
|
+
bundleName,
|
|
3910
|
+
appVersion,
|
|
3911
|
+
buildVersion,
|
|
3912
|
+
bundleIdentifier,
|
|
3913
|
+
platform: "ios",
|
|
3914
|
+
supportedInterfaceOrientations,
|
|
3915
|
+
ipadSupportedInterfaceOrientations,
|
|
3916
|
+
...defaultScreenOrientationMask ? { defaultScreenOrientationMask } : {},
|
|
3917
|
+
alternateIconNames: [...alternateIconNames],
|
|
3918
|
+
permissionUsageDescriptions,
|
|
3919
|
+
urlQuerySchemes,
|
|
3920
|
+
...shareIntoAppGroupId ? { shareIntoAppGroupId } : {},
|
|
3921
|
+
backgroundTaskIdentifiers,
|
|
3922
|
+
backgroundModes,
|
|
3923
|
+
appIntentIdentifiers
|
|
3614
3924
|
};
|
|
3615
3925
|
}
|
|
3926
|
+
function readNativeAppIdentityFromProject(projectRoot, platform, parseInfoPlist = parsePlistSource, iosTarget) {
|
|
3927
|
+
if (!canExtractNativeAppIdentity(platform)) return null;
|
|
3928
|
+
const iosRoot = import_node_path5.default.join(projectRoot, "ios");
|
|
3929
|
+
if (!import_node_fs5.default.existsSync(iosRoot)) return null;
|
|
3930
|
+
const projects = import_node_fs5.default.readdirSync(iosRoot, { withFileTypes: true }).filter((entry) => entry.isDirectory() && entry.name.endsWith(".xcodeproj"));
|
|
3931
|
+
if (projects.length === 0) return null;
|
|
3932
|
+
if (projects.length > 1 && !iosTarget) {
|
|
3933
|
+
throw new Error("native app identity requires a selected Xcode project");
|
|
3934
|
+
}
|
|
3935
|
+
let project = projects[0];
|
|
3936
|
+
if (iosTarget && projects.length > 1) {
|
|
3937
|
+
const matches = projects.filter(
|
|
3938
|
+
(entry) => listXcodeAppTargets(import_node_path5.default.join(iosRoot, entry.name)).includes(iosTarget)
|
|
3939
|
+
);
|
|
3940
|
+
if (matches.length === 0) {
|
|
3941
|
+
throw new Error(`native app identity has no application target ${iosTarget}`);
|
|
3942
|
+
}
|
|
3943
|
+
if (matches.length > 1) {
|
|
3944
|
+
throw new Error(
|
|
3945
|
+
`native app identity target ${iosTarget} is ambiguous across ${matches.map((entry) => entry.name).join(", ")}`
|
|
3946
|
+
);
|
|
3947
|
+
}
|
|
3948
|
+
project = matches[0];
|
|
3949
|
+
}
|
|
3950
|
+
const xcodeproj = import_node_path5.default.join(iosRoot, project.name);
|
|
3951
|
+
const appTargets = listXcodeAppTargets(xcodeproj);
|
|
3952
|
+
if (!iosTarget && appTargets.length > 1) {
|
|
3953
|
+
throw new Error("native app identity requires a selected app target");
|
|
3954
|
+
}
|
|
3955
|
+
const app = readXcodeAppTarget(xcodeproj, iosTarget ?? appTargets[0], "Release", {
|
|
3956
|
+
requireSources: false
|
|
3957
|
+
});
|
|
3958
|
+
return readNativeAppIdentityFromXcodeTarget(app, parseInfoPlist);
|
|
3959
|
+
}
|
|
3616
3960
|
|
|
3617
3961
|
// src/native-firebase-config.ts
|
|
3618
|
-
|
|
3962
|
+
var import_node_child_process = require("node:child_process");
|
|
3963
|
+
var import_node_fs6 = __toESM(require("node:fs"), 1);
|
|
3964
|
+
var import_node_os = __toESM(require("node:os"), 1);
|
|
3965
|
+
var import_node_path6 = __toESM(require("node:path"), 1);
|
|
3966
|
+
init_is_record();
|
|
3967
|
+
function readNativeFirebaseConfig(projectRoot, platforms = ["ios", "android"], iosTarget) {
|
|
3619
3968
|
const result = {};
|
|
3620
3969
|
let config = {};
|
|
3621
|
-
const appJsonPath =
|
|
3622
|
-
const appJson =
|
|
3623
|
-
const staticExpo =
|
|
3624
|
-
(value) =>
|
|
3970
|
+
const appJsonPath = import_node_path6.default.join(projectRoot, "app.json");
|
|
3971
|
+
const appJson = import_node_fs6.default.existsSync(appJsonPath) ? JSON.parse(import_node_fs6.default.readFileSync(appJsonPath, "utf8")) : null;
|
|
3972
|
+
const staticExpo = isRecord3(appJson) && (isRecord3(appJson.expo) || [appJson.ios, appJson.android].some(
|
|
3973
|
+
(value) => isRecord3(value) && typeof value.googleServicesFile === "string"
|
|
3625
3974
|
));
|
|
3626
3975
|
const dynamicExpo = [
|
|
3627
3976
|
"app.config.js",
|
|
3628
3977
|
"app.config.ts",
|
|
3629
3978
|
"app.config.cjs",
|
|
3630
3979
|
"app.config.mjs"
|
|
3631
|
-
].some((name2) =>
|
|
3980
|
+
].some((name2) => import_node_fs6.default.existsSync(import_node_path6.default.join(projectRoot, name2)));
|
|
3632
3981
|
if (staticExpo || dynamicExpo) {
|
|
3633
|
-
const
|
|
3634
|
-
const
|
|
3635
|
-
|
|
3636
|
-
|
|
3637
|
-
|
|
3638
|
-
|
|
3639
|
-
|
|
3640
|
-
|
|
3641
|
-
|
|
3982
|
+
const directory = import_node_fs6.default.mkdtempSync(import_node_path6.default.join(import_node_os.default.tmpdir(), "peach-expo-config-"));
|
|
3983
|
+
const resultPath = import_node_path6.default.join(directory, "config.json");
|
|
3984
|
+
try {
|
|
3985
|
+
const child = (0, import_node_child_process.spawnSync)(
|
|
3986
|
+
"node",
|
|
3987
|
+
[
|
|
3988
|
+
"--input-type=commonjs",
|
|
3989
|
+
"-e",
|
|
3990
|
+
`const { createRequire } = require('node:module');
|
|
3991
|
+
const { writeFileSync } = require('node:fs');
|
|
3992
|
+
const { join } = require('node:path');
|
|
3993
|
+
const root = process.argv[1];
|
|
3994
|
+
const { getConfig } = createRequire(join(root, 'package.json'))('@expo/config');
|
|
3995
|
+
const result = JSON.stringify(getConfig(root, { skipSDKVersionRequirement: true }).exp);
|
|
3996
|
+
if (Buffer.byteLength(result) > 1024 * 1024) throw new Error('Expo native configuration exceeds 1 MiB.');
|
|
3997
|
+
writeFileSync(process.argv[2], result, { mode: 0o600 });`,
|
|
3998
|
+
import_node_path6.default.resolve(projectRoot),
|
|
3999
|
+
resultPath
|
|
4000
|
+
],
|
|
4001
|
+
{
|
|
4002
|
+
cwd: projectRoot,
|
|
4003
|
+
encoding: "utf8",
|
|
4004
|
+
stdio: ["ignore", "ignore", "pipe"],
|
|
4005
|
+
timeout: 3e4,
|
|
4006
|
+
maxBuffer: 1024 * 1024
|
|
4007
|
+
}
|
|
4008
|
+
);
|
|
4009
|
+
if (child.error) throw child.error;
|
|
4010
|
+
if (child.status !== 0)
|
|
4011
|
+
throw new Error(child.stderr || "Expo native configuration evaluation failed.");
|
|
4012
|
+
const resolved = JSON.parse(import_node_fs6.default.readFileSync(resultPath, "utf8"));
|
|
4013
|
+
if (!isRecord3(resolved))
|
|
4014
|
+
throw new Error("Expo native configuration is unavailable.");
|
|
4015
|
+
config = resolved;
|
|
4016
|
+
} finally {
|
|
4017
|
+
import_node_fs6.default.rmSync(directory, { recursive: true, force: true });
|
|
4018
|
+
}
|
|
3642
4019
|
}
|
|
3643
4020
|
const ios = config.ios;
|
|
3644
|
-
if (platforms.includes("ios") && (!
|
|
3645
|
-
const iosRoot =
|
|
3646
|
-
if (
|
|
3647
|
-
const projects =
|
|
4021
|
+
if (platforms.includes("ios") && (!isRecord3(ios) || typeof ios.googleServicesFile !== "string")) {
|
|
4022
|
+
const iosRoot = import_node_path6.default.join(projectRoot, "ios");
|
|
4023
|
+
if (import_node_fs6.default.existsSync(iosRoot)) {
|
|
4024
|
+
const projects = import_node_fs6.default.readdirSync(iosRoot, { withFileTypes: true }).filter((entry) => entry.isDirectory() && entry.name.endsWith(".xcodeproj"));
|
|
3648
4025
|
if (projects.length > 1)
|
|
3649
4026
|
throw new Error("native Firebase configuration requires a selected Xcode project");
|
|
3650
4027
|
if (projects.length === 1) {
|
|
3651
|
-
const xcodeproj =
|
|
4028
|
+
const xcodeproj = import_node_path6.default.join(iosRoot, projects[0].name);
|
|
3652
4029
|
const appTargets = listXcodeAppTargets(xcodeproj);
|
|
3653
|
-
if (appTargets.length > 1)
|
|
4030
|
+
if (!iosTarget && appTargets.length > 1)
|
|
3654
4031
|
throw new Error("native Firebase configuration requires a selected app target");
|
|
3655
|
-
if (appTargets.length === 1) {
|
|
3656
|
-
const app = readXcodeAppTarget(
|
|
4032
|
+
if (iosTarget || appTargets.length === 1) {
|
|
4033
|
+
const app = readXcodeAppTarget(
|
|
4034
|
+
xcodeproj,
|
|
4035
|
+
iosTarget ?? appTargets[0],
|
|
4036
|
+
void 0,
|
|
4037
|
+
{
|
|
4038
|
+
requireSources: false
|
|
4039
|
+
}
|
|
4040
|
+
);
|
|
3657
4041
|
const delegates = app.allSources.filter(
|
|
3658
|
-
(file) => /^AppDelegate\.(swift|mm|m)$/.test(
|
|
4042
|
+
(file) => /^AppDelegate\.(swift|mm|m)$/.test(import_node_path6.default.basename(file))
|
|
3659
4043
|
);
|
|
3660
4044
|
const defaultConfigured = delegates.some((file) => {
|
|
3661
|
-
const source =
|
|
4045
|
+
const source = import_node_fs6.default.readFileSync(file, "utf8").replace(
|
|
3662
4046
|
/\/\*[\s\S]*?\*\/|\/\/[^\n]*|"(?:\\.|[^"\\])*"/g,
|
|
3663
4047
|
(token) => token.startsWith('"') ? '""' : token.replace(/[^\n]/g, " ")
|
|
3664
4048
|
);
|
|
3665
|
-
const launch = /(?:\bfunc\s+application\s*\([\s\S]*?didFinishLaunchingWithOptions[\s\S]*?\)\s*->\s*Bool|^-\s*\(BOOL\)\s*application\s*:[\s\S]*?didFinishLaunchingWithOptions[
|
|
4049
|
+
const launch = /(?:\bfunc\s+application\s*\([\s\S]*?didFinishLaunchingWithOptions[\s\S]*?\)\s*->\s*Bool|^-\s*\(BOOL\)\s*application\s*:[\s\S]*?didFinishLaunchingWithOptions[^{]*)\s*\{/m.exec(
|
|
3666
4050
|
source
|
|
3667
4051
|
);
|
|
3668
4052
|
if (!launch) return false;
|
|
@@ -3678,7 +4062,21 @@ function readNativeFirebaseConfig(projectRoot, platforms = ["ios", "android"]) {
|
|
|
3678
4062
|
if (token === "}") depth -= 1;
|
|
3679
4063
|
if (depth === 0) return false;
|
|
3680
4064
|
}
|
|
3681
|
-
|
|
4065
|
+
let conditionalDepth = 0;
|
|
4066
|
+
for (const directive of before.matchAll(
|
|
4067
|
+
/^\s*#\s*(if|ifdef|ifndef|elseif|elif|else|endif)\b/gm
|
|
4068
|
+
)) {
|
|
4069
|
+
const kind = directive[1];
|
|
4070
|
+
if (kind === "if" || kind === "ifdef" || kind === "ifndef") {
|
|
4071
|
+
conditionalDepth += 1;
|
|
4072
|
+
} else if (conditionalDepth === 0) {
|
|
4073
|
+
conditionalDepth = -1;
|
|
4074
|
+
break;
|
|
4075
|
+
} else if (kind === "endif") {
|
|
4076
|
+
conditionalDepth -= 1;
|
|
4077
|
+
}
|
|
4078
|
+
}
|
|
4079
|
+
if (depth !== 1 || conditionalDepth !== 0 || /\b(?:return|throw)\b/.test(before))
|
|
3682
4080
|
throw new Error(
|
|
3683
4081
|
"native Firebase initialization must be unconditional in the app launch method"
|
|
3684
4082
|
);
|
|
@@ -3686,15 +4084,15 @@ function readNativeFirebaseConfig(projectRoot, platforms = ["ios", "android"]) {
|
|
|
3686
4084
|
});
|
|
3687
4085
|
if (defaultConfigured) {
|
|
3688
4086
|
const resources = app.resources.filter(
|
|
3689
|
-
(file) => /^GoogleService-Info\.plist$/.test(
|
|
4087
|
+
(file) => /^GoogleService-Info\.plist$/.test(import_node_path6.default.basename(file))
|
|
3690
4088
|
);
|
|
3691
4089
|
if (resources.length !== 1)
|
|
3692
4090
|
throw new Error(
|
|
3693
4091
|
"native Firebase default initialization requires one GoogleService-Info.plist build resource"
|
|
3694
4092
|
);
|
|
3695
4093
|
config.ios = {
|
|
3696
|
-
googleServicesFile:
|
|
3697
|
-
|
|
4094
|
+
googleServicesFile: import_node_path6.default.relative(
|
|
4095
|
+
import_node_fs6.default.realpathSync(projectRoot),
|
|
3698
4096
|
resources[0]
|
|
3699
4097
|
)
|
|
3700
4098
|
};
|
|
@@ -3705,14 +4103,14 @@ function readNativeFirebaseConfig(projectRoot, platforms = ["ios", "android"]) {
|
|
|
3705
4103
|
}
|
|
3706
4104
|
for (const platform of platforms) {
|
|
3707
4105
|
const native = config[platform];
|
|
3708
|
-
if (!
|
|
4106
|
+
if (!isRecord3(native) || typeof native.googleServicesFile !== "string") continue;
|
|
3709
4107
|
try {
|
|
3710
|
-
const source =
|
|
3711
|
-
|
|
4108
|
+
const source = import_node_fs6.default.readFileSync(
|
|
4109
|
+
import_node_path6.default.resolve(projectRoot, native.googleServicesFile),
|
|
3712
4110
|
"utf8"
|
|
3713
4111
|
);
|
|
3714
4112
|
const parsed = platform === "ios" ? parsePlistSource(source) : JSON.parse(source);
|
|
3715
|
-
if (!
|
|
4113
|
+
if (!isRecord3(parsed)) throw new Error("Invalid Google services file.");
|
|
3716
4114
|
if (platform === "ios") {
|
|
3717
4115
|
result[platform] = {
|
|
3718
4116
|
apiKey: parsed.API_KEY,
|
|
@@ -3727,31 +4125,31 @@ function readNativeFirebaseConfig(projectRoot, platforms = ["ios", "android"]) {
|
|
|
3727
4125
|
deepLinkUrlScheme: parsed.REVERSED_CLIENT_ID
|
|
3728
4126
|
};
|
|
3729
4127
|
} else {
|
|
3730
|
-
const project =
|
|
4128
|
+
const project = isRecord3(parsed.project_info) ? parsed.project_info : {};
|
|
3731
4129
|
const clients = Array.isArray(parsed.client) ? parsed.client : [];
|
|
3732
4130
|
const client = clients.find((value) => {
|
|
3733
|
-
if (!
|
|
4131
|
+
if (!isRecord3(value) || !isRecord3(value.client_info)) return false;
|
|
3734
4132
|
const android = value.client_info.android_client_info;
|
|
3735
|
-
return
|
|
4133
|
+
return isRecord3(android) && android.package_name === native.package;
|
|
3736
4134
|
});
|
|
3737
|
-
if (!
|
|
4135
|
+
if (!isRecord3(client) || !isRecord3(client.client_info))
|
|
3738
4136
|
throw new Error("No Google services client matches the Android package.");
|
|
3739
4137
|
const apiKeys = Array.isArray(client.api_key) ? client.api_key : [];
|
|
3740
4138
|
const apiKey = apiKeys.find(
|
|
3741
|
-
(value) =>
|
|
4139
|
+
(value) => isRecord3(value) && typeof value.current_key === "string"
|
|
3742
4140
|
);
|
|
3743
4141
|
const oauthClients = Array.isArray(client.oauth_client) ? client.oauth_client : [];
|
|
3744
4142
|
const oauth = oauthClients.find(
|
|
3745
|
-
(value) =>
|
|
4143
|
+
(value) => isRecord3(value) && value.client_type === 3
|
|
3746
4144
|
);
|
|
3747
4145
|
result[platform] = {
|
|
3748
|
-
apiKey:
|
|
4146
|
+
apiKey: isRecord3(apiKey) ? apiKey.current_key : void 0,
|
|
3749
4147
|
appId: client.client_info.mobilesdk_app_id,
|
|
3750
4148
|
projectId: project.project_id,
|
|
3751
4149
|
databaseURL: project.firebase_url,
|
|
3752
4150
|
storageBucket: project.storage_bucket,
|
|
3753
4151
|
messagingSenderId: project.project_number,
|
|
3754
|
-
clientId:
|
|
4152
|
+
clientId: isRecord3(oauth) ? oauth.client_id : void 0
|
|
3755
4153
|
};
|
|
3756
4154
|
}
|
|
3757
4155
|
} catch (error) {
|
|
@@ -3848,28 +4246,28 @@ var import_url = require("url");
|
|
|
3848
4246
|
init_version();
|
|
3849
4247
|
|
|
3850
4248
|
// src/home-paths.ts
|
|
3851
|
-
var
|
|
3852
|
-
var
|
|
3853
|
-
var
|
|
4249
|
+
var import_node_fs7 = __toESM(require("node:fs"), 1);
|
|
4250
|
+
var import_node_os2 = require("node:os");
|
|
4251
|
+
var import_node_path7 = __toESM(require("node:path"), 1);
|
|
3854
4252
|
var PEACH_HOME_ENV = "PEACH_HOME";
|
|
3855
4253
|
var ACTIVE_RUNTIME_FILE = "active";
|
|
3856
4254
|
function rnxHomeDir() {
|
|
3857
4255
|
const override = process.env[PEACH_HOME_ENV];
|
|
3858
|
-
if (override && override.length > 0) return
|
|
3859
|
-
return
|
|
4256
|
+
if (override && override.length > 0) return import_node_path7.default.resolve(override);
|
|
4257
|
+
return import_node_path7.default.join((0, import_node_os2.homedir)(), ".peach");
|
|
3860
4258
|
}
|
|
3861
4259
|
function runtimesDir() {
|
|
3862
|
-
return
|
|
4260
|
+
return import_node_path7.default.join(rnxHomeDir(), "runtimes");
|
|
3863
4261
|
}
|
|
3864
4262
|
function runtimeDir(version) {
|
|
3865
|
-
return
|
|
4263
|
+
return import_node_path7.default.join(runtimesDir(), version);
|
|
3866
4264
|
}
|
|
3867
4265
|
function activeRuntimeFile() {
|
|
3868
|
-
return
|
|
4266
|
+
return import_node_path7.default.join(runtimesDir(), ACTIVE_RUNTIME_FILE);
|
|
3869
4267
|
}
|
|
3870
4268
|
function readActiveRuntime() {
|
|
3871
4269
|
try {
|
|
3872
|
-
const value =
|
|
4270
|
+
const value = import_node_fs7.default.readFileSync(activeRuntimeFile(), "utf8").trim();
|
|
3873
4271
|
return value.length > 0 ? value : null;
|
|
3874
4272
|
} catch {
|
|
3875
4273
|
return null;
|
|
@@ -4062,7 +4460,7 @@ function streamFile(res, stream) {
|
|
|
4062
4460
|
}
|
|
4063
4461
|
|
|
4064
4462
|
// src/metro-plugin.ts
|
|
4065
|
-
var prefix = "/
|
|
4463
|
+
var prefix = "/__peachsim";
|
|
4066
4464
|
function readCallableMetroExport(moduleValue, label) {
|
|
4067
4465
|
const callable = typeof moduleValue === "function" ? moduleValue : typeof moduleValue === "object" && moduleValue !== null ? Reflect.get(moduleValue, "default") : void 0;
|
|
4068
4466
|
if (typeof callable !== "function") {
|
|
@@ -4070,8 +4468,8 @@ function readCallableMetroExport(moduleValue, label) {
|
|
|
4070
4468
|
}
|
|
4071
4469
|
return (...args) => Reflect.apply(callable, void 0, args);
|
|
4072
4470
|
}
|
|
4073
|
-
function createMetroDefaultSerializer(
|
|
4074
|
-
const projectRequire = (0, import_module.createRequire)(
|
|
4471
|
+
function createMetroDefaultSerializer(asyncRequireModulePath) {
|
|
4472
|
+
const projectRequire = (0, import_module.createRequire)(asyncRequireModulePath);
|
|
4075
4473
|
const metroRoot = import_path2.default.dirname(projectRequire.resolve("metro/package.json"));
|
|
4076
4474
|
const baseJSBundle = readCallableMetroExport(
|
|
4077
4475
|
projectRequire(import_path2.default.join(metroRoot, "src/DeltaBundler/Serializers/baseJSBundle.js")),
|
|
@@ -4130,7 +4528,7 @@ function appendRNXModulePaths(result, graph, options, projectRoot) {
|
|
|
4130
4528
|
};
|
|
4131
4529
|
return typeof result === "string" ? appendRNXMetroModuleIdentityFooter(result, identity) : { ...result, code: appendRNXMetroModuleIdentityFooter(result.code, identity) };
|
|
4132
4530
|
}
|
|
4133
|
-
function
|
|
4531
|
+
function withPeach(config, options = {}) {
|
|
4134
4532
|
const cfgProjectRoot = config.projectRoot || process.cwd();
|
|
4135
4533
|
const configuredBundleUrl = "/index.bundle?platform=ios&dev=true&hot=true&minify=false";
|
|
4136
4534
|
const cfgServer = config.server;
|
|
@@ -4150,7 +4548,9 @@ function withRNX(config) {
|
|
|
4150
4548
|
serializer: {
|
|
4151
4549
|
...cfgSerializer,
|
|
4152
4550
|
customSerializer: async (entryPoint, preModules, graph, serializerOptions) => {
|
|
4153
|
-
const serializer = existingSerializer || (defaultSerializer ||= createMetroDefaultSerializer(
|
|
4551
|
+
const serializer = existingSerializer || (defaultSerializer ||= createMetroDefaultSerializer(
|
|
4552
|
+
serializerOptions.asyncRequireModulePath
|
|
4553
|
+
));
|
|
4154
4554
|
const result = await serializer(entryPoint, preModules, graph, serializerOptions);
|
|
4155
4555
|
let annotated = appendRNXModulePaths(
|
|
4156
4556
|
result,
|
|
@@ -4161,21 +4561,36 @@ function withRNX(config) {
|
|
|
4161
4561
|
const iosRoot = import_path2.default.join(cfgProjectRoot, "ios");
|
|
4162
4562
|
const bundlePlatform = graph.transformOptions?.platform;
|
|
4163
4563
|
if (canExtractNativeAppIdentity(bundlePlatform) && import_fs2.default.existsSync(iosRoot)) {
|
|
4164
|
-
|
|
4165
|
-
|
|
4166
|
-
if (!entry.isDirectory() || entry.name === "Pods") continue;
|
|
4167
|
-
const names = entry.name.endsWith(".xcodeproj") ? ["project.pbxproj"] : ["Info.plist", "AppDelegate.swift", "AppDelegate.mm", "AppDelegate.m"];
|
|
4168
|
-
for (const name2 of names) {
|
|
4169
|
-
const relative2 = `ios/${entry.name}/${name2}`;
|
|
4170
|
-
const file = import_path2.default.join(cfgProjectRoot, relative2);
|
|
4171
|
-
if (import_fs2.default.existsSync(file)) files[relative2] = import_fs2.default.readFileSync(file, "utf8");
|
|
4172
|
-
}
|
|
4173
|
-
}
|
|
4174
|
-
const identity = extractNativeAppIdentityFromFiles(
|
|
4175
|
-
files,
|
|
4564
|
+
let identity = readNativeAppIdentityFromProject(
|
|
4565
|
+
cfgProjectRoot,
|
|
4176
4566
|
bundlePlatform,
|
|
4177
|
-
parsePlistSource
|
|
4567
|
+
parsePlistSource,
|
|
4568
|
+
options.iosTarget
|
|
4178
4569
|
);
|
|
4570
|
+
if (!identity) {
|
|
4571
|
+
const files = {};
|
|
4572
|
+
for (const entry of import_fs2.default.readdirSync(iosRoot, { withFileTypes: true })) {
|
|
4573
|
+
if (entry.name === "Pods") continue;
|
|
4574
|
+
if (entry.isDirectory()) {
|
|
4575
|
+
const names = entry.name.endsWith(".xcodeproj") ? ["project.pbxproj"] : ["Info.plist", "AppDelegate.swift", "AppDelegate.mm", "AppDelegate.m"];
|
|
4576
|
+
for (const name2 of names) {
|
|
4577
|
+
const relative2 = `ios/${entry.name}/${name2}`;
|
|
4578
|
+
const file = import_path2.default.join(cfgProjectRoot, relative2);
|
|
4579
|
+
if (import_fs2.default.existsSync(file)) files[relative2] = import_fs2.default.readFileSync(file, "utf8");
|
|
4580
|
+
}
|
|
4581
|
+
} else if (/AppDelegate\.(?:swift|mm|m)$/.test(entry.name)) {
|
|
4582
|
+
const relative2 = `ios/${entry.name}`;
|
|
4583
|
+
const file = import_path2.default.join(cfgProjectRoot, relative2);
|
|
4584
|
+
if (import_fs2.default.existsSync(file)) files[relative2] = import_fs2.default.readFileSync(file, "utf8");
|
|
4585
|
+
}
|
|
4586
|
+
}
|
|
4587
|
+
identity = extractNativeAppIdentityFromFiles(
|
|
4588
|
+
files,
|
|
4589
|
+
bundlePlatform,
|
|
4590
|
+
parsePlistSource,
|
|
4591
|
+
options.iosTarget
|
|
4592
|
+
);
|
|
4593
|
+
}
|
|
4179
4594
|
if (identity) {
|
|
4180
4595
|
annotated = typeof annotated === "string" ? insertNativeAppIdentityFooter(annotated, identity) : {
|
|
4181
4596
|
...annotated,
|
|
@@ -4189,7 +4604,8 @@ function withRNX(config) {
|
|
|
4189
4604
|
const firebase = readNativeFirebaseMetadata(
|
|
4190
4605
|
readNativeFirebaseConfig(
|
|
4191
4606
|
cfgProjectRoot,
|
|
4192
|
-
typeof bundlePlatform === "string" ? [bundlePlatform] : void 0
|
|
4607
|
+
typeof bundlePlatform === "string" ? [bundlePlatform] : void 0,
|
|
4608
|
+
options.iosTarget
|
|
4193
4609
|
)
|
|
4194
4610
|
);
|
|
4195
4611
|
if (firebase)
|
|
@@ -4254,7 +4670,11 @@ function withRNX(config) {
|
|
|
4254
4670
|
res.setHeader("Content-Type", "application/json");
|
|
4255
4671
|
res.setHeader("Cache-Control", "no-store");
|
|
4256
4672
|
res.setHeader("Access-Control-Allow-Origin", "*");
|
|
4257
|
-
res.end(
|
|
4673
|
+
res.end(
|
|
4674
|
+
JSON.stringify(
|
|
4675
|
+
readNativeFirebaseConfig(cfgProjectRoot, void 0, options.iosTarget)
|
|
4676
|
+
)
|
|
4677
|
+
);
|
|
4258
4678
|
} catch (error) {
|
|
4259
4679
|
res.statusCode = 400;
|
|
4260
4680
|
res.end(
|
|
@@ -4330,10 +4750,10 @@ function resolveMetroPort(server) {
|
|
|
4330
4750
|
}
|
|
4331
4751
|
return port;
|
|
4332
4752
|
}
|
|
4333
|
-
var metro_plugin_default =
|
|
4753
|
+
var metro_plugin_default = withPeach;
|
|
4334
4754
|
// Annotate the CommonJS export names for ESM import in node:
|
|
4335
4755
|
0 && (module.exports = {
|
|
4336
|
-
|
|
4337
|
-
|
|
4338
|
-
|
|
4756
|
+
toPeachDevelopmentBundleUrl,
|
|
4757
|
+
toPeachProductionBundleUrl,
|
|
4758
|
+
withPeach
|
|
4339
4759
|
});
|