peachsim 0.1.939 → 0.1.1399
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +28 -22
- package/cli/app-catalog.ts +29 -14
- package/cli/app-fonts.ts +5 -3
- package/cli/bridge-flow-runner.ts +40 -29
- package/cli/cloud-client.ts +57 -21
- package/cli/cloud-test-tunnel.ts +12 -18
- package/cli/commands/agent.ts +1 -1
- package/cli/commands/app-fonts.ts +3 -3
- package/cli/commands/assert.ts +8 -8
- package/cli/commands/auth.ts +8 -3
- package/cli/commands/box/bundle-plane.ts +13 -1
- package/cli/commands/box.ts +16 -5
- package/cli/commands/compat.ts +1 -1
- package/cli/commands/config.ts +2 -2
- package/cli/commands/control.ts +125 -71
- package/cli/commands/cpu-profile.ts +45 -1
- package/cli/commands/daemon.ts +131 -33
- package/cli/commands/debug.ts +24 -17
- package/cli/commands/desktop.ts +7 -1
- package/cli/commands/detect.ts +101 -0
- package/cli/commands/detox.ts +6 -6
- package/cli/commands/device.ts +12 -12
- package/cli/commands/electron.ts +32 -14
- package/cli/commands/flow.ts +49 -41
- package/cli/commands/guest-host.ts +39 -1
- package/cli/commands/inspect/core.ts +14 -8
- package/cli/commands/inspect/list.ts +1 -1
- package/cli/commands/inspect/settle.ts +5 -3
- package/cli/commands/inspect/settling.ts +229 -44
- package/cli/commands/inspect/wait-idle.ts +3 -2
- package/cli/commands/inspect.ts +105 -93
- package/cli/commands/install-cli.ts +36 -15
- package/cli/commands/install-desktop.ts +68 -195
- package/cli/commands/kotlin.ts +6 -5
- package/cli/commands/login.ts +5 -5
- package/cli/commands/maestro-compare.ts +554 -0
- package/cli/commands/maestro-generate.ts +6 -3
- package/cli/commands/maestro.ts +22 -0
- package/cli/commands/mode.ts +2 -2
- package/cli/commands/no-bridge-hint.ts +6 -2
- package/cli/commands/platform.ts +35 -6
- package/cli/commands/preview.ts +6 -0
- package/cli/commands/project-report.ts +10 -12
- package/cli/commands/record.ts +37 -37
- package/cli/commands/runtime.ts +9 -9
- package/cli/commands/screenshot-layers.ts +4 -4
- package/cli/commands/screenshot-mode.ts +2 -2
- package/cli/commands/screenshot.ts +8 -8
- package/cli/commands/screenshots-capture.ts +2 -2
- package/cli/commands/serve.ts +9 -12
- package/cli/commands/setup.ts +29 -14
- package/cli/commands/shell-boolean-mode.ts +2 -2
- package/cli/commands/show-touches-mode.ts +2 -2
- package/cli/commands/skills.ts +11 -11
- package/cli/commands/swift.ts +29 -11
- package/cli/commands/telemetry.ts +2 -2
- package/cli/commands/test.ts +5 -0
- package/cli/commands/three-mode.ts +3 -3
- package/cli/commands/timeline.ts +4 -4
- package/cli/commands/upgrade.ts +2 -2
- package/cli/commands/upload.ts +15 -15
- package/cli/commands/what-happened.ts +2 -2
- package/cli/current-sim.ts +6 -3
- package/cli/desktop-companion.ts +55 -149
- package/cli/dev-build-freshness.ts +2 -2
- package/cli/drivers/desktop.ts +17 -9
- package/cli/drivers/electron.ts +1 -2
- package/cli/drivers/playwright-sim-host.ts +11 -2
- package/cli/drivers/playwright.ts +35 -2
- package/cli/drivers/types.ts +8 -0
- package/cli/maestro-compare.ts +670 -0
- package/cli/outbound-endpoints.ts +46 -8
- package/cli/recording-access.ts +6 -6
- package/cli/run-registry.ts +1 -1
- package/cli/runtime-compat.ts +5 -1
- package/cli/send-to-box.ts +3 -3
- package/cli/shell-init.ts +2 -1
- package/cli/ws-bridge.ts +9 -5
- package/detox/element-types.ts +1 -0
- package/detox/gestures.ts +3 -3
- package/detox/index.ts +67 -38
- package/detox/navigation-lifecycle.ts +9 -6
- package/detox/proof-frame.cjs +6 -4
- package/dist-lib/agent-daemon-client.cjs +1 -1
- package/dist-lib/agent-events.cjs +1 -1
- package/dist-lib/attached-projects.cjs +1 -1
- package/dist-lib/auth/shared-session.cjs +1 -1
- package/dist-lib/backend-origin.cjs +1 -1
- package/dist-lib/beta.cjs +1 -1
- package/dist-lib/beta.mjs +1 -1
- package/dist-lib/bridge-constants.cjs +1 -1
- package/dist-lib/bridge-contract-input.cjs +42 -17
- package/dist-lib/bridge-contract-input.mjs +41 -16
- package/dist-lib/bridge-contract.cjs +1 -4
- package/dist-lib/bridge-contract.mjs +1 -3
- package/dist-lib/bundle-channel.cjs +2918 -550
- package/dist-lib/capture-contract.cjs +65 -24
- package/dist-lib/capture-contract.mjs +63 -24
- package/dist-lib/cloud-contract.cjs +2 -2
- package/dist-lib/cloud-contract.mjs +2 -2
- package/dist-lib/cloud-test-args.cjs +1 -1
- package/dist-lib/cloud-test-args.mjs +1 -1
- package/dist-lib/cloud.cjs +3 -3
- package/dist-lib/cloud.mjs +3 -3
- package/dist-lib/config.cjs +15 -5
- package/dist-lib/config.mjs +154 -0
- package/dist-lib/detox/index.cjs +495 -139
- package/dist-lib/dev-bundle-resolution.cjs +1 -1
- package/dist-lib/expo-swift-bundle.cjs +1168 -238
- package/dist-lib/expo-swift-metadata.cjs +34 -23
- package/dist-lib/expo-swift-metadata.mjs +32 -23
- package/dist-lib/home-paths.cjs +2 -2
- package/dist-lib/host/bridge-host.cjs +2938 -654
- package/dist-lib/host/fetch-proxy-handler.cjs +14 -1
- package/dist-lib/host/fetch-proxy-overrides.cjs +7 -1
- package/dist-lib/host/fetch-proxy-overrides.mjs +5 -1
- package/dist-lib/host/replacement-module-handler.cjs +2 -2
- package/dist-lib/host/websocket-proxy.cjs +1 -1
- package/dist-lib/index.cjs +999 -353
- package/dist-lib/jump-to-source-babel.cjs +1 -1
- package/dist-lib/jump-to-source-native.cjs +1 -1
- package/dist-lib/kotlin-host.cjs +332 -19
- package/dist-lib/menu.cjs +1 -1
- package/dist-lib/menu.mjs +1 -1
- package/dist-lib/metro-fingerprint-registry.cjs +1 -1
- package/dist-lib/metro-fingerprint-registry.mjs +1 -1
- package/dist-lib/metro-production-bundle.cjs +7 -7
- package/dist-lib/metro-production-bundle.mjs +5 -5
- package/dist-lib/metro.cjs +688 -250
- package/dist-lib/native-app-identity-project.cjs +2647 -0
- package/dist-lib/native-app-identity-project.mjs +1257 -0
- package/dist-lib/native-app-identity.cjs +325 -25
- package/dist-lib/native-app-identity.mjs +323 -25
- package/dist-lib/native-firebase-metadata.cjs +1 -1
- package/dist-lib/native-firebase-metadata.mjs +1 -1
- package/dist-lib/plist.cjs +1 -1
- package/dist-lib/plist.mjs +1 -1
- package/dist-lib/profiles.cjs +1 -1
- package/dist-lib/public-brand.cjs +1 -1
- package/dist-lib/react-native-host-modules.cjs +5 -1
- package/dist-lib/react-native-host-modules.mjs +5 -1
- package/dist-lib/scripts/dev-server-scanner.cjs +57 -32
- package/dist-lib/sdk.cjs +231 -51
- package/dist-lib/sdk.mjs +231 -51
- package/dist-lib/skills.cjs +4107 -1374
- package/dist-lib/swift-compile.cjs +290 -30
- package/dist-lib/swift-compile.mjs +290 -30
- package/dist-lib/swift-package.cjs +143 -12
- package/dist-lib/swift-package.mjs +137 -11
- package/dist-lib/swift-submit.cjs +47 -5
- package/dist-lib/swift-submit.mjs +42 -5
- package/dist-lib/swift-toolchain.cjs +7 -2
- package/dist-lib/swift.cjs +1 -1
- package/dist-lib/vite-swift.cjs +1392 -458
- package/dist-lib/vite.cjs +13 -17
- package/dist-lib/worklet-executable.cjs +248 -33
- package/dist-lib/worklet-executable.mjs +248 -33
- package/install.sh +10 -1
- package/kotlin/{AppSources → AndroidViewSources}/android/content/res/Resources.kt +9 -9
- package/kotlin/AndroidViewSources/android/graphics/Canvas.kt +20 -0
- package/kotlin/AndroidViewSources/android/view/View.kt +211 -0
- package/kotlin/AndroidViewSources/android/widget/FrameLayout.kt +61 -0
- package/kotlin/AndroidViewSources/android/widget/LinearLayout.kt +49 -0
- package/kotlin/AppSources/android/view/Window.kt +36 -0
- package/kotlin/AppSources/android/view/WindowInsets.kt +9 -0
- package/kotlin/AppSources/android/view/WindowInsetsController.kt +5 -0
- package/kotlin/AppSources/android/window/OnBackInvokedDispatcher.kt +48 -0
- package/kotlin/AppSources/androidx/activity/OnBackPressedDispatcher.kt +20 -5
- package/kotlin/AppSources/androidx/compose/foundation/layout/WindowInsets.kt +15 -0
- package/kotlin/AppSources/androidx/compose/ui/platform/ComposeView.kt +2 -1
- package/kotlin/AppSources/dev/peach/app/PeachApp.kt +42 -50
- package/kotlin/ComposeSources/PeachComposeHost.kt +200 -84
- package/kotlin/ExpoComposeSources/PeachAndroidView.kt +87 -0
- package/kotlin/ExpoComposeSources/PeachExpoViewMount.kt +24 -0
- package/kotlin/ExpoComposeSources/dev/peach/expo/PeachExpoCompose.kt +28 -0
- package/kotlin/ExpoComposeSources/expo/modules/kotlin/views/ExpoComposeView.kt +70 -0
- package/kotlin/ExpoSources/dev/peach/expo/PeachExpoRuntime.kt +513 -0
- package/kotlin/ExpoSources/dev/peach/expo/PeachExpoTypes.kt +173 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/AppContext.kt +20 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/Promise.kt +19 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/classcomponent/ClassComponentBuilder.kt +198 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/exception/CodedException.kt +126 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/functions/Functions.kt +132 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/jni/JavaScriptTypedArray.kt +81 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/modules/Module.kt +98 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/objects/ObjectDefinitionBuilder.kt +236 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/records/Record.kt +12 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/runtime/Runtime.kt +9 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/sharedobjects/SharedObject.kt +50 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/sharedobjects/SharedObjectRegistry.kt +57 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/sharedobjects/SharedRef.kt +19 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/typedarray/ConcreteTypedArrays.kt +158 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/typedarray/GenericTypedArray.kt +8 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/typedarray/TypedArray.kt +29 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/typedarray/TypedArrayIterator.kt +9 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/types/AnyType.kt +155 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/types/Either.kt +91 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/types/Enumerable.kt +6 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/viewevent/ViewEvent.kt +54 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/views/ExpoView.kt +23 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/views/ViewDefinitionBuilder.kt +71 -0
- package/kotlin/ExpoSources/expo/modules/kotlin/views/ViewProps.kt +35 -0
- package/kotlin/README.md +13 -3
- package/kotlin/Sources/android/os/Build.kt +17 -0
- package/kotlin/Sources/android/os/Handler.kt +35 -0
- package/kotlin/Sources/android/os/Looper.kt +17 -0
- package/kotlin/Sources/android/os/MessageQueue.kt +56 -0
- package/kotlin/Sources/android/os/SystemClock.kt +14 -0
- package/kotlin/Sources/android/util/Log.kt +64 -0
- package/kotlin/Sources/java/security/MessageDigest.kt +114 -0
- package/kotlin/Sources/kotlin/text/StringFormat.kt +9 -0
- package/kotlin/Sources/org/json/JSON.kt +44 -0
- package/kotlin/fixtures/counter/Counter.d.kt.ts +1 -0
- package/kotlin/fixtures/counter/Counter.kt +10 -3
- package/kotlin/fixtures/counter/CounterApp.native.tsx +1 -1
- package/kotlin/fixtures/counter/vite.config.ts +2 -2
- package/kotlin/fixtures/headless-counter/Headless.kt +7 -6
- package/kotlin/fixtures/import-animation/Animation.d.kt.ts +7 -0
- package/kotlin/fixtures/import-animation/Animation.kt +80 -0
- package/kotlin/fixtures/import-animation/ImportAnimation.native.tsx +13 -0
- package/kotlin/fixtures/import-animation/README.md +24 -0
- package/kotlin/fixtures/import-animation/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-animation/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-animation/app/routes.d.ts +18 -0
- package/kotlin/fixtures/import-animation/package.json +23 -0
- package/kotlin/fixtures/import-animation/tsconfig.json +20 -0
- package/kotlin/fixtures/import-animation/vite.config.ts +20 -0
- package/kotlin/fixtures/import-editor/Editor.d.kt.ts +7 -0
- package/kotlin/fixtures/import-editor/Editor.kt +59 -0
- package/kotlin/fixtures/import-editor/ImportEditor.native.tsx +23 -0
- package/kotlin/fixtures/import-editor/README.md +27 -0
- package/kotlin/fixtures/import-editor/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-editor/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-editor/package.json +23 -0
- package/kotlin/fixtures/import-editor/tsconfig.json +20 -0
- package/kotlin/fixtures/import-editor/vite.config.ts +20 -0
- package/kotlin/fixtures/import-effects/Effects.d.kt.ts +7 -0
- package/kotlin/fixtures/import-effects/Effects.kt +87 -0
- package/kotlin/fixtures/import-effects/ImportEffects.native.tsx +13 -0
- package/kotlin/fixtures/import-effects/README.md +19 -0
- package/kotlin/fixtures/import-effects/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-effects/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-effects/package.json +23 -0
- package/kotlin/fixtures/import-effects/tsconfig.json +20 -0
- package/kotlin/fixtures/import-effects/vite.config.ts +20 -0
- package/kotlin/fixtures/import-layout/ImportLayout.native.tsx +13 -0
- package/kotlin/fixtures/import-layout/Layout.d.kt.ts +7 -0
- package/kotlin/fixtures/import-layout/Layout.kt +72 -0
- package/kotlin/fixtures/import-layout/README.md +24 -0
- package/kotlin/fixtures/import-layout/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-layout/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-layout/package.json +23 -0
- package/kotlin/fixtures/import-layout/tsconfig.json +20 -0
- package/kotlin/fixtures/import-layout/vite.config.ts +20 -0
- package/kotlin/fixtures/import-navigation/ImportNavigation.native.tsx +18 -0
- package/kotlin/fixtures/import-navigation/Navigation.d.kt.ts +7 -0
- package/kotlin/fixtures/import-navigation/Navigation.kt +104 -0
- package/kotlin/fixtures/import-navigation/README.md +31 -0
- package/kotlin/fixtures/import-navigation/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-navigation/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-navigation/package.json +23 -0
- package/kotlin/fixtures/import-navigation/tsconfig.json +20 -0
- package/kotlin/fixtures/import-navigation/vite.config.ts +20 -0
- package/kotlin/fixtures/import-overlays/ImportOverlays.native.tsx +29 -0
- package/kotlin/fixtures/import-overlays/Overlays.d.kt.ts +7 -0
- package/kotlin/fixtures/import-overlays/Overlays.kt +93 -0
- package/kotlin/fixtures/import-overlays/README.md +34 -0
- package/kotlin/fixtures/import-overlays/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-overlays/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-overlays/package.json +23 -0
- package/kotlin/fixtures/import-overlays/tsconfig.json +20 -0
- package/kotlin/fixtures/import-overlays/vite.config.ts +20 -0
- package/kotlin/fixtures/import-scroll/ImportScroll.native.tsx +13 -0
- package/kotlin/fixtures/import-scroll/README.md +23 -0
- package/kotlin/fixtures/import-scroll/Scroll.d.kt.ts +7 -0
- package/kotlin/fixtures/import-scroll/Scroll.kt +91 -0
- package/kotlin/fixtures/import-scroll/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-scroll/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-scroll/package.json +23 -0
- package/kotlin/fixtures/import-scroll/tsconfig.json +20 -0
- package/kotlin/fixtures/import-scroll/vite.config.ts +20 -0
- package/kotlin/fixtures/import-selection/ImportSelection.native.tsx +44 -0
- package/kotlin/fixtures/import-selection/README.md +32 -0
- package/kotlin/fixtures/import-selection/Selection.d.kt.ts +8 -0
- package/kotlin/fixtures/import-selection/Selection.kt +78 -0
- package/kotlin/fixtures/import-selection/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-selection/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-selection/package.json +23 -0
- package/kotlin/fixtures/import-selection/tsconfig.json +20 -0
- package/kotlin/fixtures/import-selection/vite.config.ts +20 -0
- package/kotlin/fixtures/import-surfaces/ImportSurfaces.native.tsx +13 -0
- package/kotlin/fixtures/import-surfaces/README.md +22 -0
- package/kotlin/fixtures/import-surfaces/Surfaces.d.kt.ts +7 -0
- package/kotlin/fixtures/import-surfaces/Surfaces.kt +64 -0
- package/kotlin/fixtures/import-surfaces/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-surfaces/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-surfaces/package.json +23 -0
- package/kotlin/fixtures/import-surfaces/tsconfig.json +20 -0
- package/kotlin/fixtures/import-surfaces/vite.config.ts +20 -0
- package/kotlin/fixtures/import-values/ImportValues.native.tsx +35 -0
- package/kotlin/fixtures/import-values/README.md +23 -0
- package/kotlin/fixtures/import-values/Values.d.kt.ts +11 -0
- package/kotlin/fixtures/import-values/Values.kt +66 -0
- package/kotlin/fixtures/import-values/app/_layout.tsx +4 -0
- package/kotlin/fixtures/import-values/app/index+spa.tsx +1 -0
- package/kotlin/fixtures/import-values/package.json +23 -0
- package/kotlin/fixtures/import-values/tsconfig.json +20 -0
- package/kotlin/fixtures/import-values/vite.config.ts +20 -0
- package/kotlin/fixtures/kotlin-app-variants/BarBehavior.kt +38 -0
- package/kotlin/fixtures/kotlin-app-variants/BarVisibility.kt +36 -0
- package/kotlin/fixtures/kotlin-app-variants/Ime.kt +3 -1
- package/kotlin/fixtures/kotlin-app-variants/TransientInsets.kt +50 -0
- package/kotlin/fork/NOTICE +6 -1
- package/kotlin/fork/README.md +15 -7
- package/kotlin/fork/build.sh +2 -0
- package/kotlin/fork/compose-worker-globals.patch +186 -4
- package/kotlin/fork/fork.json +2 -2
- package/kotlin/fork/skiko-worker-clock.patch +12 -0
- package/kotlin/toolchain.json +12 -12
- package/kotlin/tools/expo-types.main.kts +115 -0
- package/package.json +17 -23
- package/scripts/dev-server-scanner.ts +92 -66
- package/skills/contrast/SKILL.md +2 -2
- package/skills/peach-debug/SKILL.md +1 -1
- package/skills/peach-perf/SKILL.md +1 -1
- package/skills/peach-setup/SKILL.md +2 -1
- package/skills/peach-test/SKILL.md +8 -0
- package/src/assetCatalogContract.ts +43 -1
- package/src/bridge-contract-input.ts +46 -19
- package/src/bridge-contract.ts +0 -1
- package/src/bundle-channel.mjs +197 -84
- package/src/bundleGlobalFooter.ts +38 -0
- package/src/capture-contract.ts +107 -33
- package/src/cloud-contract.ts +5 -1
- package/src/cloud.ts +5 -2
- package/src/config.ts +22 -3
- package/src/configured-bundle-producer.ts +1 -1
- package/src/desktop-host-delivery.ts +95 -1
- package/src/expo-kotlin-bundle.ts +29 -0
- package/src/expo-kotlin-host.ts +201 -0
- package/src/expo-swift-host.ts +96 -76
- package/src/expoKotlinContract.ts +70 -0
- package/src/expoSwiftContract.ts +4 -25
- package/src/home-paths.ts +7 -4
- package/src/host/bridge-host.ts +23 -3
- package/src/host/fetch-proxy-handler.ts +13 -0
- package/src/host/fetch-proxy-overrides.ts +11 -0
- package/src/host/replacement-module-handler.ts +5 -2
- package/src/index.ts +3 -1
- package/src/kotlin-host.ts +463 -19
- package/src/metro-plugin.ts +56 -28
- package/src/metro-production-bundle.ts +2 -2
- package/src/native-app-identity-project.ts +190 -0
- package/src/native-app-identity.ts +398 -34
- package/src/native-firebase-config.ts +69 -15
- package/src/native-seam-manifest.ts +6 -0
- package/src/one-widget-discovery.ts +2 -1
- package/src/openstep-plist.ts +107 -0
- package/src/react-native-host-modules.ts +4 -0
- package/src/runtime-assets.ts +2 -2
- package/src/sim-client.ts +2 -2
- package/src/swift-binary-modules.ts +3 -1
- package/src/swift-compile.ts +286 -38
- package/src/swift-distribution-contract.ts +4 -0
- package/src/swift-distribution.lock.json +123 -12
- package/src/swift-distribution.ts +7 -3
- package/src/swift-host.ts +298 -83
- package/src/swift-package-manifest.ts +29 -2
- package/src/swift-package.ts +180 -10
- package/src/swift-packages.ts +4 -0
- package/src/swift-standin-emit.ts +4 -1
- package/src/swift-standins.ts +274 -15
- package/src/swift-submit.ts +62 -7
- package/src/swift-toolchain.ts +6 -1
- package/src/swiftContract.ts +126 -3
- package/src/vite-plugin-one.ts +13 -16
- package/src/vite-plugin-swift.ts +4 -5
- package/src/vite-plugin.ts +360 -144
- package/src/vite.d.ts +1 -1
- package/src/worker-system-chunks.ts +221 -0
- package/src/worklet-executable.ts +348 -38
- package/src/worklets-babel.ts +1 -1
- package/src/xcode-project.ts +243 -127
- package/dist-lib/agent-identity.cjs +0 -39
- package/dist-lib/agent-sessions.cjs +0 -760
- package/dist-lib/cli-constants.cjs +0 -32
- package/dist-lib/render-mode.cjs +0 -44
- package/kotlin/AppSources/android/view/View.kt +0 -74
- package/kotlin/AppSources/android/widget/FrameLayout.kt +0 -6
- package/src/render-mode.ts +0 -15
- /package/kotlin/{AppSources → AndroidViewSources}/android/content/Context.kt +0 -0
- /package/kotlin/{AppSources → AndroidViewSources}/android/content/res/Configuration.kt +0 -0
- /package/kotlin/{AppSources → AndroidViewSources}/android/graphics/Color.kt +0 -0
- /package/kotlin/{AppSources → AndroidViewSources}/android/util/DisplayMetrics.kt +0 -0
- /package/kotlin/{AppSources → AndroidViewSources}/dev/peach/app/JavaFormat.kt +0 -0
- /package/kotlin/{AppSources → Sources}/java/lang/Runnable.kt +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*!
|
|
1
|
+
/*! peach v0.1.1399 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
|
|
2
2
|
|
|
3
3
|
// src/swift-compile.ts
|
|
4
4
|
import { execFile as execFile2, execFileSync } from "node:child_process";
|
|
@@ -175,7 +175,10 @@ var MANIFEST_DECLARATIONS = [
|
|
|
175
175
|
function manifestCalls(manifest, kinds) {
|
|
176
176
|
const code = manifest.replace(/\/\*[\s\S]*?\*\//g, "").replace(/(^|[^:"])\/\/[^\n]*/g, "$1");
|
|
177
177
|
const calls = [];
|
|
178
|
-
const pattern = new RegExp(
|
|
178
|
+
const pattern = new RegExp(
|
|
179
|
+
`(?:\\.(${MANIFEST_DECLARATIONS.join("|")})|\\b(Package))\\s*\\(`,
|
|
180
|
+
"g"
|
|
181
|
+
);
|
|
179
182
|
let match;
|
|
180
183
|
while ((match = pattern.exec(code)) !== null) {
|
|
181
184
|
let depth = 1;
|
|
@@ -205,19 +208,56 @@ function manifestCalls(manifest, kinds) {
|
|
|
205
208
|
}
|
|
206
209
|
i++;
|
|
207
210
|
}
|
|
208
|
-
|
|
209
|
-
|
|
211
|
+
const kind = match[1] ?? match[2];
|
|
212
|
+
if (kinds.includes(kind)) calls.push({ kind, flat, call: code.slice(start, i) });
|
|
213
|
+
else if (kind === "Package") {
|
|
214
|
+
calls.push(...manifestCalls(code.slice(start, i - 1), kinds));
|
|
215
|
+
}
|
|
210
216
|
pattern.lastIndex = i;
|
|
211
217
|
}
|
|
212
218
|
return calls;
|
|
213
219
|
}
|
|
220
|
+
function splitManifestArguments(source) {
|
|
221
|
+
const arguments_ = [];
|
|
222
|
+
let start = 0;
|
|
223
|
+
let parentheses = 0;
|
|
224
|
+
let brackets = 0;
|
|
225
|
+
let braces = 0;
|
|
226
|
+
let inString = false;
|
|
227
|
+
let escaped = false;
|
|
228
|
+
for (let index = 0; index < source.length; index++) {
|
|
229
|
+
const character = source[index];
|
|
230
|
+
if (inString) {
|
|
231
|
+
if (escaped) escaped = false;
|
|
232
|
+
else if (character === "\\") escaped = true;
|
|
233
|
+
else if (character === '"') inString = false;
|
|
234
|
+
} else if (character === '"') inString = true;
|
|
235
|
+
else if (character === "(") parentheses++;
|
|
236
|
+
else if (character === ")") parentheses--;
|
|
237
|
+
else if (character === "[") brackets++;
|
|
238
|
+
else if (character === "]") brackets--;
|
|
239
|
+
else if (character === "{") braces++;
|
|
240
|
+
else if (character === "}") braces--;
|
|
241
|
+
else if (character === "," && parentheses === 0 && brackets === 0 && braces === 0) {
|
|
242
|
+
arguments_.push(source.slice(start, index).trim());
|
|
243
|
+
start = index + 1;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
const final = source.slice(start).trim();
|
|
247
|
+
if (final) arguments_.push(final);
|
|
248
|
+
return arguments_;
|
|
249
|
+
}
|
|
214
250
|
function swiftManifestTargets(manifest, resourcePaths = []) {
|
|
215
251
|
const implicitResources = swiftImplicitResourcePaths(resourcePaths);
|
|
216
252
|
const targets = [];
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
253
|
+
const declarations = manifestCalls(manifest, ["executableTarget", "target"]);
|
|
254
|
+
const targetNames = new Set(
|
|
255
|
+
declarations.flatMap(({ flat }) => {
|
|
256
|
+
const name = /\bname\s*:\s*"([^"]+)"/.exec(flat)?.[1];
|
|
257
|
+
return name ? [name] : [];
|
|
258
|
+
})
|
|
259
|
+
);
|
|
260
|
+
for (const { kind, flat, call } of declarations) {
|
|
221
261
|
const executable = kind === "executableTarget";
|
|
222
262
|
const name = /\bname\s*:\s*"([^"]+)"/.exec(flat)?.[1];
|
|
223
263
|
if (!name) continue;
|
|
@@ -227,6 +267,12 @@ function swiftManifestTargets(manifest, resourcePaths = []) {
|
|
|
227
267
|
/\.swiftLanguageMode\(\s*\.v(\d+)\s*\)/.exec(call)?.[1] ?? "5"
|
|
228
268
|
);
|
|
229
269
|
const mainActorIsolation = /\.defaultIsolation\(\s*MainActor\.self\s*\)/.test(call);
|
|
270
|
+
const cxxInterop = /\.interoperabilityMode\(\s*\.Cxx\s*\)/.test(
|
|
271
|
+
call.replace(/"(?:\\.|[^"\\])*"/g, "")
|
|
272
|
+
);
|
|
273
|
+
const defines = [
|
|
274
|
+
...call.matchAll(/\.define\(\s*"([A-Za-z_][A-Za-z0-9_]*)"\s*\)/g)
|
|
275
|
+
].map((match) => match[1]);
|
|
230
276
|
const excluded = [
|
|
231
277
|
...(/\bexclude\s*:\s*\[([^\]]*)\]/.exec(flat)?.[1] ?? "").matchAll(/"([^"]+)"/g)
|
|
232
278
|
].map((match) => match[1].replace(/^\.\//, "").replace(/\/+$/, ""));
|
|
@@ -240,20 +286,60 @@ function swiftManifestTargets(manifest, resourcePaths = []) {
|
|
|
240
286
|
return false;
|
|
241
287
|
return true;
|
|
242
288
|
});
|
|
289
|
+
const targetArguments = splitManifestArguments(call.slice(0, -1));
|
|
290
|
+
const dependencyArgument = targetArguments.find(
|
|
291
|
+
(argument) => /^dependencies\s*:/.test(argument)
|
|
292
|
+
);
|
|
293
|
+
const dependencyList = dependencyArgument?.replace(/^dependencies\s*:\s*/, "").trim();
|
|
294
|
+
const dependencyNames = /* @__PURE__ */ new Set();
|
|
295
|
+
if (dependencyList?.startsWith("[") && dependencyList.endsWith("]")) {
|
|
296
|
+
for (const dependency of splitManifestArguments(dependencyList.slice(1, -1))) {
|
|
297
|
+
const dependencyName = /^"([^"]+)"$/.exec(dependency)?.[1] ?? /^\.(?:target|byName)\s*\(\s*name\s*:\s*"([^"]+)"/.exec(dependency)?.[1];
|
|
298
|
+
if (dependencyName && targetNames.has(dependencyName))
|
|
299
|
+
dependencyNames.add(dependencyName);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
const dependencies = [...dependencyNames].map((name2) => ({
|
|
303
|
+
kind: "target",
|
|
304
|
+
name: name2
|
|
305
|
+
}));
|
|
243
306
|
targets.push({
|
|
244
307
|
name,
|
|
245
308
|
path: targetPath,
|
|
246
309
|
executable,
|
|
247
310
|
languageMode,
|
|
248
311
|
mainActorIsolation,
|
|
249
|
-
|
|
312
|
+
...cxxInterop ? { cxxInterop: true } : {},
|
|
313
|
+
...defines.length === 0 ? {} : { defines },
|
|
314
|
+
resources,
|
|
315
|
+
...dependencies.length === 0 ? {} : { dependencies },
|
|
316
|
+
...excluded.length === 0 ? {} : { exclude: excluded }
|
|
250
317
|
});
|
|
251
318
|
}
|
|
252
319
|
return targets;
|
|
253
320
|
}
|
|
321
|
+
function swiftManifestCxxLanguageStandard(manifest) {
|
|
322
|
+
const declaration = manifestCalls(manifest, ["Package"])[0];
|
|
323
|
+
if (!declaration) return void 0;
|
|
324
|
+
const code = declaration.flat.replace(/"(?:\\.|[^"\\])*"/g, "");
|
|
325
|
+
return /\bcxxLanguageStandard\s*:\s*\.(\w+)/.exec(code)?.[1];
|
|
326
|
+
}
|
|
254
327
|
function swiftPackagePartition(manifest, resourcePaths = []) {
|
|
255
328
|
const targets = swiftManifestTargets(manifest, resourcePaths);
|
|
256
|
-
return targets.length === 1 && targets[0].executable && targets[0].path === "." ? [] : targets;
|
|
329
|
+
return targets.length === 1 && targets[0].executable && targets[0].path === "." && targets[0].languageMode === 5 && !targets[0].mainActorIsolation && !targets[0].defines?.length && !targets[0].cxxInterop && !swiftManifestCxxLanguageStandard(manifest) ? [] : targets;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
// src/swiftContract.ts
|
|
333
|
+
function isSwiftResourcePath(value) {
|
|
334
|
+
return typeof value === "string" && value.length <= 4096 && !value.startsWith("/") && !value.includes("\\") && !value.includes("\0") && value.split("/").every((part) => part !== "" && part !== "." && part !== "..");
|
|
335
|
+
}
|
|
336
|
+
function isSwiftBundlePath(value) {
|
|
337
|
+
return typeof value === "string" && (value === "." || isSwiftResourcePath(value) && /\.(bundle|framework)$/.test(value));
|
|
338
|
+
}
|
|
339
|
+
function isSwiftResourceBundles(value) {
|
|
340
|
+
return Array.isArray(value) && value.length <= 128 && value.every(
|
|
341
|
+
(bundle) => typeof bundle === "object" && bundle !== null && typeof bundle.target === "string" && /^[A-Za-z_][A-Za-z0-9_-]*$/.test(bundle.target) && (bundle.sourcePath === "." || isSwiftResourcePath(bundle.sourcePath)) && isSwiftBundlePath(bundle.path)
|
|
342
|
+
) && new Set(value.map((bundle) => bundle.target)).size === value.length && new Set(value.map((bundle) => bundle.path)).size === value.length;
|
|
257
343
|
}
|
|
258
344
|
|
|
259
345
|
// src/swift-compile.ts
|
|
@@ -286,6 +372,7 @@ function swiftModuleInputFiles(root) {
|
|
|
286
372
|
"Package.swift",
|
|
287
373
|
"scripts/contrast-app-Package.swift",
|
|
288
374
|
"scripts/build-distribution.ts",
|
|
375
|
+
"scripts/distribution-clang.ts",
|
|
289
376
|
"scripts/build-distribution-plugins.sh",
|
|
290
377
|
"scripts/build-preview-plugin.sh",
|
|
291
378
|
"toolchain.json"
|
|
@@ -310,6 +397,10 @@ function swiftMacroPlugins(moduleRoot) {
|
|
|
310
397
|
stale: false
|
|
311
398
|
};
|
|
312
399
|
const dir = path2.join(moduleRoot, ".build/host/RnxPreviewMacros");
|
|
400
|
+
const release = JSON.parse(
|
|
401
|
+
readFileSync2(path2.join(moduleRoot, "toolchain.json"), "utf8")
|
|
402
|
+
).release;
|
|
403
|
+
const compilerStamp = path2.join(dir, "compiler-release");
|
|
313
404
|
const ext = process.platform === "darwin" ? "dylib" : "so";
|
|
314
405
|
const plugins = [
|
|
315
406
|
{
|
|
@@ -323,12 +414,12 @@ function swiftMacroPlugins(moduleRoot) {
|
|
|
323
414
|
];
|
|
324
415
|
return {
|
|
325
416
|
libraries: plugins.map(({ library }) => library),
|
|
326
|
-
stale: plugins.some(
|
|
417
|
+
stale: !existsSync(compilerStamp) || readFileSync2(compilerStamp, "utf8").trim() !== release || plugins.some(
|
|
327
418
|
({ library, source }) => !existsSync(library) || statSync(source).mtimeMs > statSync(library).mtimeMs
|
|
328
419
|
)
|
|
329
420
|
};
|
|
330
421
|
}
|
|
331
|
-
async function ensureMacroPlugins(moduleRoot, toolchainBin) {
|
|
422
|
+
async function ensureMacroPlugins(moduleRoot, toolchainBin, release) {
|
|
332
423
|
const { libraries, stale } = swiftMacroPlugins(moduleRoot);
|
|
333
424
|
if (stale) {
|
|
334
425
|
await run2("sh", [
|
|
@@ -336,6 +427,11 @@ async function ensureMacroPlugins(moduleRoot, toolchainBin) {
|
|
|
336
427
|
toolchainBin,
|
|
337
428
|
libraries[0]
|
|
338
429
|
]);
|
|
430
|
+
writeFileSync(
|
|
431
|
+
path2.join(path2.dirname(libraries[0]), "compiler-release"),
|
|
432
|
+
`${release}
|
|
433
|
+
`
|
|
434
|
+
);
|
|
339
435
|
}
|
|
340
436
|
return libraries;
|
|
341
437
|
}
|
|
@@ -401,6 +497,7 @@ var OPTIONAL_FRAMEWORK_DEPENDENCIES = {
|
|
|
401
497
|
TikTokBusinessSDK: [],
|
|
402
498
|
nSure: [],
|
|
403
499
|
Statsig: [],
|
|
500
|
+
TOCropViewController: [],
|
|
404
501
|
RiveRuntime: ["MetalKit"],
|
|
405
502
|
MetalKit: [],
|
|
406
503
|
DatadogCore: [],
|
|
@@ -415,6 +512,7 @@ var OPTIONAL_FRAMEWORK_DEPENDENCIES = {
|
|
|
415
512
|
Intercom: [],
|
|
416
513
|
FirebaseCore: [],
|
|
417
514
|
FirebaseSharedSwift: ["FirebaseCore"],
|
|
515
|
+
FirebaseRemoteConfig: ["FirebaseCore", "FirebaseSharedSwift"],
|
|
418
516
|
FirebaseFirestoreInternal: ["FirebaseCore"],
|
|
419
517
|
FirebaseAnalytics: ["FirebaseCore"],
|
|
420
518
|
FirebaseAppCheck: ["FirebaseCore"],
|
|
@@ -422,6 +520,7 @@ var OPTIONAL_FRAMEWORK_DEPENDENCIES = {
|
|
|
422
520
|
FirebaseCrashlytics: ["FirebaseCore"],
|
|
423
521
|
FirebaseFirestore: ["FirebaseCore", "FirebaseSharedSwift", "FirebaseFirestoreInternal"],
|
|
424
522
|
FirebaseStorage: ["FirebaseCore"],
|
|
523
|
+
GoogleMobileAds: [],
|
|
425
524
|
FBAudienceNetwork: []
|
|
426
525
|
};
|
|
427
526
|
var OPTIONAL_FRAMEWORKS = new Set(Object.keys(OPTIONAL_FRAMEWORK_DEPENDENCIES));
|
|
@@ -565,7 +664,11 @@ function swiftTargetDependencies(files, targets) {
|
|
|
565
664
|
const siblings = /* @__PURE__ */ new Map();
|
|
566
665
|
for (const target of targets) {
|
|
567
666
|
const prefix = target.path === "." ? "" : `${target.path}/`;
|
|
568
|
-
const deps =
|
|
667
|
+
const deps = new Set(
|
|
668
|
+
(target.dependencies ?? []).flatMap(
|
|
669
|
+
(dependency) => dependency.kind === "target" && dependency.name !== target.name && names.has(dependency.name) ? [dependency.name] : []
|
|
670
|
+
)
|
|
671
|
+
);
|
|
569
672
|
for (const [file, contents] of Object.entries(files)) {
|
|
570
673
|
if (file === "Package.swift" || !file.startsWith(prefix)) continue;
|
|
571
674
|
if (targets.some(
|
|
@@ -589,17 +692,17 @@ var FOUNDATION_IMPLICIT_MODULES = [
|
|
|
589
692
|
"PeachObjC",
|
|
590
693
|
"Dispatch",
|
|
591
694
|
"FoundationNetworking",
|
|
592
|
-
"
|
|
593
|
-
"
|
|
695
|
+
"PeachFoundationCombine",
|
|
696
|
+
"Darwin"
|
|
594
697
|
];
|
|
595
698
|
var FOUNDATION_IMPLICIT_FLAGS = FOUNDATION_IMPLICIT_MODULES.map(
|
|
596
699
|
(module) => `, "-Xfrontend", "-import-module", "-Xfrontend", "${module}"`
|
|
597
700
|
).join("");
|
|
598
701
|
var ONE_IMPLICIT_FLAGS = ', "-Xfrontend", "-import-module", "-Xfrontend", "One"';
|
|
599
|
-
var MULTI_MANIFEST_VERSION =
|
|
702
|
+
var MULTI_MANIFEST_VERSION = 18;
|
|
600
703
|
function swiftArtifactHash(input, release, moduleRoot) {
|
|
601
704
|
const hash = createHash2("sha256");
|
|
602
|
-
hash.update(`swift-compile/
|
|
705
|
+
hash.update(`swift-compile/v23
|
|
603
706
|
${release}
|
|
604
707
|
`);
|
|
605
708
|
if (input.oneModule) hash.update("one-module\n");
|
|
@@ -608,6 +711,13 @@ ${release}
|
|
|
608
711
|
hash.update(createHash2("sha256").update(file).digest());
|
|
609
712
|
hash.update(createHash2("sha256").update(input.files[file]).digest());
|
|
610
713
|
}
|
|
714
|
+
for (const file of Object.keys(input.metalSources ?? {}).sort()) {
|
|
715
|
+
hash.update("metal-source\n");
|
|
716
|
+
hash.update(createHash2("sha256").update(file).digest());
|
|
717
|
+
hash.update(
|
|
718
|
+
createHash2("sha256").update(input.metalSources?.[file] ?? "").digest()
|
|
719
|
+
);
|
|
720
|
+
}
|
|
611
721
|
for (const base of Object.keys(input.resources ?? {}).sort()) {
|
|
612
722
|
hash.update(createHash2("sha256").update(base).digest());
|
|
613
723
|
hash.update(
|
|
@@ -625,6 +735,19 @@ ${release}
|
|
|
625
735
|
hash.update("resource-path\n");
|
|
626
736
|
hash.update(createHash2("sha256").update(file).digest());
|
|
627
737
|
}
|
|
738
|
+
hash.update(
|
|
739
|
+
JSON.stringify(
|
|
740
|
+
[...input.resourceBundles ?? []].sort((a, b) => a.target.localeCompare(b.target))
|
|
741
|
+
)
|
|
742
|
+
);
|
|
743
|
+
for (const target of Object.keys(input.libraries ?? {}).sort()) {
|
|
744
|
+
hash.update(`library
|
|
745
|
+
${target}
|
|
746
|
+
`);
|
|
747
|
+
hash.update(
|
|
748
|
+
createHash2("sha256").update(input.libraries?.[target] ?? "").digest()
|
|
749
|
+
);
|
|
750
|
+
}
|
|
628
751
|
const targets = compileTargets(input);
|
|
629
752
|
if (targets.length > 0) {
|
|
630
753
|
hash.update(`swift-multi/v${MULTI_MANIFEST_VERSION}
|
|
@@ -660,10 +783,22 @@ function emitSwiftPackageManifest(args) {
|
|
|
660
783
|
if (!executable) throw new Error("swift-compile: no executable target to emit");
|
|
661
784
|
const stanza = (target) => {
|
|
662
785
|
const isolation = target.mainActorIsolation ? " .defaultIsolation(MainActor.self)," : "";
|
|
786
|
+
const interoperability = target.cxxInterop ? " .interoperabilityMode(.Cxx)," : "";
|
|
787
|
+
const defines = (target.defines ?? []).map((name) => ` .define(${JSON.stringify(name)}),`).join("");
|
|
663
788
|
const imports = distribution ? `, "-I", ${JSON.stringify(path2.join(moduleRoot, "modules"))}` : "";
|
|
664
|
-
const
|
|
789
|
+
const native = args.native?.get(target.name);
|
|
790
|
+
const nativeImports = (siblings.get(target.name) ?? []).filter((name) => args.native?.has(name)).map(
|
|
791
|
+
(name) => `, "-Xfrontend", "-import-module", "-Xfrontend", ${JSON.stringify(name)}`
|
|
792
|
+
).join("");
|
|
793
|
+
const header = args.headerDirectory && [...args.native?.values() ?? []].some(
|
|
794
|
+
(value) => value.late.producers.includes(target.name)
|
|
795
|
+
) ? `, "-emit-objc-header-path", ${JSON.stringify(path2.join(args.headerDirectory, `${target.name}-Swift.h`))}` : "";
|
|
796
|
+
const swiftSettings = `swiftSettings: [.swiftLanguageMode(.v${target.languageMode}),${isolation}${interoperability}${defines} .unsafeFlags(["-Osize"${FOUNDATION_IMPLICIT_FLAGS}${oneModule ? ONE_IMPLICIT_FLAGS : ""}${imports}${nativeImports}${header}])]`;
|
|
665
797
|
const deps = [
|
|
666
|
-
...
|
|
798
|
+
...target.executable ? [...args.native?.values() ?? []].map(
|
|
799
|
+
(value) => JSON.stringify(value.late.name)
|
|
800
|
+
) : [],
|
|
801
|
+
...distribution || native ? [] : [
|
|
667
802
|
'.product(name: "SwiftUI", package: "sootsim-swift")',
|
|
668
803
|
...oneModule ? [ONE_PRODUCT] : [],
|
|
669
804
|
...spriteKit ? [SPRITEKIT_PRODUCT] : []
|
|
@@ -684,13 +819,15 @@ function emitSwiftPackageManifest(args) {
|
|
|
684
819
|
"-Xlinker", "--export-if-defined=__main_argc_argv"${library},
|
|
685
820
|
]),
|
|
686
821
|
.unsafeFlags(["-Xlinker", "--strip-all"], .when(configuration: .release)),
|
|
687
|
-
]` :
|
|
822
|
+
]` : args.libraries?.has(target.name) ? `,
|
|
823
|
+
linkerSettings: [.unsafeFlags([${JSON.stringify(args.libraries.get(target.name))}])]` : "";
|
|
688
824
|
return [
|
|
689
825
|
` ${kind}(`,
|
|
690
826
|
` name: "${target.name}",`,
|
|
691
827
|
` dependencies: [${deps}],`,
|
|
692
828
|
` path: "${target.path}",`,
|
|
693
|
-
` ${
|
|
829
|
+
...native ? [` exclude: ${JSON.stringify(native.lateSources)},`] : [],
|
|
830
|
+
` ${native ? "cxxSettings: []" : swiftSettings}${link}`,
|
|
694
831
|
` ),`
|
|
695
832
|
].join("\n");
|
|
696
833
|
};
|
|
@@ -705,7 +842,16 @@ function emitSwiftPackageManifest(args) {
|
|
|
705
842
|
` dependencies: [${distribution ? "" : `.package(path: "${moduleRoot}")`}],`,
|
|
706
843
|
" targets: [",
|
|
707
844
|
...targets.map(stanza),
|
|
708
|
-
|
|
845
|
+
...[...args.native?.entries() ?? []].flatMap(([name, native]) => [
|
|
846
|
+
` .target(name: ${JSON.stringify(native.late.name)},`,
|
|
847
|
+
` dependencies: ${JSON.stringify([name, ...native.late.producers])},`,
|
|
848
|
+
` path: ${JSON.stringify(native.path)},`,
|
|
849
|
+
` sources: ${JSON.stringify(native.lateSources)},`,
|
|
850
|
+
` publicHeadersPath: "include",`,
|
|
851
|
+
` cxxSettings: [.unsafeFlags(["-fno-cxx-modules", "-I", ${JSON.stringify(native.includeDirectory)}, "-I", ${JSON.stringify(args.headerDirectory)}])]),`
|
|
852
|
+
]),
|
|
853
|
+
args.cxxLanguageStandard ? ` ],
|
|
854
|
+
cxxLanguageStandard: .${args.cxxLanguageStandard}` : " ]",
|
|
709
855
|
")",
|
|
710
856
|
""
|
|
711
857
|
].join("\n");
|
|
@@ -722,9 +868,10 @@ function syncSwiftTree(base, files) {
|
|
|
722
868
|
};
|
|
723
869
|
walk(base);
|
|
724
870
|
for (const [full, contents] of files) {
|
|
725
|
-
if (existsSync(full) && readFileSync2(full, "utf8") === contents)
|
|
871
|
+
if (existsSync(full) && (typeof contents === "string" ? readFileSync2(full, "utf8") === contents : readFileSync2(full).equals(contents)))
|
|
872
|
+
continue;
|
|
726
873
|
mkdirSync(path2.dirname(full), { recursive: true });
|
|
727
|
-
writeFileSync(full, contents
|
|
874
|
+
writeFileSync(full, contents);
|
|
728
875
|
}
|
|
729
876
|
}
|
|
730
877
|
var DIRECTIVE = /^[ \t]*#(?:if|elseif)\b/;
|
|
@@ -1842,6 +1989,8 @@ function prepareSwiftDependency(source, destination) {
|
|
|
1842
1989
|
copy(source, destination, true);
|
|
1843
1990
|
}
|
|
1844
1991
|
function writeSwiftProject(layout, input, moduleRoot) {
|
|
1992
|
+
if (input.resourceBundles !== void 0 && !isSwiftResourceBundles(input.resourceBundles))
|
|
1993
|
+
throw new Error("swift compile input has invalid target bundle assignments");
|
|
1845
1994
|
const resourceTargets = swiftManifestTargets(
|
|
1846
1995
|
input.files["Package.swift"] ?? "",
|
|
1847
1996
|
input.resourcePaths
|
|
@@ -1858,6 +2007,80 @@ function writeSwiftProject(layout, input, moduleRoot) {
|
|
|
1858
2007
|
}
|
|
1859
2008
|
] : compileTargets(input);
|
|
1860
2009
|
const files = /* @__PURE__ */ new Map();
|
|
2010
|
+
const native = /* @__PURE__ */ new Map();
|
|
2011
|
+
const headerDirectory = path2.join(layout.root, ".build", "peach-cxx-headers");
|
|
2012
|
+
for (const target of targets) {
|
|
2013
|
+
const prefix = target.path === "." ? "" : `${target.path}/`;
|
|
2014
|
+
const entries = Object.entries(input.files).filter(
|
|
2015
|
+
([file]) => file.startsWith(prefix) && !targets.some(
|
|
2016
|
+
(candidate) => candidate.name !== target.name && candidate.path !== "." && candidate.path.startsWith(prefix) && file.startsWith(`${candidate.path}/`)
|
|
2017
|
+
)
|
|
2018
|
+
);
|
|
2019
|
+
if (entries.some(([file]) => file.endsWith(".swift"))) continue;
|
|
2020
|
+
const units = entries.filter(([file]) => /\.(?:c|cc|cpp|cxx|m|mm)$/.test(file));
|
|
2021
|
+
if (units.length === 0) continue;
|
|
2022
|
+
const includes = `${prefix}include/`;
|
|
2023
|
+
const consumers = /* @__PURE__ */ new Map();
|
|
2024
|
+
const reverse = /* @__PURE__ */ new Map();
|
|
2025
|
+
for (const [file, contents] of entries) {
|
|
2026
|
+
const producers = /* @__PURE__ */ new Set();
|
|
2027
|
+
const source = contents.replace(/\/\*[\s\S]*?\*\//g, "");
|
|
2028
|
+
for (const match of source.matchAll(/^\s*#\s*include\s*[<"]([^>"]+)[>"]/gm)) {
|
|
2029
|
+
const include = match[1];
|
|
2030
|
+
const producer = /(?:^|\/)([^/]+)-Swift\.h$/.exec(include)?.[1];
|
|
2031
|
+
if (producer && targets.some((value) => value.name === producer))
|
|
2032
|
+
producers.add(producer);
|
|
2033
|
+
const local = [
|
|
2034
|
+
path2.posix.join(path2.posix.dirname(file), include),
|
|
2035
|
+
`${includes}${include}`
|
|
2036
|
+
].find((candidate) => input.files[candidate] !== void 0);
|
|
2037
|
+
if (local) {
|
|
2038
|
+
reverse.set(local, [...reverse.get(local) ?? [], file]);
|
|
2039
|
+
}
|
|
2040
|
+
}
|
|
2041
|
+
consumers.set(file, producers);
|
|
2042
|
+
}
|
|
2043
|
+
const queue = [...consumers.keys()].filter((file) => consumers.get(file).size > 0);
|
|
2044
|
+
for (let index = 0; index < queue.length; index++) {
|
|
2045
|
+
const file = queue[index];
|
|
2046
|
+
for (const parent of reverse.get(file) ?? []) {
|
|
2047
|
+
const inherited = consumers.get(parent);
|
|
2048
|
+
const before = inherited.size;
|
|
2049
|
+
for (const producer of consumers.get(file)) inherited.add(producer);
|
|
2050
|
+
if (before !== inherited.size) queue.push(parent);
|
|
2051
|
+
}
|
|
2052
|
+
}
|
|
2053
|
+
const late = units.filter(([file]) => consumers.get(file).size > 0);
|
|
2054
|
+
if (late.length === 0) continue;
|
|
2055
|
+
native.set(target.name, {
|
|
2056
|
+
path: target.path,
|
|
2057
|
+
includeDirectory: path2.join(layout.root, includes),
|
|
2058
|
+
lateSources: late.map(([file]) => file.slice(prefix.length)),
|
|
2059
|
+
late: {
|
|
2060
|
+
name: `${target.name}SwiftImplementation`,
|
|
2061
|
+
producers: [
|
|
2062
|
+
...new Set(late.flatMap(([file]) => [...consumers.get(file)]))
|
|
2063
|
+
].sort()
|
|
2064
|
+
}
|
|
2065
|
+
});
|
|
2066
|
+
if (input.files[`${includes}module.modulemap`] !== void 0) continue;
|
|
2067
|
+
const roots = entries.filter(
|
|
2068
|
+
([file]) => file.startsWith(includes) && /\.(?:h|hpp|hh|hxx)$/.test(file) && consumers.get(file).size === 0
|
|
2069
|
+
);
|
|
2070
|
+
files.set(
|
|
2071
|
+
path2.join(layout.root, includes, "module.modulemap"),
|
|
2072
|
+
[
|
|
2073
|
+
`module ${target.name} {`,
|
|
2074
|
+
...roots.map(
|
|
2075
|
+
([file]) => ` header ${JSON.stringify(file.slice(includes.length))}`
|
|
2076
|
+
),
|
|
2077
|
+
" export *",
|
|
2078
|
+
"}",
|
|
2079
|
+
""
|
|
2080
|
+
].join("\n")
|
|
2081
|
+
);
|
|
2082
|
+
}
|
|
2083
|
+
if (native.size > 0) mkdirSync(headerDirectory, { recursive: true });
|
|
1861
2084
|
const modulePlan = createHash2("sha256").update(
|
|
1862
2085
|
swiftModuleInputFiles(moduleRoot).join("\n")
|
|
1863
2086
|
);
|
|
@@ -1866,7 +2089,11 @@ function writeSwiftProject(layout, input, moduleRoot) {
|
|
|
1866
2089
|
}
|
|
1867
2090
|
const resourcePlan = createHash2("sha256").update(
|
|
1868
2091
|
JSON.stringify(
|
|
1869
|
-
resourceTargets.filter((target) => target.resources).map((target) => [
|
|
2092
|
+
resourceTargets.filter((target) => target.resources).map((target) => [
|
|
2093
|
+
target.name,
|
|
2094
|
+
target.path,
|
|
2095
|
+
input.resourceBundles?.find((bundle) => bundle.target === target.name)?.path
|
|
2096
|
+
])
|
|
1870
2097
|
)
|
|
1871
2098
|
).digest("hex").slice(0, 16);
|
|
1872
2099
|
const moduleFiles = `
|
|
@@ -1926,6 +2153,12 @@ function writeSwiftProject(layout, input, moduleRoot) {
|
|
|
1926
2153
|
files.set(path2.join(layout.root, "Package.swift"), manifest + moduleFiles);
|
|
1927
2154
|
} else {
|
|
1928
2155
|
const base = layout.multi ? layout.root : layout.sources;
|
|
2156
|
+
const libraries = /* @__PURE__ */ new Map();
|
|
2157
|
+
for (const [target, data] of Object.entries(input.libraries ?? {})) {
|
|
2158
|
+
const file = path2.join(layout.root, ".peach-libraries", `lib${target}.a`);
|
|
2159
|
+
files.set(file, Buffer.from(data, "base64"));
|
|
2160
|
+
libraries.set(target, file);
|
|
2161
|
+
}
|
|
1929
2162
|
for (const [file, contents] of Object.entries(input.files)) {
|
|
1930
2163
|
if (file === "Package.swift") continue;
|
|
1931
2164
|
files.set(
|
|
@@ -1937,6 +2170,11 @@ function writeSwiftProject(layout, input, moduleRoot) {
|
|
|
1937
2170
|
path2.join(layout.root, "Package.swift"),
|
|
1938
2171
|
emitSwiftPackageManifest({
|
|
1939
2172
|
targets,
|
|
2173
|
+
native,
|
|
2174
|
+
headerDirectory: native.size > 0 ? headerDirectory : void 0,
|
|
2175
|
+
cxxLanguageStandard: swiftManifestCxxLanguageStandard(
|
|
2176
|
+
input.files["Package.swift"] ?? ""
|
|
2177
|
+
),
|
|
1940
2178
|
siblings: swiftTargetDependencies(
|
|
1941
2179
|
input.files,
|
|
1942
2180
|
layout.multi ? targets : targets.map((target) => ({ ...target, path: "." }))
|
|
@@ -1944,12 +2182,20 @@ function writeSwiftProject(layout, input, moduleRoot) {
|
|
|
1944
2182
|
moduleRoot,
|
|
1945
2183
|
oneModule: input.oneModule,
|
|
1946
2184
|
spriteKit: importsSpriteKit(input.files),
|
|
1947
|
-
distribution: distribution ?? void 0
|
|
2185
|
+
distribution: distribution ?? void 0,
|
|
2186
|
+
libraries
|
|
1948
2187
|
}) + moduleFiles
|
|
1949
2188
|
);
|
|
1950
2189
|
}
|
|
1951
2190
|
for (const target of resourceTargets) {
|
|
1952
2191
|
if (!target.resources) continue;
|
|
2192
|
+
const bundle = input.resourceBundles?.find(
|
|
2193
|
+
(candidate) => candidate.target === target.name
|
|
2194
|
+
);
|
|
2195
|
+
if (!bundle || bundle.sourcePath !== target.path)
|
|
2196
|
+
throw new Error(
|
|
2197
|
+
`swift resource target ${target.name} has no matching bundle assignment`
|
|
2198
|
+
);
|
|
1953
2199
|
const directory = layout.multi ? path2.join(layout.root, target.path) : layout.sources;
|
|
1954
2200
|
files.set(
|
|
1955
2201
|
path2.join(directory, "ResourceBundleAccessor.generated.swift"),
|
|
@@ -1957,7 +2203,11 @@ function writeSwiftProject(layout, input, moduleRoot) {
|
|
|
1957
2203
|
"import Foundation",
|
|
1958
2204
|
"",
|
|
1959
2205
|
"extension Foundation.Bundle {",
|
|
1960
|
-
" static let module: Bundle = Bundle.main"
|
|
2206
|
+
bundle.path === "." ? " static let module: Bundle = Bundle.main" : ` static let module: Bundle = {
|
|
2207
|
+
let url = Bundle.main.bundleURL.appendingPathComponent(${JSON.stringify(bundle.path)})
|
|
2208
|
+
guard let bundle = Bundle(url: url) else { fatalError("resource bundle is missing: ${bundle.target}") }
|
|
2209
|
+
return bundle
|
|
2210
|
+
}()`,
|
|
1961
2211
|
"}",
|
|
1962
2212
|
""
|
|
1963
2213
|
].join("\n")
|
|
@@ -2025,7 +2275,7 @@ function compileSwiftProjectUnit(input, options) {
|
|
|
2025
2275
|
};
|
|
2026
2276
|
const hash = swiftArtifactHash(input, options.release, moduleRoot);
|
|
2027
2277
|
return serialize(root, async () => {
|
|
2028
|
-
if (process.platform === "darwin" && process.env.TM_SESSION && process.env.CI !== "true" &&
|
|
2278
|
+
if (process.platform === "darwin" && process.env.TM_SESSION && process.env.CI !== "true" && moduleRoot === path2.resolve(import.meta.dirname, "../../sootsim-swift") && !swiftDistributionAt(moduleRoot)) {
|
|
2029
2279
|
const requestRoot = mkdtempSync(path2.join(root, ".builder-request-"));
|
|
2030
2280
|
const output = path2.join(requestRoot, "output");
|
|
2031
2281
|
const request = path2.join(requestRoot, "request.json");
|
|
@@ -2050,7 +2300,11 @@ function compileSwiftProjectUnit(input, options) {
|
|
|
2050
2300
|
"--output",
|
|
2051
2301
|
output
|
|
2052
2302
|
],
|
|
2053
|
-
{
|
|
2303
|
+
{
|
|
2304
|
+
cwd: repo,
|
|
2305
|
+
timeout: options.timeoutMs,
|
|
2306
|
+
maxBuffer: 64 * 1024 * 1024
|
|
2307
|
+
}
|
|
2054
2308
|
);
|
|
2055
2309
|
pending.child.stdout?.on("data", (bytes2) => process.stdout.write(bytes2));
|
|
2056
2310
|
pending.child.stderr?.on("data", (bytes2) => process.stderr.write(bytes2));
|
|
@@ -2082,7 +2336,11 @@ function compileSwiftProjectUnit(input, options) {
|
|
|
2082
2336
|
`swift-compile: no swift.org toolchain at ${options.toolchainBin}; install ${options.release} and its matching wasm sdk`
|
|
2083
2337
|
);
|
|
2084
2338
|
}
|
|
2085
|
-
const macroPlugins = await ensureMacroPlugins(
|
|
2339
|
+
const macroPlugins = await ensureMacroPlugins(
|
|
2340
|
+
moduleRoot,
|
|
2341
|
+
options.toolchainBin,
|
|
2342
|
+
options.release
|
|
2343
|
+
);
|
|
2086
2344
|
const sdk = swiftModuleSdk(moduleRoot).wasmSdkId;
|
|
2087
2345
|
const icu = swiftIcuAsset(options.toolchainBin, sdk);
|
|
2088
2346
|
try {
|
|
@@ -2090,6 +2348,8 @@ function compileSwiftProjectUnit(input, options) {
|
|
|
2090
2348
|
swift,
|
|
2091
2349
|
[
|
|
2092
2350
|
"build",
|
|
2351
|
+
"--build-system",
|
|
2352
|
+
"native",
|
|
2093
2353
|
"-j",
|
|
2094
2354
|
BUILD_JOBS,
|
|
2095
2355
|
"--package-path",
|