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;
|
|
@@ -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;
|
package/dist-lib/kotlin-host.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*!
|
|
1
|
+
/*! peach v0.1.1399 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -32,8 +32,10 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
32
32
|
// src/kotlin-host.ts
|
|
33
33
|
var kotlin_host_exports = {};
|
|
34
34
|
__export(kotlin_host_exports, {
|
|
35
|
+
expoKotlinArtifact: () => expoKotlinArtifact,
|
|
35
36
|
kotlinAppArtifact: () => kotlinAppArtifact,
|
|
36
37
|
kotlinArtifact: () => kotlinArtifact,
|
|
38
|
+
kotlinArtifactFiles: () => kotlinArtifactFiles,
|
|
37
39
|
kotlinSources: () => kotlinSources,
|
|
38
40
|
peachKotlinModuleRoot: () => peachKotlinModuleRoot,
|
|
39
41
|
serveKotlinArtifact: () => serveKotlinArtifact,
|
|
@@ -45,7 +47,9 @@ var import_node_crypto = require("node:crypto");
|
|
|
45
47
|
var import_node_fs = __toESM(require("node:fs"), 1);
|
|
46
48
|
var import_node_module = require("node:module");
|
|
47
49
|
var import_node_path2 = __toESM(require("node:path"), 1);
|
|
50
|
+
var import_node_url = require("node:url");
|
|
48
51
|
var import_node_util = require("node:util");
|
|
52
|
+
var import_acorn = require("acorn");
|
|
49
53
|
|
|
50
54
|
// src/home-paths.ts
|
|
51
55
|
var import_node_os = require("node:os");
|
|
@@ -268,9 +272,9 @@ function kotlinSources(root, skip = SKIP_DIRS) {
|
|
|
268
272
|
}
|
|
269
273
|
function entrySource(ids) {
|
|
270
274
|
return [
|
|
275
|
+
"import android.os.Build",
|
|
271
276
|
"import kotlin.js.JsAny",
|
|
272
277
|
"import kotlin.js.Promise",
|
|
273
|
-
"import kotlinx.coroutines.CoroutineStart",
|
|
274
278
|
"import kotlinx.coroutines.Dispatchers",
|
|
275
279
|
"import kotlinx.coroutines.GlobalScope",
|
|
276
280
|
"import kotlinx.coroutines.promise",
|
|
@@ -284,10 +288,14 @@ function entrySource(ids) {
|
|
|
284
288
|
" else -> null",
|
|
285
289
|
"}?.also { instances[packageName] = it }",
|
|
286
290
|
"",
|
|
291
|
+
"@OptIn(kotlin.js.ExperimentalJsExport::class)",
|
|
292
|
+
"@JsExport",
|
|
293
|
+
"fun peachSetAndroidBuildInfo(model: String, release: String) = Build.setDevice(model, release)",
|
|
294
|
+
"",
|
|
287
295
|
"@OptIn(kotlin.js.ExperimentalJsExport::class, kotlin.js.ExperimentalWasmJsInterop::class, kotlinx.coroutines.DelicateCoroutinesApi::class)",
|
|
288
296
|
"@JsExport",
|
|
289
297
|
"fun peachNativeCall(module: String, method: String, argsJson: String, contractHash: String): Promise<JsAny?> =",
|
|
290
|
-
" GlobalScope.promise(Dispatchers.Main
|
|
298
|
+
" GlobalScope.promise(Dispatchers.Main) {",
|
|
291
299
|
" val reply = JSONObject()",
|
|
292
300
|
" try {",
|
|
293
301
|
` val packageName = module.substringBefore('.', "")`,
|
|
@@ -309,7 +317,7 @@ function entrySource(ids) {
|
|
|
309
317
|
""
|
|
310
318
|
].join("\n");
|
|
311
319
|
}
|
|
312
|
-
var BUILD_FORMAT =
|
|
320
|
+
var BUILD_FORMAT = 14;
|
|
313
321
|
var builds = /* @__PURE__ */ new Map();
|
|
314
322
|
function buildsDir() {
|
|
315
323
|
return import_node_path2.default.join(kotlinHome(), "builds");
|
|
@@ -336,7 +344,7 @@ async function kotlinArtifact(root, moduleRoot, origin) {
|
|
|
336
344
|
}
|
|
337
345
|
generated["PeachEntry.kt"] = entrySource(ids);
|
|
338
346
|
if (viewIds.length > 0) generated["PeachViews.kt"] = viewsSource(viewIds);
|
|
339
|
-
const shims = kotlinSources(import_node_path2.default.join(moduleRoot, "Sources")).filter(
|
|
347
|
+
const shims = kotlinSources(import_node_path2.default.join(moduleRoot, "Sources"), /* @__PURE__ */ new Set()).filter(
|
|
340
348
|
(file) => usesCompose || !file.endsWith("/OneNativeSourceViewDispatch.kt")
|
|
341
349
|
);
|
|
342
350
|
if (viewIds.length > 0)
|
|
@@ -346,6 +354,261 @@ async function kotlinArtifact(root, moduleRoot, origin) {
|
|
|
346
354
|
origin
|
|
347
355
|
);
|
|
348
356
|
}
|
|
357
|
+
function readExpoField(value) {
|
|
358
|
+
if (!isRecord(value) || typeof value.name !== "string" || typeof value.key !== "string" || typeof value.required !== "boolean" || typeof value.mutable !== "boolean" || typeof value.hidden !== "boolean")
|
|
359
|
+
throw new Error("expo-types printed an invalid field");
|
|
360
|
+
const range = value.initializer;
|
|
361
|
+
if (range !== null && (!Array.isArray(range) || range.length !== 2 || typeof range[0] !== "number" || typeof range[1] !== "number"))
|
|
362
|
+
throw new Error("expo-types printed an invalid initializer range");
|
|
363
|
+
return {
|
|
364
|
+
name: value.name,
|
|
365
|
+
key: value.key,
|
|
366
|
+
required: value.required,
|
|
367
|
+
mutable: value.mutable,
|
|
368
|
+
hidden: value.hidden,
|
|
369
|
+
initializer: range === null ? null : [range[0], range[1]]
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
function readExpoTypes(output) {
|
|
373
|
+
return output.split("\n").filter((line) => line.startsWith("{")).map((line) => {
|
|
374
|
+
const row = JSON.parse(line);
|
|
375
|
+
if (!isRecord(row) || typeof row.file !== "string" || typeof row.package !== "string" || !Array.isArray(row.records) || !Array.isArray(row.enums) || !Array.isArray(row.views) || !Array.isArray(row.props))
|
|
376
|
+
throw new Error("expo-types printed an invalid file");
|
|
377
|
+
return {
|
|
378
|
+
file: row.file,
|
|
379
|
+
package: row.package,
|
|
380
|
+
records: row.records.map((record) => {
|
|
381
|
+
if (!isRecord(record) || typeof record.name !== "string" || typeof record.hidden !== "boolean" || !Array.isArray(record.fields))
|
|
382
|
+
throw new Error("expo-types printed an invalid record");
|
|
383
|
+
return {
|
|
384
|
+
name: record.name,
|
|
385
|
+
hidden: record.hidden,
|
|
386
|
+
fields: record.fields.map(readExpoField)
|
|
387
|
+
};
|
|
388
|
+
}),
|
|
389
|
+
enums: row.enums.map((entry) => {
|
|
390
|
+
if (!isRecord(entry) || typeof entry.name !== "string" || typeof entry.hidden !== "boolean" || typeof entry.fields !== "number" || entry.parameter !== null && typeof entry.parameter !== "string" || typeof entry.hiddenParameter !== "boolean")
|
|
391
|
+
throw new Error("expo-types printed an invalid enum");
|
|
392
|
+
return {
|
|
393
|
+
name: entry.name,
|
|
394
|
+
hidden: entry.hidden,
|
|
395
|
+
fields: entry.fields,
|
|
396
|
+
parameter: entry.parameter,
|
|
397
|
+
hiddenParameter: entry.hiddenParameter
|
|
398
|
+
};
|
|
399
|
+
}),
|
|
400
|
+
views: row.views.map((view) => {
|
|
401
|
+
if (!isRecord(view) || typeof view.name !== "string" || typeof view.hidden !== "boolean" || typeof view.props !== "string")
|
|
402
|
+
throw new Error("expo-types printed an invalid view");
|
|
403
|
+
return { name: view.name, hidden: view.hidden, props: view.props };
|
|
404
|
+
}),
|
|
405
|
+
props: row.props.map((entry) => {
|
|
406
|
+
if (!isRecord(entry) || typeof entry.name !== "string" || typeof entry.hidden !== "boolean" || !Array.isArray(entry.states) || !entry.states.every((state) => typeof state === "string"))
|
|
407
|
+
throw new Error("expo-types printed invalid compose props");
|
|
408
|
+
return { name: entry.name, hidden: entry.hidden, states: entry.states };
|
|
409
|
+
})
|
|
410
|
+
};
|
|
411
|
+
});
|
|
412
|
+
}
|
|
413
|
+
var expoTypeScans = /* @__PURE__ */ new Map();
|
|
414
|
+
function scanExpoTypes(toolchain, script, sources) {
|
|
415
|
+
const candidates = sources.filter(
|
|
416
|
+
(file) => /\bRecord\b|\benum\s+class\b|\bExpoComposeView\b|\bExpoView\b|\bComposeProps\b/.test(
|
|
417
|
+
import_node_fs.default.readFileSync(file, "utf8")
|
|
418
|
+
)
|
|
419
|
+
);
|
|
420
|
+
if (candidates.length === 0) return Promise.resolve([]);
|
|
421
|
+
const digest = (0, import_node_crypto.createHash)("sha256");
|
|
422
|
+
for (const file of [script, ...candidates])
|
|
423
|
+
digest.update(`${file}\0${import_node_fs.default.readFileSync(file, "utf8")}\0`);
|
|
424
|
+
const key = digest.digest("hex");
|
|
425
|
+
let scan = expoTypeScans.get(key);
|
|
426
|
+
if (!scan) {
|
|
427
|
+
scan = (async () => {
|
|
428
|
+
const { kotlinc } = await ensureToolchain(toolchain);
|
|
429
|
+
const { stdout } = await run(
|
|
430
|
+
import_node_path2.default.join(import_node_path2.default.dirname(kotlinc), "kotlinc"),
|
|
431
|
+
[
|
|
432
|
+
"-cp",
|
|
433
|
+
import_node_path2.default.resolve(import_node_path2.default.dirname(kotlinc), "../lib/kotlin-compiler.jar"),
|
|
434
|
+
"-script",
|
|
435
|
+
script,
|
|
436
|
+
...candidates
|
|
437
|
+
],
|
|
438
|
+
{ maxBuffer: 16 * 1024 * 1024 }
|
|
439
|
+
);
|
|
440
|
+
return readExpoTypes(stdout);
|
|
441
|
+
})().catch((error) => {
|
|
442
|
+
expoTypeScans.delete(key);
|
|
443
|
+
throw error;
|
|
444
|
+
});
|
|
445
|
+
expoTypeScans.set(key, scan);
|
|
446
|
+
}
|
|
447
|
+
return scan;
|
|
448
|
+
}
|
|
449
|
+
function expoTypeSources(files) {
|
|
450
|
+
const generated = {};
|
|
451
|
+
const origins = {};
|
|
452
|
+
const registrations = [];
|
|
453
|
+
files.forEach((file, index) => {
|
|
454
|
+
const edits = [];
|
|
455
|
+
const calls = [];
|
|
456
|
+
for (const record of file.records) {
|
|
457
|
+
const fields = [];
|
|
458
|
+
for (const field of record.fields) {
|
|
459
|
+
if (field.initializer)
|
|
460
|
+
edits.push({ range: field.initializer, owner: record.name, field });
|
|
461
|
+
if (field.hidden) {
|
|
462
|
+
if (!field.initializer)
|
|
463
|
+
throw new Error(
|
|
464
|
+
`${file.file}: @Field ${record.name}.${field.name} is private and has no initializer, which Peach cannot set`
|
|
465
|
+
);
|
|
466
|
+
continue;
|
|
467
|
+
}
|
|
468
|
+
const name = literal(field.key);
|
|
469
|
+
const read = `{ record: ${record.name} -> record.${field.name} }`;
|
|
470
|
+
const write = field.mutable && !field.initializer ? `{ record, value -> record.${field.name} = value }` : "null";
|
|
471
|
+
fields.push(
|
|
472
|
+
` dev.peach.expo.PeachExpoTypes.field(${name}, ${field.required}, ${read}, ${write}),`
|
|
473
|
+
);
|
|
474
|
+
}
|
|
475
|
+
if (record.hidden) continue;
|
|
476
|
+
calls.push(
|
|
477
|
+
[
|
|
478
|
+
` dev.peach.expo.PeachExpoTypes.record(${record.name}::class, ${literal(file.package ? `${file.package}.${record.name}` : record.name)}, { ${record.name}() }, listOf(`,
|
|
479
|
+
...fields,
|
|
480
|
+
" ))"
|
|
481
|
+
].join("\n")
|
|
482
|
+
);
|
|
483
|
+
}
|
|
484
|
+
for (const entry of file.enums) {
|
|
485
|
+
if (entry.hidden) continue;
|
|
486
|
+
if (entry.hiddenParameter)
|
|
487
|
+
throw new Error(
|
|
488
|
+
`${file.file}: enum ${entry.name} keeps its value in a private property, which Peach cannot read`
|
|
489
|
+
);
|
|
490
|
+
const value = entry.fields === 1 ? `{ it.${entry.parameter} }` : "null";
|
|
491
|
+
calls.push(
|
|
492
|
+
` dev.peach.expo.PeachExpoTypes.enum(${entry.name}::class, enumValues<${entry.name}>(), ${entry.fields}, ${entry.parameter === null ? "null" : literal(entry.parameter)}, ${value})`
|
|
493
|
+
);
|
|
494
|
+
}
|
|
495
|
+
const views = [
|
|
496
|
+
...file.views.filter((view) => !view.hidden).map(
|
|
497
|
+
(view) => ` dev.peach.expo.PeachExpoTypes.view(${view.name}::class, ${view.props ? `${view.props}::class` : "null"}) { context, appContext -> ${view.name}(context, appContext) }`
|
|
498
|
+
),
|
|
499
|
+
...file.props.filter((entry) => !entry.hidden).map(
|
|
500
|
+
(entry) => [
|
|
501
|
+
` dev.peach.expo.PeachExpoTypes.composeProps(${entry.name}::class, listOf(`,
|
|
502
|
+
...entry.states.map(
|
|
503
|
+
(state) => ` dev.peach.expo.PeachExpoCompose.prop(${literal(state)}) { props: ${entry.name} -> props.${state} },`
|
|
504
|
+
),
|
|
505
|
+
" ))"
|
|
506
|
+
].join("\n")
|
|
507
|
+
)
|
|
508
|
+
];
|
|
509
|
+
if (edits.length > 0 || views.length > 0) {
|
|
510
|
+
let text = import_node_fs.default.readFileSync(file.file, "utf8").replaceAll("\r\n", "\n");
|
|
511
|
+
for (const { range, owner, field } of edits.sort((a, b) => b.range[0] - a.range[0]))
|
|
512
|
+
text = `${text.slice(0, range[0])}dev.peach.expo.PeachExpoTypes.initial(${owner}::class, ${literal(field.key)}, ${field.required}) { ${text.slice(range[0], range[1])} }${text.slice(range[1])}`;
|
|
513
|
+
if (views.length > 0) {
|
|
514
|
+
text = [
|
|
515
|
+
text,
|
|
516
|
+
"",
|
|
517
|
+
`internal fun peachExpoViews${index}() {`,
|
|
518
|
+
...views,
|
|
519
|
+
"}",
|
|
520
|
+
""
|
|
521
|
+
].join("\n");
|
|
522
|
+
registrations.push(
|
|
523
|
+
`${file.package ? `${file.package}.` : ""}peachExpoViews${index}()`
|
|
524
|
+
);
|
|
525
|
+
}
|
|
526
|
+
const name = `PeachExpoSource_${index}_${import_node_path2.default.basename(file.file)}`;
|
|
527
|
+
generated[name] = text;
|
|
528
|
+
origins[name] = file.file;
|
|
529
|
+
}
|
|
530
|
+
if (calls.length === 0) return;
|
|
531
|
+
generated[`PeachExpoTypes_${index}.kt`] = [
|
|
532
|
+
...file.package ? [`package ${file.package}`, ""] : [],
|
|
533
|
+
`internal fun peachExpoTypes${index}() {`,
|
|
534
|
+
...calls,
|
|
535
|
+
"}",
|
|
536
|
+
""
|
|
537
|
+
].join("\n");
|
|
538
|
+
registrations.push(
|
|
539
|
+
`${file.package ? `${file.package}.` : ""}peachExpoTypes${index}()`
|
|
540
|
+
);
|
|
541
|
+
});
|
|
542
|
+
return { generated, origins, registrations };
|
|
543
|
+
}
|
|
544
|
+
async function expoKotlinArtifact(root, moduleRoot, origin, modules) {
|
|
545
|
+
const toolchain = readToolchain(moduleRoot);
|
|
546
|
+
const language = appKotlinLanguage(root);
|
|
547
|
+
const scanned = await scanExpoTypes(
|
|
548
|
+
toolchain,
|
|
549
|
+
import_node_path2.default.join(moduleRoot, "tools/expo-types.main.kts"),
|
|
550
|
+
modules.sources
|
|
551
|
+
);
|
|
552
|
+
const usesCompose = scanned.some((file) => file.views.length > 0) || modules.sources.some(
|
|
553
|
+
(file) => /\bandroidx\.compose\./.test(import_node_fs.default.readFileSync(file, "utf8"))
|
|
554
|
+
);
|
|
555
|
+
const shims = [
|
|
556
|
+
...kotlinSources(import_node_path2.default.join(moduleRoot, "Sources"), /* @__PURE__ */ new Set()).filter(
|
|
557
|
+
(file) => usesCompose || !file.endsWith("/OneNativeSourceViewDispatch.kt")
|
|
558
|
+
),
|
|
559
|
+
...kotlinSources(import_node_path2.default.join(moduleRoot, "ExpoSources"), /* @__PURE__ */ new Set()),
|
|
560
|
+
...kotlinSources(import_node_path2.default.join(moduleRoot, "AndroidViewSources"), /* @__PURE__ */ new Set()),
|
|
561
|
+
...usesCompose ? [
|
|
562
|
+
...kotlinSources(import_node_path2.default.join(moduleRoot, "ComposeSources")),
|
|
563
|
+
...kotlinSources(import_node_path2.default.join(moduleRoot, "ExpoComposeSources"), /* @__PURE__ */ new Set())
|
|
564
|
+
] : []
|
|
565
|
+
];
|
|
566
|
+
const types = expoTypeSources(scanned);
|
|
567
|
+
const rewritten = new Set(Object.values(types.origins));
|
|
568
|
+
const entry = [
|
|
569
|
+
"@file:OptIn(kotlin.js.ExperimentalJsExport::class)",
|
|
570
|
+
"",
|
|
571
|
+
"import dev.peach.expo.PeachExpoRuntime",
|
|
572
|
+
"",
|
|
573
|
+
"private val registered by lazy {",
|
|
574
|
+
...types.registrations.map((call) => ` ${call}`),
|
|
575
|
+
" PeachExpoRuntime.register(listOf(",
|
|
576
|
+
...modules.modules.map(
|
|
577
|
+
({ classifier, name }) => ` { ${classifier}() } to ${name === null ? "null" : JSON.stringify(name)},`
|
|
578
|
+
),
|
|
579
|
+
" ))",
|
|
580
|
+
"}",
|
|
581
|
+
"",
|
|
582
|
+
"@JsExport fun peachExpoListen(notify: () -> Unit) {",
|
|
583
|
+
" registered",
|
|
584
|
+
" PeachExpoRuntime.listen(notify)",
|
|
585
|
+
"}",
|
|
586
|
+
"",
|
|
587
|
+
"@JsExport fun peachExpoCall(payload: String): String {",
|
|
588
|
+
" registered",
|
|
589
|
+
" return PeachExpoRuntime.dispatch(payload)",
|
|
590
|
+
"}",
|
|
591
|
+
""
|
|
592
|
+
].join("\n");
|
|
593
|
+
const artifact = await compileKotlin(
|
|
594
|
+
{
|
|
595
|
+
root,
|
|
596
|
+
toolchain,
|
|
597
|
+
language,
|
|
598
|
+
sources: modules.sources.filter((file) => !rewritten.has(file)),
|
|
599
|
+
generated: {
|
|
600
|
+
...types.generated,
|
|
601
|
+
"PeachExpoEntry.kt": entry,
|
|
602
|
+
...usesCompose ? { "PeachViews.kt": viewsSource([]) } : {}
|
|
603
|
+
},
|
|
604
|
+
origins: types.origins,
|
|
605
|
+
shims,
|
|
606
|
+
usesCompose
|
|
607
|
+
},
|
|
608
|
+
origin
|
|
609
|
+
);
|
|
610
|
+
return { ...artifact, compose: usesCompose };
|
|
611
|
+
}
|
|
349
612
|
function viewsSource(viewIds) {
|
|
350
613
|
return [
|
|
351
614
|
"import dev.onejs.one.OneNativeSourceViewDispatch",
|
|
@@ -391,8 +654,8 @@ async function kotlinAppArtifact(app, moduleRoot, origin) {
|
|
|
391
654
|
"import androidx.lifecycle.createSavedStateHandle",
|
|
392
655
|
"",
|
|
393
656
|
"@JsExport",
|
|
394
|
-
"fun peachAppMount(density: Float, fontScale: Float, locale: String,
|
|
395
|
-
"
|
|
657
|
+
"fun peachAppMount(density: Float, fontScale: Float, locale: String,",
|
|
658
|
+
" font: String, insets: String, night: Boolean,",
|
|
396
659
|
" invalidate: (Boolean) -> Unit): String = dev.peach.app.peachStartApp(",
|
|
397
660
|
" dev.peach.app.PeachAppSpec(",
|
|
398
661
|
` android.content.ComponentName(${literal(app.packageName)}, ${literal(app.launcher.name)}),`,
|
|
@@ -406,8 +669,9 @@ async function kotlinAppArtifact(app, moduleRoot, origin) {
|
|
|
406
669
|
" androidx.lifecycle.viewmodel.viewModelFactory {",
|
|
407
670
|
...viewModels.map(viewModelInitializer),
|
|
408
671
|
" },",
|
|
672
|
+
` ${app.predictiveBack},`,
|
|
409
673
|
" ),",
|
|
410
|
-
" density, fontScale, locale,
|
|
674
|
+
" density, fontScale, locale, font, insets, night, invalidate,",
|
|
411
675
|
")",
|
|
412
676
|
"",
|
|
413
677
|
"@JsExport",
|
|
@@ -420,7 +684,10 @@ async function kotlinAppArtifact(app, moduleRoot, origin) {
|
|
|
420
684
|
"fun peachAppNight(night: Boolean) = dev.peach.app.peachAppNight(night)",
|
|
421
685
|
"",
|
|
422
686
|
"@JsExport",
|
|
423
|
-
"fun peachAppIme(bottom: Int) = dev.peach.app.peachAppIme(bottom)",
|
|
687
|
+
"fun peachAppIme(bottom: Int, visible: Boolean) = dev.peach.app.peachAppIme(bottom, visible)",
|
|
688
|
+
"",
|
|
689
|
+
"@JsExport",
|
|
690
|
+
"fun peachAppInsets(insets: String, visibleSystemBars: Int) = dev.peach.app.peachAppInsets(insets, visibleSystemBars)",
|
|
424
691
|
""
|
|
425
692
|
].join("\n");
|
|
426
693
|
const generated = {
|
|
@@ -430,9 +697,10 @@ async function kotlinAppArtifact(app, moduleRoot, origin) {
|
|
|
430
697
|
...appResourceSources(app)
|
|
431
698
|
};
|
|
432
699
|
const shims = [
|
|
433
|
-
...kotlinSources(import_node_path2.default.join(moduleRoot, "Sources")),
|
|
700
|
+
...kotlinSources(import_node_path2.default.join(moduleRoot, "Sources"), /* @__PURE__ */ new Set()),
|
|
434
701
|
...kotlinSources(import_node_path2.default.join(moduleRoot, "ComposeSources")),
|
|
435
|
-
...kotlinSources(import_node_path2.default.join(moduleRoot, "AppSources"), /* @__PURE__ */ new Set())
|
|
702
|
+
...kotlinSources(import_node_path2.default.join(moduleRoot, "AppSources"), /* @__PURE__ */ new Set()),
|
|
703
|
+
...kotlinSources(import_node_path2.default.join(moduleRoot, "AndroidViewSources"), /* @__PURE__ */ new Set())
|
|
436
704
|
];
|
|
437
705
|
return compileKotlin(
|
|
438
706
|
{
|
|
@@ -622,6 +890,7 @@ async function compileKotlin(input, origin) {
|
|
|
622
890
|
language,
|
|
623
891
|
sources,
|
|
624
892
|
generated,
|
|
893
|
+
origins = {},
|
|
625
894
|
shims,
|
|
626
895
|
usesCompose,
|
|
627
896
|
viewModels
|
|
@@ -667,6 +936,7 @@ async function compileKotlin(input, origin) {
|
|
|
667
936
|
const common = [
|
|
668
937
|
// the full upstream Compose graph exceeds kotlinc's 512 mib default heap.
|
|
669
938
|
"-J-Xmx2g",
|
|
939
|
+
"-Xallow-kotlin-package",
|
|
670
940
|
"-Xwasm-target=js",
|
|
671
941
|
"-libraries",
|
|
672
942
|
libraries.join(import_node_path2.default.delimiter)
|
|
@@ -728,16 +998,50 @@ async function compileKotlin(input, origin) {
|
|
|
728
998
|
],
|
|
729
999
|
{ maxBuffer: 16 * 1024 * 1024 }
|
|
730
1000
|
);
|
|
731
|
-
if (usesCompose)
|
|
1001
|
+
if (usesCompose) {
|
|
732
1002
|
await run("unzip", [
|
|
733
1003
|
"-q",
|
|
734
1004
|
"-j",
|
|
735
1005
|
composeRuntime,
|
|
736
1006
|
"skiko.mjs",
|
|
737
|
-
"skiko.wasm",
|
|
738
1007
|
"-d",
|
|
739
1008
|
import_node_path2.default.join(work, "js")
|
|
740
1009
|
]);
|
|
1010
|
+
const skikoPath = import_node_path2.default.join(work, "js", "skiko.mjs");
|
|
1011
|
+
const upstream = (0, import_acorn.parse)(import_node_fs.default.readFileSync(skikoPath, "utf8"), {
|
|
1012
|
+
ecmaVersion: "latest",
|
|
1013
|
+
sourceType: "module"
|
|
1014
|
+
});
|
|
1015
|
+
const bindings = [];
|
|
1016
|
+
for (const statement of upstream.body) {
|
|
1017
|
+
if (statement.type !== "ExportNamedDeclaration" || statement.declaration?.type !== "VariableDeclaration" || statement.declaration.kind !== "let")
|
|
1018
|
+
continue;
|
|
1019
|
+
for (const binding of statement.declaration.declarations) {
|
|
1020
|
+
if (binding.id.type !== "Identifier")
|
|
1021
|
+
throw new Error("Skiko binding must have one exported identifier");
|
|
1022
|
+
bindings.push(binding.id.name);
|
|
1023
|
+
}
|
|
1024
|
+
}
|
|
1025
|
+
if (bindings.length !== 967) throw new Error("pinned Skiko binding count changed");
|
|
1026
|
+
const names = [
|
|
1027
|
+
"awaitSkiko",
|
|
1028
|
+
"loadedWasm",
|
|
1029
|
+
"registerSkikoWasmReadyCallback",
|
|
1030
|
+
"skikoApi",
|
|
1031
|
+
"GL",
|
|
1032
|
+
...bindings
|
|
1033
|
+
];
|
|
1034
|
+
import_node_fs.default.writeFileSync(
|
|
1035
|
+
skikoPath,
|
|
1036
|
+
[
|
|
1037
|
+
"const runtime = globalThis.__peachKotlinSkiko;",
|
|
1038
|
+
"if (!runtime) throw Error('Kotlin tenant runtime was not installed before guest evaluation');",
|
|
1039
|
+
`for (const name of ${JSON.stringify(names)}) if (!(name in runtime)) throw Error('Kotlin tenant runtime has no ' + name);`,
|
|
1040
|
+
...names.map((name) => `export const ${name} = runtime.${name};`),
|
|
1041
|
+
""
|
|
1042
|
+
].join("\n")
|
|
1043
|
+
);
|
|
1044
|
+
}
|
|
741
1045
|
if (usesCompose) {
|
|
742
1046
|
for (const library of toolchain.composeJsLibraries) {
|
|
743
1047
|
let imported = false;
|
|
@@ -770,7 +1074,9 @@ async function compileKotlin(input, origin) {
|
|
|
770
1074
|
}
|
|
771
1075
|
} catch (error) {
|
|
772
1076
|
import_node_fs.default.rmSync(work, { recursive: true, force: true });
|
|
773
|
-
|
|
1077
|
+
let output = isRecord(error) ? `${String(error.stderr ?? "")}${String(error.stdout ?? "")}` : "";
|
|
1078
|
+
for (const [name, source] of Object.entries(origins))
|
|
1079
|
+
output = output.replaceAll(import_node_path2.default.join(generatedDir, name), source);
|
|
774
1080
|
throw new Error(
|
|
775
1081
|
`kotlin compile failed:
|
|
776
1082
|
${output.trim() || (error instanceof Error ? error.message : String(error))}`
|
|
@@ -818,6 +1124,14 @@ var CONTENT_TYPES = {
|
|
|
818
1124
|
".mjs": "text/javascript",
|
|
819
1125
|
".wasm": "application/wasm"
|
|
820
1126
|
};
|
|
1127
|
+
function kotlinArtifactFiles(hash) {
|
|
1128
|
+
const dir = import_node_path2.default.join(buildsDir(), hash, "js");
|
|
1129
|
+
return import_node_fs.default.readdirSync(dir).sort().map((name) => {
|
|
1130
|
+
const contentType = CONTENT_TYPES[import_node_path2.default.extname(name)];
|
|
1131
|
+
if (!contentType) throw new Error(`unexpected kotlin artifact file ${name}`);
|
|
1132
|
+
return { name, bytes: import_node_fs.default.readFileSync(import_node_path2.default.join(dir, name)), contentType };
|
|
1133
|
+
});
|
|
1134
|
+
}
|
|
821
1135
|
function serveKotlinArtifact(pathname, res) {
|
|
822
1136
|
if (!pathname.startsWith(KOTLIN_ARTIFACT_PREFIX)) return false;
|
|
823
1137
|
const [hash, file, ...rest] = pathname.slice(KOTLIN_ARTIFACT_PREFIX.length).split("/");
|
|
@@ -840,11 +1154,8 @@ function serveKotlinArtifact(pathname, res) {
|
|
|
840
1154
|
return true;
|
|
841
1155
|
}
|
|
842
1156
|
var KOTLIN_PACKAGE_PATH = "/__peach/kotlin-package";
|
|
843
|
-
function peachKotlinModuleRoot(
|
|
844
|
-
|
|
845
|
-
"peachsim/package.json"
|
|
846
|
-
);
|
|
847
|
-
return import_node_path2.default.join(import_node_path2.default.dirname(peachsimPackage), "kotlin");
|
|
1157
|
+
function peachKotlinModuleRoot() {
|
|
1158
|
+
return import_node_path2.default.resolve(import_node_path2.default.dirname((0, import_node_url.fileURLToPath)(__sootsim_import_meta_url)), "..", "kotlin");
|
|
848
1159
|
}
|
|
849
1160
|
async function serveKotlinRequest(pathname, res, app) {
|
|
850
1161
|
if (serveKotlinArtifact(pathname, res)) return true;
|
|
@@ -862,8 +1173,10 @@ async function serveKotlinRequest(pathname, res, app) {
|
|
|
862
1173
|
}
|
|
863
1174
|
// Annotate the CommonJS export names for ESM import in node:
|
|
864
1175
|
0 && (module.exports = {
|
|
1176
|
+
expoKotlinArtifact,
|
|
865
1177
|
kotlinAppArtifact,
|
|
866
1178
|
kotlinArtifact,
|
|
1179
|
+
kotlinArtifactFiles,
|
|
867
1180
|
kotlinSources,
|
|
868
1181
|
peachKotlinModuleRoot,
|
|
869
1182
|
serveKotlinArtifact,
|
package/dist-lib/menu.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*!
|
|
1
|
+
/*! peach v0.1.1399 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
package/dist-lib/menu.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*!
|
|
1
|
+
/*! peach v0.1.1399 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -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;
|
|
@@ -28,15 +28,15 @@ __export(metro_production_bundle_exports, {
|
|
|
28
28
|
detachRNXMetroSourceMapUrl: () => detachRNXMetroSourceMapUrl,
|
|
29
29
|
readRNXMetroBundleLayout: () => readRNXMetroBundleLayout,
|
|
30
30
|
readRNXMetroModuleIdentity: () => readRNXMetroModuleIdentity,
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
toPeachDevelopmentBundleUrl: () => toPeachDevelopmentBundleUrl,
|
|
32
|
+
toPeachProductionBundleUrl: () => toPeachProductionBundleUrl,
|
|
33
33
|
validateRNXMetroModuleIdentity: () => validateRNXMetroModuleIdentity,
|
|
34
34
|
validateRNXMetroModulePaths: () => validateRNXMetroModulePaths
|
|
35
35
|
});
|
|
36
36
|
module.exports = __toCommonJS(metro_production_bundle_exports);
|
|
37
37
|
var RNXSIM_METRO_MODULE_PATHS_PREFIX = "globalThis.__sootsimModulePaths=";
|
|
38
38
|
var RNX_METRO_MODULE_IDENTITY_VERSION = 2;
|
|
39
|
-
function
|
|
39
|
+
function toPeachProductionBundleUrl(bundleUrl) {
|
|
40
40
|
const relative = bundleUrl.startsWith("/");
|
|
41
41
|
const url = new URL(bundleUrl, "http://peachsim.local");
|
|
42
42
|
url.searchParams.set("dev", "false");
|
|
@@ -44,7 +44,7 @@ function toRNXProductionBundleUrl(bundleUrl) {
|
|
|
44
44
|
url.searchParams.set("minify", "true");
|
|
45
45
|
return relative ? `${url.pathname}${url.search}${url.hash}` : url.toString();
|
|
46
46
|
}
|
|
47
|
-
function
|
|
47
|
+
function toPeachDevelopmentBundleUrl(bundleUrl) {
|
|
48
48
|
const relative = bundleUrl.startsWith("/");
|
|
49
49
|
const url = new URL(bundleUrl, "http://peachsim.local");
|
|
50
50
|
url.searchParams.set("dev", "true");
|
|
@@ -322,8 +322,8 @@ function validateRNXMetroModuleIdentity(identity) {
|
|
|
322
322
|
detachRNXMetroSourceMapUrl,
|
|
323
323
|
readRNXMetroBundleLayout,
|
|
324
324
|
readRNXMetroModuleIdentity,
|
|
325
|
-
|
|
326
|
-
|
|
325
|
+
toPeachDevelopmentBundleUrl,
|
|
326
|
+
toPeachProductionBundleUrl,
|
|
327
327
|
validateRNXMetroModuleIdentity,
|
|
328
328
|
validateRNXMetroModulePaths
|
|
329
329
|
});
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
/*!
|
|
1
|
+
/*! peach v0.1.1399 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
|
|
2
2
|
|
|
3
3
|
// src/metro-production-bundle.ts
|
|
4
4
|
var RNXSIM_METRO_MODULE_PATHS_PREFIX = "globalThis.__sootsimModulePaths=";
|
|
5
5
|
var RNX_METRO_MODULE_IDENTITY_VERSION = 2;
|
|
6
|
-
function
|
|
6
|
+
function toPeachProductionBundleUrl(bundleUrl) {
|
|
7
7
|
const relative = bundleUrl.startsWith("/");
|
|
8
8
|
const url = new URL(bundleUrl, "http://peachsim.local");
|
|
9
9
|
url.searchParams.set("dev", "false");
|
|
@@ -11,7 +11,7 @@ function toRNXProductionBundleUrl(bundleUrl) {
|
|
|
11
11
|
url.searchParams.set("minify", "true");
|
|
12
12
|
return relative ? `${url.pathname}${url.search}${url.hash}` : url.toString();
|
|
13
13
|
}
|
|
14
|
-
function
|
|
14
|
+
function toPeachDevelopmentBundleUrl(bundleUrl) {
|
|
15
15
|
const relative = bundleUrl.startsWith("/");
|
|
16
16
|
const url = new URL(bundleUrl, "http://peachsim.local");
|
|
17
17
|
url.searchParams.set("dev", "true");
|
|
@@ -288,8 +288,8 @@ export {
|
|
|
288
288
|
detachRNXMetroSourceMapUrl,
|
|
289
289
|
readRNXMetroBundleLayout,
|
|
290
290
|
readRNXMetroModuleIdentity,
|
|
291
|
-
|
|
292
|
-
|
|
291
|
+
toPeachDevelopmentBundleUrl,
|
|
292
|
+
toPeachProductionBundleUrl,
|
|
293
293
|
validateRNXMetroModuleIdentity,
|
|
294
294
|
validateRNXMetroModulePaths
|
|
295
295
|
};
|