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,7 +1,8 @@
|
|
|
1
1
|
// read native default initialization inputs before the guest Firebase SDK starts.
|
|
2
2
|
// expose only FirebaseOptions, never a partner-specific extra configuration.
|
|
3
|
+
import { spawnSync } from 'node:child_process'
|
|
3
4
|
import fs from 'node:fs'
|
|
4
|
-
import
|
|
5
|
+
import os from 'node:os'
|
|
5
6
|
import path from 'node:path'
|
|
6
7
|
import { isRecord } from './is-record'
|
|
7
8
|
import { parsePlistSource } from './plist'
|
|
@@ -10,6 +11,7 @@ import { listXcodeAppTargets, readXcodeAppTarget } from './xcode-project'
|
|
|
10
11
|
export function readNativeFirebaseConfig(
|
|
11
12
|
projectRoot: string,
|
|
12
13
|
platforms: readonly string[] = ['ios', 'android'],
|
|
14
|
+
iosTarget?: string,
|
|
13
15
|
) {
|
|
14
16
|
const result: Record<string, unknown> = {}
|
|
15
17
|
let config: Record<string, unknown> = {}
|
|
@@ -30,15 +32,45 @@ export function readNativeFirebaseConfig(
|
|
|
30
32
|
'app.config.mjs',
|
|
31
33
|
].some((name) => fs.existsSync(path.join(projectRoot, name)))
|
|
32
34
|
if (staticExpo || dynamicExpo) {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
35
|
+
// expo's synchronous ESM/TypeScript loader requires Node's module evaluator.
|
|
36
|
+
// a private result file keeps authored console output off the configuration wire.
|
|
37
|
+
const directory = fs.mkdtempSync(path.join(os.tmpdir(), 'peach-expo-config-'))
|
|
38
|
+
const resultPath = path.join(directory, 'config.json')
|
|
39
|
+
try {
|
|
40
|
+
const child = spawnSync(
|
|
41
|
+
'node',
|
|
42
|
+
[
|
|
43
|
+
'--input-type=commonjs',
|
|
44
|
+
'-e',
|
|
45
|
+
`const { createRequire } = require('node:module');
|
|
46
|
+
const { writeFileSync } = require('node:fs');
|
|
47
|
+
const { join } = require('node:path');
|
|
48
|
+
const root = process.argv[1];
|
|
49
|
+
const { getConfig } = createRequire(join(root, 'package.json'))('@expo/config');
|
|
50
|
+
const result = JSON.stringify(getConfig(root, { skipSDKVersionRequirement: true }).exp);
|
|
51
|
+
if (Buffer.byteLength(result) > 1024 * 1024) throw new Error('Expo native configuration exceeds 1 MiB.');
|
|
52
|
+
writeFileSync(process.argv[2], result, { mode: 0o600 });`,
|
|
53
|
+
path.resolve(projectRoot),
|
|
54
|
+
resultPath,
|
|
55
|
+
],
|
|
56
|
+
{
|
|
57
|
+
cwd: projectRoot,
|
|
58
|
+
encoding: 'utf8',
|
|
59
|
+
stdio: ['ignore', 'ignore', 'pipe'],
|
|
60
|
+
timeout: 30_000,
|
|
61
|
+
maxBuffer: 1024 * 1024,
|
|
62
|
+
},
|
|
63
|
+
)
|
|
64
|
+
if (child.error) throw child.error
|
|
65
|
+
if (child.status !== 0)
|
|
66
|
+
throw new Error(child.stderr || 'Expo native configuration evaluation failed.')
|
|
67
|
+
const resolved: unknown = JSON.parse(fs.readFileSync(resultPath, 'utf8'))
|
|
68
|
+
if (!isRecord(resolved))
|
|
69
|
+
throw new Error('Expo native configuration is unavailable.')
|
|
70
|
+
config = resolved
|
|
71
|
+
} finally {
|
|
72
|
+
fs.rmSync(directory, { recursive: true, force: true })
|
|
73
|
+
}
|
|
42
74
|
}
|
|
43
75
|
const ios = config.ios
|
|
44
76
|
if (
|
|
@@ -55,10 +87,17 @@ export function readNativeFirebaseConfig(
|
|
|
55
87
|
if (projects.length === 1) {
|
|
56
88
|
const xcodeproj = path.join(iosRoot, projects[0].name)
|
|
57
89
|
const appTargets = listXcodeAppTargets(xcodeproj)
|
|
58
|
-
if (appTargets.length > 1)
|
|
90
|
+
if (!iosTarget && appTargets.length > 1)
|
|
59
91
|
throw new Error('native Firebase configuration requires a selected app target')
|
|
60
|
-
if (appTargets.length === 1) {
|
|
61
|
-
const app = readXcodeAppTarget(
|
|
92
|
+
if (iosTarget || appTargets.length === 1) {
|
|
93
|
+
const app = readXcodeAppTarget(
|
|
94
|
+
xcodeproj,
|
|
95
|
+
iosTarget ?? appTargets[0],
|
|
96
|
+
undefined,
|
|
97
|
+
{
|
|
98
|
+
requireSources: false,
|
|
99
|
+
},
|
|
100
|
+
)
|
|
62
101
|
const delegates = app.allSources.filter((file) =>
|
|
63
102
|
/^AppDelegate\.(swift|mm|m)$/.test(path.basename(file)),
|
|
64
103
|
)
|
|
@@ -69,7 +108,7 @@ export function readNativeFirebaseConfig(
|
|
|
69
108
|
token.startsWith('"') ? '""' : token.replace(/[^\n]/g, ' '),
|
|
70
109
|
)
|
|
71
110
|
const launch =
|
|
72
|
-
/(?:\bfunc\s+application\s*\([\s\S]*?didFinishLaunchingWithOptions[\s\S]*?\)\s*->\s*Bool|^-\s*\(BOOL\)\s*application\s*:[\s\S]*?didFinishLaunchingWithOptions[
|
|
111
|
+
/(?:\bfunc\s+application\s*\([\s\S]*?didFinishLaunchingWithOptions[\s\S]*?\)\s*->\s*Bool|^-\s*\(BOOL\)\s*application\s*:[\s\S]*?didFinishLaunchingWithOptions[^{]*)\s*\{/m.exec(
|
|
73
112
|
source,
|
|
74
113
|
)
|
|
75
114
|
if (!launch) return false
|
|
@@ -86,9 +125,24 @@ export function readNativeFirebaseConfig(
|
|
|
86
125
|
if (token === '}') depth -= 1
|
|
87
126
|
if (depth === 0) return false
|
|
88
127
|
}
|
|
128
|
+
let conditionalDepth = 0
|
|
129
|
+
for (const directive of before.matchAll(
|
|
130
|
+
/^\s*#\s*(if|ifdef|ifndef|elseif|elif|else|endif)\b/gm,
|
|
131
|
+
)) {
|
|
132
|
+
const kind = directive[1]
|
|
133
|
+
if (kind === 'if' || kind === 'ifdef' || kind === 'ifndef') {
|
|
134
|
+
conditionalDepth += 1
|
|
135
|
+
} else if (conditionalDepth === 0) {
|
|
136
|
+
conditionalDepth = -1
|
|
137
|
+
break
|
|
138
|
+
} else if (kind === 'endif') {
|
|
139
|
+
conditionalDepth -= 1
|
|
140
|
+
}
|
|
141
|
+
}
|
|
89
142
|
if (
|
|
90
143
|
depth !== 1 ||
|
|
91
|
-
|
|
144
|
+
conditionalDepth !== 0 ||
|
|
145
|
+
/\b(?:return|throw)\b/.test(before)
|
|
92
146
|
)
|
|
93
147
|
throw new Error(
|
|
94
148
|
'native Firebase initialization must be unconditional in the app launch method',
|
|
@@ -148,6 +148,12 @@ export const NATIVE_SEAM_MANIFEST: NativeSeamEntry[] = [
|
|
|
148
148
|
notes:
|
|
149
149
|
'ASAuthorizationAppleIDButton native view — render the system button surface while upstream AppleAuthenticationButton.tsx remains unchanged',
|
|
150
150
|
},
|
|
151
|
+
{
|
|
152
|
+
pkg: 'expo-asset',
|
|
153
|
+
seamBasenames: ['resolveAssetSource'],
|
|
154
|
+
target: path.resolve(NATIVE_SEAMS_DIR, '../rn-libraries/resolveAssetSource.ts'),
|
|
155
|
+
notes: 'the native Image resolver and transformer registration share one owner',
|
|
156
|
+
},
|
|
151
157
|
{
|
|
152
158
|
pkg: '@bam.tech/react-native-image-resizer',
|
|
153
159
|
// a Metro bundle reaches the same seam through the ImageResizer
|
|
@@ -3,9 +3,10 @@ import type { ConfiguredOneWidget } from './oneWidgetContract'
|
|
|
3
3
|
|
|
4
4
|
export async function readConfiguredOneWidget(
|
|
5
5
|
bundleUrl: string,
|
|
6
|
+
fetchScan: (url: string, init: RequestInit) => Promise<Response> = fetch,
|
|
6
7
|
): Promise<ConfiguredOneWidget | null> {
|
|
7
8
|
try {
|
|
8
|
-
const response = await
|
|
9
|
+
const response = await fetchScan(new URL('/__server-scan', bundleUrl).href, {
|
|
9
10
|
signal: AbortSignal.timeout(30_000),
|
|
10
11
|
})
|
|
11
12
|
if (!response.ok || !response.headers.get('content-type')?.includes('json'))
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
export type PlistValue = string | PlistValue[] | { [key: string]: PlistValue }
|
|
2
|
+
export type PlistDict = { [key: string]: PlistValue }
|
|
3
|
+
|
|
4
|
+
export const isDict = (value: PlistValue | undefined): value is PlistDict =>
|
|
5
|
+
typeof value === 'object' && value !== null && !Array.isArray(value)
|
|
6
|
+
|
|
7
|
+
export const str = (value: PlistValue | undefined): string | undefined =>
|
|
8
|
+
typeof value === 'string' ? value : undefined
|
|
9
|
+
|
|
10
|
+
export const list = (value: PlistValue | undefined): string[] =>
|
|
11
|
+
Array.isArray(value)
|
|
12
|
+
? value.filter((item): item is string => typeof item === 'string')
|
|
13
|
+
: []
|
|
14
|
+
|
|
15
|
+
// project.pbxproj is an old-style (openstep) property list: dictionaries,
|
|
16
|
+
// arrays and strings, with c comments. node's plist package reads only xml.
|
|
17
|
+
export function parseOpenStepPlist(text: string): PlistValue {
|
|
18
|
+
let i = 0
|
|
19
|
+
const fail = (message: string): never => {
|
|
20
|
+
const line = text.slice(0, i).split('\n').length
|
|
21
|
+
throw new Error(`project.pbxproj line ${line}: ${message}`)
|
|
22
|
+
}
|
|
23
|
+
const skip = () => {
|
|
24
|
+
for (;;) {
|
|
25
|
+
const ch = text[i]
|
|
26
|
+
if (ch === ' ' || ch === '\t' || ch === '\n' || ch === '\r') i++
|
|
27
|
+
else if (ch === '/' && text[i + 1] === '*') {
|
|
28
|
+
const end = text.indexOf('*/', i + 2)
|
|
29
|
+
if (end < 0) fail('unterminated comment')
|
|
30
|
+
i = end + 2
|
|
31
|
+
} else if (ch === '/' && text[i + 1] === '/') {
|
|
32
|
+
const end = text.indexOf('\n', i)
|
|
33
|
+
i = end < 0 ? text.length : end + 1
|
|
34
|
+
} else return
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const quoted = (): string => {
|
|
38
|
+
i++
|
|
39
|
+
let out = ''
|
|
40
|
+
for (;;) {
|
|
41
|
+
const ch = text[i++]
|
|
42
|
+
if (ch === undefined) fail('unterminated string')
|
|
43
|
+
if (ch === '"') return out
|
|
44
|
+
if (ch !== '\\') {
|
|
45
|
+
out += ch
|
|
46
|
+
continue
|
|
47
|
+
}
|
|
48
|
+
const next = text[i++]
|
|
49
|
+
if (next === 'n') out += '\n'
|
|
50
|
+
else if (next === 't') out += '\t'
|
|
51
|
+
else if (next === 'r') out += '\r'
|
|
52
|
+
else if (next === 'U') {
|
|
53
|
+
out += String.fromCharCode(parseInt(text.slice(i, i + 4), 16))
|
|
54
|
+
i += 4
|
|
55
|
+
} else out += next
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const value = (): PlistValue => {
|
|
59
|
+
skip()
|
|
60
|
+
const ch = text[i]
|
|
61
|
+
if (ch === '{') {
|
|
62
|
+
i++
|
|
63
|
+
const dict: PlistDict = {}
|
|
64
|
+
for (;;) {
|
|
65
|
+
skip()
|
|
66
|
+
if (text[i] === '}') {
|
|
67
|
+
i++
|
|
68
|
+
return dict
|
|
69
|
+
}
|
|
70
|
+
const key = value()
|
|
71
|
+
if (typeof key !== 'string') fail('dictionary key is not a string')
|
|
72
|
+
skip()
|
|
73
|
+
if (text[i++] !== '=') fail('expected =')
|
|
74
|
+
// two objects under one id leave every reference to it ambiguous
|
|
75
|
+
if (Object.hasOwn(dict, key as string)) fail(`duplicate key ${key}`)
|
|
76
|
+
dict[key as string] = value()
|
|
77
|
+
skip()
|
|
78
|
+
if (text[i++] !== ';') fail('expected ;')
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
if (ch === '(') {
|
|
82
|
+
i++
|
|
83
|
+
const list: PlistValue[] = []
|
|
84
|
+
for (;;) {
|
|
85
|
+
skip()
|
|
86
|
+
if (text[i] === ')') {
|
|
87
|
+
i++
|
|
88
|
+
return list
|
|
89
|
+
}
|
|
90
|
+
list.push(value())
|
|
91
|
+
skip()
|
|
92
|
+
if (text[i] === ',') i++
|
|
93
|
+
else if (text[i] !== ')') fail('expected , or )')
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
if (ch === '"') return quoted()
|
|
97
|
+
const start = i
|
|
98
|
+
while (i < text.length && /[A-Za-z0-9_$+/:.\-<>]/.test(text[i]!)) i++
|
|
99
|
+
if (i === start) fail(`unexpected ${JSON.stringify(ch ?? 'end of file')}`)
|
|
100
|
+
return text.slice(start, i)
|
|
101
|
+
}
|
|
102
|
+
if (text.startsWith('// !$*UTF8*$!')) i = text.indexOf('\n') + 1
|
|
103
|
+
const root = value()
|
|
104
|
+
skip()
|
|
105
|
+
if (i !== text.length) fail('trailing content')
|
|
106
|
+
return root
|
|
107
|
+
}
|
|
@@ -6,6 +6,10 @@
|
|
|
6
6
|
* preserves upstream platform, style, event-emitter, and TurboModule behavior.
|
|
7
7
|
*/
|
|
8
8
|
export const REACT_NATIVE_PASSTHROUGH_SPECIFIERS: readonly string[] = [
|
|
9
|
+
// sdk 58 reads these upstream getters and wraps the original metro logger.
|
|
10
|
+
'react-native/unstable-internals-do-not-use',
|
|
11
|
+
'react-native/src/unstable-internals-do-not-use',
|
|
12
|
+
'react-native/Libraries/Utilities/HMRClient',
|
|
9
13
|
'react-native/Libraries/vendor/emitter',
|
|
10
14
|
'react-native/Libraries/Components/View/ReactNativeStyleAttributes',
|
|
11
15
|
'react-native/Libraries/StyleSheet',
|
package/src/runtime-assets.ts
CHANGED
|
@@ -16,12 +16,12 @@ export const SOOTSIM_RUNTIME_MISSING_MESSAGE =
|
|
|
16
16
|
//
|
|
17
17
|
// there is exactly one rule for which engine gets served: INSIDE the Contrast
|
|
18
18
|
// monorepo dev checkout the fresh dev-stack build (public/sootsim, kept current
|
|
19
|
-
// by `bun dev`'s watch:
|
|
19
|
+
// by `bun dev`'s watch:peach) IS the engine; OUTSIDE it (a published CLI in a
|
|
20
20
|
// user's project, or an isolated home) the installed runtime IS. this is a mode
|
|
21
21
|
// boundary, not a preference or a runtime fallback chain — the check is
|
|
22
22
|
// structural (the monorepo layout is present next to this module) and
|
|
23
23
|
// deterministic (the dev build's files exist). it exists because the daemon and
|
|
24
|
-
// the /
|
|
24
|
+
// the /__peachsim plugin otherwise serve ~/.peach/runtimes/<active>, a PUBLISHED
|
|
25
25
|
// runtime that `bun dev` never refreshes, so local engine edits are invisible
|
|
26
26
|
// until a manual publish — the silent trap that cost a full night of
|
|
27
27
|
// already-fixed bugs re-reproducing.
|
package/src/sim-client.ts
CHANGED
|
@@ -196,11 +196,11 @@ const TARGET_SEARCH_PARAMS = [
|
|
|
196
196
|
export function buildSimOpenUrl(currentUrl: string, target: number | string): string {
|
|
197
197
|
const url = new URL(currentUrl)
|
|
198
198
|
for (const param of TARGET_SEARCH_PARAMS) url.searchParams.delete(param)
|
|
199
|
-
// shell route grammar: an optional /
|
|
199
|
+
// shell route grammar: an optional /__peachsim prefix, then /rn, /rn/<port>, or
|
|
200
200
|
// /app/<name>. the current route is replaced wholesale, keeping the prefix.
|
|
201
201
|
const pathname = url.pathname.replace(/\/+$/, '') || '/'
|
|
202
202
|
const prefix =
|
|
203
|
-
pathname === '/
|
|
203
|
+
pathname === '/__peachsim' || pathname.startsWith('/__peachsim/') ? '/__peachsim' : ''
|
|
204
204
|
const normalized = String(target).trim()
|
|
205
205
|
if (/^\d+$/.test(normalized)) {
|
|
206
206
|
// `/rn/<port>` — the shell's own connect route resolves the metro bundle
|
|
@@ -23,9 +23,11 @@ function frameworkModules(paths: string[]): string[] {
|
|
|
23
23
|
return [...modules].sort()
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
+
// byte offsets index the archive itself: a host that gzips range responses
|
|
27
|
+
// (dl.google.com) otherwise answers with offsets into its compressed copy.
|
|
26
28
|
async function range(url: string, spec: string) {
|
|
27
29
|
const response = await fetch(url, {
|
|
28
|
-
headers: { range: `bytes=${spec}
|
|
30
|
+
headers: { range: `bytes=${spec}`, 'accept-encoding': 'identity' },
|
|
29
31
|
signal: AbortSignal.timeout(20_000),
|
|
30
32
|
})
|
|
31
33
|
const match = /^bytes (\d+)-\d+\/(\d+)$/.exec(
|