rnxsim 0.1.392 → 0.1.394
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/cli/cloud-client.ts +74 -52
- package/cli/cloud-dispatch.ts +2 -1
- package/cli/commands/inspect/core.ts +33 -2
- package/cli/commands/platform.ts +34 -9
- package/detox/attempt-events.cjs +23 -0
- package/detox/element-types.ts +11 -2
- package/detox/expectations.ts +7 -3
- package/detox/gestures.ts +23 -2
- package/detox/index.ts +42 -62
- package/detox/navigation-lifecycle.ts +290 -0
- 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 +12 -1
- package/dist-lib/bridge-contract-input.mjs +10 -1
- package/dist-lib/bridge-contract.cjs +7 -1
- package/dist-lib/bridge-contract.mjs +5 -1
- 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 +29 -3
- package/dist-lib/cloud-contract.mjs +26 -2
- package/dist-lib/config.cjs +1 -1
- package/dist-lib/detox/index.cjs +240 -48
- package/dist-lib/dev-bundle-resolution.cjs +1 -1
- package/dist-lib/home-paths.cjs +1 -1
- package/dist-lib/host/bridge-host.cjs +1 -1
- 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 +23 -3
- package/dist-lib/jump-to-source-babel.cjs +1 -1
- package/dist-lib/menu.cjs +1 -1
- package/dist-lib/menu.mjs +1 -1
- package/dist-lib/metro-production-bundle.cjs +132 -3
- package/dist-lib/metro-production-bundle.mjs +129 -2
- package/dist-lib/metro.cjs +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 +24 -3
- package/dist-lib/sdk.mjs +24 -3
- package/dist-lib/skills.cjs +51 -80
- package/dist-lib/vite.cjs +1 -1
- package/package.json +1 -1
- package/src/bridge-contract-input.ts +12 -0
- package/src/bridge-contract.ts +7 -0
- package/src/cloud-contract.ts +29 -0
- package/src/metro-production-bundle.ts +200 -0
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
import { writeAttemptEvent } from './attempt-events.cjs'
|
|
2
|
+
import type { Page, Request, Response } from 'playwright'
|
|
3
|
+
|
|
4
|
+
export type SootsimNavigationIdentity = {
|
|
5
|
+
browserId: number
|
|
6
|
+
contextId: number
|
|
7
|
+
operation: 'launchApp' | 'openURL'
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
type SootsimPageState = {
|
|
11
|
+
bodyText: string
|
|
12
|
+
bridges: {
|
|
13
|
+
sootsim: boolean
|
|
14
|
+
test: boolean
|
|
15
|
+
}
|
|
16
|
+
globals: string[]
|
|
17
|
+
readyState: string
|
|
18
|
+
title: string
|
|
19
|
+
url: string
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
type ActiveNavigation = SootsimNavigationIdentity & {
|
|
23
|
+
navigationUrl: string
|
|
24
|
+
navigationId: number
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
type NavigationMilestone =
|
|
28
|
+
| 'document-request'
|
|
29
|
+
| 'document-request-failed'
|
|
30
|
+
| 'document-request-finished'
|
|
31
|
+
| 'document-response'
|
|
32
|
+
| 'domcontentloaded'
|
|
33
|
+
| 'error'
|
|
34
|
+
| 'load'
|
|
35
|
+
| 'start'
|
|
36
|
+
|
|
37
|
+
type NavigationDiagnostic = {
|
|
38
|
+
browserId: number
|
|
39
|
+
capturedAt: string
|
|
40
|
+
contextId: number
|
|
41
|
+
errorText?: string
|
|
42
|
+
failurePhase?: 'bridge' | 'navigation'
|
|
43
|
+
headersReceived?: boolean
|
|
44
|
+
method?: string
|
|
45
|
+
milestone: NavigationMilestone
|
|
46
|
+
navigationUrl: string
|
|
47
|
+
navigationId: number
|
|
48
|
+
operation: SootsimNavigationIdentity['operation']
|
|
49
|
+
pageState?: SootsimPageState | { evaluateError: string }
|
|
50
|
+
status?: number
|
|
51
|
+
target: string
|
|
52
|
+
type: 'rnx-navigation'
|
|
53
|
+
url: string
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
type PageDiagnostic =
|
|
57
|
+
| NavigationDiagnostic
|
|
58
|
+
| {
|
|
59
|
+
capturedAt: string
|
|
60
|
+
level: string
|
|
61
|
+
message: string
|
|
62
|
+
type: 'page-console'
|
|
63
|
+
}
|
|
64
|
+
| {
|
|
65
|
+
capturedAt: string
|
|
66
|
+
message: string
|
|
67
|
+
type: 'page-error'
|
|
68
|
+
}
|
|
69
|
+
| {
|
|
70
|
+
capturedAt: string
|
|
71
|
+
errorText: string
|
|
72
|
+
method: string
|
|
73
|
+
type: 'subresource-request-failed'
|
|
74
|
+
url: string
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const DIAGNOSTIC_LIMIT = 40
|
|
78
|
+
const pageDiagnostics = new WeakMap<Page, PageDiagnostic[]>()
|
|
79
|
+
const activeNavigations = new WeakMap<Page, ActiveNavigation>()
|
|
80
|
+
const lastNavigations = new WeakMap<Page, ActiveNavigation>()
|
|
81
|
+
let nextNavigationIdentity = 0
|
|
82
|
+
|
|
83
|
+
function recordPageDiagnostic(page: Page, diagnostic: PageDiagnostic, persist = false) {
|
|
84
|
+
const entries = pageDiagnostics.get(page)
|
|
85
|
+
if (!entries) return
|
|
86
|
+
entries.push(diagnostic)
|
|
87
|
+
if (entries.length > DIAGNOSTIC_LIMIT) entries.shift()
|
|
88
|
+
if (persist) writeAttemptEvent(diagnostic)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function isTopLevelDocumentRequest(page: Page, request: Request) {
|
|
92
|
+
return (
|
|
93
|
+
request.isNavigationRequest() &&
|
|
94
|
+
request.resourceType() === 'document' &&
|
|
95
|
+
request.frame() === page.mainFrame()
|
|
96
|
+
)
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function recordNavigationMilestoneFor(
|
|
100
|
+
page: Page,
|
|
101
|
+
active: ActiveNavigation,
|
|
102
|
+
milestone: NavigationMilestone,
|
|
103
|
+
details: Partial<
|
|
104
|
+
Pick<
|
|
105
|
+
NavigationDiagnostic,
|
|
106
|
+
| 'errorText'
|
|
107
|
+
| 'failurePhase'
|
|
108
|
+
| 'headersReceived'
|
|
109
|
+
| 'method'
|
|
110
|
+
| 'pageState'
|
|
111
|
+
| 'status'
|
|
112
|
+
| 'url'
|
|
113
|
+
>
|
|
114
|
+
> = {},
|
|
115
|
+
) {
|
|
116
|
+
recordPageDiagnostic(
|
|
117
|
+
page,
|
|
118
|
+
{
|
|
119
|
+
...active,
|
|
120
|
+
...details,
|
|
121
|
+
capturedAt: new Date().toISOString(),
|
|
122
|
+
milestone,
|
|
123
|
+
target: process.env.CONFORMANCE_PROOF_TARGET || 'sootsim',
|
|
124
|
+
type: 'rnx-navigation',
|
|
125
|
+
url: details.url ?? active.navigationUrl,
|
|
126
|
+
},
|
|
127
|
+
true,
|
|
128
|
+
)
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function recordNavigationMilestone(
|
|
132
|
+
page: Page,
|
|
133
|
+
milestone: NavigationMilestone,
|
|
134
|
+
details: Parameters<typeof recordNavigationMilestoneFor>[3] = {},
|
|
135
|
+
) {
|
|
136
|
+
const active = activeNavigations.get(page)
|
|
137
|
+
if (active) recordNavigationMilestoneFor(page, active, milestone, details)
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function attachPageDiagnostics(page: Page) {
|
|
141
|
+
if (pageDiagnostics.has(page)) return
|
|
142
|
+
pageDiagnostics.set(page, [])
|
|
143
|
+
page.on('console', (message) => {
|
|
144
|
+
recordPageDiagnostic(page, {
|
|
145
|
+
capturedAt: new Date().toISOString(),
|
|
146
|
+
level: message.type(),
|
|
147
|
+
message: message.text(),
|
|
148
|
+
type: 'page-console',
|
|
149
|
+
})
|
|
150
|
+
})
|
|
151
|
+
page.on('pageerror', (error) => {
|
|
152
|
+
recordPageDiagnostic(page, {
|
|
153
|
+
capturedAt: new Date().toISOString(),
|
|
154
|
+
message: error.message,
|
|
155
|
+
type: 'page-error',
|
|
156
|
+
})
|
|
157
|
+
})
|
|
158
|
+
page.on('request', (request) => {
|
|
159
|
+
if (!isTopLevelDocumentRequest(page, request)) return
|
|
160
|
+
recordNavigationMilestone(page, 'document-request', {
|
|
161
|
+
method: request.method(),
|
|
162
|
+
url: request.url(),
|
|
163
|
+
})
|
|
164
|
+
})
|
|
165
|
+
page.on('response', (response) => {
|
|
166
|
+
const request = response.request()
|
|
167
|
+
if (!isTopLevelDocumentRequest(page, request)) return
|
|
168
|
+
recordNavigationMilestone(page, 'document-response', {
|
|
169
|
+
headersReceived: true,
|
|
170
|
+
status: response.status(),
|
|
171
|
+
url: request.url(),
|
|
172
|
+
})
|
|
173
|
+
})
|
|
174
|
+
page.on('requestfinished', (request) => {
|
|
175
|
+
if (!isTopLevelDocumentRequest(page, request)) return
|
|
176
|
+
recordNavigationMilestone(page, 'document-request-finished', { url: request.url() })
|
|
177
|
+
})
|
|
178
|
+
page.on('requestfailed', (request) => {
|
|
179
|
+
const failure = request.failure()
|
|
180
|
+
const errorText = failure?.errorText ?? ''
|
|
181
|
+
if (isTopLevelDocumentRequest(page, request)) {
|
|
182
|
+
recordNavigationMilestone(page, 'document-request-failed', {
|
|
183
|
+
errorText,
|
|
184
|
+
url: request.url(),
|
|
185
|
+
})
|
|
186
|
+
return
|
|
187
|
+
}
|
|
188
|
+
recordPageDiagnostic(page, {
|
|
189
|
+
capturedAt: new Date().toISOString(),
|
|
190
|
+
errorText,
|
|
191
|
+
method: request.method(),
|
|
192
|
+
type: 'subresource-request-failed',
|
|
193
|
+
url: request.url(),
|
|
194
|
+
})
|
|
195
|
+
})
|
|
196
|
+
page.on('domcontentloaded', () => {
|
|
197
|
+
recordNavigationMilestone(page, 'domcontentloaded')
|
|
198
|
+
})
|
|
199
|
+
page.on('load', () => {
|
|
200
|
+
recordNavigationMilestone(page, 'load')
|
|
201
|
+
})
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
async function readSootsimPageState(
|
|
205
|
+
page: Page,
|
|
206
|
+
): Promise<SootsimPageState | { evaluateError: string }> {
|
|
207
|
+
try {
|
|
208
|
+
return await page.evaluate(() => ({
|
|
209
|
+
bodyText: document.body?.innerText?.slice(0, 500) ?? '',
|
|
210
|
+
bridges: {
|
|
211
|
+
sootsim: Boolean(window.SootSim),
|
|
212
|
+
test: Boolean(window.__sootsimTest),
|
|
213
|
+
},
|
|
214
|
+
globals: Object.keys(window)
|
|
215
|
+
.filter((key) => key.startsWith('__sootsim') || key === 'SootSim')
|
|
216
|
+
.sort(),
|
|
217
|
+
readyState: document.readyState,
|
|
218
|
+
title: document.title,
|
|
219
|
+
url: window.location.href,
|
|
220
|
+
}))
|
|
221
|
+
} catch (error) {
|
|
222
|
+
return {
|
|
223
|
+
evaluateError: error instanceof Error ? error.message : String(error),
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
export async function describeSootsimBridgeFailure(
|
|
229
|
+
page: Page,
|
|
230
|
+
cause: unknown,
|
|
231
|
+
summary = 'timed out waiting for sootsim test bridge',
|
|
232
|
+
pageState?: SootsimPageState | { evaluateError: string },
|
|
233
|
+
) {
|
|
234
|
+
const recordBridgeFailure = pageState === undefined
|
|
235
|
+
const state = pageState ?? (await readSootsimPageState(page))
|
|
236
|
+
const navigation = lastNavigations.get(page)
|
|
237
|
+
if (recordBridgeFailure && navigation) {
|
|
238
|
+
recordNavigationMilestoneFor(page, navigation, 'error', {
|
|
239
|
+
errorText: cause instanceof Error ? cause.message : String(cause),
|
|
240
|
+
failurePhase: 'bridge',
|
|
241
|
+
pageState: state,
|
|
242
|
+
})
|
|
243
|
+
}
|
|
244
|
+
return new Error(
|
|
245
|
+
[
|
|
246
|
+
summary,
|
|
247
|
+
`cause: ${cause instanceof Error ? cause.message : String(cause)}`,
|
|
248
|
+
`page: ${JSON.stringify(state)}`,
|
|
249
|
+
`recent page diagnostics:\n${JSON.stringify(getSootsimNavigationDiagnostics(page))}`,
|
|
250
|
+
].join('\n'),
|
|
251
|
+
)
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
export async function navigateSootsimPage(
|
|
255
|
+
page: Page,
|
|
256
|
+
url: string,
|
|
257
|
+
identity: SootsimNavigationIdentity,
|
|
258
|
+
): Promise<Response | null> {
|
|
259
|
+
attachPageDiagnostics(page)
|
|
260
|
+
const navigation = {
|
|
261
|
+
...identity,
|
|
262
|
+
navigationUrl: url,
|
|
263
|
+
navigationId: ++nextNavigationIdentity,
|
|
264
|
+
}
|
|
265
|
+
activeNavigations.set(page, navigation)
|
|
266
|
+
lastNavigations.set(page, navigation)
|
|
267
|
+
recordNavigationMilestone(page, 'start')
|
|
268
|
+
try {
|
|
269
|
+
return await page.goto(url, { waitUntil: 'load', timeout: 30000 })
|
|
270
|
+
} catch (error) {
|
|
271
|
+
const pageState = await readSootsimPageState(page)
|
|
272
|
+
recordNavigationMilestone(page, 'error', {
|
|
273
|
+
errorText: error instanceof Error ? error.message : String(error),
|
|
274
|
+
failurePhase: 'navigation',
|
|
275
|
+
pageState,
|
|
276
|
+
})
|
|
277
|
+
throw await describeSootsimBridgeFailure(
|
|
278
|
+
page,
|
|
279
|
+
error,
|
|
280
|
+
'sootsim navigation failed',
|
|
281
|
+
pageState,
|
|
282
|
+
)
|
|
283
|
+
} finally {
|
|
284
|
+
activeNavigations.delete(page)
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
export function getSootsimNavigationDiagnostics(page: Page): readonly PageDiagnostic[] {
|
|
289
|
+
return [...(pageDiagnostics.get(page) ?? [])]
|
|
290
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.394 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.394 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.394 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.394 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.394 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.394 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.394 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } 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.394 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } 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.394 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.394 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -33,6 +33,11 @@ __export(bridge_contract_input_exports, {
|
|
|
33
33
|
parseStateOptions: () => parseStateOptions
|
|
34
34
|
});
|
|
35
35
|
module.exports = __toCommonJS(bridge_contract_input_exports);
|
|
36
|
+
|
|
37
|
+
// src/bridge-contract.ts
|
|
38
|
+
var SIM_LONG_PRESS_MAX_MS = 5e3;
|
|
39
|
+
|
|
40
|
+
// src/bridge-contract-input.ts
|
|
36
41
|
var BridgeInputError = class extends Error {
|
|
37
42
|
constructor(message) {
|
|
38
43
|
super(message);
|
|
@@ -123,6 +128,12 @@ function parsePerformStep(value, index) {
|
|
|
123
128
|
}
|
|
124
129
|
case "longPress": {
|
|
125
130
|
const durationMs = optionalNumber(step, "durationMs", path);
|
|
131
|
+
if (durationMs !== void 0 && (!Number.isInteger(durationMs) || durationMs < 1 || durationMs > SIM_LONG_PRESS_MAX_MS)) {
|
|
132
|
+
validationFailure(
|
|
133
|
+
`${path}.durationMs`,
|
|
134
|
+
`must be an integer between 1 and ${SIM_LONG_PRESS_MAX_MS}`
|
|
135
|
+
);
|
|
136
|
+
}
|
|
126
137
|
return {
|
|
127
138
|
type,
|
|
128
139
|
x: numberValue(step.x, `${path}.x`),
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.394 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
+
|
|
3
|
+
// src/bridge-contract.ts
|
|
4
|
+
var SIM_LONG_PRESS_MAX_MS = 5e3;
|
|
2
5
|
|
|
3
6
|
// src/bridge-contract-input.ts
|
|
4
7
|
var BridgeInputError = class extends Error {
|
|
@@ -91,6 +94,12 @@ function parsePerformStep(value, index) {
|
|
|
91
94
|
}
|
|
92
95
|
case "longPress": {
|
|
93
96
|
const durationMs = optionalNumber(step, "durationMs", path);
|
|
97
|
+
if (durationMs !== void 0 && (!Number.isInteger(durationMs) || durationMs < 1 || durationMs > SIM_LONG_PRESS_MAX_MS)) {
|
|
98
|
+
validationFailure(
|
|
99
|
+
`${path}.durationMs`,
|
|
100
|
+
`must be an integer between 1 and ${SIM_LONG_PRESS_MAX_MS}`
|
|
101
|
+
);
|
|
102
|
+
}
|
|
94
103
|
return {
|
|
95
104
|
type,
|
|
96
105
|
x: numberValue(step.x, `${path}.x`),
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.394 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -25,10 +25,14 @@ __export(bridge_contract_exports, {
|
|
|
25
25
|
SEMANTIC_READY_CONTENT_NODE_FLOOR: () => SEMANTIC_READY_CONTENT_NODE_FLOOR,
|
|
26
26
|
SEMANTIC_READY_NODE_STABLE_MS: () => SEMANTIC_READY_NODE_STABLE_MS,
|
|
27
27
|
SEMANTIC_READY_POLL_MS: () => SEMANTIC_READY_POLL_MS,
|
|
28
|
+
SIM_LONG_PRESS_DEFAULT_MS: () => SIM_LONG_PRESS_DEFAULT_MS,
|
|
29
|
+
SIM_LONG_PRESS_MAX_MS: () => SIM_LONG_PRESS_MAX_MS,
|
|
28
30
|
readyProbeHasContent: () => readyProbeHasContent,
|
|
29
31
|
readyProbeHasTargetContent: () => readyProbeHasTargetContent
|
|
30
32
|
});
|
|
31
33
|
module.exports = __toCommonJS(bridge_contract_exports);
|
|
34
|
+
var SIM_LONG_PRESS_DEFAULT_MS = 500;
|
|
35
|
+
var SIM_LONG_PRESS_MAX_MS = 5e3;
|
|
32
36
|
var SEMANTIC_READY_CONTENT_NODE_FLOOR = 100;
|
|
33
37
|
var SEMANTIC_READY_NODE_STABLE_MS = 750;
|
|
34
38
|
var SEMANTIC_READY_POLL_MS = 150;
|
|
@@ -43,6 +47,8 @@ function readyProbeHasTargetContent(probe) {
|
|
|
43
47
|
SEMANTIC_READY_CONTENT_NODE_FLOOR,
|
|
44
48
|
SEMANTIC_READY_NODE_STABLE_MS,
|
|
45
49
|
SEMANTIC_READY_POLL_MS,
|
|
50
|
+
SIM_LONG_PRESS_DEFAULT_MS,
|
|
51
|
+
SIM_LONG_PRESS_MAX_MS,
|
|
46
52
|
readyProbeHasContent,
|
|
47
53
|
readyProbeHasTargetContent
|
|
48
54
|
});
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.394 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
|
|
3
3
|
// src/bridge-contract.ts
|
|
4
|
+
var SIM_LONG_PRESS_DEFAULT_MS = 500;
|
|
5
|
+
var SIM_LONG_PRESS_MAX_MS = 5e3;
|
|
4
6
|
var SEMANTIC_READY_CONTENT_NODE_FLOOR = 100;
|
|
5
7
|
var SEMANTIC_READY_NODE_STABLE_MS = 750;
|
|
6
8
|
var SEMANTIC_READY_POLL_MS = 150;
|
|
@@ -14,6 +16,8 @@ export {
|
|
|
14
16
|
SEMANTIC_READY_CONTENT_NODE_FLOOR,
|
|
15
17
|
SEMANTIC_READY_NODE_STABLE_MS,
|
|
16
18
|
SEMANTIC_READY_POLL_MS,
|
|
19
|
+
SIM_LONG_PRESS_DEFAULT_MS,
|
|
20
|
+
SIM_LONG_PRESS_MAX_MS,
|
|
17
21
|
readyProbeHasContent,
|
|
18
22
|
readyProbeHasTargetContent
|
|
19
23
|
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.394 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.394 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.394 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -22,20 +22,46 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
22
22
|
// src/cloud-contract.ts
|
|
23
23
|
var cloud_contract_exports = {};
|
|
24
24
|
__export(cloud_contract_exports, {
|
|
25
|
+
RNX_CLOUD_COMMAND_TYPES: () => RNX_CLOUD_COMMAND_TYPES,
|
|
25
26
|
RNX_CLOUD_DESIGN_MAX_STORAGE_BYTES: () => RNX_CLOUD_DESIGN_MAX_STORAGE_BYTES,
|
|
26
27
|
RNX_CLOUD_DESIGN_MAX_STORAGE_ENTRIES: () => RNX_CLOUD_DESIGN_MAX_STORAGE_ENTRIES,
|
|
27
28
|
RNX_CLOUD_DESIGN_PARALLEL_JOB_LIMIT: () => RNX_CLOUD_DESIGN_PARALLEL_JOB_LIMIT,
|
|
28
|
-
RNX_CLOUD_MAX_ARTIFACT_BYTES: () => RNX_CLOUD_MAX_ARTIFACT_BYTES
|
|
29
|
+
RNX_CLOUD_MAX_ARTIFACT_BYTES: () => RNX_CLOUD_MAX_ARTIFACT_BYTES,
|
|
30
|
+
isRnxCloudCommandType: () => isRnxCloudCommandType
|
|
29
31
|
});
|
|
30
32
|
module.exports = __toCommonJS(cloud_contract_exports);
|
|
31
33
|
var RNX_CLOUD_MAX_ARTIFACT_BYTES = 20 * 1024 * 1024;
|
|
32
34
|
var RNX_CLOUD_DESIGN_PARALLEL_JOB_LIMIT = 16;
|
|
33
35
|
var RNX_CLOUD_DESIGN_MAX_STORAGE_ENTRIES = 256;
|
|
34
36
|
var RNX_CLOUD_DESIGN_MAX_STORAGE_BYTES = 1024 * 1024;
|
|
37
|
+
var RNX_CLOUD_COMMAND_TYPES = Object.freeze([
|
|
38
|
+
"state",
|
|
39
|
+
"query",
|
|
40
|
+
"resolve",
|
|
41
|
+
"perform",
|
|
42
|
+
"waitFor",
|
|
43
|
+
"reset",
|
|
44
|
+
"screenshot",
|
|
45
|
+
"capture",
|
|
46
|
+
"captureRegions",
|
|
47
|
+
"settle",
|
|
48
|
+
"setAppearance",
|
|
49
|
+
"openUrl",
|
|
50
|
+
"tree",
|
|
51
|
+
"tap",
|
|
52
|
+
"longPress",
|
|
53
|
+
"memory"
|
|
54
|
+
]);
|
|
55
|
+
var RNX_CLOUD_COMMAND_TYPE_SET = new Set(RNX_CLOUD_COMMAND_TYPES);
|
|
56
|
+
function isRnxCloudCommandType(value) {
|
|
57
|
+
return RNX_CLOUD_COMMAND_TYPE_SET.has(value);
|
|
58
|
+
}
|
|
35
59
|
// Annotate the CommonJS export names for ESM import in node:
|
|
36
60
|
0 && (module.exports = {
|
|
61
|
+
RNX_CLOUD_COMMAND_TYPES,
|
|
37
62
|
RNX_CLOUD_DESIGN_MAX_STORAGE_BYTES,
|
|
38
63
|
RNX_CLOUD_DESIGN_MAX_STORAGE_ENTRIES,
|
|
39
64
|
RNX_CLOUD_DESIGN_PARALLEL_JOB_LIMIT,
|
|
40
|
-
RNX_CLOUD_MAX_ARTIFACT_BYTES
|
|
65
|
+
RNX_CLOUD_MAX_ARTIFACT_BYTES,
|
|
66
|
+
isRnxCloudCommandType
|
|
41
67
|
});
|
|
@@ -1,13 +1,37 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.394 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
|
|
3
3
|
// src/cloud-contract.ts
|
|
4
4
|
var RNX_CLOUD_MAX_ARTIFACT_BYTES = 20 * 1024 * 1024;
|
|
5
5
|
var RNX_CLOUD_DESIGN_PARALLEL_JOB_LIMIT = 16;
|
|
6
6
|
var RNX_CLOUD_DESIGN_MAX_STORAGE_ENTRIES = 256;
|
|
7
7
|
var RNX_CLOUD_DESIGN_MAX_STORAGE_BYTES = 1024 * 1024;
|
|
8
|
+
var RNX_CLOUD_COMMAND_TYPES = Object.freeze([
|
|
9
|
+
"state",
|
|
10
|
+
"query",
|
|
11
|
+
"resolve",
|
|
12
|
+
"perform",
|
|
13
|
+
"waitFor",
|
|
14
|
+
"reset",
|
|
15
|
+
"screenshot",
|
|
16
|
+
"capture",
|
|
17
|
+
"captureRegions",
|
|
18
|
+
"settle",
|
|
19
|
+
"setAppearance",
|
|
20
|
+
"openUrl",
|
|
21
|
+
"tree",
|
|
22
|
+
"tap",
|
|
23
|
+
"longPress",
|
|
24
|
+
"memory"
|
|
25
|
+
]);
|
|
26
|
+
var RNX_CLOUD_COMMAND_TYPE_SET = new Set(RNX_CLOUD_COMMAND_TYPES);
|
|
27
|
+
function isRnxCloudCommandType(value) {
|
|
28
|
+
return RNX_CLOUD_COMMAND_TYPE_SET.has(value);
|
|
29
|
+
}
|
|
8
30
|
export {
|
|
31
|
+
RNX_CLOUD_COMMAND_TYPES,
|
|
9
32
|
RNX_CLOUD_DESIGN_MAX_STORAGE_BYTES,
|
|
10
33
|
RNX_CLOUD_DESIGN_MAX_STORAGE_ENTRIES,
|
|
11
34
|
RNX_CLOUD_DESIGN_PARALLEL_JOB_LIMIT,
|
|
12
|
-
RNX_CLOUD_MAX_ARTIFACT_BYTES
|
|
35
|
+
RNX_CLOUD_MAX_ARTIFACT_BYTES,
|
|
36
|
+
isRnxCloudCommandType
|
|
13
37
|
};
|
package/dist-lib/config.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.394 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|