peachsim 0.1.939 → 0.1.1399
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +28 -22
- package/cli/app-catalog.ts +29 -14
- package/cli/app-fonts.ts +5 -3
- package/cli/bridge-flow-runner.ts +40 -29
- package/cli/cloud-client.ts +57 -21
- package/cli/cloud-test-tunnel.ts +12 -18
- package/cli/commands/agent.ts +1 -1
- package/cli/commands/app-fonts.ts +3 -3
- package/cli/commands/assert.ts +8 -8
- package/cli/commands/auth.ts +8 -3
- package/cli/commands/box/bundle-plane.ts +13 -1
- package/cli/commands/box.ts +16 -5
- package/cli/commands/compat.ts +1 -1
- package/cli/commands/config.ts +2 -2
- package/cli/commands/control.ts +125 -71
- package/cli/commands/cpu-profile.ts +45 -1
- package/cli/commands/daemon.ts +131 -33
- package/cli/commands/debug.ts +24 -17
- package/cli/commands/desktop.ts +7 -1
- package/cli/commands/detect.ts +101 -0
- package/cli/commands/detox.ts +6 -6
- package/cli/commands/device.ts +12 -12
- package/cli/commands/electron.ts +32 -14
- package/cli/commands/flow.ts +49 -41
- package/cli/commands/guest-host.ts +39 -1
- package/cli/commands/inspect/core.ts +14 -8
- package/cli/commands/inspect/list.ts +1 -1
- package/cli/commands/inspect/settle.ts +5 -3
- package/cli/commands/inspect/settling.ts +229 -44
- package/cli/commands/inspect/wait-idle.ts +3 -2
- package/cli/commands/inspect.ts +105 -93
- package/cli/commands/install-cli.ts +36 -15
- package/cli/commands/install-desktop.ts +68 -195
- package/cli/commands/kotlin.ts +6 -5
- package/cli/commands/login.ts +5 -5
- package/cli/commands/maestro-compare.ts +554 -0
- package/cli/commands/maestro-generate.ts +6 -3
- package/cli/commands/maestro.ts +22 -0
- package/cli/commands/mode.ts +2 -2
- package/cli/commands/no-bridge-hint.ts +6 -2
- package/cli/commands/platform.ts +35 -6
- package/cli/commands/preview.ts +6 -0
- package/cli/commands/project-report.ts +10 -12
- package/cli/commands/record.ts +37 -37
- package/cli/commands/runtime.ts +9 -9
- package/cli/commands/screenshot-layers.ts +4 -4
- package/cli/commands/screenshot-mode.ts +2 -2
- package/cli/commands/screenshot.ts +8 -8
- package/cli/commands/screenshots-capture.ts +2 -2
- package/cli/commands/serve.ts +9 -12
- package/cli/commands/setup.ts +29 -14
- package/cli/commands/shell-boolean-mode.ts +2 -2
- package/cli/commands/show-touches-mode.ts +2 -2
- package/cli/commands/skills.ts +11 -11
- package/cli/commands/swift.ts +29 -11
- package/cli/commands/telemetry.ts +2 -2
- package/cli/commands/test.ts +5 -0
- package/cli/commands/three-mode.ts +3 -3
- package/cli/commands/timeline.ts +4 -4
- package/cli/commands/upgrade.ts +2 -2
- package/cli/commands/upload.ts +15 -15
- package/cli/commands/what-happened.ts +2 -2
- package/cli/current-sim.ts +6 -3
- package/cli/desktop-companion.ts +55 -149
- package/cli/dev-build-freshness.ts +2 -2
- package/cli/drivers/desktop.ts +17 -9
- package/cli/drivers/electron.ts +1 -2
- package/cli/drivers/playwright-sim-host.ts +11 -2
- package/cli/drivers/playwright.ts +35 -2
- package/cli/drivers/types.ts +8 -0
- package/cli/maestro-compare.ts +670 -0
- package/cli/outbound-endpoints.ts +46 -8
- package/cli/recording-access.ts +6 -6
- package/cli/run-registry.ts +1 -1
- package/cli/runtime-compat.ts +5 -1
- package/cli/send-to-box.ts +3 -3
- package/cli/shell-init.ts +2 -1
- package/cli/ws-bridge.ts +9 -5
- package/detox/element-types.ts +1 -0
- package/detox/gestures.ts +3 -3
- package/detox/index.ts +67 -38
- package/detox/navigation-lifecycle.ts +9 -6
- package/detox/proof-frame.cjs +6 -4
- package/dist-lib/agent-daemon-client.cjs +1 -1
- package/dist-lib/agent-events.cjs +1 -1
- package/dist-lib/attached-projects.cjs +1 -1
- package/dist-lib/auth/shared-session.cjs +1 -1
- package/dist-lib/backend-origin.cjs +1 -1
- package/dist-lib/beta.cjs +1 -1
- package/dist-lib/beta.mjs +1 -1
- package/dist-lib/bridge-constants.cjs +1 -1
- package/dist-lib/bridge-contract-input.cjs +42 -17
- package/dist-lib/bridge-contract-input.mjs +41 -16
- package/dist-lib/bridge-contract.cjs +1 -4
- package/dist-lib/bridge-contract.mjs +1 -3
- package/dist-lib/bundle-channel.cjs +2918 -550
- package/dist-lib/capture-contract.cjs +65 -24
- package/dist-lib/capture-contract.mjs +63 -24
- package/dist-lib/cloud-contract.cjs +2 -2
- package/dist-lib/cloud-contract.mjs +2 -2
- package/dist-lib/cloud-test-args.cjs +1 -1
- package/dist-lib/cloud-test-args.mjs +1 -1
- package/dist-lib/cloud.cjs +3 -3
- package/dist-lib/cloud.mjs +3 -3
- package/dist-lib/config.cjs +15 -5
- package/dist-lib/config.mjs +154 -0
- package/dist-lib/detox/index.cjs +495 -139
- package/dist-lib/dev-bundle-resolution.cjs +1 -1
- package/dist-lib/expo-swift-bundle.cjs +1168 -238
- package/dist-lib/expo-swift-metadata.cjs +34 -23
- package/dist-lib/expo-swift-metadata.mjs +32 -23
- package/dist-lib/home-paths.cjs +2 -2
- package/dist-lib/host/bridge-host.cjs +2938 -654
- package/dist-lib/host/fetch-proxy-handler.cjs +14 -1
- package/dist-lib/host/fetch-proxy-overrides.cjs +7 -1
- package/dist-lib/host/fetch-proxy-overrides.mjs +5 -1
- package/dist-lib/host/replacement-module-handler.cjs +2 -2
- package/dist-lib/host/websocket-proxy.cjs +1 -1
- package/dist-lib/index.cjs +999 -353
- package/dist-lib/jump-to-source-babel.cjs +1 -1
- package/dist-lib/jump-to-source-native.cjs +1 -1
- package/dist-lib/kotlin-host.cjs +332 -19
- package/dist-lib/menu.cjs +1 -1
- package/dist-lib/menu.mjs +1 -1
- package/dist-lib/metro-fingerprint-registry.cjs +1 -1
- package/dist-lib/metro-fingerprint-registry.mjs +1 -1
- package/dist-lib/metro-production-bundle.cjs +7 -7
- package/dist-lib/metro-production-bundle.mjs +5 -5
- package/dist-lib/metro.cjs +688 -250
- package/dist-lib/native-app-identity-project.cjs +2647 -0
- package/dist-lib/native-app-identity-project.mjs +1257 -0
- package/dist-lib/native-app-identity.cjs +325 -25
- package/dist-lib/native-app-identity.mjs +323 -25
- package/dist-lib/native-firebase-metadata.cjs +1 -1
- package/dist-lib/native-firebase-metadata.mjs +1 -1
- package/dist-lib/plist.cjs +1 -1
- package/dist-lib/plist.mjs +1 -1
- package/dist-lib/profiles.cjs +1 -1
- package/dist-lib/public-brand.cjs +1 -1
- package/dist-lib/react-native-host-modules.cjs +5 -1
- package/dist-lib/react-native-host-modules.mjs +5 -1
- package/dist-lib/scripts/dev-server-scanner.cjs +57 -32
- package/dist-lib/sdk.cjs +231 -51
- package/dist-lib/sdk.mjs +231 -51
- package/dist-lib/skills.cjs +4107 -1374
- package/dist-lib/swift-compile.cjs +290 -30
- package/dist-lib/swift-compile.mjs +290 -30
- package/dist-lib/swift-package.cjs +143 -12
- package/dist-lib/swift-package.mjs +137 -11
- package/dist-lib/swift-submit.cjs +47 -5
- package/dist-lib/swift-submit.mjs +42 -5
- package/dist-lib/swift-toolchain.cjs +7 -2
- package/dist-lib/swift.cjs +1 -1
- package/dist-lib/vite-swift.cjs +1392 -458
- package/dist-lib/vite.cjs +13 -17
- package/dist-lib/worklet-executable.cjs +248 -33
- package/dist-lib/worklet-executable.mjs +248 -33
- package/install.sh +10 -1
- package/kotlin/{AppSources → AndroidViewSources}/android/content/res/Resources.kt +9 -9
- package/kotlin/AndroidViewSources/android/graphics/Canvas.kt +20 -0
- package/kotlin/AndroidViewSources/android/view/View.kt +211 -0
- package/kotlin/AndroidViewSources/android/widget/FrameLayout.kt +61 -0
- package/kotlin/AndroidViewSources/android/widget/LinearLayout.kt +49 -0
- package/kotlin/AppSources/android/view/Window.kt +36 -0
- package/kotlin/AppSources/android/view/WindowInsets.kt +9 -0
- package/kotlin/AppSources/android/view/WindowInsetsController.kt +5 -0
- package/kotlin/AppSources/android/window/OnBackInvokedDispatcher.kt +48 -0
- package/kotlin/AppSources/androidx/activity/OnBackPressedDispatcher.kt +20 -5
- package/kotlin/AppSources/androidx/compose/foundation/layout/WindowInsets.kt +15 -0
- package/kotlin/AppSources/androidx/compose/ui/platform/ComposeView.kt +2 -1
- package/kotlin/AppSources/dev/peach/app/PeachApp.kt +42 -50
- package/kotlin/ComposeSources/PeachComposeHost.kt +200 -84
- package/kotlin/ExpoComposeSources/PeachAndroidView.kt +87 -0
- package/kotlin/ExpoComposeSources/PeachExpoViewMount.kt +24 -0
- package/kotlin/ExpoComposeSources/dev/peach/expo/PeachExpoCompose.kt +28 -0
- package/kotlin/ExpoComposeSources/expo/modules/kotlin/views/ExpoComposeView.kt +70 -0
- package/kotlin/ExpoSources/dev/peach/expo/PeachExpoRuntime.kt +513 -0
- package/kotlin/ExpoSources/dev/peach/expo/PeachExpoTypes.kt +173 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/AppContext.kt +20 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/Promise.kt +19 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/classcomponent/ClassComponentBuilder.kt +198 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/exception/CodedException.kt +126 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/functions/Functions.kt +132 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/jni/JavaScriptTypedArray.kt +81 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/modules/Module.kt +98 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/objects/ObjectDefinitionBuilder.kt +236 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/records/Record.kt +12 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/runtime/Runtime.kt +9 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/sharedobjects/SharedObject.kt +50 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/sharedobjects/SharedObjectRegistry.kt +57 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/sharedobjects/SharedRef.kt +19 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/typedarray/ConcreteTypedArrays.kt +158 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/typedarray/GenericTypedArray.kt +8 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/typedarray/TypedArray.kt +29 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/typedarray/TypedArrayIterator.kt +9 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/types/AnyType.kt +155 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/types/Either.kt +91 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/types/Enumerable.kt +6 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/viewevent/ViewEvent.kt +54 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/views/ExpoView.kt +23 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/views/ViewDefinitionBuilder.kt +71 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/views/ViewProps.kt +35 -0
- package/kotlin/README.md +13 -3
- package/kotlin/Sources/android/os/Build.kt +17 -0
- package/kotlin/Sources/android/os/Handler.kt +35 -0
- package/kotlin/Sources/android/os/Looper.kt +17 -0
- package/kotlin/Sources/android/os/MessageQueue.kt +56 -0
- package/kotlin/Sources/android/os/SystemClock.kt +14 -0
- package/kotlin/Sources/android/util/Log.kt +64 -0
- package/kotlin/Sources/java/security/MessageDigest.kt +114 -0
- package/kotlin/Sources/kotlin/text/StringFormat.kt +9 -0
- package/kotlin/Sources/org/json/JSON.kt +44 -0
- package/kotlin/fixtures/counter/Counter.d.kt.ts +1 -0
- package/kotlin/fixtures/counter/Counter.kt +10 -3
- package/kotlin/fixtures/counter/CounterApp.native.tsx +1 -1
- package/kotlin/fixtures/counter/vite.config.ts +2 -2
- package/kotlin/fixtures/headless-counter/Headless.kt +7 -6
- package/kotlin/fixtures/import-animation/Animation.d.kt.ts +7 -0
- package/kotlin/fixtures/import-animation/Animation.kt +80 -0
- package/kotlin/fixtures/import-animation/ImportAnimation.native.tsx +13 -0
- package/kotlin/fixtures/import-animation/README.md +24 -0
- package/kotlin/fixtures/import-animation/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-animation/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-animation/app/routes.d.ts +18 -0
- package/kotlin/fixtures/import-animation/package.json +23 -0
- package/kotlin/fixtures/import-animation/tsconfig.json +20 -0
- package/kotlin/fixtures/import-animation/vite.config.ts +20 -0
- package/kotlin/fixtures/import-editor/Editor.d.kt.ts +7 -0
- package/kotlin/fixtures/import-editor/Editor.kt +59 -0
- package/kotlin/fixtures/import-editor/ImportEditor.native.tsx +23 -0
- package/kotlin/fixtures/import-editor/README.md +27 -0
- package/kotlin/fixtures/import-editor/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-editor/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-editor/package.json +23 -0
- package/kotlin/fixtures/import-editor/tsconfig.json +20 -0
- package/kotlin/fixtures/import-editor/vite.config.ts +20 -0
- package/kotlin/fixtures/import-effects/Effects.d.kt.ts +7 -0
- package/kotlin/fixtures/import-effects/Effects.kt +87 -0
- package/kotlin/fixtures/import-effects/ImportEffects.native.tsx +13 -0
- package/kotlin/fixtures/import-effects/README.md +19 -0
- package/kotlin/fixtures/import-effects/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-effects/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-effects/package.json +23 -0
- package/kotlin/fixtures/import-effects/tsconfig.json +20 -0
- package/kotlin/fixtures/import-effects/vite.config.ts +20 -0
- package/kotlin/fixtures/import-layout/ImportLayout.native.tsx +13 -0
- package/kotlin/fixtures/import-layout/Layout.d.kt.ts +7 -0
- package/kotlin/fixtures/import-layout/Layout.kt +72 -0
- package/kotlin/fixtures/import-layout/README.md +24 -0
- package/kotlin/fixtures/import-layout/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-layout/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-layout/package.json +23 -0
- package/kotlin/fixtures/import-layout/tsconfig.json +20 -0
- package/kotlin/fixtures/import-layout/vite.config.ts +20 -0
- package/kotlin/fixtures/import-navigation/ImportNavigation.native.tsx +18 -0
- package/kotlin/fixtures/import-navigation/Navigation.d.kt.ts +7 -0
- package/kotlin/fixtures/import-navigation/Navigation.kt +104 -0
- package/kotlin/fixtures/import-navigation/README.md +31 -0
- package/kotlin/fixtures/import-navigation/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-navigation/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-navigation/package.json +23 -0
- package/kotlin/fixtures/import-navigation/tsconfig.json +20 -0
- package/kotlin/fixtures/import-navigation/vite.config.ts +20 -0
- package/kotlin/fixtures/import-overlays/ImportOverlays.native.tsx +29 -0
- package/kotlin/fixtures/import-overlays/Overlays.d.kt.ts +7 -0
- package/kotlin/fixtures/import-overlays/Overlays.kt +93 -0
- package/kotlin/fixtures/import-overlays/README.md +34 -0
- package/kotlin/fixtures/import-overlays/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-overlays/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-overlays/package.json +23 -0
- package/kotlin/fixtures/import-overlays/tsconfig.json +20 -0
- package/kotlin/fixtures/import-overlays/vite.config.ts +20 -0
- package/kotlin/fixtures/import-scroll/ImportScroll.native.tsx +13 -0
- package/kotlin/fixtures/import-scroll/README.md +23 -0
- package/kotlin/fixtures/import-scroll/Scroll.d.kt.ts +7 -0
- package/kotlin/fixtures/import-scroll/Scroll.kt +91 -0
- package/kotlin/fixtures/import-scroll/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-scroll/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-scroll/package.json +23 -0
- package/kotlin/fixtures/import-scroll/tsconfig.json +20 -0
- package/kotlin/fixtures/import-scroll/vite.config.ts +20 -0
- package/kotlin/fixtures/import-selection/ImportSelection.native.tsx +44 -0
- package/kotlin/fixtures/import-selection/README.md +32 -0
- package/kotlin/fixtures/import-selection/Selection.d.kt.ts +8 -0
- package/kotlin/fixtures/import-selection/Selection.kt +78 -0
- package/kotlin/fixtures/import-selection/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-selection/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-selection/package.json +23 -0
- package/kotlin/fixtures/import-selection/tsconfig.json +20 -0
- package/kotlin/fixtures/import-selection/vite.config.ts +20 -0
- package/kotlin/fixtures/import-surfaces/ImportSurfaces.native.tsx +13 -0
- package/kotlin/fixtures/import-surfaces/README.md +22 -0
- package/kotlin/fixtures/import-surfaces/Surfaces.d.kt.ts +7 -0
- package/kotlin/fixtures/import-surfaces/Surfaces.kt +64 -0
- package/kotlin/fixtures/import-surfaces/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-surfaces/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-surfaces/package.json +23 -0
- package/kotlin/fixtures/import-surfaces/tsconfig.json +20 -0
- package/kotlin/fixtures/import-surfaces/vite.config.ts +20 -0
- package/kotlin/fixtures/import-values/ImportValues.native.tsx +35 -0
- package/kotlin/fixtures/import-values/README.md +23 -0
- package/kotlin/fixtures/import-values/Values.d.kt.ts +11 -0
- package/kotlin/fixtures/import-values/Values.kt +66 -0
- package/kotlin/fixtures/import-values/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-values/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-values/package.json +23 -0
- package/kotlin/fixtures/import-values/tsconfig.json +20 -0
- package/kotlin/fixtures/import-values/vite.config.ts +20 -0
- package/kotlin/fixtures/kotlin-app-variants/BarBehavior.kt +38 -0
- package/kotlin/fixtures/kotlin-app-variants/BarVisibility.kt +36 -0
- package/kotlin/fixtures/kotlin-app-variants/Ime.kt +3 -1
- package/kotlin/fixtures/kotlin-app-variants/TransientInsets.kt +50 -0
- package/kotlin/fork/NOTICE +6 -1
- package/kotlin/fork/README.md +15 -7
- package/kotlin/fork/build.sh +2 -0
- package/kotlin/fork/compose-worker-globals.patch +186 -4
- package/kotlin/fork/fork.json +2 -2
- package/kotlin/fork/skiko-worker-clock.patch +12 -0
- package/kotlin/toolchain.json +12 -12
- package/kotlin/tools/expo-types.main.kts +115 -0
- package/package.json +17 -23
- package/scripts/dev-server-scanner.ts +92 -66
- package/skills/contrast/SKILL.md +2 -2
- package/skills/peach-debug/SKILL.md +1 -1
- package/skills/peach-perf/SKILL.md +1 -1
- package/skills/peach-setup/SKILL.md +2 -1
- package/skills/peach-test/SKILL.md +8 -0
- package/src/assetCatalogContract.ts +43 -1
- package/src/bridge-contract-input.ts +46 -19
- package/src/bridge-contract.ts +0 -1
- package/src/bundle-channel.mjs +197 -84
- package/src/bundleGlobalFooter.ts +38 -0
- package/src/capture-contract.ts +107 -33
- package/src/cloud-contract.ts +5 -1
- package/src/cloud.ts +5 -2
- package/src/config.ts +22 -3
- package/src/configured-bundle-producer.ts +1 -1
- package/src/desktop-host-delivery.ts +95 -1
- package/src/expo-kotlin-bundle.ts +29 -0
- package/src/expo-kotlin-host.ts +201 -0
- package/src/expo-swift-host.ts +96 -76
- package/src/expoKotlinContract.ts +70 -0
- package/src/expoSwiftContract.ts +4 -25
- package/src/home-paths.ts +7 -4
- package/src/host/bridge-host.ts +23 -3
- package/src/host/fetch-proxy-handler.ts +13 -0
- package/src/host/fetch-proxy-overrides.ts +11 -0
- package/src/host/replacement-module-handler.ts +5 -2
- package/src/index.ts +3 -1
- package/src/kotlin-host.ts +463 -19
- package/src/metro-plugin.ts +56 -28
- package/src/metro-production-bundle.ts +2 -2
- package/src/native-app-identity-project.ts +190 -0
- package/src/native-app-identity.ts +398 -34
- package/src/native-firebase-config.ts +69 -15
- package/src/native-seam-manifest.ts +6 -0
- package/src/one-widget-discovery.ts +2 -1
- package/src/openstep-plist.ts +107 -0
- package/src/react-native-host-modules.ts +4 -0
- package/src/runtime-assets.ts +2 -2
- package/src/sim-client.ts +2 -2
- package/src/swift-binary-modules.ts +3 -1
- package/src/swift-compile.ts +286 -38
- package/src/swift-distribution-contract.ts +4 -0
- package/src/swift-distribution.lock.json +123 -12
- package/src/swift-distribution.ts +7 -3
- package/src/swift-host.ts +298 -83
- package/src/swift-package-manifest.ts +29 -2
- package/src/swift-package.ts +180 -10
- package/src/swift-packages.ts +4 -0
- package/src/swift-standin-emit.ts +4 -1
- package/src/swift-standins.ts +274 -15
- package/src/swift-submit.ts +62 -7
- package/src/swift-toolchain.ts +6 -1
- package/src/swiftContract.ts +126 -3
- package/src/vite-plugin-one.ts +13 -16
- package/src/vite-plugin-swift.ts +4 -5
- package/src/vite-plugin.ts +360 -144
- package/src/vite.d.ts +1 -1
- package/src/worker-system-chunks.ts +221 -0
- package/src/worklet-executable.ts +348 -38
- package/src/worklets-babel.ts +1 -1
- package/src/xcode-project.ts +243 -127
- package/dist-lib/agent-identity.cjs +0 -39
- package/dist-lib/agent-sessions.cjs +0 -760
- package/dist-lib/cli-constants.cjs +0 -32
- package/dist-lib/render-mode.cjs +0 -44
- package/kotlin/AppSources/android/view/View.kt +0 -74
- package/kotlin/AppSources/android/widget/FrameLayout.kt +0 -6
- package/src/render-mode.ts +0 -15
- /package/kotlin/{AppSources → AndroidViewSources}/android/content/Context.kt +0 -0
- /package/kotlin/{AppSources → AndroidViewSources}/android/content/res/Configuration.kt +0 -0
- /package/kotlin/{AppSources → AndroidViewSources}/android/graphics/Color.kt +0 -0
- /package/kotlin/{AppSources → AndroidViewSources}/android/util/DisplayMetrics.kt +0 -0
- /package/kotlin/{AppSources → AndroidViewSources}/dev/peach/app/JavaFormat.kt +0 -0
- /package/kotlin/{AppSources → Sources}/java/lang/Runnable.kt +0 -0
package/src/xcode-project.ts
CHANGED
|
@@ -12,109 +12,22 @@ import plist from 'plist'
|
|
|
12
12
|
import { readXcodeJsonProject } from './xcode-json-project'
|
|
13
13
|
import type { SwiftLinkedProduct } from './swift-packages'
|
|
14
14
|
|
|
15
|
-
export
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
const end = text.indexOf('*/', i + 2)
|
|
32
|
-
if (end < 0) fail('unterminated comment')
|
|
33
|
-
i = end + 2
|
|
34
|
-
} else if (ch === '/' && text[i + 1] === '/') {
|
|
35
|
-
const end = text.indexOf('\n', i)
|
|
36
|
-
i = end < 0 ? text.length : end + 1
|
|
37
|
-
} else return
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
const quoted = (): string => {
|
|
41
|
-
i++
|
|
42
|
-
let out = ''
|
|
43
|
-
for (;;) {
|
|
44
|
-
const ch = text[i++]
|
|
45
|
-
if (ch === undefined) fail('unterminated string')
|
|
46
|
-
if (ch === '"') return out
|
|
47
|
-
if (ch !== '\\') {
|
|
48
|
-
out += ch
|
|
49
|
-
continue
|
|
50
|
-
}
|
|
51
|
-
const next = text[i++]
|
|
52
|
-
if (next === 'n') out += '\n'
|
|
53
|
-
else if (next === 't') out += '\t'
|
|
54
|
-
else if (next === 'r') out += '\r'
|
|
55
|
-
else if (next === 'U') {
|
|
56
|
-
out += String.fromCharCode(parseInt(text.slice(i, i + 4), 16))
|
|
57
|
-
i += 4
|
|
58
|
-
} else out += next
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
const value = (): PlistValue => {
|
|
62
|
-
skip()
|
|
63
|
-
const ch = text[i]
|
|
64
|
-
if (ch === '{') {
|
|
65
|
-
i++
|
|
66
|
-
const dict: PlistDict = {}
|
|
67
|
-
for (;;) {
|
|
68
|
-
skip()
|
|
69
|
-
if (text[i] === '}') {
|
|
70
|
-
i++
|
|
71
|
-
return dict
|
|
72
|
-
}
|
|
73
|
-
const key = value()
|
|
74
|
-
if (typeof key !== 'string') fail('dictionary key is not a string')
|
|
75
|
-
skip()
|
|
76
|
-
if (text[i++] !== '=') fail('expected =')
|
|
77
|
-
dict[key as string] = value()
|
|
78
|
-
skip()
|
|
79
|
-
if (text[i++] !== ';') fail('expected ;')
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
if (ch === '(') {
|
|
83
|
-
i++
|
|
84
|
-
const list: PlistValue[] = []
|
|
85
|
-
for (;;) {
|
|
86
|
-
skip()
|
|
87
|
-
if (text[i] === ')') {
|
|
88
|
-
i++
|
|
89
|
-
return list
|
|
90
|
-
}
|
|
91
|
-
list.push(value())
|
|
92
|
-
skip()
|
|
93
|
-
if (text[i] === ',') i++
|
|
94
|
-
else if (text[i] !== ')') fail('expected , or )')
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
if (ch === '"') return quoted()
|
|
98
|
-
const start = i
|
|
99
|
-
while (i < text.length && /[A-Za-z0-9_$+/:.\-<>]/.test(text[i]!)) i++
|
|
100
|
-
if (i === start) fail(`unexpected ${JSON.stringify(ch ?? 'end of file')}`)
|
|
101
|
-
return text.slice(start, i)
|
|
102
|
-
}
|
|
103
|
-
if (text.startsWith('// !$*UTF8*$!')) i = text.indexOf('\n') + 1
|
|
104
|
-
const root = value()
|
|
105
|
-
skip()
|
|
106
|
-
if (i !== text.length) fail('trailing content')
|
|
107
|
-
return root
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
const isDict = (value: PlistValue | undefined): value is PlistDict =>
|
|
111
|
-
typeof value === 'object' && value !== null && !Array.isArray(value)
|
|
112
|
-
const str = (value: PlistValue | undefined): string | undefined =>
|
|
113
|
-
typeof value === 'string' ? value : undefined
|
|
114
|
-
const list = (value: PlistValue | undefined): string[] =>
|
|
115
|
-
Array.isArray(value)
|
|
116
|
-
? value.filter((item): item is string => typeof item === 'string')
|
|
117
|
-
: []
|
|
15
|
+
export {
|
|
16
|
+
parseOpenStepPlist,
|
|
17
|
+
type PlistValue,
|
|
18
|
+
type PlistDict,
|
|
19
|
+
isDict,
|
|
20
|
+
str,
|
|
21
|
+
list,
|
|
22
|
+
} from './openstep-plist'
|
|
23
|
+
import {
|
|
24
|
+
parseOpenStepPlist,
|
|
25
|
+
type PlistValue,
|
|
26
|
+
type PlistDict,
|
|
27
|
+
isDict,
|
|
28
|
+
str,
|
|
29
|
+
list,
|
|
30
|
+
} from './openstep-plist'
|
|
118
31
|
|
|
119
32
|
/** a target whose swift compiles as one module: the app, or a framework it builds. */
|
|
120
33
|
export interface XcodeModuleTarget {
|
|
@@ -123,10 +36,14 @@ export interface XcodeModuleTarget {
|
|
|
123
36
|
moduleName: string
|
|
124
37
|
/** absolute paths of the swift sources that are members of the target. */
|
|
125
38
|
sources: string[]
|
|
39
|
+
/** the target's compiled sources in every language, swift or not. */
|
|
40
|
+
allSources: string[]
|
|
126
41
|
/** absolute paths of every resource file the target copies, bundles expanded. */
|
|
127
42
|
resources: string[]
|
|
128
43
|
languageMode: number
|
|
129
44
|
mainActorIsolation: boolean
|
|
45
|
+
/** the compilation conditions the build configuration defines, as `-D` passes them. */
|
|
46
|
+
defines: string[]
|
|
130
47
|
}
|
|
131
48
|
|
|
132
49
|
/** an application target, resolved to files on disk with everything it builds. */
|
|
@@ -136,14 +53,12 @@ export interface XcodeAppTarget extends XcodeModuleTarget {
|
|
|
136
53
|
* local package the app builds from: every compile path is relative to it.
|
|
137
54
|
*/
|
|
138
55
|
rootDir: string
|
|
139
|
-
/** every project file (project.pbxproj or project.xcproj) the app's build reads. */
|
|
56
|
+
/** every project file (project.pbxproj or project.xcproj) and xcconfig the app's build reads. */
|
|
140
57
|
projectFiles: string[]
|
|
141
58
|
/** the target's processed launch plist, including generated build settings. */
|
|
142
59
|
infoPlist: string
|
|
143
60
|
infoPlistFile: string | null
|
|
144
61
|
appIconName: string
|
|
145
|
-
/** the target's compiled sources in every language, swift or not. */
|
|
146
|
-
allSources: string[]
|
|
147
62
|
/**
|
|
148
63
|
* framework and library targets of any project in the workspace that the
|
|
149
64
|
* app depends on or links, dependencies first. xcode builds them into one
|
|
@@ -160,6 +75,10 @@ export interface XcodeAppTarget extends XcodeModuleTarget {
|
|
|
160
75
|
packageResolved: string | null
|
|
161
76
|
/** every application target in the workspace, for a chooser. */
|
|
162
77
|
appTargets: string[]
|
|
78
|
+
/** the build configuration every target's settings are read in. */
|
|
79
|
+
configuration: string
|
|
80
|
+
/** target-level build settings query function. */
|
|
81
|
+
settings: (key: string) => string
|
|
163
82
|
}
|
|
164
83
|
|
|
165
84
|
const APPLICATION = 'com.apple.product-type.application'
|
|
@@ -200,9 +119,9 @@ function walkFiles(dir: string): string[] {
|
|
|
200
119
|
const isDirectory = (dir: string) => fs.existsSync(dir) && fs.statSync(dir).isDirectory()
|
|
201
120
|
|
|
202
121
|
// an xcconfig's assignments, conditions kept in the key, includes inlined in order.
|
|
203
|
-
function readXcconfig(file: string,
|
|
204
|
-
if (
|
|
205
|
-
|
|
122
|
+
function readXcconfig(file: string, read: string[]): Record<string, string> {
|
|
123
|
+
if (read.includes(file) || !fs.existsSync(file)) return {}
|
|
124
|
+
read.push(file)
|
|
206
125
|
const settings: Record<string, string> = {}
|
|
207
126
|
for (const raw of fs.readFileSync(file, 'utf8').split('\n')) {
|
|
208
127
|
const line = raw.replace(/\/\/.*$/, '').trim()
|
|
@@ -210,7 +129,7 @@ function readXcconfig(file: string, seen = new Set<string>()): Record<string, st
|
|
|
210
129
|
if (include) {
|
|
211
130
|
Object.assign(
|
|
212
131
|
settings,
|
|
213
|
-
readXcconfig(path.resolve(path.dirname(file), include[1]!),
|
|
132
|
+
readXcconfig(path.resolve(path.dirname(file), include[1]!), read),
|
|
214
133
|
)
|
|
215
134
|
continue
|
|
216
135
|
}
|
|
@@ -321,7 +240,7 @@ function workspaceReferences(workspace: string): string[] {
|
|
|
321
240
|
export function enclosingXcodeWorkspace(xcodeproj: string): string | null {
|
|
322
241
|
const project = fs.realpathSync(xcodeproj)
|
|
323
242
|
for (let dir = path.dirname(project); ; dir = path.dirname(dir)) {
|
|
324
|
-
for (const name of fs.readdirSync(dir)) {
|
|
243
|
+
for (const name of fs.readdirSync(dir).sort()) {
|
|
325
244
|
if (!name.endsWith('.xcworkspace')) continue
|
|
326
245
|
const workspace = path.join(dir, name)
|
|
327
246
|
if (!fs.existsSync(path.join(workspace, 'contents.xcworkspacedata'))) continue
|
|
@@ -352,7 +271,10 @@ export function findXcodeProject(input: string): string | null {
|
|
|
352
271
|
if (resolved.endsWith('.xcodeproj')) return resolved
|
|
353
272
|
if (!isDirectory(resolved)) return null
|
|
354
273
|
for (const extension of ['.xcworkspace', '.xcodeproj']) {
|
|
355
|
-
const found = fs
|
|
274
|
+
const found = fs
|
|
275
|
+
.readdirSync(resolved)
|
|
276
|
+
.filter((name) => name.endsWith(extension))
|
|
277
|
+
.sort()
|
|
356
278
|
if (found.length > 1) {
|
|
357
279
|
throw new Error(
|
|
358
280
|
`${resolved} holds ${found.length} ${extension} bundles (${found.join(', ')}); pass one`,
|
|
@@ -459,24 +381,45 @@ interface TargetRef {
|
|
|
459
381
|
target: PlistDict
|
|
460
382
|
}
|
|
461
383
|
|
|
462
|
-
// the
|
|
463
|
-
//
|
|
464
|
-
|
|
384
|
+
// the configuration a project builds when nothing names one: xcode's run
|
|
385
|
+
// action builds Debug, else the list's default.
|
|
386
|
+
function defaultConfiguration(project: LoadedProject): string {
|
|
387
|
+
const configList = project.object(str(project.project.buildConfigurationList))
|
|
388
|
+
const names = list(configList?.buildConfigurations).flatMap(
|
|
389
|
+
(id) => str(project.object(id)?.name) ?? [],
|
|
390
|
+
)
|
|
391
|
+
return names.includes('Debug')
|
|
392
|
+
? 'Debug'
|
|
393
|
+
: (str(configList?.defaultConfigurationName) ?? names[0] ?? 'Debug')
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
// the build settings of one target in `configuration`, evaluated as xcode
|
|
397
|
+
// does: project then target level, each an xcconfig under its own settings;
|
|
398
|
+
// `$(inherited)` reads the level below and an undefined setting is empty. a
|
|
399
|
+
// list without that configuration builds its default one.
|
|
465
400
|
function targetSettings(
|
|
466
401
|
ref: TargetRef,
|
|
402
|
+
configuration: string,
|
|
467
403
|
builtins: Record<string, string>,
|
|
468
|
-
): { get: (key: string) => string; keys: Set<string
|
|
404
|
+
): { get: (key: string) => string; keys: Set<string>; xcconfigs: string[] } {
|
|
469
405
|
const { project, target } = ref
|
|
406
|
+
const xcconfigs: string[] = []
|
|
470
407
|
const level = (listId: string | undefined): Record<string, string>[] => {
|
|
471
|
-
const
|
|
408
|
+
const configList = project.object(listId)
|
|
409
|
+
const configs = list(configList?.buildConfigurations).map(project.object)
|
|
472
410
|
const config =
|
|
473
|
-
configs.find((entry) => entry?.name ===
|
|
411
|
+
configs.find((entry) => entry?.name === configuration) ??
|
|
412
|
+
configs.find((entry) => entry?.name === str(configList?.defaultConfigurationName))
|
|
474
413
|
if (!config) return []
|
|
475
|
-
const name = str(config.name) ??
|
|
414
|
+
const name = str(config.name) ?? configuration
|
|
476
415
|
const base = str(config.baseConfigurationReference)
|
|
477
416
|
const own = isDict(config.buildSettings) ? config.buildSettings : {}
|
|
417
|
+
const baseFile = base ? project.resolvePath(base) : null
|
|
418
|
+
const read: string[] = []
|
|
419
|
+
const fromFile = baseFile ? readXcconfig(baseFile, read) : {}
|
|
420
|
+
xcconfigs.push(...read)
|
|
478
421
|
return [
|
|
479
|
-
applyConditions(
|
|
422
|
+
applyConditions(fromFile, name),
|
|
480
423
|
applyConditions(
|
|
481
424
|
Object.fromEntries(
|
|
482
425
|
Object.entries(own).flatMap(([key, value]) =>
|
|
@@ -492,7 +435,7 @@ function targetSettings(
|
|
|
492
435
|
]
|
|
493
436
|
}
|
|
494
437
|
const levels = [
|
|
495
|
-
builtins,
|
|
438
|
+
{ ...builtins, CONFIGURATION: configuration },
|
|
496
439
|
...level(str(project.project.buildConfigurationList)),
|
|
497
440
|
...level(str(target.buildConfigurationList)),
|
|
498
441
|
]
|
|
@@ -533,9 +476,36 @@ function targetSettings(
|
|
|
533
476
|
return {
|
|
534
477
|
get: (key) => valueAt(key, levels.length - 1),
|
|
535
478
|
keys: new Set(levels.flatMap((values) => Object.keys(values))),
|
|
479
|
+
xcconfigs,
|
|
536
480
|
}
|
|
537
481
|
}
|
|
538
482
|
|
|
483
|
+
// a list-typed build setting's items: whitespace separates them, and quotes
|
|
484
|
+
// or a backslash keep whitespace inside one.
|
|
485
|
+
function settingList(value: string): string[] {
|
|
486
|
+
const items: string[] = []
|
|
487
|
+
for (const [, quoted, plain] of value.matchAll(
|
|
488
|
+
/"((?:\\.|[^"\\])*)"|((?:\\.|[^\s"])+)/g,
|
|
489
|
+
))
|
|
490
|
+
items.push((quoted ?? plain!).replace(/\\(.)/g, '$1'))
|
|
491
|
+
return items
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
// the conditions swift compiles a target with: its active compilation
|
|
495
|
+
// conditions and each `-D` in its other swift flags, as xcode passes them.
|
|
496
|
+
function compilationConditions(settings: (key: string) => string): string[] {
|
|
497
|
+
const flags = settingList(settings('OTHER_SWIFT_FLAGS'))
|
|
498
|
+
const defined = flags.flatMap((flag, index) =>
|
|
499
|
+
flag === '-D' ? (flags[index + 1] ?? []) : flag.startsWith('-D') ? flag.slice(2) : [],
|
|
500
|
+
)
|
|
501
|
+
return [
|
|
502
|
+
...new Set([
|
|
503
|
+
...settingList(settings('SWIFT_ACTIVE_COMPILATION_CONDITIONS')),
|
|
504
|
+
...defined,
|
|
505
|
+
]),
|
|
506
|
+
]
|
|
507
|
+
}
|
|
508
|
+
|
|
539
509
|
function expand(value: string, lookup: (name: string) => string): string {
|
|
540
510
|
return value.replace(
|
|
541
511
|
/\$(?:\(([A-Za-z_][A-Za-z0-9_]*)((?::[^)]*)?)\)|\{([A-Za-z_][A-Za-z0-9_]*)((?::[^}]*)?)\}|([A-Za-z_][A-Za-z0-9_]*))/g,
|
|
@@ -551,12 +521,20 @@ function expand(value: string, lookup: (name: string) => string): string {
|
|
|
551
521
|
}
|
|
552
522
|
|
|
553
523
|
// the swift sources and resources that are members of a target.
|
|
554
|
-
|
|
524
|
+
// run script phases never execute here; their declared swift outputs are
|
|
525
|
+
// compile inputs xcode generates before compiling, so a missing one names
|
|
526
|
+
// the script instead of silently dropping the file.
|
|
527
|
+
function targetMembers(
|
|
528
|
+
ref: TargetRef,
|
|
529
|
+
settings: (key: string) => string,
|
|
530
|
+
options: { requireSources?: boolean } = {},
|
|
531
|
+
): {
|
|
555
532
|
sources: string[]
|
|
556
533
|
resources: string[]
|
|
557
534
|
allSources: string[]
|
|
558
535
|
} {
|
|
559
536
|
const { project, target, id: targetId } = ref
|
|
537
|
+
const targetName = str(target.name) ?? targetId
|
|
560
538
|
const sources = new Set<string>()
|
|
561
539
|
const allSources = new Set<string>()
|
|
562
540
|
const resources = new Set<string>()
|
|
@@ -577,6 +555,33 @@ function targetMembers(ref: TargetRef): {
|
|
|
577
555
|
const resolved = project.resolvePath(refId)
|
|
578
556
|
return resolved ? [resolved] : []
|
|
579
557
|
}
|
|
558
|
+
const scriptForOutput = new Map<string, string>()
|
|
559
|
+
const noteScriptOutput = (raw: string, script: string) => {
|
|
560
|
+
const expanded = expand(raw, settings)
|
|
561
|
+
if (!expanded.endsWith('.swift')) return
|
|
562
|
+
const absolute = path.isAbsolute(expanded)
|
|
563
|
+
? path.normalize(expanded)
|
|
564
|
+
: path.resolve(project.projectDir, expanded)
|
|
565
|
+
if (!scriptForOutput.has(absolute)) scriptForOutput.set(absolute, script)
|
|
566
|
+
}
|
|
567
|
+
for (const phaseId of list(target.buildPhases)) {
|
|
568
|
+
const phase = project.object(phaseId)
|
|
569
|
+
if (phase?.isa !== 'PBXShellScriptBuildPhase') continue
|
|
570
|
+
const script = str(phase.name) ?? phaseId
|
|
571
|
+
for (const raw of list(phase.outputPaths)) noteScriptOutput(raw, script)
|
|
572
|
+
for (const listPath of list(phase.outputFileListPaths)) {
|
|
573
|
+
const expandedList = expand(listPath, settings)
|
|
574
|
+
const absoluteList = path.isAbsolute(expandedList)
|
|
575
|
+
? expandedList
|
|
576
|
+
: path.resolve(project.projectDir, expandedList)
|
|
577
|
+
if (!fs.existsSync(absoluteList)) continue
|
|
578
|
+
for (const line of fs.readFileSync(absoluteList, 'utf8').split('\n')) {
|
|
579
|
+
const trimmed = line.trim()
|
|
580
|
+
if (trimmed === '' || trimmed.startsWith('#')) continue
|
|
581
|
+
noteScriptOutput(trimmed, script)
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
}
|
|
580
585
|
for (const phaseId of list(target.buildPhases)) {
|
|
581
586
|
const phase = project.object(phaseId)
|
|
582
587
|
if (phase?.isa !== 'PBXSourcesBuildPhase' && phase?.isa !== 'PBXResourcesBuildPhase')
|
|
@@ -584,13 +589,32 @@ function targetMembers(ref: TargetRef): {
|
|
|
584
589
|
for (const buildFileId of list(phase.files)) {
|
|
585
590
|
for (const file of fileRefPaths(str(project.object(buildFileId)?.fileRef) ?? '')) {
|
|
586
591
|
if (phase.isa === 'PBXSourcesBuildPhase') {
|
|
587
|
-
if (!fs.existsSync(file))
|
|
592
|
+
if (!fs.existsSync(file)) {
|
|
593
|
+
if (options.requireSources === false) continue
|
|
594
|
+
const script = scriptForOutput.get(path.normalize(file))
|
|
595
|
+
throw new Error(
|
|
596
|
+
script
|
|
597
|
+
? `${targetName}: missing generated source ${file} (Run Script "${script}" declares it in outputPaths; run the script or check in its output)`
|
|
598
|
+
: `${targetName}: missing source ${file}`,
|
|
599
|
+
)
|
|
600
|
+
}
|
|
588
601
|
allSources.add(file)
|
|
589
602
|
if (file.endsWith('.swift')) sources.add(file)
|
|
590
603
|
} else if (phase.isa === 'PBXResourcesBuildPhase') addResource(file)
|
|
591
604
|
}
|
|
592
605
|
}
|
|
593
606
|
}
|
|
607
|
+
for (const [file, script] of scriptForOutput) {
|
|
608
|
+
if (sources.has(file) || allSources.has(file)) continue
|
|
609
|
+
if (!fs.existsSync(file)) {
|
|
610
|
+
if (options.requireSources === false) continue
|
|
611
|
+
throw new Error(
|
|
612
|
+
`${targetName}: missing generated source ${file} (Run Script "${script}" declares it in outputPaths; run the script or check in its output)`,
|
|
613
|
+
)
|
|
614
|
+
}
|
|
615
|
+
allSources.add(file)
|
|
616
|
+
sources.add(file)
|
|
617
|
+
}
|
|
594
618
|
|
|
595
619
|
// synchronized folders: every file under a folder the target owns is a
|
|
596
620
|
// member, minus that folder's exceptions for this target; a folder the
|
|
@@ -718,13 +742,93 @@ export function listXcodeAppTargets(xcodeprojOrWorkspace: string): string[] {
|
|
|
718
742
|
.map((ref) => str(ref.target.name) ?? ref.id)
|
|
719
743
|
}
|
|
720
744
|
|
|
745
|
+
/**
|
|
746
|
+
* the application target and build configuration a scheme runs: its launch
|
|
747
|
+
* action, as xcode's Run builds it. shared schemes and the user's own are
|
|
748
|
+
* found in the workspace and every project it builds.
|
|
749
|
+
*/
|
|
750
|
+
export function readXcodeScheme(
|
|
751
|
+
xcodeprojOrWorkspace: string,
|
|
752
|
+
scheme: string,
|
|
753
|
+
): { target: string; configuration: string } {
|
|
754
|
+
const container = fs.realpathSync(xcodeprojOrWorkspace)
|
|
755
|
+
const { projects } = workspaceProjects(container)
|
|
756
|
+
const containers = [
|
|
757
|
+
...new Set([container, ...projects.map((project) => project.xcodeproj)]),
|
|
758
|
+
]
|
|
759
|
+
const found = containers
|
|
760
|
+
.flatMap((dir) =>
|
|
761
|
+
[
|
|
762
|
+
path.join(dir, 'xcshareddata'),
|
|
763
|
+
...(isDirectory(path.join(dir, 'xcuserdata'))
|
|
764
|
+
? fs
|
|
765
|
+
.readdirSync(path.join(dir, 'xcuserdata'))
|
|
766
|
+
.sort()
|
|
767
|
+
.map((user) => path.join(dir, 'xcuserdata', user))
|
|
768
|
+
: []),
|
|
769
|
+
].map((data) => ({
|
|
770
|
+
dir,
|
|
771
|
+
file: path.join(data, 'xcschemes', `${scheme}.xcscheme`),
|
|
772
|
+
})),
|
|
773
|
+
)
|
|
774
|
+
.find((candidate) => fs.existsSync(candidate.file))
|
|
775
|
+
if (!found) {
|
|
776
|
+
const known = containers.flatMap((dir) =>
|
|
777
|
+
fs.existsSync(path.join(dir, 'xcshareddata', 'xcschemes'))
|
|
778
|
+
? fs
|
|
779
|
+
.readdirSync(path.join(dir, 'xcshareddata', 'xcschemes'))
|
|
780
|
+
.filter((name) => name.endsWith('.xcscheme'))
|
|
781
|
+
.map((name) => name.slice(0, -'.xcscheme'.length))
|
|
782
|
+
.sort()
|
|
783
|
+
: [],
|
|
784
|
+
)
|
|
785
|
+
throw new Error(
|
|
786
|
+
`${path.basename(container)} has no scheme ${scheme}; it shares ${known.join(', ') || 'none'}`,
|
|
787
|
+
)
|
|
788
|
+
}
|
|
789
|
+
const launch = /<LaunchAction\b([^>]*)>([\s\S]*?)<\/LaunchAction>/.exec(
|
|
790
|
+
fs.readFileSync(found.file, 'utf8'),
|
|
791
|
+
)
|
|
792
|
+
const attribute = (text: string, name: string) => {
|
|
793
|
+
const value = new RegExp(`\\b${name}\\s*=\\s*"([^"]*)"`).exec(text)?.[1]
|
|
794
|
+
return value === undefined ? undefined : decodeXml(value)
|
|
795
|
+
}
|
|
796
|
+
const runnable = launch
|
|
797
|
+
? /<BuildableProductRunnable\b[\s\S]*?<BuildableReference\b([^>]*)>/.exec(launch[2]!)
|
|
798
|
+
: null
|
|
799
|
+
const configuration = launch ? attribute(launch[1]!, 'buildConfiguration') : undefined
|
|
800
|
+
const blueprint = runnable ? attribute(runnable[1]!, 'BlueprintIdentifier') : undefined
|
|
801
|
+
const referenced = runnable ? attribute(runnable[1]!, 'ReferencedContainer') : undefined
|
|
802
|
+
if (!configuration || !blueprint || !referenced?.startsWith('container:')) {
|
|
803
|
+
throw new Error(`scheme ${scheme} runs no application target`)
|
|
804
|
+
}
|
|
805
|
+
// a container path is relative to the directory holding the scheme's container
|
|
806
|
+
const projectPath = path.resolve(
|
|
807
|
+
path.dirname(found.dir),
|
|
808
|
+
referenced.slice('container:'.length),
|
|
809
|
+
)
|
|
810
|
+
const project = projects.find(
|
|
811
|
+
(candidate) =>
|
|
812
|
+
fs.existsSync(projectPath) && candidate.xcodeproj === fs.realpathSync(projectPath),
|
|
813
|
+
)
|
|
814
|
+
const target = project && nativeTargets(project).find((ref) => ref.id === blueprint)
|
|
815
|
+
const name = target && str(target.target.name)
|
|
816
|
+
if (!name) throw new Error(`scheme ${scheme} runs a target no project here declares`)
|
|
817
|
+
return { target: name, configuration }
|
|
818
|
+
}
|
|
819
|
+
|
|
721
820
|
/**
|
|
722
821
|
* the application target `targetName` names (or the workspace's only one),
|
|
723
822
|
* with every framework, library and package it builds: its member files
|
|
724
823
|
* listed fresh from disk, so a file added to a synchronized folder joins the
|
|
725
824
|
* target without any project change.
|
|
726
825
|
*/
|
|
727
|
-
export function readXcodeAppTarget(
|
|
826
|
+
export function readXcodeAppTarget(
|
|
827
|
+
input: string,
|
|
828
|
+
targetName?: string,
|
|
829
|
+
configurationName?: string,
|
|
830
|
+
options: { requireSources?: boolean } = {},
|
|
831
|
+
): XcodeAppTarget {
|
|
728
832
|
// canonical, so every path returned agrees with the host's realpath checks
|
|
729
833
|
const xcodeprojOrWorkspace = fs.realpathSync(input)
|
|
730
834
|
const workspace = xcodeprojOrWorkspace.endsWith('.xcworkspace')
|
|
@@ -748,6 +852,7 @@ export function readXcodeAppTarget(input: string, targetName?: string): XcodeApp
|
|
|
748
852
|
)
|
|
749
853
|
}
|
|
750
854
|
const app = named[0]!
|
|
855
|
+
const configuration = configurationName ?? defaultConfiguration(app.project)
|
|
751
856
|
|
|
752
857
|
// dependencies: explicit target dependencies, in this project or another
|
|
753
858
|
// through a container proxy, and products linked by file name, which xcode
|
|
@@ -818,9 +923,14 @@ export function readXcodeAppTarget(input: string, targetName?: string): XcodeApp
|
|
|
818
923
|
}
|
|
819
924
|
visit(app)
|
|
820
925
|
|
|
926
|
+
const xcconfigs = new Set<string>()
|
|
821
927
|
const moduleTarget = (ref: TargetRef) => {
|
|
822
928
|
const name = str(ref.target.name) ?? ref.id
|
|
823
|
-
const {
|
|
929
|
+
const {
|
|
930
|
+
get: settings,
|
|
931
|
+
keys,
|
|
932
|
+
xcconfigs: read,
|
|
933
|
+
} = targetSettings(ref, configuration, {
|
|
824
934
|
TARGET_NAME: name,
|
|
825
935
|
PROJECT_NAME: path.basename(ref.project.xcodeproj, '.xcodeproj'),
|
|
826
936
|
SRCROOT: ref.project.projectDir,
|
|
@@ -828,6 +938,7 @@ export function readXcodeAppTarget(input: string, targetName?: string): XcodeApp
|
|
|
828
938
|
PROJECT_DIR: ref.project.projectDir,
|
|
829
939
|
DEVELOPMENT_LANGUAGE: str(ref.project.project.developmentRegion) ?? 'en',
|
|
830
940
|
})
|
|
941
|
+
for (const file of read) xcconfigs.add(file)
|
|
831
942
|
const swiftVersion = Number.parseFloat(settings('SWIFT_VERSION') || '5')
|
|
832
943
|
return {
|
|
833
944
|
settings,
|
|
@@ -835,9 +946,10 @@ export function readXcodeAppTarget(input: string, targetName?: string): XcodeApp
|
|
|
835
946
|
module: {
|
|
836
947
|
name,
|
|
837
948
|
moduleName: applyOperator(settings('PRODUCT_MODULE_NAME'), 'c99extidentifier'),
|
|
838
|
-
...targetMembers(ref),
|
|
949
|
+
...targetMembers(ref, settings, options),
|
|
839
950
|
languageMode: swiftVersion >= 6 ? 6 : 5,
|
|
840
951
|
mainActorIsolation: settings('SWIFT_DEFAULT_ACTOR_ISOLATION') === 'MainActor',
|
|
952
|
+
defines: compilationConditions(settings),
|
|
841
953
|
} satisfies XcodeModuleTarget,
|
|
842
954
|
}
|
|
843
955
|
}
|
|
@@ -991,7 +1103,9 @@ export function readXcodeAppTarget(input: string, targetName?: string): XcodeApp
|
|
|
991
1103
|
),
|
|
992
1104
|
].map((dir) => fs.realpathSync(dir)),
|
|
993
1105
|
),
|
|
994
|
-
projectFiles: [
|
|
1106
|
+
projectFiles: [
|
|
1107
|
+
...new Set([...used.map((project) => project.projectFile), ...xcconfigs]),
|
|
1108
|
+
].sort(),
|
|
995
1109
|
appIconName: settings('ASSETCATALOG_COMPILER_APPICON_NAME'),
|
|
996
1110
|
infoPlist: plist.build(info),
|
|
997
1111
|
infoPlistFile,
|
|
@@ -1005,5 +1119,7 @@ export function readXcodeAppTarget(input: string, targetName?: string): XcodeApp
|
|
|
1005
1119
|
.sort((left, right) => left.name.localeCompare(right.name)),
|
|
1006
1120
|
packageResolved: fs.existsSync(resolvedFile) ? resolvedFile : null,
|
|
1007
1121
|
appTargets: appTargetNames,
|
|
1122
|
+
configuration,
|
|
1123
|
+
settings,
|
|
1008
1124
|
}
|
|
1009
1125
|
}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
/*! rnx v0.1.939 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
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
|
-
"use strict";
|
|
4
|
-
var __defProp = Object.defineProperty;
|
|
5
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
6
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
-
var __export = (target, all) => {
|
|
9
|
-
for (var name in all)
|
|
10
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
-
};
|
|
12
|
-
var __copyProps = (to, from, except, desc) => {
|
|
13
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
-
for (let key of __getOwnPropNames(from))
|
|
15
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
-
}
|
|
18
|
-
return to;
|
|
19
|
-
};
|
|
20
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
21
|
-
|
|
22
|
-
// src/agent-identity.ts
|
|
23
|
-
var agent_identity_exports = {};
|
|
24
|
-
__export(agent_identity_exports, {
|
|
25
|
-
agentSessionIdFromCliIdentity: () => agentSessionIdFromCliIdentity
|
|
26
|
-
});
|
|
27
|
-
module.exports = __toCommonJS(agent_identity_exports);
|
|
28
|
-
function agentSessionIdFromCliIdentity(identity) {
|
|
29
|
-
if (!identity) return null;
|
|
30
|
-
const colon = identity.indexOf(":");
|
|
31
|
-
if (colon < 0) return identity.trim() || null;
|
|
32
|
-
const source = identity.slice(0, colon);
|
|
33
|
-
const value = identity.slice(colon + 1).trim();
|
|
34
|
-
return source === "PEACH_CLI_IDENTITY" && value ? value : null;
|
|
35
|
-
}
|
|
36
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
37
|
-
0 && (module.exports = {
|
|
38
|
-
agentSessionIdFromCliIdentity
|
|
39
|
-
});
|