rnxsim 0.1.444 → 0.1.446

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.
Files changed (61) hide show
  1. package/cli/auth.ts +2 -2
  2. package/cli/cloud-client.ts +13 -13
  3. package/cli/cloud-session.ts +1 -1
  4. package/cli/commands/detox.ts +18 -0
  5. package/cli/commands/inspect.ts +2 -2
  6. package/cli/outbound-endpoints.ts +0 -2
  7. package/cli/send-to-box.ts +7 -7
  8. package/detox/index.ts +21 -1
  9. package/dist-lib/agent-daemon-client.cjs +1 -1
  10. package/dist-lib/agent-events.cjs +1 -1
  11. package/dist-lib/agent-identity.cjs +1 -1
  12. package/dist-lib/agent-sessions.cjs +1 -1
  13. package/dist-lib/attached-projects.cjs +1 -1
  14. package/dist-lib/auth/shared-session.cjs +1 -1
  15. package/dist-lib/backend-origin.cjs +1 -1
  16. package/dist-lib/beta.cjs +1 -1
  17. package/dist-lib/beta.mjs +1 -1
  18. package/dist-lib/bridge-constants.cjs +1 -1
  19. package/dist-lib/bridge-contract-input.cjs +1 -1
  20. package/dist-lib/bridge-contract-input.mjs +1 -1
  21. package/dist-lib/bridge-contract.cjs +1 -1
  22. package/dist-lib/bridge-contract.mjs +1 -1
  23. package/dist-lib/capture-contract.cjs +1 -1
  24. package/dist-lib/capture-contract.mjs +1 -1
  25. package/dist-lib/cli-constants.cjs +1 -1
  26. package/dist-lib/cloud-contract.cjs +1 -1
  27. package/dist-lib/cloud-contract.mjs +1 -1
  28. package/dist-lib/cloud.cjs +1 -1
  29. package/dist-lib/cloud.mjs +1 -1
  30. package/dist-lib/config.cjs +1 -1
  31. package/dist-lib/detox/index.cjs +16 -1
  32. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  33. package/dist-lib/home-paths.cjs +1 -1
  34. package/dist-lib/host/bridge-host.cjs +178 -178
  35. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  36. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  37. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  38. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  39. package/dist-lib/host/websocket-proxy.cjs +1 -1
  40. package/dist-lib/index.cjs +4 -4
  41. package/dist-lib/jump-to-source-babel.cjs +1 -1
  42. package/dist-lib/menu.cjs +1 -1
  43. package/dist-lib/menu.mjs +1 -1
  44. package/dist-lib/metro-fingerprint-registry.cjs +1 -1
  45. package/dist-lib/metro-fingerprint-registry.mjs +1 -1
  46. package/dist-lib/metro-production-bundle.cjs +1 -1
  47. package/dist-lib/metro-production-bundle.mjs +1 -1
  48. package/dist-lib/metro.cjs +1 -1
  49. package/dist-lib/profiles.cjs +1 -1
  50. package/dist-lib/public-brand.cjs +1 -1
  51. package/dist-lib/react-native-host-modules.cjs +1 -1
  52. package/dist-lib/react-native-host-modules.mjs +1 -1
  53. package/dist-lib/render-mode.cjs +1 -1
  54. package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
  55. package/dist-lib/sdk.cjs +1 -1
  56. package/dist-lib/sdk.mjs +1 -1
  57. package/dist-lib/skills.cjs +198 -201
  58. package/dist-lib/vite.cjs +1 -1
  59. package/package.json +1 -1
  60. package/src/auth/shared-session.ts +1 -1
  61. package/src/cloud-contract.ts +1 -1
package/cli/auth.ts CHANGED
@@ -11,8 +11,8 @@
11
11
  import {
12
12
  readSharedDesktopAuthSession,
13
13
  sharedDesktopAuthAccounts,
14
- } from '../src/auth/shared-session'
15
- import { rnxExit } from './run-rnx'
14
+ } from '../src/auth/shared-session.ts'
15
+ import { rnxExit } from './run-rnx.ts'
16
16
 
17
17
  export type CliApiKeyEnvName = 'RNX_API_KEY'
18
18
 
@@ -17,26 +17,26 @@ import {
17
17
  resolveMetroIosAssetDestFiles,
18
18
  type MetroArtifactAssetSize,
19
19
  type MetroAssetDescriptor,
20
- } from '../../contrast-bundler/src/metroAssetArtifact'
20
+ } from '../../contrast-bundler/src/metroAssetArtifact.ts'
21
21
  import {
22
22
  buildRnxCloudArtifact,
23
23
  type RnxCloudArtifactReceipt,
24
- } from '../../contrast-bundler/src/metroCloudArtifact'
25
- import { inferMetroModuleIdentity } from '../../sootsim-engine/src/metro-fingerprint'
26
- import { loadMetroFingerprintRegistry } from '../../sootsim-engine/src/metro-fingerprint-registry-client'
27
- import { isLoopbackHost } from '../src/backend-origin'
24
+ } from '../../contrast-bundler/src/metroCloudArtifact.ts'
25
+ import { loadMetroFingerprintRegistry } from '../../sootsim-engine/src/metro-fingerprint-registry-client.ts'
26
+ import { inferMetroModuleIdentity } from '../../sootsim-engine/src/metro-fingerprint.ts'
27
+ import { isLoopbackHost } from '../src/backend-origin.ts'
28
28
  import {
29
29
  isRnxCloudCommandType,
30
30
  RNX_CLOUD_MAX_ARTIFACT_BYTES,
31
31
  type RnxCloudBoxCreateReceipt,
32
32
  type RnxCloudCreateReceipt,
33
- } from '../src/cloud-contract'
33
+ } from '../src/cloud-contract.ts'
34
34
  import {
35
35
  RNX_METRO_MODULE_IDENTITY_VERSION,
36
36
  type RNXMetroModuleIdentityMetadata,
37
- } from '../src/metro-production-bundle'
38
- import { rnxPublicBrand } from '../src/public-brand'
39
- import { CHOOSE_ACCOUNT_HINT } from './auth'
37
+ } from '../src/metro-production-bundle.ts'
38
+ import { rnxPublicBrand } from '../src/public-brand.ts'
39
+ import { CHOOSE_ACCOUNT_HINT } from './auth.ts'
40
40
  import {
41
41
  createCloudSession,
42
42
  normalizeCloudOrigin,
@@ -44,15 +44,15 @@ import {
44
44
  type CloudBoxSession,
45
45
  type CloudSession,
46
46
  type CloudSimSession,
47
- } from './cloud-session'
48
- import { detectProject, findProjectRoot } from './commands/detect'
49
- import type { StorageSnapshot } from '../../sootsim-engine/src/preview/storage-snapshot-contract'
47
+ } from './cloud-session.ts'
48
+ import { detectProject, findProjectRoot } from './commands/detect.ts'
49
+ import type { StorageSnapshot } from '../../sootsim-engine/src/preview/storage-snapshot-contract.ts'
50
50
  import type {
51
51
  BridgeClaimResult,
52
52
  BridgeSimInfo,
53
53
  ParsedBridgeCliArgs,
54
54
  WsBridge,
55
- } from './ws-bridge'
55
+ } from './ws-bridge.ts'
56
56
 
57
57
  export const DEFAULT_RNX_CLOUD_ORIGIN = rnxPublicBrand.origin
58
58
  export const MAX_RNX_CLOUD_BUNDLE_BYTES = RNX_CLOUD_MAX_ARTIFACT_BYTES
@@ -1,5 +1,5 @@
1
1
  import { fstatSync, writeSync } from 'node:fs'
2
- import { isLoopbackHost } from '../src/backend-origin'
2
+ import { isLoopbackHost } from '../src/backend-origin.ts'
3
3
 
4
4
  const CLOUD_SESSION_VERSION = 3 as const
5
5
  const SHELL_UPDATE_FD_ENV = 'RNX_SHELL_UPDATE_FD'
@@ -86,6 +86,7 @@ export async function runDetox(args: string[], opts: RunDetoxOpts = {}): Promise
86
86
  prev === '-t' ||
87
87
  prev === '--testNamePattern' ||
88
88
  prev === '--grep' ||
89
+ prev === '--outputFile' ||
89
90
  prev === '--maxWorkers' ||
90
91
  prev === '--shard'
91
92
  )
@@ -154,11 +155,28 @@ export async function runDetox(args: string[], opts: RunDetoxOpts = {}): Promise
154
155
  // scope roots + testMatch to the discovered test dir so jest doesn't
155
156
  // scan the entire repo (which causes haste collisions in monorepos).
156
157
  const presetPath = resolve(resolveDetoxDir(), 'jest-preset.cjs')
158
+ // an external suite may optionally declare its own ignore patterns via e2e/jest-ignore.cjs
159
+ const suiteIgnoreFile = testDir ? join(testDir, 'e2e', 'jest-ignore.cjs') : null
160
+ let suiteIgnorePatterns: string[] = []
161
+ if (suiteIgnoreFile && existsSync(suiteIgnoreFile)) {
162
+ try {
163
+ const req = createRequire(import.meta.url)
164
+ const exported = req(suiteIgnoreFile)
165
+ suiteIgnorePatterns = Array.isArray(exported)
166
+ ? exported
167
+ : Array.isArray(exported.testPathIgnorePatterns)
168
+ ? exported.testPathIgnorePatterns
169
+ : []
170
+ } catch {}
171
+ }
157
172
  tempConfig = join(tmpdir(), `rnx-detox-${process.pid}.config.cjs`)
158
173
  const cfg = {
159
174
  rootDir: testDir,
160
175
  roots: ['<rootDir>'],
161
176
  testMatch: ['<rootDir>/**/*.test.ts', '<rootDir>/**/*.test.js'],
177
+ ...(suiteIgnorePatterns.length > 0
178
+ ? { testPathIgnorePatterns: suiteIgnorePatterns }
179
+ : {}),
162
180
  }
163
181
  writeFileSync(
164
182
  tempConfig,
@@ -475,9 +475,9 @@ function printRenderProfile(worker: string, rp: Record<string, any> | undefined)
475
475
  )
476
476
  }
477
477
  }
478
- if (rp.paragraphBuilds || rp.paragraphLayouts) {
478
+ if (rp.paragraphBuilds || rp.prewarmParagraphBuilds || rp.paragraphLayouts) {
479
479
  console.log(
480
- ` text shaping: ${rp.paragraphBuilds} shaped ${Number(rp.paragraphBuildMs ?? 0).toFixed(1)}ms · ${rp.paragraphLayouts} re-broken ${Number(rp.paragraphLayoutMs ?? 0).toFixed(1)}ms`,
480
+ ` text shaping: ${rp.paragraphBuilds} shaped on frame ${Number(rp.paragraphBuildMs ?? 0).toFixed(1)}ms · ${rp.prewarmParagraphBuilds ?? 0} shaped on idle ${Number(rp.prewarmParagraphBuildMs ?? 0).toFixed(1)}ms · ${rp.paragraphLayouts} re-broken ${Number(rp.paragraphLayoutMs ?? 0).toFixed(1)}ms (all phases)`,
481
481
  )
482
482
  }
483
483
  console.log(` blur: ${rp.avgBlurMs}ms`)
@@ -250,8 +250,6 @@ export const DECLARED_OUTBOUND_CALLS: Record<string, OutboundCallDeclaration> =
250
250
  { category: 'contrast_user_action', count: 1 },
251
251
  'packages/sootsim-engine/src/auth/shared-session.ts :: fetch :: `${CONTRAST_ORIGIN}/api/auth/sign-out`':
252
252
  { category: 'contrast_user_action', count: 1 },
253
- 'packages/sootsim-engine/src/auth/UploadsMenu.tsx :: fetch :: `${CONTRAST_ORIGIN}/api/preview/uploads?limit=20`':
254
- { category: 'contrast_user_action', count: 1 },
255
253
  "packages/sootsim-engine/src/billing/client.ts :: fetch :: apiUrl('/api/sootsim/billing/checkout')":
256
254
  { category: 'contrast_user_action', count: 1 },
257
255
  'packages/sootsim-engine/src/billing/client.ts :: fetch :: apiUrl(path)': {
@@ -5,17 +5,17 @@
5
5
  // it directly; both hand it a way to run a bridge command against the sim that
6
6
  // is running the app, and both get the same simulator id and URL back.
7
7
 
8
- import { isStorageSnapshot } from '../../sootsim-engine/src/preview/storage-snapshot-contract'
8
+ import { isStorageSnapshot } from '../../sootsim-engine/src/preview/storage-snapshot-contract.ts'
9
9
  import {
10
10
  DEFAULT_DEVICE_BY_PLATFORM,
11
11
  getRuntimePlatform,
12
12
  listDeviceModels,
13
- } from '../../sootsim-engine/src/settings/devices'
14
- import { toRNXProductionBundleUrl } from '../src/metro-production-bundle'
15
- import { createCloudBox } from './cloud-client'
16
- import type { StorageSnapshot } from '../../sootsim-engine/src/preview/storage-snapshot-contract'
17
- import type { DeviceModel } from '../../sootsim-engine/src/settings/devices'
18
- import type { BridgeCommandType } from '../src/bridge-contract'
13
+ } from '../../sootsim-engine/src/settings/devices.ts'
14
+ import { toRNXProductionBundleUrl } from '../src/metro-production-bundle.ts'
15
+ import { createCloudBox } from './cloud-client.ts'
16
+ import type { StorageSnapshot } from '../../sootsim-engine/src/preview/storage-snapshot-contract.ts'
17
+ import type { DeviceModel } from '../../sootsim-engine/src/settings/devices.ts'
18
+ import type { BridgeCommandType } from '../src/bridge-contract.ts'
19
19
 
20
20
  export interface SendToBoxOptions {
21
21
  /** runs one bridge command against the sim running the app. */
package/detox/index.ts CHANGED
@@ -7,7 +7,12 @@ import * as path from 'path'
7
7
  import { chromium } from 'playwright'
8
8
  import { launchReapedChromeScoped } from '../../../scripts/lib/reap-browser'
9
9
  import { pollUntil } from '../src/poll-until'
10
- import { createExpect, createWaitFor } from './expectations'
10
+ import {
11
+ createExpect,
12
+ createWaitFor,
13
+ describeNodeVisibility,
14
+ isNodeVisible,
15
+ } from './expectations'
11
16
  import {
12
17
  dispatchTwoFingerGesture,
13
18
  dragScrollNode,
@@ -725,6 +730,11 @@ function createSootSimElement(matcher: Matcher): SootSimElement {
725
730
  await waitForSootsimWorkletsIdle(page, 3000)
726
731
  const node = await findNodeByMatcher(matcher)
727
732
  if (!node) throw new Error(`element not found for tap: ${JSON.stringify(matcher)}`)
733
+ if (!isNodeVisible(node)) {
734
+ throw new Error(
735
+ `Cannot perform action due to constraint failure: element not visible (${describeNodeVisibility(node)}): ${JSON.stringify(matcher)}`,
736
+ )
737
+ }
728
738
  const defaultPoint = point ? null : await getDefaultTapPoint(page, node)
729
739
  const targetSootSimX =
730
740
  typeof point?.x === 'number'
@@ -750,6 +760,11 @@ function createSootSimElement(matcher: Matcher): SootSimElement {
750
760
  const node = await findNodeByMatcher(matcher)
751
761
  if (!node)
752
762
  throw new Error(`element not found for multiTap: ${JSON.stringify(matcher)}`)
763
+ if (!isNodeVisible(node)) {
764
+ throw new Error(
765
+ `Cannot perform action due to constraint failure: element not visible (${describeNodeVisibility(node)}): ${JSON.stringify(matcher)}`,
766
+ )
767
+ }
753
768
  const center = getNodeCenter(node)
754
769
  const pageCoords = await sootsimToPage(page, center.x, center.y)
755
770
 
@@ -775,6 +790,11 @@ function createSootSimElement(matcher: Matcher): SootSimElement {
775
790
  const node = await findNodeByMatcher(matcher)
776
791
  if (!node)
777
792
  throw new Error(`element not found for longPress: ${JSON.stringify(matcher)}`)
793
+ if (!isNodeVisible(node)) {
794
+ throw new Error(
795
+ `Cannot perform action due to constraint failure: element not visible (${describeNodeVisibility(node)}): ${JSON.stringify(matcher)}`,
796
+ )
797
+ }
778
798
  const duration = typeof pointOrDuration === 'number' ? pointOrDuration : durationArg
779
799
  const target =
780
800
  typeof pointOrDuration === 'object'
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.444 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.446 | (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.444 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.446 | (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.444 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.446 | (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.444 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.446 | (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.444 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.446 | (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.444 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.446 | (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.444 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.446 | (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.444 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.446 | (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.444 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.446 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/beta.ts
4
4
  var IS_BETA = true;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.444 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.446 | (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.444 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.446 | (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.444 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.446 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/bridge-contract.ts
4
4
  var SIM_LONG_PRESS_MAX_MS = 5e3;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.444 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.446 | (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.444 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.446 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/bridge-contract.ts
4
4
  var SIM_LONG_PRESS_DEFAULT_MS = 500;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.444 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.446 | (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.444 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.446 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/capture-contract.ts
4
4
  var RNX_SCREEN_CAPTURE_VERSION = 1;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.444 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.446 | (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.444 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.446 | (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.444 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.446 | (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;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.444 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.446 | (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.444 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.446 | (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);
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.444 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.446 | (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.444 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.446 | (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;
@@ -2319,6 +2319,11 @@ function createSootSimElement(matcher) {
2319
2319
  await waitForSootsimWorkletsIdle(page, 3e3);
2320
2320
  const node = await findNodeByMatcher(matcher);
2321
2321
  if (!node) throw new Error(`element not found for tap: ${JSON.stringify(matcher)}`);
2322
+ if (!isNodeVisible(node)) {
2323
+ throw new Error(
2324
+ `Cannot perform action due to constraint failure: element not visible (${describeNodeVisibility(node)}): ${JSON.stringify(matcher)}`
2325
+ );
2326
+ }
2322
2327
  const defaultPoint = point ? null : await getDefaultTapPoint(page, node);
2323
2328
  const targetSootSimX = typeof point?.x === "number" ? node.absolutePosition.x + point.x : defaultPoint?.x ?? node.absolutePosition.x + node.layout.width / 2;
2324
2329
  const targetSootSimY = typeof point?.y === "number" ? node.absolutePosition.y + point.y : defaultPoint?.y ?? node.absolutePosition.y + node.layout.height / 2;
@@ -2332,6 +2337,11 @@ function createSootSimElement(matcher) {
2332
2337
  const node = await findNodeByMatcher(matcher);
2333
2338
  if (!node)
2334
2339
  throw new Error(`element not found for multiTap: ${JSON.stringify(matcher)}`);
2340
+ if (!isNodeVisible(node)) {
2341
+ throw new Error(
2342
+ `Cannot perform action due to constraint failure: element not visible (${describeNodeVisibility(node)}): ${JSON.stringify(matcher)}`
2343
+ );
2344
+ }
2335
2345
  const center = getNodeCenter(node);
2336
2346
  const pageCoords = await sootsimToPage(page, center.x, center.y);
2337
2347
  for (let i = 0; i < times; i++) {
@@ -2352,6 +2362,11 @@ function createSootSimElement(matcher) {
2352
2362
  const node = await findNodeByMatcher(matcher);
2353
2363
  if (!node)
2354
2364
  throw new Error(`element not found for longPress: ${JSON.stringify(matcher)}`);
2365
+ if (!isNodeVisible(node)) {
2366
+ throw new Error(
2367
+ `Cannot perform action due to constraint failure: element not visible (${describeNodeVisibility(node)}): ${JSON.stringify(matcher)}`
2368
+ );
2369
+ }
2355
2370
  const duration = typeof pointOrDuration === "number" ? pointOrDuration : durationArg;
2356
2371
  const target = typeof pointOrDuration === "object" ? {
2357
2372
  x: node.absolutePosition.x + pointOrDuration.x,
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.444 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.446 | (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.444 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.446 | (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;