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 __defProp = Object.defineProperty;
|
|
@@ -24,9 +24,14 @@ var swift_package_exports = {};
|
|
|
24
24
|
__export(swift_package_exports, {
|
|
25
25
|
isSwiftManifestFile: () => isSwiftManifestFile,
|
|
26
26
|
swiftImplicitResourcePaths: () => swiftImplicitResourcePaths,
|
|
27
|
+
swiftManifestCxxLanguageStandard: () => swiftManifestCxxLanguageStandard,
|
|
27
28
|
swiftManifestTargets: () => swiftManifestTargets,
|
|
29
|
+
swiftMetalSourceFiles: () => swiftMetalSourceFiles,
|
|
28
30
|
swiftPackageIdentity: () => swiftPackageIdentity,
|
|
29
|
-
swiftPackagePartition: () => swiftPackagePartition
|
|
31
|
+
swiftPackagePartition: () => swiftPackagePartition,
|
|
32
|
+
swiftResourceBundleForFile: () => swiftResourceBundleForFile,
|
|
33
|
+
swiftResourceBundleInfoPlist: () => swiftResourceBundleInfoPlist,
|
|
34
|
+
swiftResourceBundles: () => swiftResourceBundles
|
|
30
35
|
});
|
|
31
36
|
module.exports = __toCommonJS(swift_package_exports);
|
|
32
37
|
function isSwiftManifestFile(file) {
|
|
@@ -55,7 +60,10 @@ var MANIFEST_DECLARATIONS = [
|
|
|
55
60
|
function manifestCalls(manifest, kinds) {
|
|
56
61
|
const code = manifest.replace(/\/\*[\s\S]*?\*\//g, "").replace(/(^|[^:"])\/\/[^\n]*/g, "$1");
|
|
57
62
|
const calls = [];
|
|
58
|
-
const pattern = new RegExp(
|
|
63
|
+
const pattern = new RegExp(
|
|
64
|
+
`(?:\\.(${MANIFEST_DECLARATIONS.join("|")})|\\b(Package))\\s*\\(`,
|
|
65
|
+
"g"
|
|
66
|
+
);
|
|
59
67
|
let match;
|
|
60
68
|
while ((match = pattern.exec(code)) !== null) {
|
|
61
69
|
let depth = 1;
|
|
@@ -85,22 +93,59 @@ function manifestCalls(manifest, kinds) {
|
|
|
85
93
|
}
|
|
86
94
|
i++;
|
|
87
95
|
}
|
|
88
|
-
|
|
89
|
-
|
|
96
|
+
const kind = match[1] ?? match[2];
|
|
97
|
+
if (kinds.includes(kind)) calls.push({ kind, flat, call: code.slice(start, i) });
|
|
98
|
+
else if (kind === "Package") {
|
|
99
|
+
calls.push(...manifestCalls(code.slice(start, i - 1), kinds));
|
|
100
|
+
}
|
|
90
101
|
pattern.lastIndex = i;
|
|
91
102
|
}
|
|
92
103
|
return calls;
|
|
93
104
|
}
|
|
105
|
+
function splitManifestArguments(source) {
|
|
106
|
+
const arguments_ = [];
|
|
107
|
+
let start = 0;
|
|
108
|
+
let parentheses = 0;
|
|
109
|
+
let brackets = 0;
|
|
110
|
+
let braces = 0;
|
|
111
|
+
let inString = false;
|
|
112
|
+
let escaped = false;
|
|
113
|
+
for (let index = 0; index < source.length; index++) {
|
|
114
|
+
const character = source[index];
|
|
115
|
+
if (inString) {
|
|
116
|
+
if (escaped) escaped = false;
|
|
117
|
+
else if (character === "\\") escaped = true;
|
|
118
|
+
else if (character === '"') inString = false;
|
|
119
|
+
} else if (character === '"') inString = true;
|
|
120
|
+
else if (character === "(") parentheses++;
|
|
121
|
+
else if (character === ")") parentheses--;
|
|
122
|
+
else if (character === "[") brackets++;
|
|
123
|
+
else if (character === "]") brackets--;
|
|
124
|
+
else if (character === "{") braces++;
|
|
125
|
+
else if (character === "}") braces--;
|
|
126
|
+
else if (character === "," && parentheses === 0 && brackets === 0 && braces === 0) {
|
|
127
|
+
arguments_.push(source.slice(start, index).trim());
|
|
128
|
+
start = index + 1;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
const final = source.slice(start).trim();
|
|
132
|
+
if (final) arguments_.push(final);
|
|
133
|
+
return arguments_;
|
|
134
|
+
}
|
|
94
135
|
function swiftPackageIdentity(url) {
|
|
95
136
|
return (url.split("/").pop() ?? url).replace(/\.git$/, "").toLowerCase();
|
|
96
137
|
}
|
|
97
138
|
function swiftManifestTargets(manifest, resourcePaths = []) {
|
|
98
139
|
const implicitResources = swiftImplicitResourcePaths(resourcePaths);
|
|
99
140
|
const targets = [];
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
141
|
+
const declarations = manifestCalls(manifest, ["executableTarget", "target"]);
|
|
142
|
+
const targetNames = new Set(
|
|
143
|
+
declarations.flatMap(({ flat }) => {
|
|
144
|
+
const name = /\bname\s*:\s*"([^"]+)"/.exec(flat)?.[1];
|
|
145
|
+
return name ? [name] : [];
|
|
146
|
+
})
|
|
147
|
+
);
|
|
148
|
+
for (const { kind, flat, call } of declarations) {
|
|
104
149
|
const executable = kind === "executableTarget";
|
|
105
150
|
const name = /\bname\s*:\s*"([^"]+)"/.exec(flat)?.[1];
|
|
106
151
|
if (!name) continue;
|
|
@@ -110,6 +155,12 @@ function swiftManifestTargets(manifest, resourcePaths = []) {
|
|
|
110
155
|
/\.swiftLanguageMode\(\s*\.v(\d+)\s*\)/.exec(call)?.[1] ?? "5"
|
|
111
156
|
);
|
|
112
157
|
const mainActorIsolation = /\.defaultIsolation\(\s*MainActor\.self\s*\)/.test(call);
|
|
158
|
+
const cxxInterop = /\.interoperabilityMode\(\s*\.Cxx\s*\)/.test(
|
|
159
|
+
call.replace(/"(?:\\.|[^"\\])*"/g, "")
|
|
160
|
+
);
|
|
161
|
+
const defines = [
|
|
162
|
+
...call.matchAll(/\.define\(\s*"([A-Za-z_][A-Za-z0-9_]*)"\s*\)/g)
|
|
163
|
+
].map((match) => match[1]);
|
|
113
164
|
const excluded = [
|
|
114
165
|
...(/\bexclude\s*:\s*\[([^\]]*)\]/.exec(flat)?.[1] ?? "").matchAll(/"([^"]+)"/g)
|
|
115
166
|
].map((match) => match[1].replace(/^\.\//, "").replace(/\/+$/, ""));
|
|
@@ -123,26 +174,106 @@ function swiftManifestTargets(manifest, resourcePaths = []) {
|
|
|
123
174
|
return false;
|
|
124
175
|
return true;
|
|
125
176
|
});
|
|
177
|
+
const targetArguments = splitManifestArguments(call.slice(0, -1));
|
|
178
|
+
const dependencyArgument = targetArguments.find(
|
|
179
|
+
(argument) => /^dependencies\s*:/.test(argument)
|
|
180
|
+
);
|
|
181
|
+
const dependencyList = dependencyArgument?.replace(/^dependencies\s*:\s*/, "").trim();
|
|
182
|
+
const dependencyNames = /* @__PURE__ */ new Set();
|
|
183
|
+
if (dependencyList?.startsWith("[") && dependencyList.endsWith("]")) {
|
|
184
|
+
for (const dependency of splitManifestArguments(dependencyList.slice(1, -1))) {
|
|
185
|
+
const dependencyName = /^"([^"]+)"$/.exec(dependency)?.[1] ?? /^\.(?:target|byName)\s*\(\s*name\s*:\s*"([^"]+)"/.exec(dependency)?.[1];
|
|
186
|
+
if (dependencyName && targetNames.has(dependencyName))
|
|
187
|
+
dependencyNames.add(dependencyName);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
const dependencies = [...dependencyNames].map((name2) => ({
|
|
191
|
+
kind: "target",
|
|
192
|
+
name: name2
|
|
193
|
+
}));
|
|
126
194
|
targets.push({
|
|
127
195
|
name,
|
|
128
196
|
path: targetPath,
|
|
129
197
|
executable,
|
|
130
198
|
languageMode,
|
|
131
199
|
mainActorIsolation,
|
|
132
|
-
|
|
200
|
+
...cxxInterop ? { cxxInterop: true } : {},
|
|
201
|
+
...defines.length === 0 ? {} : { defines },
|
|
202
|
+
resources,
|
|
203
|
+
...dependencies.length === 0 ? {} : { dependencies },
|
|
204
|
+
...excluded.length === 0 ? {} : { exclude: excluded }
|
|
133
205
|
});
|
|
134
206
|
}
|
|
135
207
|
return targets;
|
|
136
208
|
}
|
|
209
|
+
function swiftManifestCxxLanguageStandard(manifest) {
|
|
210
|
+
const declaration = manifestCalls(manifest, ["Package"])[0];
|
|
211
|
+
if (!declaration) return void 0;
|
|
212
|
+
const code = declaration.flat.replace(/"(?:\\.|[^"\\])*"/g, "");
|
|
213
|
+
return /\bcxxLanguageStandard\s*:\s*\.(\w+)/.exec(code)?.[1];
|
|
214
|
+
}
|
|
215
|
+
function swiftResourceBundles(files, resourcePaths = []) {
|
|
216
|
+
const manifest = files["Package.swift"] ?? "";
|
|
217
|
+
const targets = swiftManifestTargets(manifest, resourcePaths).filter(
|
|
218
|
+
(target) => target.resources
|
|
219
|
+
);
|
|
220
|
+
if (targets.length === 0) return [];
|
|
221
|
+
const declaration = manifestCalls(manifest, ["Package"])[0];
|
|
222
|
+
const packageName = declaration && /\bname\s*:\s*"([^"/\\]+)"/.exec(declaration.flat)?.[1];
|
|
223
|
+
if (!packageName)
|
|
224
|
+
throw new Error("swift resource bundles require the original package name");
|
|
225
|
+
return targets.map((target) => ({
|
|
226
|
+
target: target.name,
|
|
227
|
+
sourcePath: target.path,
|
|
228
|
+
path: `${packageName}_${target.name}.bundle`
|
|
229
|
+
}));
|
|
230
|
+
}
|
|
231
|
+
function swiftResourceBundleForFile(bundles, file) {
|
|
232
|
+
let owner;
|
|
233
|
+
for (const bundle of bundles) {
|
|
234
|
+
const prefix = bundle.sourcePath === "." ? "" : `${bundle.sourcePath}/`;
|
|
235
|
+
if (file.startsWith(prefix) && (!owner || bundle.sourcePath.length > owner.sourcePath.length))
|
|
236
|
+
owner = bundle;
|
|
237
|
+
}
|
|
238
|
+
return owner;
|
|
239
|
+
}
|
|
240
|
+
function swiftResourceBundleInfoPlist(bundle) {
|
|
241
|
+
const name = bundle.path.split("/").pop().replace(/\.(bundle|framework)$/, "");
|
|
242
|
+
const escaped = name.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">");
|
|
243
|
+
return `<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><dict><key>CFBundleName</key><string>${escaped}</string><key>CFBundlePackageType</key><string>${bundle.path.endsWith(".framework") ? "FMWK" : "BNDL"}</string></dict></plist>`;
|
|
244
|
+
}
|
|
245
|
+
function swiftMetalSourceFiles(files) {
|
|
246
|
+
const sources = Object.entries(files).filter(([file]) => file.endsWith(".metal"));
|
|
247
|
+
if (sources.length === 0) return {};
|
|
248
|
+
const targets = swiftManifestTargets(files["Package.swift"] ?? "");
|
|
249
|
+
return Object.fromEntries(
|
|
250
|
+
sources.filter(([file]) => {
|
|
251
|
+
if (targets.length === 0) return true;
|
|
252
|
+
return targets.some((target) => {
|
|
253
|
+
const prefix = target.path === "." ? "" : `${target.path}/`;
|
|
254
|
+
if (!file.startsWith(prefix)) return false;
|
|
255
|
+
const relative = file.slice(prefix.length);
|
|
256
|
+
return !(target.exclude ?? []).some(
|
|
257
|
+
(excluded) => relative === excluded || relative.startsWith(`${excluded}/`)
|
|
258
|
+
);
|
|
259
|
+
});
|
|
260
|
+
})
|
|
261
|
+
);
|
|
262
|
+
}
|
|
137
263
|
function swiftPackagePartition(manifest, resourcePaths = []) {
|
|
138
264
|
const targets = swiftManifestTargets(manifest, resourcePaths);
|
|
139
|
-
return targets.length === 1 && targets[0].executable && targets[0].path === "." ? [] : targets;
|
|
265
|
+
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;
|
|
140
266
|
}
|
|
141
267
|
// Annotate the CommonJS export names for ESM import in node:
|
|
142
268
|
0 && (module.exports = {
|
|
143
269
|
isSwiftManifestFile,
|
|
144
270
|
swiftImplicitResourcePaths,
|
|
271
|
+
swiftManifestCxxLanguageStandard,
|
|
145
272
|
swiftManifestTargets,
|
|
273
|
+
swiftMetalSourceFiles,
|
|
146
274
|
swiftPackageIdentity,
|
|
147
|
-
swiftPackagePartition
|
|
275
|
+
swiftPackagePartition,
|
|
276
|
+
swiftResourceBundleForFile,
|
|
277
|
+
swiftResourceBundleInfoPlist,
|
|
278
|
+
swiftResourceBundles
|
|
148
279
|
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*!
|
|
1
|
+
/*! peach v0.1.1399 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
|
|
2
2
|
|
|
3
3
|
// src/swift-package.ts
|
|
4
4
|
function isSwiftManifestFile(file) {
|
|
@@ -27,7 +27,10 @@ var MANIFEST_DECLARATIONS = [
|
|
|
27
27
|
function manifestCalls(manifest, kinds) {
|
|
28
28
|
const code = manifest.replace(/\/\*[\s\S]*?\*\//g, "").replace(/(^|[^:"])\/\/[^\n]*/g, "$1");
|
|
29
29
|
const calls = [];
|
|
30
|
-
const pattern = new RegExp(
|
|
30
|
+
const pattern = new RegExp(
|
|
31
|
+
`(?:\\.(${MANIFEST_DECLARATIONS.join("|")})|\\b(Package))\\s*\\(`,
|
|
32
|
+
"g"
|
|
33
|
+
);
|
|
31
34
|
let match;
|
|
32
35
|
while ((match = pattern.exec(code)) !== null) {
|
|
33
36
|
let depth = 1;
|
|
@@ -57,22 +60,59 @@ function manifestCalls(manifest, kinds) {
|
|
|
57
60
|
}
|
|
58
61
|
i++;
|
|
59
62
|
}
|
|
60
|
-
|
|
61
|
-
|
|
63
|
+
const kind = match[1] ?? match[2];
|
|
64
|
+
if (kinds.includes(kind)) calls.push({ kind, flat, call: code.slice(start, i) });
|
|
65
|
+
else if (kind === "Package") {
|
|
66
|
+
calls.push(...manifestCalls(code.slice(start, i - 1), kinds));
|
|
67
|
+
}
|
|
62
68
|
pattern.lastIndex = i;
|
|
63
69
|
}
|
|
64
70
|
return calls;
|
|
65
71
|
}
|
|
72
|
+
function splitManifestArguments(source) {
|
|
73
|
+
const arguments_ = [];
|
|
74
|
+
let start = 0;
|
|
75
|
+
let parentheses = 0;
|
|
76
|
+
let brackets = 0;
|
|
77
|
+
let braces = 0;
|
|
78
|
+
let inString = false;
|
|
79
|
+
let escaped = false;
|
|
80
|
+
for (let index = 0; index < source.length; index++) {
|
|
81
|
+
const character = source[index];
|
|
82
|
+
if (inString) {
|
|
83
|
+
if (escaped) escaped = false;
|
|
84
|
+
else if (character === "\\") escaped = true;
|
|
85
|
+
else if (character === '"') inString = false;
|
|
86
|
+
} else if (character === '"') inString = true;
|
|
87
|
+
else if (character === "(") parentheses++;
|
|
88
|
+
else if (character === ")") parentheses--;
|
|
89
|
+
else if (character === "[") brackets++;
|
|
90
|
+
else if (character === "]") brackets--;
|
|
91
|
+
else if (character === "{") braces++;
|
|
92
|
+
else if (character === "}") braces--;
|
|
93
|
+
else if (character === "," && parentheses === 0 && brackets === 0 && braces === 0) {
|
|
94
|
+
arguments_.push(source.slice(start, index).trim());
|
|
95
|
+
start = index + 1;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
const final = source.slice(start).trim();
|
|
99
|
+
if (final) arguments_.push(final);
|
|
100
|
+
return arguments_;
|
|
101
|
+
}
|
|
66
102
|
function swiftPackageIdentity(url) {
|
|
67
103
|
return (url.split("/").pop() ?? url).replace(/\.git$/, "").toLowerCase();
|
|
68
104
|
}
|
|
69
105
|
function swiftManifestTargets(manifest, resourcePaths = []) {
|
|
70
106
|
const implicitResources = swiftImplicitResourcePaths(resourcePaths);
|
|
71
107
|
const targets = [];
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
108
|
+
const declarations = manifestCalls(manifest, ["executableTarget", "target"]);
|
|
109
|
+
const targetNames = new Set(
|
|
110
|
+
declarations.flatMap(({ flat }) => {
|
|
111
|
+
const name = /\bname\s*:\s*"([^"]+)"/.exec(flat)?.[1];
|
|
112
|
+
return name ? [name] : [];
|
|
113
|
+
})
|
|
114
|
+
);
|
|
115
|
+
for (const { kind, flat, call } of declarations) {
|
|
76
116
|
const executable = kind === "executableTarget";
|
|
77
117
|
const name = /\bname\s*:\s*"([^"]+)"/.exec(flat)?.[1];
|
|
78
118
|
if (!name) continue;
|
|
@@ -82,6 +122,12 @@ function swiftManifestTargets(manifest, resourcePaths = []) {
|
|
|
82
122
|
/\.swiftLanguageMode\(\s*\.v(\d+)\s*\)/.exec(call)?.[1] ?? "5"
|
|
83
123
|
);
|
|
84
124
|
const mainActorIsolation = /\.defaultIsolation\(\s*MainActor\.self\s*\)/.test(call);
|
|
125
|
+
const cxxInterop = /\.interoperabilityMode\(\s*\.Cxx\s*\)/.test(
|
|
126
|
+
call.replace(/"(?:\\.|[^"\\])*"/g, "")
|
|
127
|
+
);
|
|
128
|
+
const defines = [
|
|
129
|
+
...call.matchAll(/\.define\(\s*"([A-Za-z_][A-Za-z0-9_]*)"\s*\)/g)
|
|
130
|
+
].map((match) => match[1]);
|
|
85
131
|
const excluded = [
|
|
86
132
|
...(/\bexclude\s*:\s*\[([^\]]*)\]/.exec(flat)?.[1] ?? "").matchAll(/"([^"]+)"/g)
|
|
87
133
|
].map((match) => match[1].replace(/^\.\//, "").replace(/\/+$/, ""));
|
|
@@ -95,25 +141,105 @@ function swiftManifestTargets(manifest, resourcePaths = []) {
|
|
|
95
141
|
return false;
|
|
96
142
|
return true;
|
|
97
143
|
});
|
|
144
|
+
const targetArguments = splitManifestArguments(call.slice(0, -1));
|
|
145
|
+
const dependencyArgument = targetArguments.find(
|
|
146
|
+
(argument) => /^dependencies\s*:/.test(argument)
|
|
147
|
+
);
|
|
148
|
+
const dependencyList = dependencyArgument?.replace(/^dependencies\s*:\s*/, "").trim();
|
|
149
|
+
const dependencyNames = /* @__PURE__ */ new Set();
|
|
150
|
+
if (dependencyList?.startsWith("[") && dependencyList.endsWith("]")) {
|
|
151
|
+
for (const dependency of splitManifestArguments(dependencyList.slice(1, -1))) {
|
|
152
|
+
const dependencyName = /^"([^"]+)"$/.exec(dependency)?.[1] ?? /^\.(?:target|byName)\s*\(\s*name\s*:\s*"([^"]+)"/.exec(dependency)?.[1];
|
|
153
|
+
if (dependencyName && targetNames.has(dependencyName))
|
|
154
|
+
dependencyNames.add(dependencyName);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
const dependencies = [...dependencyNames].map((name2) => ({
|
|
158
|
+
kind: "target",
|
|
159
|
+
name: name2
|
|
160
|
+
}));
|
|
98
161
|
targets.push({
|
|
99
162
|
name,
|
|
100
163
|
path: targetPath,
|
|
101
164
|
executable,
|
|
102
165
|
languageMode,
|
|
103
166
|
mainActorIsolation,
|
|
104
|
-
|
|
167
|
+
...cxxInterop ? { cxxInterop: true } : {},
|
|
168
|
+
...defines.length === 0 ? {} : { defines },
|
|
169
|
+
resources,
|
|
170
|
+
...dependencies.length === 0 ? {} : { dependencies },
|
|
171
|
+
...excluded.length === 0 ? {} : { exclude: excluded }
|
|
105
172
|
});
|
|
106
173
|
}
|
|
107
174
|
return targets;
|
|
108
175
|
}
|
|
176
|
+
function swiftManifestCxxLanguageStandard(manifest) {
|
|
177
|
+
const declaration = manifestCalls(manifest, ["Package"])[0];
|
|
178
|
+
if (!declaration) return void 0;
|
|
179
|
+
const code = declaration.flat.replace(/"(?:\\.|[^"\\])*"/g, "");
|
|
180
|
+
return /\bcxxLanguageStandard\s*:\s*\.(\w+)/.exec(code)?.[1];
|
|
181
|
+
}
|
|
182
|
+
function swiftResourceBundles(files, resourcePaths = []) {
|
|
183
|
+
const manifest = files["Package.swift"] ?? "";
|
|
184
|
+
const targets = swiftManifestTargets(manifest, resourcePaths).filter(
|
|
185
|
+
(target) => target.resources
|
|
186
|
+
);
|
|
187
|
+
if (targets.length === 0) return [];
|
|
188
|
+
const declaration = manifestCalls(manifest, ["Package"])[0];
|
|
189
|
+
const packageName = declaration && /\bname\s*:\s*"([^"/\\]+)"/.exec(declaration.flat)?.[1];
|
|
190
|
+
if (!packageName)
|
|
191
|
+
throw new Error("swift resource bundles require the original package name");
|
|
192
|
+
return targets.map((target) => ({
|
|
193
|
+
target: target.name,
|
|
194
|
+
sourcePath: target.path,
|
|
195
|
+
path: `${packageName}_${target.name}.bundle`
|
|
196
|
+
}));
|
|
197
|
+
}
|
|
198
|
+
function swiftResourceBundleForFile(bundles, file) {
|
|
199
|
+
let owner;
|
|
200
|
+
for (const bundle of bundles) {
|
|
201
|
+
const prefix = bundle.sourcePath === "." ? "" : `${bundle.sourcePath}/`;
|
|
202
|
+
if (file.startsWith(prefix) && (!owner || bundle.sourcePath.length > owner.sourcePath.length))
|
|
203
|
+
owner = bundle;
|
|
204
|
+
}
|
|
205
|
+
return owner;
|
|
206
|
+
}
|
|
207
|
+
function swiftResourceBundleInfoPlist(bundle) {
|
|
208
|
+
const name = bundle.path.split("/").pop().replace(/\.(bundle|framework)$/, "");
|
|
209
|
+
const escaped = name.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">");
|
|
210
|
+
return `<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><dict><key>CFBundleName</key><string>${escaped}</string><key>CFBundlePackageType</key><string>${bundle.path.endsWith(".framework") ? "FMWK" : "BNDL"}</string></dict></plist>`;
|
|
211
|
+
}
|
|
212
|
+
function swiftMetalSourceFiles(files) {
|
|
213
|
+
const sources = Object.entries(files).filter(([file]) => file.endsWith(".metal"));
|
|
214
|
+
if (sources.length === 0) return {};
|
|
215
|
+
const targets = swiftManifestTargets(files["Package.swift"] ?? "");
|
|
216
|
+
return Object.fromEntries(
|
|
217
|
+
sources.filter(([file]) => {
|
|
218
|
+
if (targets.length === 0) return true;
|
|
219
|
+
return targets.some((target) => {
|
|
220
|
+
const prefix = target.path === "." ? "" : `${target.path}/`;
|
|
221
|
+
if (!file.startsWith(prefix)) return false;
|
|
222
|
+
const relative = file.slice(prefix.length);
|
|
223
|
+
return !(target.exclude ?? []).some(
|
|
224
|
+
(excluded) => relative === excluded || relative.startsWith(`${excluded}/`)
|
|
225
|
+
);
|
|
226
|
+
});
|
|
227
|
+
})
|
|
228
|
+
);
|
|
229
|
+
}
|
|
109
230
|
function swiftPackagePartition(manifest, resourcePaths = []) {
|
|
110
231
|
const targets = swiftManifestTargets(manifest, resourcePaths);
|
|
111
|
-
return targets.length === 1 && targets[0].executable && targets[0].path === "." ? [] : targets;
|
|
232
|
+
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;
|
|
112
233
|
}
|
|
113
234
|
export {
|
|
114
235
|
isSwiftManifestFile,
|
|
115
236
|
swiftImplicitResourcePaths,
|
|
237
|
+
swiftManifestCxxLanguageStandard,
|
|
116
238
|
swiftManifestTargets,
|
|
239
|
+
swiftMetalSourceFiles,
|
|
117
240
|
swiftPackageIdentity,
|
|
118
|
-
swiftPackagePartition
|
|
241
|
+
swiftPackagePartition,
|
|
242
|
+
swiftResourceBundleForFile,
|
|
243
|
+
swiftResourceBundleInfoPlist,
|
|
244
|
+
swiftResourceBundles
|
|
119
245
|
};
|
|
@@ -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 __defProp = Object.defineProperty;
|
|
@@ -26,6 +26,9 @@ __export(swift_submit_exports, {
|
|
|
26
26
|
MAX_SWIFT_COMPILE_IMAGES: () => MAX_SWIFT_COMPILE_IMAGES,
|
|
27
27
|
MAX_SWIFT_COMPILE_IMAGE_BYTES: () => MAX_SWIFT_COMPILE_IMAGE_BYTES,
|
|
28
28
|
MAX_SWIFT_COMPILE_IMAGE_TOTAL_BYTES: () => MAX_SWIFT_COMPILE_IMAGE_TOTAL_BYTES,
|
|
29
|
+
MAX_SWIFT_COMPILE_METAL_BYTES: () => MAX_SWIFT_COMPILE_METAL_BYTES,
|
|
30
|
+
MAX_SWIFT_COMPILE_METAL_FILES: () => MAX_SWIFT_COMPILE_METAL_FILES,
|
|
31
|
+
MAX_SWIFT_COMPILE_METAL_TOTAL_BYTES: () => MAX_SWIFT_COMPILE_METAL_TOTAL_BYTES,
|
|
29
32
|
MAX_SWIFT_COMPILE_RESOURCES: () => MAX_SWIFT_COMPILE_RESOURCES,
|
|
30
33
|
MAX_SWIFT_COMPILE_RESOURCE_BYTES: () => MAX_SWIFT_COMPILE_RESOURCE_BYTES,
|
|
31
34
|
MAX_SWIFT_COMPILE_RESOURCE_TOTAL_BYTES: () => MAX_SWIFT_COMPILE_RESOURCE_TOTAL_BYTES,
|
|
@@ -40,6 +43,26 @@ __export(swift_submit_exports, {
|
|
|
40
43
|
swiftNativeEntry: () => swiftNativeEntry
|
|
41
44
|
});
|
|
42
45
|
module.exports = __toCommonJS(swift_submit_exports);
|
|
46
|
+
|
|
47
|
+
// src/swiftContract.ts
|
|
48
|
+
function isSwiftResourcePath(value) {
|
|
49
|
+
return typeof value === "string" && value.length <= 4096 && !value.startsWith("/") && !value.includes("\\") && !value.includes("\0") && value.split("/").every((part) => part !== "" && part !== "." && part !== "..");
|
|
50
|
+
}
|
|
51
|
+
function isSwiftBundlePath(value) {
|
|
52
|
+
return typeof value === "string" && (value === "." || isSwiftResourcePath(value) && /\.(bundle|framework)$/.test(value));
|
|
53
|
+
}
|
|
54
|
+
function isSwiftMetalSources(value) {
|
|
55
|
+
return typeof value === "object" && value !== null && !Array.isArray(value) && Object.entries(value).every(
|
|
56
|
+
([file, source]) => file.endsWith(".metal") && isSwiftResourcePath(file) && typeof source === "object" && source !== null && !Array.isArray(source) && "url" in source && typeof source.url === "string" && "sha256" in source && typeof source.sha256 === "string" && /^[a-f0-9]{64}$/.test(source.sha256)
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
function isSwiftMetalLibrarySources(value) {
|
|
60
|
+
return isSwiftMetalSources(value) && Object.values(value).every(
|
|
61
|
+
(source) => "bundlePath" in source && isSwiftBundlePath(source.bundlePath)
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// src/swift-submit.ts
|
|
43
66
|
var SWIFT_COMPILE_PATH = "/api/swift-compile";
|
|
44
67
|
var SWIFT_PACKAGE_PATH = "/__peach/swift-package/";
|
|
45
68
|
var SWIFT_HMR_PATH = "/__peach/swift-hmr";
|
|
@@ -48,18 +71,22 @@ var MAX_SWIFT_COMPILE_SOURCE_BYTES = 2 * 1024 * 1024;
|
|
|
48
71
|
var MAX_SWIFT_COMPILE_RESOURCES = 128;
|
|
49
72
|
var MAX_SWIFT_COMPILE_RESOURCE_BYTES = 2 * 1024 * 1024;
|
|
50
73
|
var MAX_SWIFT_COMPILE_RESOURCE_TOTAL_BYTES = 8 * 1024 * 1024;
|
|
74
|
+
var MAX_SWIFT_COMPILE_METAL_FILES = 128;
|
|
75
|
+
var MAX_SWIFT_COMPILE_METAL_BYTES = 2 * 1024 * 1024;
|
|
76
|
+
var MAX_SWIFT_COMPILE_METAL_TOTAL_BYTES = 8 * 1024 * 1024;
|
|
51
77
|
var MAX_SWIFT_COMPILE_IMAGES = 128;
|
|
52
78
|
var MAX_SWIFT_COMPILE_IMAGE_BYTES = 4 * 1024 * 1024;
|
|
53
79
|
var MAX_SWIFT_COMPILE_IMAGE_TOTAL_BYTES = 16 * 1024 * 1024;
|
|
54
|
-
var SWIFT_HOST_ABI =
|
|
80
|
+
var SWIFT_HOST_ABI = 41;
|
|
55
81
|
var POLL_INTERVAL_MS = 1500;
|
|
56
82
|
function swiftNativeEntry(native, file) {
|
|
57
83
|
return {
|
|
58
84
|
packageId: native.packageId,
|
|
59
85
|
contractHash: native.hash,
|
|
60
86
|
modules: Object.fromEntries(
|
|
61
|
-
(native.files[file] ?? []).map((name) => [name, native.modules[name]
|
|
87
|
+
(native.files[file] ?? []).filter((name) => Object.hasOwn(native.modules, name)).map((name) => [name, native.modules[name]])
|
|
62
88
|
),
|
|
89
|
+
views: (native.files[file] ?? []).filter((name) => Object.hasOwn(native.views, name)),
|
|
63
90
|
defaultView: native.defaultViewFiles.includes(file)
|
|
64
91
|
};
|
|
65
92
|
}
|
|
@@ -106,7 +133,11 @@ function isRecord(value) {
|
|
|
106
133
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
107
134
|
}
|
|
108
135
|
function isSwiftNativeModules(value) {
|
|
109
|
-
return isRecord(value) && typeof value.packageId === "string" && typeof value.hash === "string" && isRecord(value.files) && isRecord(value.modules) &&
|
|
136
|
+
return isRecord(value) && typeof value.packageId === "string" && typeof value.hash === "string" && isRecord(value.files) && isRecord(value.modules) && isRecord(value.views) && [
|
|
137
|
+
...Object.values(value.files),
|
|
138
|
+
...Object.values(value.modules),
|
|
139
|
+
...Object.values(value.views)
|
|
140
|
+
].every(
|
|
110
141
|
(names) => Array.isArray(names) && names.every((name) => typeof name === "string")
|
|
111
142
|
) && Array.isArray(value.defaultViewFiles) && value.defaultViewFiles.every((file) => typeof file === "string");
|
|
112
143
|
}
|
|
@@ -114,7 +145,7 @@ function isSwiftCompileOutcome(value) {
|
|
|
114
145
|
if (!isRecord(value)) return false;
|
|
115
146
|
switch (value.status) {
|
|
116
147
|
case "published":
|
|
117
|
-
return typeof value.artifactUrl === "string" && typeof value.icuUrl === "string" && typeof value.hash === "string" && /^[a-f0-9]{64}$/.test(value.hash) && (value.imageUrls === void 0 || isRecord(value.imageUrls) && Object.values(value.imageUrls).every((url) => typeof url === "string")) && (value.native === void 0 || isSwiftNativeModules(value.native));
|
|
148
|
+
return typeof value.artifactUrl === "string" && typeof value.icuUrl === "string" && typeof value.hash === "string" && /^[a-f0-9]{64}$/.test(value.hash) && (value.imageUrls === void 0 || isRecord(value.imageUrls) && Object.values(value.imageUrls).every((url) => typeof url === "string")) && (value.metalSources === void 0 || isSwiftMetalLibrarySources(value.metalSources)) && (value.native === void 0 || isSwiftNativeModules(value.native));
|
|
118
149
|
case "compiling":
|
|
119
150
|
return typeof value.hash === "string" && /^[a-f0-9]{64}$/.test(value.hash);
|
|
120
151
|
case "refused":
|
|
@@ -149,6 +180,14 @@ async function compileSwiftProject(submit, work, origin, signal) {
|
|
|
149
180
|
hash: outcome.hash,
|
|
150
181
|
icuUrl: compileAssetUrl(outcome.icuUrl, origin),
|
|
151
182
|
...outcome.imageUrls === void 0 ? {} : { imageUrls: resolveImageUrls(outcome.imageUrls, origin) },
|
|
183
|
+
...outcome.metalSources === void 0 ? {} : {
|
|
184
|
+
metalSources: Object.fromEntries(
|
|
185
|
+
Object.entries(outcome.metalSources).map(([file, source]) => [
|
|
186
|
+
file,
|
|
187
|
+
{ ...source, url: compileAssetUrl(source.url, origin) }
|
|
188
|
+
])
|
|
189
|
+
)
|
|
190
|
+
},
|
|
152
191
|
...outcome.native === void 0 ? {} : { native: outcome.native }
|
|
153
192
|
};
|
|
154
193
|
case "compiling":
|
|
@@ -182,6 +221,9 @@ async function compileSwiftProject(submit, work, origin, signal) {
|
|
|
182
221
|
MAX_SWIFT_COMPILE_IMAGES,
|
|
183
222
|
MAX_SWIFT_COMPILE_IMAGE_BYTES,
|
|
184
223
|
MAX_SWIFT_COMPILE_IMAGE_TOTAL_BYTES,
|
|
224
|
+
MAX_SWIFT_COMPILE_METAL_BYTES,
|
|
225
|
+
MAX_SWIFT_COMPILE_METAL_FILES,
|
|
226
|
+
MAX_SWIFT_COMPILE_METAL_TOTAL_BYTES,
|
|
185
227
|
MAX_SWIFT_COMPILE_RESOURCES,
|
|
186
228
|
MAX_SWIFT_COMPILE_RESOURCE_BYTES,
|
|
187
229
|
MAX_SWIFT_COMPILE_RESOURCE_TOTAL_BYTES,
|
|
@@ -1,4 +1,22 @@
|
|
|
1
|
-
/*!
|
|
1
|
+
/*! peach v0.1.1399 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
|
|
2
|
+
|
|
3
|
+
// src/swiftContract.ts
|
|
4
|
+
function isSwiftResourcePath(value) {
|
|
5
|
+
return typeof value === "string" && value.length <= 4096 && !value.startsWith("/") && !value.includes("\\") && !value.includes("\0") && value.split("/").every((part) => part !== "" && part !== "." && part !== "..");
|
|
6
|
+
}
|
|
7
|
+
function isSwiftBundlePath(value) {
|
|
8
|
+
return typeof value === "string" && (value === "." || isSwiftResourcePath(value) && /\.(bundle|framework)$/.test(value));
|
|
9
|
+
}
|
|
10
|
+
function isSwiftMetalSources(value) {
|
|
11
|
+
return typeof value === "object" && value !== null && !Array.isArray(value) && Object.entries(value).every(
|
|
12
|
+
([file, source]) => file.endsWith(".metal") && isSwiftResourcePath(file) && typeof source === "object" && source !== null && !Array.isArray(source) && "url" in source && typeof source.url === "string" && "sha256" in source && typeof source.sha256 === "string" && /^[a-f0-9]{64}$/.test(source.sha256)
|
|
13
|
+
);
|
|
14
|
+
}
|
|
15
|
+
function isSwiftMetalLibrarySources(value) {
|
|
16
|
+
return isSwiftMetalSources(value) && Object.values(value).every(
|
|
17
|
+
(source) => "bundlePath" in source && isSwiftBundlePath(source.bundlePath)
|
|
18
|
+
);
|
|
19
|
+
}
|
|
2
20
|
|
|
3
21
|
// src/swift-submit.ts
|
|
4
22
|
var SWIFT_COMPILE_PATH = "/api/swift-compile";
|
|
@@ -9,18 +27,22 @@ var MAX_SWIFT_COMPILE_SOURCE_BYTES = 2 * 1024 * 1024;
|
|
|
9
27
|
var MAX_SWIFT_COMPILE_RESOURCES = 128;
|
|
10
28
|
var MAX_SWIFT_COMPILE_RESOURCE_BYTES = 2 * 1024 * 1024;
|
|
11
29
|
var MAX_SWIFT_COMPILE_RESOURCE_TOTAL_BYTES = 8 * 1024 * 1024;
|
|
30
|
+
var MAX_SWIFT_COMPILE_METAL_FILES = 128;
|
|
31
|
+
var MAX_SWIFT_COMPILE_METAL_BYTES = 2 * 1024 * 1024;
|
|
32
|
+
var MAX_SWIFT_COMPILE_METAL_TOTAL_BYTES = 8 * 1024 * 1024;
|
|
12
33
|
var MAX_SWIFT_COMPILE_IMAGES = 128;
|
|
13
34
|
var MAX_SWIFT_COMPILE_IMAGE_BYTES = 4 * 1024 * 1024;
|
|
14
35
|
var MAX_SWIFT_COMPILE_IMAGE_TOTAL_BYTES = 16 * 1024 * 1024;
|
|
15
|
-
var SWIFT_HOST_ABI =
|
|
36
|
+
var SWIFT_HOST_ABI = 41;
|
|
16
37
|
var POLL_INTERVAL_MS = 1500;
|
|
17
38
|
function swiftNativeEntry(native, file) {
|
|
18
39
|
return {
|
|
19
40
|
packageId: native.packageId,
|
|
20
41
|
contractHash: native.hash,
|
|
21
42
|
modules: Object.fromEntries(
|
|
22
|
-
(native.files[file] ?? []).map((name) => [name, native.modules[name]
|
|
43
|
+
(native.files[file] ?? []).filter((name) => Object.hasOwn(native.modules, name)).map((name) => [name, native.modules[name]])
|
|
23
44
|
),
|
|
45
|
+
views: (native.files[file] ?? []).filter((name) => Object.hasOwn(native.views, name)),
|
|
24
46
|
defaultView: native.defaultViewFiles.includes(file)
|
|
25
47
|
};
|
|
26
48
|
}
|
|
@@ -67,7 +89,11 @@ function isRecord(value) {
|
|
|
67
89
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
68
90
|
}
|
|
69
91
|
function isSwiftNativeModules(value) {
|
|
70
|
-
return isRecord(value) && typeof value.packageId === "string" && typeof value.hash === "string" && isRecord(value.files) && isRecord(value.modules) &&
|
|
92
|
+
return isRecord(value) && typeof value.packageId === "string" && typeof value.hash === "string" && isRecord(value.files) && isRecord(value.modules) && isRecord(value.views) && [
|
|
93
|
+
...Object.values(value.files),
|
|
94
|
+
...Object.values(value.modules),
|
|
95
|
+
...Object.values(value.views)
|
|
96
|
+
].every(
|
|
71
97
|
(names) => Array.isArray(names) && names.every((name) => typeof name === "string")
|
|
72
98
|
) && Array.isArray(value.defaultViewFiles) && value.defaultViewFiles.every((file) => typeof file === "string");
|
|
73
99
|
}
|
|
@@ -75,7 +101,7 @@ function isSwiftCompileOutcome(value) {
|
|
|
75
101
|
if (!isRecord(value)) return false;
|
|
76
102
|
switch (value.status) {
|
|
77
103
|
case "published":
|
|
78
|
-
return typeof value.artifactUrl === "string" && typeof value.icuUrl === "string" && typeof value.hash === "string" && /^[a-f0-9]{64}$/.test(value.hash) && (value.imageUrls === void 0 || isRecord(value.imageUrls) && Object.values(value.imageUrls).every((url) => typeof url === "string")) && (value.native === void 0 || isSwiftNativeModules(value.native));
|
|
104
|
+
return typeof value.artifactUrl === "string" && typeof value.icuUrl === "string" && typeof value.hash === "string" && /^[a-f0-9]{64}$/.test(value.hash) && (value.imageUrls === void 0 || isRecord(value.imageUrls) && Object.values(value.imageUrls).every((url) => typeof url === "string")) && (value.metalSources === void 0 || isSwiftMetalLibrarySources(value.metalSources)) && (value.native === void 0 || isSwiftNativeModules(value.native));
|
|
79
105
|
case "compiling":
|
|
80
106
|
return typeof value.hash === "string" && /^[a-f0-9]{64}$/.test(value.hash);
|
|
81
107
|
case "refused":
|
|
@@ -110,6 +136,14 @@ async function compileSwiftProject(submit, work, origin, signal) {
|
|
|
110
136
|
hash: outcome.hash,
|
|
111
137
|
icuUrl: compileAssetUrl(outcome.icuUrl, origin),
|
|
112
138
|
...outcome.imageUrls === void 0 ? {} : { imageUrls: resolveImageUrls(outcome.imageUrls, origin) },
|
|
139
|
+
...outcome.metalSources === void 0 ? {} : {
|
|
140
|
+
metalSources: Object.fromEntries(
|
|
141
|
+
Object.entries(outcome.metalSources).map(([file, source]) => [
|
|
142
|
+
file,
|
|
143
|
+
{ ...source, url: compileAssetUrl(source.url, origin) }
|
|
144
|
+
])
|
|
145
|
+
)
|
|
146
|
+
},
|
|
113
147
|
...outcome.native === void 0 ? {} : { native: outcome.native }
|
|
114
148
|
};
|
|
115
149
|
case "compiling":
|
|
@@ -142,6 +176,9 @@ export {
|
|
|
142
176
|
MAX_SWIFT_COMPILE_IMAGES,
|
|
143
177
|
MAX_SWIFT_COMPILE_IMAGE_BYTES,
|
|
144
178
|
MAX_SWIFT_COMPILE_IMAGE_TOTAL_BYTES,
|
|
179
|
+
MAX_SWIFT_COMPILE_METAL_BYTES,
|
|
180
|
+
MAX_SWIFT_COMPILE_METAL_FILES,
|
|
181
|
+
MAX_SWIFT_COMPILE_METAL_TOTAL_BYTES,
|
|
145
182
|
MAX_SWIFT_COMPILE_RESOURCES,
|
|
146
183
|
MAX_SWIFT_COMPILE_RESOURCE_BYTES,
|
|
147
184
|
MAX_SWIFT_COMPILE_RESOURCE_TOTAL_BYTES,
|