peachsim 0.1.834 → 0.1.835
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/detox/index.ts +70 -15
- package/dist-lib/agent-daemon-client.cjs +1 -1
- package/dist-lib/agent-events.cjs +1 -1
- package/dist-lib/agent-identity.cjs +1 -1
- package/dist-lib/agent-sessions.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 +1 -1
- package/dist-lib/bridge-contract-input.mjs +1 -1
- package/dist-lib/bridge-contract.cjs +1 -1
- package/dist-lib/bridge-contract.mjs +1 -1
- package/dist-lib/bundle-channel.cjs +9 -9
- package/dist-lib/capture-contract.cjs +1 -1
- package/dist-lib/capture-contract.mjs +1 -1
- package/dist-lib/cli-constants.cjs +1 -1
- package/dist-lib/cloud-contract.cjs +1 -1
- package/dist-lib/cloud-contract.mjs +1 -1
- package/dist-lib/cloud-test-args.cjs +1 -1
- package/dist-lib/cloud-test-args.mjs +1 -1
- package/dist-lib/cloud.cjs +1 -1
- package/dist-lib/cloud.mjs +1 -1
- package/dist-lib/config.cjs +1 -1
- package/dist-lib/detox/index.cjs +42 -13
- package/dist-lib/dev-bundle-resolution.cjs +1 -1
- package/dist-lib/expo-swift-bundle.cjs +9 -9
- package/dist-lib/expo-swift-metadata.cjs +1 -1
- package/dist-lib/expo-swift-metadata.mjs +1 -1
- package/dist-lib/home-paths.cjs +1 -1
- package/dist-lib/host/bridge-host.cjs +9 -9
- package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
- package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
- package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
- package/dist-lib/host/replacement-module-handler.cjs +1 -1
- package/dist-lib/host/websocket-proxy.cjs +1 -1
- package/dist-lib/index.cjs +1 -1
- 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 +1 -1
- 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 +1 -1
- package/dist-lib/metro-production-bundle.mjs +1 -1
- package/dist-lib/metro.cjs +1 -1
- package/dist-lib/native-app-identity.cjs +1 -1
- package/dist-lib/native-app-identity.mjs +1 -1
- 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 +1 -1
- package/dist-lib/react-native-host-modules.mjs +1 -1
- package/dist-lib/render-mode.cjs +1 -1
- package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
- package/dist-lib/sdk.cjs +1 -1
- package/dist-lib/sdk.mjs +1 -1
- package/dist-lib/skills.cjs +9 -9
- package/dist-lib/swift-compile.cjs +1 -1
- package/dist-lib/swift-compile.mjs +1 -1
- package/dist-lib/swift-package.cjs +1 -1
- package/dist-lib/swift-package.mjs +1 -1
- package/dist-lib/swift-submit.cjs +1 -1
- package/dist-lib/swift-submit.mjs +1 -1
- package/dist-lib/swift-toolchain.cjs +1 -1
- package/dist-lib/swift.cjs +1 -1
- package/dist-lib/vite-swift.cjs +9 -9
- package/dist-lib/vite.cjs +1 -1
- package/dist-lib/worklet-executable.cjs +1 -1
- package/dist-lib/worklet-executable.mjs +1 -1
- package/package.json +1 -1
- package/src/swift-distribution.lock.json +8 -8
package/detox/index.ts
CHANGED
|
@@ -57,6 +57,15 @@ import type { Browser, BrowserContext, Page } from 'playwright-core'
|
|
|
57
57
|
export { by }
|
|
58
58
|
export type { SootSimElement } from './element-types'
|
|
59
59
|
|
|
60
|
+
declare global {
|
|
61
|
+
interface Window {
|
|
62
|
+
// installed by takeScreenshotStagesFast; each input action calls it just
|
|
63
|
+
// before handing its input to the engine so an input-anchored capture
|
|
64
|
+
// starts its stage clock at that dispatch
|
|
65
|
+
__sootsimAnchorTimedInput?: () => void
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
60
69
|
const BASE_URL = process.env.PEACH_URL || 'http://localhost:5173'
|
|
61
70
|
const SCREENSHOT_DIR =
|
|
62
71
|
process.env.PEACH_SCREENSHOT_DIR ||
|
|
@@ -744,6 +753,7 @@ async function dispatchTapAtSootsimPoint(page: Page, x: number, y: number) {
|
|
|
744
753
|
await page.evaluate(
|
|
745
754
|
async ({ x, y }) => {
|
|
746
755
|
const interactTap = window.SootSim?.bridges?.interact?.tap
|
|
756
|
+
window.__sootsimAnchorTimedInput?.()
|
|
747
757
|
if (typeof interactTap === 'function') {
|
|
748
758
|
const result = await interactTap(x, y)
|
|
749
759
|
if (result && (typeof result !== 'object' || result.hit !== false)) return
|
|
@@ -1164,6 +1174,7 @@ function createSootSimElement(matcher: Matcher): SootSimElement {
|
|
|
1164
1174
|
if (typeof longPress !== 'function') {
|
|
1165
1175
|
throw new Error('sootsim longPress bridge is not installed')
|
|
1166
1176
|
}
|
|
1177
|
+
window.__sootsimAnchorTimedInput?.()
|
|
1167
1178
|
await longPress(x, y, duration)
|
|
1168
1179
|
},
|
|
1169
1180
|
{ duration, x: target.x, y: target.y },
|
|
@@ -1440,6 +1451,7 @@ function createSootSimElement(matcher: Matcher): SootSimElement {
|
|
|
1440
1451
|
if (typeof drag !== 'function') {
|
|
1441
1452
|
throw new Error('sootsim interact bridge is not installed')
|
|
1442
1453
|
}
|
|
1454
|
+
window.__sootsimAnchorTimedInput?.()
|
|
1443
1455
|
await drag(fromX, fromY, toX, toY, steps, stepMs)
|
|
1444
1456
|
},
|
|
1445
1457
|
{
|
|
@@ -2861,6 +2873,7 @@ export const device = {
|
|
|
2861
2873
|
label: string
|
|
2862
2874
|
offsetMs: number
|
|
2863
2875
|
actualMs: number
|
|
2876
|
+
captureCompletedMs: number
|
|
2864
2877
|
captureRequestedAtMs: number
|
|
2865
2878
|
path: string
|
|
2866
2879
|
}>
|
|
@@ -2869,18 +2882,25 @@ export const device = {
|
|
|
2869
2882
|
}> {
|
|
2870
2883
|
const page = getPage()
|
|
2871
2884
|
const token = `timed-${process.pid}-${Date.now()}-${Math.random()}`
|
|
2885
|
+
// anchorAfterTrigger false anchors the stages at the moment the trigger
|
|
2886
|
+
// hands its input to the engine's interact bridge, after the trigger has
|
|
2887
|
+
// resolved its target. arming before the trigger counted node resolution
|
|
2888
|
+
// and layout polling as elapsed press time.
|
|
2889
|
+
const anchorOnInput = options.anchorAfterTrigger === false
|
|
2872
2890
|
const capturePromise: Promise<{
|
|
2873
2891
|
captureAnchorMs: number
|
|
2874
2892
|
frames: Array<{
|
|
2875
2893
|
label: string
|
|
2876
2894
|
offsetMs: number
|
|
2877
2895
|
actualMs: number
|
|
2896
|
+
captureCompletedMs: number
|
|
2878
2897
|
captureRequestedAtMs: number
|
|
2879
2898
|
dataUrl: string
|
|
2880
2899
|
}>
|
|
2881
2900
|
}> = page.evaluate(
|
|
2882
2901
|
async (input) => {
|
|
2883
2902
|
type CaptureState = {
|
|
2903
|
+
anchorOnInput: boolean
|
|
2884
2904
|
anchorPerformanceMs: number | null
|
|
2885
2905
|
anchorWallMs: number | null
|
|
2886
2906
|
cancelled: boolean
|
|
@@ -2910,12 +2930,23 @@ export const device = {
|
|
|
2910
2930
|
captureWindow.__sootsimTimedCaptures ??
|
|
2911
2931
|
(captureWindow.__sootsimTimedCaptures = {})
|
|
2912
2932
|
const state: CaptureState = {
|
|
2933
|
+
anchorOnInput: input.anchorOnInput,
|
|
2913
2934
|
anchorPerformanceMs: null,
|
|
2914
2935
|
anchorWallMs: null,
|
|
2915
2936
|
cancelled: false,
|
|
2916
2937
|
ready: false,
|
|
2917
2938
|
}
|
|
2918
2939
|
registry[input.token] = state
|
|
2940
|
+
window.__sootsimAnchorTimedInput = () => {
|
|
2941
|
+
const anchorPerformanceMs = performance.now()
|
|
2942
|
+
const anchorWallMs = Date.now()
|
|
2943
|
+
for (const capture of Object.values(registry)) {
|
|
2944
|
+
if (!capture.anchorOnInput || !capture.ready) continue
|
|
2945
|
+
if (capture.anchorPerformanceMs !== null) continue
|
|
2946
|
+
capture.anchorPerformanceMs = anchorPerformanceMs
|
|
2947
|
+
capture.anchorWallMs = anchorWallMs
|
|
2948
|
+
}
|
|
2949
|
+
}
|
|
2919
2950
|
// initial warm-up: ensure the worker has produced at least one
|
|
2920
2951
|
// frame after the menu's portal mount before we start sampling.
|
|
2921
2952
|
// (a pump at higher cadence was tried and starved tap propagation —
|
|
@@ -2935,6 +2966,7 @@ export const device = {
|
|
|
2935
2966
|
label: string
|
|
2936
2967
|
offsetMs: number
|
|
2937
2968
|
actualMs: number
|
|
2969
|
+
captureCompletedMs: number
|
|
2938
2970
|
captureRequestedAtMs: number
|
|
2939
2971
|
dataUrl: string | null
|
|
2940
2972
|
}
|
|
@@ -2950,6 +2982,10 @@ export const device = {
|
|
|
2950
2982
|
const fire = async () => {
|
|
2951
2983
|
const actualMs = performance.now() - captureAnchorPerformanceMs
|
|
2952
2984
|
const captureRequestedAtMs = Date.now()
|
|
2985
|
+
// the sample's content is fixed somewhere between the
|
|
2986
|
+
// request and the completed composite paint; the engine
|
|
2987
|
+
// exposes no producer timestamp for the frame it reads.
|
|
2988
|
+
let captureCompletedMs = actualMs
|
|
2953
2989
|
try {
|
|
2954
2990
|
let dataUrl: string | null = null
|
|
2955
2991
|
if (live && typeof live.captureFresh === 'function') {
|
|
@@ -2957,6 +2993,7 @@ export const device = {
|
|
|
2957
2993
|
// worker round-trip. the background pump keeps the
|
|
2958
2994
|
// canvas fresh.
|
|
2959
2995
|
const { canvas } = await live.captureFresh()
|
|
2996
|
+
captureCompletedMs = performance.now() - captureAnchorPerformanceMs
|
|
2960
2997
|
if (canvas) {
|
|
2961
2998
|
const bmp = await createImageBitmap(canvas)
|
|
2962
2999
|
const enc = document.createElement('canvas')
|
|
@@ -2972,11 +3009,13 @@ export const device = {
|
|
|
2972
3009
|
}
|
|
2973
3010
|
if (!dataUrl) {
|
|
2974
3011
|
dataUrl = await screenshot({ format: 'png' })
|
|
3012
|
+
captureCompletedMs = performance.now() - captureAnchorPerformanceMs
|
|
2975
3013
|
}
|
|
2976
3014
|
resolve({
|
|
2977
3015
|
label: stage.label,
|
|
2978
3016
|
offsetMs: stage.offsetMs,
|
|
2979
3017
|
actualMs,
|
|
3018
|
+
captureCompletedMs,
|
|
2980
3019
|
captureRequestedAtMs,
|
|
2981
3020
|
dataUrl,
|
|
2982
3021
|
})
|
|
@@ -2985,6 +3024,7 @@ export const device = {
|
|
|
2985
3024
|
label: stage.label,
|
|
2986
3025
|
offsetMs: stage.offsetMs,
|
|
2987
3026
|
actualMs,
|
|
3027
|
+
captureCompletedMs,
|
|
2988
3028
|
captureRequestedAtMs,
|
|
2989
3029
|
dataUrl: null,
|
|
2990
3030
|
})
|
|
@@ -3006,6 +3046,7 @@ export const device = {
|
|
|
3006
3046
|
label: string
|
|
3007
3047
|
offsetMs: number
|
|
3008
3048
|
actualMs: number
|
|
3049
|
+
captureCompletedMs: number
|
|
3009
3050
|
captureRequestedAtMs: number
|
|
3010
3051
|
dataUrl: string
|
|
3011
3052
|
}> = []
|
|
@@ -3015,6 +3056,7 @@ export const device = {
|
|
|
3015
3056
|
label: snap.label,
|
|
3016
3057
|
offsetMs: snap.offsetMs,
|
|
3017
3058
|
actualMs: snap.actualMs,
|
|
3059
|
+
captureCompletedMs: snap.captureCompletedMs,
|
|
3018
3060
|
captureRequestedAtMs: snap.captureRequestedAtMs,
|
|
3019
3061
|
dataUrl: snap.dataUrl,
|
|
3020
3062
|
})
|
|
@@ -3022,7 +3064,7 @@ export const device = {
|
|
|
3022
3064
|
delete registry[input.token]
|
|
3023
3065
|
return { captureAnchorMs, frames: out }
|
|
3024
3066
|
},
|
|
3025
|
-
{ stages, skipWarmup: options.skipWarmup === true, token },
|
|
3067
|
+
{ anchorOnInput, stages, skipWarmup: options.skipWarmup === true, token },
|
|
3026
3068
|
)
|
|
3027
3069
|
|
|
3028
3070
|
await page.waitForFunction(
|
|
@@ -3038,7 +3080,7 @@ export const device = {
|
|
|
3038
3080
|
{ timeout: 5000 },
|
|
3039
3081
|
)
|
|
3040
3082
|
|
|
3041
|
-
const armCapture = (anchorMs
|
|
3083
|
+
const armCapture = (anchorMs: number) =>
|
|
3042
3084
|
page.evaluate(
|
|
3043
3085
|
({ anchorMs, captureToken }) => {
|
|
3044
3086
|
const registry = (
|
|
@@ -3055,9 +3097,8 @@ export const device = {
|
|
|
3055
3097
|
).__sootsimTimedCaptures
|
|
3056
3098
|
const capture = registry?.[captureToken]
|
|
3057
3099
|
if (!capture?.ready) throw new Error('peach timed capture was not armed')
|
|
3058
|
-
|
|
3059
|
-
capture.
|
|
3060
|
-
capture.anchorPerformanceMs = performance.now() - (nowMs - capture.anchorWallMs)
|
|
3100
|
+
capture.anchorWallMs = anchorMs
|
|
3101
|
+
capture.anchorPerformanceMs = performance.now() - (Date.now() - anchorMs)
|
|
3061
3102
|
return capture.anchorWallMs
|
|
3062
3103
|
},
|
|
3063
3104
|
{ anchorMs, captureToken: token },
|
|
@@ -3067,17 +3108,29 @@ export const device = {
|
|
|
3067
3108
|
let triggerCompletedMs = 0
|
|
3068
3109
|
try {
|
|
3069
3110
|
let captureAnchorMs: number
|
|
3070
|
-
if (
|
|
3071
|
-
|
|
3072
|
-
|
|
3073
|
-
|
|
3074
|
-
|
|
3075
|
-
|
|
3076
|
-
|
|
3077
|
-
|
|
3078
|
-
|
|
3111
|
+
if (anchorOnInput) {
|
|
3112
|
+
triggerStartMs = Date.now()
|
|
3113
|
+
await Promise.resolve(options.trigger())
|
|
3114
|
+
triggerCompletedMs = Date.now()
|
|
3115
|
+
// the capture deletes its entry once every stage is sampled, which
|
|
3116
|
+
// can precede a long trigger's return; only a live entry can be unanchored
|
|
3117
|
+
const unanchored = await page.evaluate(
|
|
3118
|
+
(captureToken) =>
|
|
3119
|
+
(
|
|
3120
|
+
window as Window & {
|
|
3121
|
+
__sootsimTimedCaptures?: Record<string, { anchorWallMs: number | null }>
|
|
3122
|
+
}
|
|
3123
|
+
).__sootsimTimedCaptures?.[captureToken]?.anchorWallMs === null,
|
|
3124
|
+
token,
|
|
3125
|
+
)
|
|
3126
|
+
if (unanchored) {
|
|
3127
|
+
throw new Error(
|
|
3128
|
+
'peach timed capture: the trigger completed without dispatching input to anchor its stages',
|
|
3129
|
+
)
|
|
3130
|
+
}
|
|
3131
|
+
const capture = await capturePromise
|
|
3079
3132
|
return {
|
|
3080
|
-
captureAnchorMs,
|
|
3133
|
+
captureAnchorMs: capture.captureAnchorMs,
|
|
3081
3134
|
frames: writeFastScreenshotFrames(namePrefix, capture.frames),
|
|
3082
3135
|
triggerCompletedMs,
|
|
3083
3136
|
triggerStartMs,
|
|
@@ -3259,6 +3312,7 @@ export const device = {
|
|
|
3259
3312
|
await page.evaluate(
|
|
3260
3313
|
async ({ x: tx, y: ty }) => {
|
|
3261
3314
|
const interactTap = window.SootSim?.bridges?.interact?.tap
|
|
3315
|
+
window.__sootsimAnchorTimedInput?.()
|
|
3262
3316
|
if (typeof interactTap === 'function') {
|
|
3263
3317
|
const result = await interactTap(tx, ty)
|
|
3264
3318
|
if (result && (typeof result !== 'object' || result.hit !== false)) return
|
|
@@ -3288,6 +3342,7 @@ export const device = {
|
|
|
3288
3342
|
if (typeof longPress !== 'function') {
|
|
3289
3343
|
throw new Error('sootsim longPress bridge is not installed')
|
|
3290
3344
|
}
|
|
3345
|
+
window.__sootsimAnchorTimedInput?.()
|
|
3291
3346
|
const hit = await longPress(px, py, ms)
|
|
3292
3347
|
if (!hit) {
|
|
3293
3348
|
throw new Error(`sootsim longPress missed at ${px},${py}`)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.835 | (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;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.835 | (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
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.835 | (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
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.835 | (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;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.835 | (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;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.835 | (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;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.835 | (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/beta.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.835 | (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/beta.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.835 | (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
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.835 | (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
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.835 | (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
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.835 | (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;
|
|
@@ -2369,24 +2369,24 @@ var swift_distribution_lock_default;
|
|
|
2369
2369
|
var init_swift_distribution_lock = __esm({
|
|
2370
2370
|
"src/swift-distribution.lock.json"() {
|
|
2371
2371
|
swift_distribution_lock_default = {
|
|
2372
|
-
id: "
|
|
2372
|
+
id: "8a53b074b33eb8b5",
|
|
2373
2373
|
release: "swift-6.3-RELEASE",
|
|
2374
2374
|
wasmSdkId: "swift-6.3-RELEASE_wasm-peach-41921598-peach-edd95e37",
|
|
2375
2375
|
wasmSdkUrl: "https://r2.rnxsim.com/swift-wasm-sdk/swift-6.3-RELEASE_wasm-peach-41921598-peach-edd95e37.artifactbundle.tar.gz",
|
|
2376
2376
|
wasmSdkChecksum: "e8b76a6b78c21e9e16a6943a691ea001aeb0a18518d775a26130520303eb5c6d",
|
|
2377
|
-
source: "
|
|
2377
|
+
source: "882ff4ff4b262e108926af9d13985fba69132c1a",
|
|
2378
2378
|
hosts: {
|
|
2379
2379
|
"darwin-arm64": {
|
|
2380
|
-
sha256: "
|
|
2381
|
-
size:
|
|
2380
|
+
sha256: "6199b51b4d4f963db72bff2fc7174d7944bbf7c6f0379b58fc9fe1db81081dd7",
|
|
2381
|
+
size: 39773614
|
|
2382
2382
|
},
|
|
2383
2383
|
"linux-x64": {
|
|
2384
|
-
sha256: "
|
|
2385
|
-
size:
|
|
2384
|
+
sha256: "dd414d2c73175b5ea4e142f414615e2648102f827a998b8a80edf3c0a8acbb0f",
|
|
2385
|
+
size: 39779064
|
|
2386
2386
|
},
|
|
2387
2387
|
"linux-arm64": {
|
|
2388
|
-
sha256: "
|
|
2389
|
-
size:
|
|
2388
|
+
sha256: "67396e3baa888a4463ecfdeb9f14996e8f5ee397c181e64cf0e82868b27d3463",
|
|
2389
|
+
size: 39778119
|
|
2390
2390
|
}
|
|
2391
2391
|
}
|
|
2392
2392
|
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.835 | (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
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.835 | (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
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.835 | (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
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.835 | (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/cloud.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.835 | (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/cloud.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.835 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
var __defProp = Object.defineProperty;
|
|
3
3
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
4
4
|
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
package/dist-lib/config.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.835 | (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/detox/index.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.835 | (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;
|
|
@@ -8489,6 +8489,7 @@ async function dispatchTapAtSootsimPoint(page, x, y) {
|
|
|
8489
8489
|
await page.evaluate(
|
|
8490
8490
|
async ({ x: x2, y: y2 }) => {
|
|
8491
8491
|
const interactTap = window.SootSim?.bridges?.interact?.tap;
|
|
8492
|
+
window.__sootsimAnchorTimedInput?.();
|
|
8492
8493
|
if (typeof interactTap === "function") {
|
|
8493
8494
|
const result = await interactTap(x2, y2);
|
|
8494
8495
|
if (result && (typeof result !== "object" || result.hit !== false)) return;
|
|
@@ -8813,6 +8814,7 @@ function createSootSimElement(matcher) {
|
|
|
8813
8814
|
if (typeof longPress !== "function") {
|
|
8814
8815
|
throw new Error("sootsim longPress bridge is not installed");
|
|
8815
8816
|
}
|
|
8817
|
+
window.__sootsimAnchorTimedInput?.();
|
|
8816
8818
|
await longPress(x, y, duration2);
|
|
8817
8819
|
},
|
|
8818
8820
|
{ duration, x: target.x, y: target.y }
|
|
@@ -8994,6 +8996,7 @@ function createSootSimElement(matcher) {
|
|
|
8994
8996
|
if (typeof drag !== "function") {
|
|
8995
8997
|
throw new Error("sootsim interact bridge is not installed");
|
|
8996
8998
|
}
|
|
8999
|
+
window.__sootsimAnchorTimedInput?.();
|
|
8997
9000
|
await drag(fromX, fromY, toX, toY, steps2, stepMs);
|
|
8998
9001
|
},
|
|
8999
9002
|
{
|
|
@@ -9981,6 +9984,7 @@ var device = {
|
|
|
9981
9984
|
async takeScreenshotStagesFast(namePrefix, stages, options) {
|
|
9982
9985
|
const page = getPage();
|
|
9983
9986
|
const token = `timed-${process.pid}-${Date.now()}-${Math.random()}`;
|
|
9987
|
+
const anchorOnInput = options.anchorAfterTrigger === false;
|
|
9984
9988
|
const capturePromise = page.evaluate(
|
|
9985
9989
|
async (input) => {
|
|
9986
9990
|
const captureWindow = window;
|
|
@@ -9991,12 +9995,23 @@ var device = {
|
|
|
9991
9995
|
}
|
|
9992
9996
|
const registry = captureWindow.__sootsimTimedCaptures ?? (captureWindow.__sootsimTimedCaptures = {});
|
|
9993
9997
|
const state = {
|
|
9998
|
+
anchorOnInput: input.anchorOnInput,
|
|
9994
9999
|
anchorPerformanceMs: null,
|
|
9995
10000
|
anchorWallMs: null,
|
|
9996
10001
|
cancelled: false,
|
|
9997
10002
|
ready: false
|
|
9998
10003
|
};
|
|
9999
10004
|
registry[input.token] = state;
|
|
10005
|
+
window.__sootsimAnchorTimedInput = () => {
|
|
10006
|
+
const anchorPerformanceMs = performance.now();
|
|
10007
|
+
const anchorWallMs = Date.now();
|
|
10008
|
+
for (const capture of Object.values(registry)) {
|
|
10009
|
+
if (!capture.anchorOnInput || !capture.ready) continue;
|
|
10010
|
+
if (capture.anchorPerformanceMs !== null) continue;
|
|
10011
|
+
capture.anchorPerformanceMs = anchorPerformanceMs;
|
|
10012
|
+
capture.anchorWallMs = anchorWallMs;
|
|
10013
|
+
}
|
|
10014
|
+
};
|
|
10000
10015
|
if (!input.skipWarmup) {
|
|
10001
10016
|
await screenshot({ format: "png" });
|
|
10002
10017
|
}
|
|
@@ -10013,10 +10028,12 @@ var device = {
|
|
|
10013
10028
|
const fire = async () => {
|
|
10014
10029
|
const actualMs = performance.now() - captureAnchorPerformanceMs;
|
|
10015
10030
|
const captureRequestedAtMs = Date.now();
|
|
10031
|
+
let captureCompletedMs = actualMs;
|
|
10016
10032
|
try {
|
|
10017
10033
|
let dataUrl = null;
|
|
10018
10034
|
if (live && typeof live.captureFresh === "function") {
|
|
10019
10035
|
const { canvas } = await live.captureFresh();
|
|
10036
|
+
captureCompletedMs = performance.now() - captureAnchorPerformanceMs;
|
|
10020
10037
|
if (canvas) {
|
|
10021
10038
|
const bmp = await createImageBitmap(canvas);
|
|
10022
10039
|
const enc = document.createElement("canvas");
|
|
@@ -10032,11 +10049,13 @@ var device = {
|
|
|
10032
10049
|
}
|
|
10033
10050
|
if (!dataUrl) {
|
|
10034
10051
|
dataUrl = await screenshot({ format: "png" });
|
|
10052
|
+
captureCompletedMs = performance.now() - captureAnchorPerformanceMs;
|
|
10035
10053
|
}
|
|
10036
10054
|
resolve2({
|
|
10037
10055
|
label: stage.label,
|
|
10038
10056
|
offsetMs: stage.offsetMs,
|
|
10039
10057
|
actualMs,
|
|
10058
|
+
captureCompletedMs,
|
|
10040
10059
|
captureRequestedAtMs,
|
|
10041
10060
|
dataUrl
|
|
10042
10061
|
});
|
|
@@ -10045,6 +10064,7 @@ var device = {
|
|
|
10045
10064
|
label: stage.label,
|
|
10046
10065
|
offsetMs: stage.offsetMs,
|
|
10047
10066
|
actualMs,
|
|
10067
|
+
captureCompletedMs,
|
|
10048
10068
|
captureRequestedAtMs,
|
|
10049
10069
|
dataUrl: null
|
|
10050
10070
|
});
|
|
@@ -10069,6 +10089,7 @@ var device = {
|
|
|
10069
10089
|
label: snap.label,
|
|
10070
10090
|
offsetMs: snap.offsetMs,
|
|
10071
10091
|
actualMs: snap.actualMs,
|
|
10092
|
+
captureCompletedMs: snap.captureCompletedMs,
|
|
10072
10093
|
captureRequestedAtMs: snap.captureRequestedAtMs,
|
|
10073
10094
|
dataUrl: snap.dataUrl
|
|
10074
10095
|
});
|
|
@@ -10076,7 +10097,7 @@ var device = {
|
|
|
10076
10097
|
delete registry[input.token];
|
|
10077
10098
|
return { captureAnchorMs, frames: out };
|
|
10078
10099
|
},
|
|
10079
|
-
{ stages, skipWarmup: options.skipWarmup === true, token }
|
|
10100
|
+
{ anchorOnInput, stages, skipWarmup: options.skipWarmup === true, token }
|
|
10080
10101
|
);
|
|
10081
10102
|
await page.waitForFunction(
|
|
10082
10103
|
(captureToken) => {
|
|
@@ -10091,9 +10112,8 @@ var device = {
|
|
|
10091
10112
|
const registry = window.__sootsimTimedCaptures;
|
|
10092
10113
|
const capture = registry?.[captureToken];
|
|
10093
10114
|
if (!capture?.ready) throw new Error("peach timed capture was not armed");
|
|
10094
|
-
|
|
10095
|
-
capture.
|
|
10096
|
-
capture.anchorPerformanceMs = performance.now() - (nowMs - capture.anchorWallMs);
|
|
10115
|
+
capture.anchorWallMs = anchorMs2;
|
|
10116
|
+
capture.anchorPerformanceMs = performance.now() - (Date.now() - anchorMs2);
|
|
10097
10117
|
return capture.anchorWallMs;
|
|
10098
10118
|
},
|
|
10099
10119
|
{ anchorMs, captureToken: token }
|
|
@@ -10102,15 +10122,22 @@ var device = {
|
|
|
10102
10122
|
let triggerCompletedMs = 0;
|
|
10103
10123
|
try {
|
|
10104
10124
|
let captureAnchorMs;
|
|
10105
|
-
if (
|
|
10106
|
-
|
|
10107
|
-
|
|
10108
|
-
|
|
10109
|
-
|
|
10110
|
-
|
|
10111
|
-
|
|
10125
|
+
if (anchorOnInput) {
|
|
10126
|
+
triggerStartMs = Date.now();
|
|
10127
|
+
await Promise.resolve(options.trigger());
|
|
10128
|
+
triggerCompletedMs = Date.now();
|
|
10129
|
+
const unanchored = await page.evaluate(
|
|
10130
|
+
(captureToken) => window.__sootsimTimedCaptures?.[captureToken]?.anchorWallMs === null,
|
|
10131
|
+
token
|
|
10132
|
+
);
|
|
10133
|
+
if (unanchored) {
|
|
10134
|
+
throw new Error(
|
|
10135
|
+
"peach timed capture: the trigger completed without dispatching input to anchor its stages"
|
|
10136
|
+
);
|
|
10137
|
+
}
|
|
10138
|
+
const capture2 = await capturePromise;
|
|
10112
10139
|
return {
|
|
10113
|
-
captureAnchorMs,
|
|
10140
|
+
captureAnchorMs: capture2.captureAnchorMs,
|
|
10114
10141
|
frames: writeFastScreenshotFrames(namePrefix, capture2.frames),
|
|
10115
10142
|
triggerCompletedMs,
|
|
10116
10143
|
triggerStartMs
|
|
@@ -10251,6 +10278,7 @@ var device = {
|
|
|
10251
10278
|
await page.evaluate(
|
|
10252
10279
|
async ({ x: tx, y: ty }) => {
|
|
10253
10280
|
const interactTap = window.SootSim?.bridges?.interact?.tap;
|
|
10281
|
+
window.__sootsimAnchorTimedInput?.();
|
|
10254
10282
|
if (typeof interactTap === "function") {
|
|
10255
10283
|
const result = await interactTap(tx, ty);
|
|
10256
10284
|
if (result && (typeof result !== "object" || result.hit !== false)) return;
|
|
@@ -10279,6 +10307,7 @@ var device = {
|
|
|
10279
10307
|
if (typeof longPress !== "function") {
|
|
10280
10308
|
throw new Error("sootsim longPress bridge is not installed");
|
|
10281
10309
|
}
|
|
10310
|
+
window.__sootsimAnchorTimedInput?.();
|
|
10282
10311
|
const hit = await longPress(px, py, ms);
|
|
10283
10312
|
if (!hit) {
|
|
10284
10313
|
throw new Error(`sootsim longPress missed at ${px},${py}`);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.835 | (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;
|