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
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -229,7 +229,10 @@ var MANIFEST_DECLARATIONS = [
|
|
|
229
229
|
function manifestCalls(manifest, kinds) {
|
|
230
230
|
const code = manifest.replace(/\/\*[\s\S]*?\*\//g, "").replace(/(^|[^:"])\/\/[^\n]*/g, "$1");
|
|
231
231
|
const calls = [];
|
|
232
|
-
const pattern = new RegExp(
|
|
232
|
+
const pattern = new RegExp(
|
|
233
|
+
`(?:\\.(${MANIFEST_DECLARATIONS.join("|")})|\\b(Package))\\s*\\(`,
|
|
234
|
+
"g"
|
|
235
|
+
);
|
|
233
236
|
let match;
|
|
234
237
|
while ((match = pattern.exec(code)) !== null) {
|
|
235
238
|
let depth = 1;
|
|
@@ -259,19 +262,56 @@ function manifestCalls(manifest, kinds) {
|
|
|
259
262
|
}
|
|
260
263
|
i++;
|
|
261
264
|
}
|
|
262
|
-
|
|
263
|
-
|
|
265
|
+
const kind = match[1] ?? match[2];
|
|
266
|
+
if (kinds.includes(kind)) calls.push({ kind, flat, call: code.slice(start, i) });
|
|
267
|
+
else if (kind === "Package") {
|
|
268
|
+
calls.push(...manifestCalls(code.slice(start, i - 1), kinds));
|
|
269
|
+
}
|
|
264
270
|
pattern.lastIndex = i;
|
|
265
271
|
}
|
|
266
272
|
return calls;
|
|
267
273
|
}
|
|
274
|
+
function splitManifestArguments(source) {
|
|
275
|
+
const arguments_ = [];
|
|
276
|
+
let start = 0;
|
|
277
|
+
let parentheses = 0;
|
|
278
|
+
let brackets = 0;
|
|
279
|
+
let braces = 0;
|
|
280
|
+
let inString = false;
|
|
281
|
+
let escaped = false;
|
|
282
|
+
for (let index = 0; index < source.length; index++) {
|
|
283
|
+
const character = source[index];
|
|
284
|
+
if (inString) {
|
|
285
|
+
if (escaped) escaped = false;
|
|
286
|
+
else if (character === "\\") escaped = true;
|
|
287
|
+
else if (character === '"') inString = false;
|
|
288
|
+
} else if (character === '"') inString = true;
|
|
289
|
+
else if (character === "(") parentheses++;
|
|
290
|
+
else if (character === ")") parentheses--;
|
|
291
|
+
else if (character === "[") brackets++;
|
|
292
|
+
else if (character === "]") brackets--;
|
|
293
|
+
else if (character === "{") braces++;
|
|
294
|
+
else if (character === "}") braces--;
|
|
295
|
+
else if (character === "," && parentheses === 0 && brackets === 0 && braces === 0) {
|
|
296
|
+
arguments_.push(source.slice(start, index).trim());
|
|
297
|
+
start = index + 1;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
const final = source.slice(start).trim();
|
|
301
|
+
if (final) arguments_.push(final);
|
|
302
|
+
return arguments_;
|
|
303
|
+
}
|
|
268
304
|
function swiftManifestTargets(manifest, resourcePaths = []) {
|
|
269
305
|
const implicitResources = swiftImplicitResourcePaths(resourcePaths);
|
|
270
306
|
const targets = [];
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
307
|
+
const declarations = manifestCalls(manifest, ["executableTarget", "target"]);
|
|
308
|
+
const targetNames = new Set(
|
|
309
|
+
declarations.flatMap(({ flat }) => {
|
|
310
|
+
const name = /\bname\s*:\s*"([^"]+)"/.exec(flat)?.[1];
|
|
311
|
+
return name ? [name] : [];
|
|
312
|
+
})
|
|
313
|
+
);
|
|
314
|
+
for (const { kind, flat, call } of declarations) {
|
|
275
315
|
const executable = kind === "executableTarget";
|
|
276
316
|
const name = /\bname\s*:\s*"([^"]+)"/.exec(flat)?.[1];
|
|
277
317
|
if (!name) continue;
|
|
@@ -281,6 +321,12 @@ function swiftManifestTargets(manifest, resourcePaths = []) {
|
|
|
281
321
|
/\.swiftLanguageMode\(\s*\.v(\d+)\s*\)/.exec(call)?.[1] ?? "5"
|
|
282
322
|
);
|
|
283
323
|
const mainActorIsolation = /\.defaultIsolation\(\s*MainActor\.self\s*\)/.test(call);
|
|
324
|
+
const cxxInterop = /\.interoperabilityMode\(\s*\.Cxx\s*\)/.test(
|
|
325
|
+
call.replace(/"(?:\\.|[^"\\])*"/g, "")
|
|
326
|
+
);
|
|
327
|
+
const defines = [
|
|
328
|
+
...call.matchAll(/\.define\(\s*"([A-Za-z_][A-Za-z0-9_]*)"\s*\)/g)
|
|
329
|
+
].map((match) => match[1]);
|
|
284
330
|
const excluded = [
|
|
285
331
|
...(/\bexclude\s*:\s*\[([^\]]*)\]/.exec(flat)?.[1] ?? "").matchAll(/"([^"]+)"/g)
|
|
286
332
|
].map((match) => match[1].replace(/^\.\//, "").replace(/\/+$/, ""));
|
|
@@ -294,20 +340,60 @@ function swiftManifestTargets(manifest, resourcePaths = []) {
|
|
|
294
340
|
return false;
|
|
295
341
|
return true;
|
|
296
342
|
});
|
|
343
|
+
const targetArguments = splitManifestArguments(call.slice(0, -1));
|
|
344
|
+
const dependencyArgument = targetArguments.find(
|
|
345
|
+
(argument) => /^dependencies\s*:/.test(argument)
|
|
346
|
+
);
|
|
347
|
+
const dependencyList = dependencyArgument?.replace(/^dependencies\s*:\s*/, "").trim();
|
|
348
|
+
const dependencyNames = /* @__PURE__ */ new Set();
|
|
349
|
+
if (dependencyList?.startsWith("[") && dependencyList.endsWith("]")) {
|
|
350
|
+
for (const dependency of splitManifestArguments(dependencyList.slice(1, -1))) {
|
|
351
|
+
const dependencyName = /^"([^"]+)"$/.exec(dependency)?.[1] ?? /^\.(?:target|byName)\s*\(\s*name\s*:\s*"([^"]+)"/.exec(dependency)?.[1];
|
|
352
|
+
if (dependencyName && targetNames.has(dependencyName))
|
|
353
|
+
dependencyNames.add(dependencyName);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
const dependencies = [...dependencyNames].map((name2) => ({
|
|
357
|
+
kind: "target",
|
|
358
|
+
name: name2
|
|
359
|
+
}));
|
|
297
360
|
targets.push({
|
|
298
361
|
name,
|
|
299
362
|
path: targetPath,
|
|
300
363
|
executable,
|
|
301
364
|
languageMode,
|
|
302
365
|
mainActorIsolation,
|
|
303
|
-
|
|
366
|
+
...cxxInterop ? { cxxInterop: true } : {},
|
|
367
|
+
...defines.length === 0 ? {} : { defines },
|
|
368
|
+
resources,
|
|
369
|
+
...dependencies.length === 0 ? {} : { dependencies },
|
|
370
|
+
...excluded.length === 0 ? {} : { exclude: excluded }
|
|
304
371
|
});
|
|
305
372
|
}
|
|
306
373
|
return targets;
|
|
307
374
|
}
|
|
375
|
+
function swiftManifestCxxLanguageStandard(manifest) {
|
|
376
|
+
const declaration = manifestCalls(manifest, ["Package"])[0];
|
|
377
|
+
if (!declaration) return void 0;
|
|
378
|
+
const code = declaration.flat.replace(/"(?:\\.|[^"\\])*"/g, "");
|
|
379
|
+
return /\bcxxLanguageStandard\s*:\s*\.(\w+)/.exec(code)?.[1];
|
|
380
|
+
}
|
|
308
381
|
function swiftPackagePartition(manifest, resourcePaths = []) {
|
|
309
382
|
const targets = swiftManifestTargets(manifest, resourcePaths);
|
|
310
|
-
return targets.length === 1 && targets[0].executable && targets[0].path === "." ? [] : targets;
|
|
383
|
+
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;
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
// src/swiftContract.ts
|
|
387
|
+
function isSwiftResourcePath(value) {
|
|
388
|
+
return typeof value === "string" && value.length <= 4096 && !value.startsWith("/") && !value.includes("\\") && !value.includes("\0") && value.split("/").every((part) => part !== "" && part !== "." && part !== "..");
|
|
389
|
+
}
|
|
390
|
+
function isSwiftBundlePath(value) {
|
|
391
|
+
return typeof value === "string" && (value === "." || isSwiftResourcePath(value) && /\.(bundle|framework)$/.test(value));
|
|
392
|
+
}
|
|
393
|
+
function isSwiftResourceBundles(value) {
|
|
394
|
+
return Array.isArray(value) && value.length <= 128 && value.every(
|
|
395
|
+
(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)
|
|
396
|
+
) && new Set(value.map((bundle) => bundle.target)).size === value.length && new Set(value.map((bundle) => bundle.path)).size === value.length;
|
|
311
397
|
}
|
|
312
398
|
|
|
313
399
|
// src/swift-compile.ts
|
|
@@ -340,6 +426,7 @@ function swiftModuleInputFiles(root) {
|
|
|
340
426
|
"Package.swift",
|
|
341
427
|
"scripts/contrast-app-Package.swift",
|
|
342
428
|
"scripts/build-distribution.ts",
|
|
429
|
+
"scripts/distribution-clang.ts",
|
|
343
430
|
"scripts/build-distribution-plugins.sh",
|
|
344
431
|
"scripts/build-preview-plugin.sh",
|
|
345
432
|
"toolchain.json"
|
|
@@ -364,6 +451,10 @@ function swiftMacroPlugins(moduleRoot) {
|
|
|
364
451
|
stale: false
|
|
365
452
|
};
|
|
366
453
|
const dir = import_node_path2.default.join(moduleRoot, ".build/host/RnxPreviewMacros");
|
|
454
|
+
const release = JSON.parse(
|
|
455
|
+
(0, import_node_fs2.readFileSync)(import_node_path2.default.join(moduleRoot, "toolchain.json"), "utf8")
|
|
456
|
+
).release;
|
|
457
|
+
const compilerStamp = import_node_path2.default.join(dir, "compiler-release");
|
|
367
458
|
const ext = process.platform === "darwin" ? "dylib" : "so";
|
|
368
459
|
const plugins = [
|
|
369
460
|
{
|
|
@@ -377,12 +468,12 @@ function swiftMacroPlugins(moduleRoot) {
|
|
|
377
468
|
];
|
|
378
469
|
return {
|
|
379
470
|
libraries: plugins.map(({ library }) => library),
|
|
380
|
-
stale: plugins.some(
|
|
471
|
+
stale: !(0, import_node_fs2.existsSync)(compilerStamp) || (0, import_node_fs2.readFileSync)(compilerStamp, "utf8").trim() !== release || plugins.some(
|
|
381
472
|
({ library, source }) => !(0, import_node_fs2.existsSync)(library) || (0, import_node_fs2.statSync)(source).mtimeMs > (0, import_node_fs2.statSync)(library).mtimeMs
|
|
382
473
|
)
|
|
383
474
|
};
|
|
384
475
|
}
|
|
385
|
-
async function ensureMacroPlugins(moduleRoot, toolchainBin) {
|
|
476
|
+
async function ensureMacroPlugins(moduleRoot, toolchainBin, release) {
|
|
386
477
|
const { libraries, stale } = swiftMacroPlugins(moduleRoot);
|
|
387
478
|
if (stale) {
|
|
388
479
|
await run2("sh", [
|
|
@@ -390,6 +481,11 @@ async function ensureMacroPlugins(moduleRoot, toolchainBin) {
|
|
|
390
481
|
toolchainBin,
|
|
391
482
|
libraries[0]
|
|
392
483
|
]);
|
|
484
|
+
(0, import_node_fs2.writeFileSync)(
|
|
485
|
+
import_node_path2.default.join(import_node_path2.default.dirname(libraries[0]), "compiler-release"),
|
|
486
|
+
`${release}
|
|
487
|
+
`
|
|
488
|
+
);
|
|
393
489
|
}
|
|
394
490
|
return libraries;
|
|
395
491
|
}
|
|
@@ -455,6 +551,7 @@ var OPTIONAL_FRAMEWORK_DEPENDENCIES = {
|
|
|
455
551
|
TikTokBusinessSDK: [],
|
|
456
552
|
nSure: [],
|
|
457
553
|
Statsig: [],
|
|
554
|
+
TOCropViewController: [],
|
|
458
555
|
RiveRuntime: ["MetalKit"],
|
|
459
556
|
MetalKit: [],
|
|
460
557
|
DatadogCore: [],
|
|
@@ -469,6 +566,7 @@ var OPTIONAL_FRAMEWORK_DEPENDENCIES = {
|
|
|
469
566
|
Intercom: [],
|
|
470
567
|
FirebaseCore: [],
|
|
471
568
|
FirebaseSharedSwift: ["FirebaseCore"],
|
|
569
|
+
FirebaseRemoteConfig: ["FirebaseCore", "FirebaseSharedSwift"],
|
|
472
570
|
FirebaseFirestoreInternal: ["FirebaseCore"],
|
|
473
571
|
FirebaseAnalytics: ["FirebaseCore"],
|
|
474
572
|
FirebaseAppCheck: ["FirebaseCore"],
|
|
@@ -476,6 +574,7 @@ var OPTIONAL_FRAMEWORK_DEPENDENCIES = {
|
|
|
476
574
|
FirebaseCrashlytics: ["FirebaseCore"],
|
|
477
575
|
FirebaseFirestore: ["FirebaseCore", "FirebaseSharedSwift", "FirebaseFirestoreInternal"],
|
|
478
576
|
FirebaseStorage: ["FirebaseCore"],
|
|
577
|
+
GoogleMobileAds: [],
|
|
479
578
|
FBAudienceNetwork: []
|
|
480
579
|
};
|
|
481
580
|
var OPTIONAL_FRAMEWORKS = new Set(Object.keys(OPTIONAL_FRAMEWORK_DEPENDENCIES));
|
|
@@ -619,7 +718,11 @@ function swiftTargetDependencies(files, targets) {
|
|
|
619
718
|
const siblings = /* @__PURE__ */ new Map();
|
|
620
719
|
for (const target of targets) {
|
|
621
720
|
const prefix = target.path === "." ? "" : `${target.path}/`;
|
|
622
|
-
const deps =
|
|
721
|
+
const deps = new Set(
|
|
722
|
+
(target.dependencies ?? []).flatMap(
|
|
723
|
+
(dependency) => dependency.kind === "target" && dependency.name !== target.name && names.has(dependency.name) ? [dependency.name] : []
|
|
724
|
+
)
|
|
725
|
+
);
|
|
623
726
|
for (const [file, contents] of Object.entries(files)) {
|
|
624
727
|
if (file === "Package.swift" || !file.startsWith(prefix)) continue;
|
|
625
728
|
if (targets.some(
|
|
@@ -643,17 +746,17 @@ var FOUNDATION_IMPLICIT_MODULES = [
|
|
|
643
746
|
"PeachObjC",
|
|
644
747
|
"Dispatch",
|
|
645
748
|
"FoundationNetworking",
|
|
646
|
-
"
|
|
647
|
-
"
|
|
749
|
+
"PeachFoundationCombine",
|
|
750
|
+
"Darwin"
|
|
648
751
|
];
|
|
649
752
|
var FOUNDATION_IMPLICIT_FLAGS = FOUNDATION_IMPLICIT_MODULES.map(
|
|
650
753
|
(module2) => `, "-Xfrontend", "-import-module", "-Xfrontend", "${module2}"`
|
|
651
754
|
).join("");
|
|
652
755
|
var ONE_IMPLICIT_FLAGS = ', "-Xfrontend", "-import-module", "-Xfrontend", "One"';
|
|
653
|
-
var MULTI_MANIFEST_VERSION =
|
|
756
|
+
var MULTI_MANIFEST_VERSION = 18;
|
|
654
757
|
function swiftArtifactHash(input, release, moduleRoot) {
|
|
655
758
|
const hash = (0, import_node_crypto2.createHash)("sha256");
|
|
656
|
-
hash.update(`swift-compile/
|
|
759
|
+
hash.update(`swift-compile/v23
|
|
657
760
|
${release}
|
|
658
761
|
`);
|
|
659
762
|
if (input.oneModule) hash.update("one-module\n");
|
|
@@ -662,6 +765,13 @@ ${release}
|
|
|
662
765
|
hash.update((0, import_node_crypto2.createHash)("sha256").update(file).digest());
|
|
663
766
|
hash.update((0, import_node_crypto2.createHash)("sha256").update(input.files[file]).digest());
|
|
664
767
|
}
|
|
768
|
+
for (const file of Object.keys(input.metalSources ?? {}).sort()) {
|
|
769
|
+
hash.update("metal-source\n");
|
|
770
|
+
hash.update((0, import_node_crypto2.createHash)("sha256").update(file).digest());
|
|
771
|
+
hash.update(
|
|
772
|
+
(0, import_node_crypto2.createHash)("sha256").update(input.metalSources?.[file] ?? "").digest()
|
|
773
|
+
);
|
|
774
|
+
}
|
|
665
775
|
for (const base of Object.keys(input.resources ?? {}).sort()) {
|
|
666
776
|
hash.update((0, import_node_crypto2.createHash)("sha256").update(base).digest());
|
|
667
777
|
hash.update(
|
|
@@ -679,6 +789,19 @@ ${release}
|
|
|
679
789
|
hash.update("resource-path\n");
|
|
680
790
|
hash.update((0, import_node_crypto2.createHash)("sha256").update(file).digest());
|
|
681
791
|
}
|
|
792
|
+
hash.update(
|
|
793
|
+
JSON.stringify(
|
|
794
|
+
[...input.resourceBundles ?? []].sort((a, b) => a.target.localeCompare(b.target))
|
|
795
|
+
)
|
|
796
|
+
);
|
|
797
|
+
for (const target of Object.keys(input.libraries ?? {}).sort()) {
|
|
798
|
+
hash.update(`library
|
|
799
|
+
${target}
|
|
800
|
+
`);
|
|
801
|
+
hash.update(
|
|
802
|
+
(0, import_node_crypto2.createHash)("sha256").update(input.libraries?.[target] ?? "").digest()
|
|
803
|
+
);
|
|
804
|
+
}
|
|
682
805
|
const targets = compileTargets(input);
|
|
683
806
|
if (targets.length > 0) {
|
|
684
807
|
hash.update(`swift-multi/v${MULTI_MANIFEST_VERSION}
|
|
@@ -714,10 +837,22 @@ function emitSwiftPackageManifest(args) {
|
|
|
714
837
|
if (!executable) throw new Error("swift-compile: no executable target to emit");
|
|
715
838
|
const stanza = (target) => {
|
|
716
839
|
const isolation = target.mainActorIsolation ? " .defaultIsolation(MainActor.self)," : "";
|
|
840
|
+
const interoperability = target.cxxInterop ? " .interoperabilityMode(.Cxx)," : "";
|
|
841
|
+
const defines = (target.defines ?? []).map((name) => ` .define(${JSON.stringify(name)}),`).join("");
|
|
717
842
|
const imports = distribution ? `, "-I", ${JSON.stringify(import_node_path2.default.join(moduleRoot, "modules"))}` : "";
|
|
718
|
-
const
|
|
843
|
+
const native = args.native?.get(target.name);
|
|
844
|
+
const nativeImports = (siblings.get(target.name) ?? []).filter((name) => args.native?.has(name)).map(
|
|
845
|
+
(name) => `, "-Xfrontend", "-import-module", "-Xfrontend", ${JSON.stringify(name)}`
|
|
846
|
+
).join("");
|
|
847
|
+
const header = args.headerDirectory && [...args.native?.values() ?? []].some(
|
|
848
|
+
(value) => value.late.producers.includes(target.name)
|
|
849
|
+
) ? `, "-emit-objc-header-path", ${JSON.stringify(import_node_path2.default.join(args.headerDirectory, `${target.name}-Swift.h`))}` : "";
|
|
850
|
+
const swiftSettings = `swiftSettings: [.swiftLanguageMode(.v${target.languageMode}),${isolation}${interoperability}${defines} .unsafeFlags(["-Osize"${FOUNDATION_IMPLICIT_FLAGS}${oneModule ? ONE_IMPLICIT_FLAGS : ""}${imports}${nativeImports}${header}])]`;
|
|
719
851
|
const deps = [
|
|
720
|
-
...
|
|
852
|
+
...target.executable ? [...args.native?.values() ?? []].map(
|
|
853
|
+
(value) => JSON.stringify(value.late.name)
|
|
854
|
+
) : [],
|
|
855
|
+
...distribution || native ? [] : [
|
|
721
856
|
'.product(name: "SwiftUI", package: "sootsim-swift")',
|
|
722
857
|
...oneModule ? [ONE_PRODUCT] : [],
|
|
723
858
|
...spriteKit ? [SPRITEKIT_PRODUCT] : []
|
|
@@ -738,13 +873,15 @@ function emitSwiftPackageManifest(args) {
|
|
|
738
873
|
"-Xlinker", "--export-if-defined=__main_argc_argv"${library},
|
|
739
874
|
]),
|
|
740
875
|
.unsafeFlags(["-Xlinker", "--strip-all"], .when(configuration: .release)),
|
|
741
|
-
]` :
|
|
876
|
+
]` : args.libraries?.has(target.name) ? `,
|
|
877
|
+
linkerSettings: [.unsafeFlags([${JSON.stringify(args.libraries.get(target.name))}])]` : "";
|
|
742
878
|
return [
|
|
743
879
|
` ${kind}(`,
|
|
744
880
|
` name: "${target.name}",`,
|
|
745
881
|
` dependencies: [${deps}],`,
|
|
746
882
|
` path: "${target.path}",`,
|
|
747
|
-
` ${
|
|
883
|
+
...native ? [` exclude: ${JSON.stringify(native.lateSources)},`] : [],
|
|
884
|
+
` ${native ? "cxxSettings: []" : swiftSettings}${link}`,
|
|
748
885
|
` ),`
|
|
749
886
|
].join("\n");
|
|
750
887
|
};
|
|
@@ -759,7 +896,16 @@ function emitSwiftPackageManifest(args) {
|
|
|
759
896
|
` dependencies: [${distribution ? "" : `.package(path: "${moduleRoot}")`}],`,
|
|
760
897
|
" targets: [",
|
|
761
898
|
...targets.map(stanza),
|
|
762
|
-
|
|
899
|
+
...[...args.native?.entries() ?? []].flatMap(([name, native]) => [
|
|
900
|
+
` .target(name: ${JSON.stringify(native.late.name)},`,
|
|
901
|
+
` dependencies: ${JSON.stringify([name, ...native.late.producers])},`,
|
|
902
|
+
` path: ${JSON.stringify(native.path)},`,
|
|
903
|
+
` sources: ${JSON.stringify(native.lateSources)},`,
|
|
904
|
+
` publicHeadersPath: "include",`,
|
|
905
|
+
` cxxSettings: [.unsafeFlags(["-fno-cxx-modules", "-I", ${JSON.stringify(native.includeDirectory)}, "-I", ${JSON.stringify(args.headerDirectory)}])]),`
|
|
906
|
+
]),
|
|
907
|
+
args.cxxLanguageStandard ? ` ],
|
|
908
|
+
cxxLanguageStandard: .${args.cxxLanguageStandard}` : " ]",
|
|
763
909
|
")",
|
|
764
910
|
""
|
|
765
911
|
].join("\n");
|
|
@@ -776,9 +922,10 @@ function syncSwiftTree(base, files) {
|
|
|
776
922
|
};
|
|
777
923
|
walk(base);
|
|
778
924
|
for (const [full, contents] of files) {
|
|
779
|
-
if ((0, import_node_fs2.existsSync)(full) && (0, import_node_fs2.readFileSync)(full, "utf8") === contents)
|
|
925
|
+
if ((0, import_node_fs2.existsSync)(full) && (typeof contents === "string" ? (0, import_node_fs2.readFileSync)(full, "utf8") === contents : (0, import_node_fs2.readFileSync)(full).equals(contents)))
|
|
926
|
+
continue;
|
|
780
927
|
(0, import_node_fs2.mkdirSync)(import_node_path2.default.dirname(full), { recursive: true });
|
|
781
|
-
(0, import_node_fs2.writeFileSync)(full, contents
|
|
928
|
+
(0, import_node_fs2.writeFileSync)(full, contents);
|
|
782
929
|
}
|
|
783
930
|
}
|
|
784
931
|
var DIRECTIVE = /^[ \t]*#(?:if|elseif)\b/;
|
|
@@ -1896,6 +2043,8 @@ function prepareSwiftDependency(source, destination) {
|
|
|
1896
2043
|
copy(source, destination, true);
|
|
1897
2044
|
}
|
|
1898
2045
|
function writeSwiftProject(layout, input, moduleRoot) {
|
|
2046
|
+
if (input.resourceBundles !== void 0 && !isSwiftResourceBundles(input.resourceBundles))
|
|
2047
|
+
throw new Error("swift compile input has invalid target bundle assignments");
|
|
1899
2048
|
const resourceTargets = swiftManifestTargets(
|
|
1900
2049
|
input.files["Package.swift"] ?? "",
|
|
1901
2050
|
input.resourcePaths
|
|
@@ -1912,6 +2061,80 @@ function writeSwiftProject(layout, input, moduleRoot) {
|
|
|
1912
2061
|
}
|
|
1913
2062
|
] : compileTargets(input);
|
|
1914
2063
|
const files = /* @__PURE__ */ new Map();
|
|
2064
|
+
const native = /* @__PURE__ */ new Map();
|
|
2065
|
+
const headerDirectory = import_node_path2.default.join(layout.root, ".build", "peach-cxx-headers");
|
|
2066
|
+
for (const target of targets) {
|
|
2067
|
+
const prefix = target.path === "." ? "" : `${target.path}/`;
|
|
2068
|
+
const entries = Object.entries(input.files).filter(
|
|
2069
|
+
([file]) => file.startsWith(prefix) && !targets.some(
|
|
2070
|
+
(candidate) => candidate.name !== target.name && candidate.path !== "." && candidate.path.startsWith(prefix) && file.startsWith(`${candidate.path}/`)
|
|
2071
|
+
)
|
|
2072
|
+
);
|
|
2073
|
+
if (entries.some(([file]) => file.endsWith(".swift"))) continue;
|
|
2074
|
+
const units = entries.filter(([file]) => /\.(?:c|cc|cpp|cxx|m|mm)$/.test(file));
|
|
2075
|
+
if (units.length === 0) continue;
|
|
2076
|
+
const includes = `${prefix}include/`;
|
|
2077
|
+
const consumers = /* @__PURE__ */ new Map();
|
|
2078
|
+
const reverse = /* @__PURE__ */ new Map();
|
|
2079
|
+
for (const [file, contents] of entries) {
|
|
2080
|
+
const producers = /* @__PURE__ */ new Set();
|
|
2081
|
+
const source = contents.replace(/\/\*[\s\S]*?\*\//g, "");
|
|
2082
|
+
for (const match of source.matchAll(/^\s*#\s*include\s*[<"]([^>"]+)[>"]/gm)) {
|
|
2083
|
+
const include = match[1];
|
|
2084
|
+
const producer = /(?:^|\/)([^/]+)-Swift\.h$/.exec(include)?.[1];
|
|
2085
|
+
if (producer && targets.some((value) => value.name === producer))
|
|
2086
|
+
producers.add(producer);
|
|
2087
|
+
const local = [
|
|
2088
|
+
import_node_path2.default.posix.join(import_node_path2.default.posix.dirname(file), include),
|
|
2089
|
+
`${includes}${include}`
|
|
2090
|
+
].find((candidate) => input.files[candidate] !== void 0);
|
|
2091
|
+
if (local) {
|
|
2092
|
+
reverse.set(local, [...reverse.get(local) ?? [], file]);
|
|
2093
|
+
}
|
|
2094
|
+
}
|
|
2095
|
+
consumers.set(file, producers);
|
|
2096
|
+
}
|
|
2097
|
+
const queue = [...consumers.keys()].filter((file) => consumers.get(file).size > 0);
|
|
2098
|
+
for (let index = 0; index < queue.length; index++) {
|
|
2099
|
+
const file = queue[index];
|
|
2100
|
+
for (const parent of reverse.get(file) ?? []) {
|
|
2101
|
+
const inherited = consumers.get(parent);
|
|
2102
|
+
const before = inherited.size;
|
|
2103
|
+
for (const producer of consumers.get(file)) inherited.add(producer);
|
|
2104
|
+
if (before !== inherited.size) queue.push(parent);
|
|
2105
|
+
}
|
|
2106
|
+
}
|
|
2107
|
+
const late = units.filter(([file]) => consumers.get(file).size > 0);
|
|
2108
|
+
if (late.length === 0) continue;
|
|
2109
|
+
native.set(target.name, {
|
|
2110
|
+
path: target.path,
|
|
2111
|
+
includeDirectory: import_node_path2.default.join(layout.root, includes),
|
|
2112
|
+
lateSources: late.map(([file]) => file.slice(prefix.length)),
|
|
2113
|
+
late: {
|
|
2114
|
+
name: `${target.name}SwiftImplementation`,
|
|
2115
|
+
producers: [
|
|
2116
|
+
...new Set(late.flatMap(([file]) => [...consumers.get(file)]))
|
|
2117
|
+
].sort()
|
|
2118
|
+
}
|
|
2119
|
+
});
|
|
2120
|
+
if (input.files[`${includes}module.modulemap`] !== void 0) continue;
|
|
2121
|
+
const roots = entries.filter(
|
|
2122
|
+
([file]) => file.startsWith(includes) && /\.(?:h|hpp|hh|hxx)$/.test(file) && consumers.get(file).size === 0
|
|
2123
|
+
);
|
|
2124
|
+
files.set(
|
|
2125
|
+
import_node_path2.default.join(layout.root, includes, "module.modulemap"),
|
|
2126
|
+
[
|
|
2127
|
+
`module ${target.name} {`,
|
|
2128
|
+
...roots.map(
|
|
2129
|
+
([file]) => ` header ${JSON.stringify(file.slice(includes.length))}`
|
|
2130
|
+
),
|
|
2131
|
+
" export *",
|
|
2132
|
+
"}",
|
|
2133
|
+
""
|
|
2134
|
+
].join("\n")
|
|
2135
|
+
);
|
|
2136
|
+
}
|
|
2137
|
+
if (native.size > 0) (0, import_node_fs2.mkdirSync)(headerDirectory, { recursive: true });
|
|
1915
2138
|
const modulePlan = (0, import_node_crypto2.createHash)("sha256").update(
|
|
1916
2139
|
swiftModuleInputFiles(moduleRoot).join("\n")
|
|
1917
2140
|
);
|
|
@@ -1920,7 +2143,11 @@ function writeSwiftProject(layout, input, moduleRoot) {
|
|
|
1920
2143
|
}
|
|
1921
2144
|
const resourcePlan = (0, import_node_crypto2.createHash)("sha256").update(
|
|
1922
2145
|
JSON.stringify(
|
|
1923
|
-
resourceTargets.filter((target) => target.resources).map((target) => [
|
|
2146
|
+
resourceTargets.filter((target) => target.resources).map((target) => [
|
|
2147
|
+
target.name,
|
|
2148
|
+
target.path,
|
|
2149
|
+
input.resourceBundles?.find((bundle) => bundle.target === target.name)?.path
|
|
2150
|
+
])
|
|
1924
2151
|
)
|
|
1925
2152
|
).digest("hex").slice(0, 16);
|
|
1926
2153
|
const moduleFiles = `
|
|
@@ -1980,6 +2207,12 @@ function writeSwiftProject(layout, input, moduleRoot) {
|
|
|
1980
2207
|
files.set(import_node_path2.default.join(layout.root, "Package.swift"), manifest + moduleFiles);
|
|
1981
2208
|
} else {
|
|
1982
2209
|
const base = layout.multi ? layout.root : layout.sources;
|
|
2210
|
+
const libraries = /* @__PURE__ */ new Map();
|
|
2211
|
+
for (const [target, data] of Object.entries(input.libraries ?? {})) {
|
|
2212
|
+
const file = import_node_path2.default.join(layout.root, ".peach-libraries", `lib${target}.a`);
|
|
2213
|
+
files.set(file, Buffer.from(data, "base64"));
|
|
2214
|
+
libraries.set(target, file);
|
|
2215
|
+
}
|
|
1983
2216
|
for (const [file, contents] of Object.entries(input.files)) {
|
|
1984
2217
|
if (file === "Package.swift") continue;
|
|
1985
2218
|
files.set(
|
|
@@ -1991,6 +2224,11 @@ function writeSwiftProject(layout, input, moduleRoot) {
|
|
|
1991
2224
|
import_node_path2.default.join(layout.root, "Package.swift"),
|
|
1992
2225
|
emitSwiftPackageManifest({
|
|
1993
2226
|
targets,
|
|
2227
|
+
native,
|
|
2228
|
+
headerDirectory: native.size > 0 ? headerDirectory : void 0,
|
|
2229
|
+
cxxLanguageStandard: swiftManifestCxxLanguageStandard(
|
|
2230
|
+
input.files["Package.swift"] ?? ""
|
|
2231
|
+
),
|
|
1994
2232
|
siblings: swiftTargetDependencies(
|
|
1995
2233
|
input.files,
|
|
1996
2234
|
layout.multi ? targets : targets.map((target) => ({ ...target, path: "." }))
|
|
@@ -1998,12 +2236,20 @@ function writeSwiftProject(layout, input, moduleRoot) {
|
|
|
1998
2236
|
moduleRoot,
|
|
1999
2237
|
oneModule: input.oneModule,
|
|
2000
2238
|
spriteKit: importsSpriteKit(input.files),
|
|
2001
|
-
distribution: distribution ?? void 0
|
|
2239
|
+
distribution: distribution ?? void 0,
|
|
2240
|
+
libraries
|
|
2002
2241
|
}) + moduleFiles
|
|
2003
2242
|
);
|
|
2004
2243
|
}
|
|
2005
2244
|
for (const target of resourceTargets) {
|
|
2006
2245
|
if (!target.resources) continue;
|
|
2246
|
+
const bundle = input.resourceBundles?.find(
|
|
2247
|
+
(candidate) => candidate.target === target.name
|
|
2248
|
+
);
|
|
2249
|
+
if (!bundle || bundle.sourcePath !== target.path)
|
|
2250
|
+
throw new Error(
|
|
2251
|
+
`swift resource target ${target.name} has no matching bundle assignment`
|
|
2252
|
+
);
|
|
2007
2253
|
const directory = layout.multi ? import_node_path2.default.join(layout.root, target.path) : layout.sources;
|
|
2008
2254
|
files.set(
|
|
2009
2255
|
import_node_path2.default.join(directory, "ResourceBundleAccessor.generated.swift"),
|
|
@@ -2011,7 +2257,11 @@ function writeSwiftProject(layout, input, moduleRoot) {
|
|
|
2011
2257
|
"import Foundation",
|
|
2012
2258
|
"",
|
|
2013
2259
|
"extension Foundation.Bundle {",
|
|
2014
|
-
" static let module: Bundle = Bundle.main"
|
|
2260
|
+
bundle.path === "." ? " static let module: Bundle = Bundle.main" : ` static let module: Bundle = {
|
|
2261
|
+
let url = Bundle.main.bundleURL.appendingPathComponent(${JSON.stringify(bundle.path)})
|
|
2262
|
+
guard let bundle = Bundle(url: url) else { fatalError("resource bundle is missing: ${bundle.target}") }
|
|
2263
|
+
return bundle
|
|
2264
|
+
}()`,
|
|
2015
2265
|
"}",
|
|
2016
2266
|
""
|
|
2017
2267
|
].join("\n")
|
|
@@ -2079,7 +2329,7 @@ function compileSwiftProjectUnit(input, options) {
|
|
|
2079
2329
|
};
|
|
2080
2330
|
const hash = swiftArtifactHash(input, options.release, moduleRoot);
|
|
2081
2331
|
return serialize(root, async () => {
|
|
2082
|
-
if (process.platform === "darwin" && process.env.TM_SESSION && process.env.CI !== "true" &&
|
|
2332
|
+
if (process.platform === "darwin" && process.env.TM_SESSION && process.env.CI !== "true" && moduleRoot === import_node_path2.default.resolve(__sootsim_import_meta_dirname, "../../sootsim-swift") && !swiftDistributionAt(moduleRoot)) {
|
|
2083
2333
|
const requestRoot = (0, import_node_fs2.mkdtempSync)(import_node_path2.default.join(root, ".builder-request-"));
|
|
2084
2334
|
const output = import_node_path2.default.join(requestRoot, "output");
|
|
2085
2335
|
const request = import_node_path2.default.join(requestRoot, "request.json");
|
|
@@ -2104,7 +2354,11 @@ function compileSwiftProjectUnit(input, options) {
|
|
|
2104
2354
|
"--output",
|
|
2105
2355
|
output
|
|
2106
2356
|
],
|
|
2107
|
-
{
|
|
2357
|
+
{
|
|
2358
|
+
cwd: repo,
|
|
2359
|
+
timeout: options.timeoutMs,
|
|
2360
|
+
maxBuffer: 64 * 1024 * 1024
|
|
2361
|
+
}
|
|
2108
2362
|
);
|
|
2109
2363
|
pending.child.stdout?.on("data", (bytes2) => process.stdout.write(bytes2));
|
|
2110
2364
|
pending.child.stderr?.on("data", (bytes2) => process.stderr.write(bytes2));
|
|
@@ -2136,7 +2390,11 @@ function compileSwiftProjectUnit(input, options) {
|
|
|
2136
2390
|
`swift-compile: no swift.org toolchain at ${options.toolchainBin}; install ${options.release} and its matching wasm sdk`
|
|
2137
2391
|
);
|
|
2138
2392
|
}
|
|
2139
|
-
const macroPlugins = await ensureMacroPlugins(
|
|
2393
|
+
const macroPlugins = await ensureMacroPlugins(
|
|
2394
|
+
moduleRoot,
|
|
2395
|
+
options.toolchainBin,
|
|
2396
|
+
options.release
|
|
2397
|
+
);
|
|
2140
2398
|
const sdk = swiftModuleSdk(moduleRoot).wasmSdkId;
|
|
2141
2399
|
const icu = swiftIcuAsset(options.toolchainBin, sdk);
|
|
2142
2400
|
try {
|
|
@@ -2144,6 +2402,8 @@ function compileSwiftProjectUnit(input, options) {
|
|
|
2144
2402
|
swift,
|
|
2145
2403
|
[
|
|
2146
2404
|
"build",
|
|
2405
|
+
"--build-system",
|
|
2406
|
+
"native",
|
|
2147
2407
|
"-j",
|
|
2148
2408
|
BUILD_JOBS,
|
|
2149
2409
|
"--package-path",
|