peachsim 0.1.899 → 0.1.908

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 (103) hide show
  1. package/README.md +8 -0
  2. package/cli/app-fonts.ts +27 -2
  3. package/cli/commands/box/bundle-plane.ts +13 -4
  4. package/cli/commands/box.ts +22 -1
  5. package/cli/commands/control.ts +29 -16
  6. package/cli/commands/flow.ts +8 -1
  7. package/cli/commands/platform.ts +15 -2
  8. package/cli/commands/skills.ts +125 -10
  9. package/cli/commands/upload.ts +53 -39
  10. package/cli/flow-live-status.ts +11 -6
  11. package/detox/expectations.ts +22 -15
  12. package/detox/index.ts +4 -19
  13. package/dist-lib/agent-daemon-client.cjs +1 -1
  14. package/dist-lib/agent-events.cjs +1 -1
  15. package/dist-lib/agent-identity.cjs +1 -1
  16. package/dist-lib/agent-sessions.cjs +1 -1
  17. package/dist-lib/attached-projects.cjs +1 -1
  18. package/dist-lib/auth/shared-session.cjs +1 -1
  19. package/dist-lib/backend-origin.cjs +1 -1
  20. package/dist-lib/beta.cjs +1 -1
  21. package/dist-lib/beta.mjs +1 -1
  22. package/dist-lib/bridge-constants.cjs +1 -1
  23. package/dist-lib/bridge-contract-input.cjs +1 -1
  24. package/dist-lib/bridge-contract-input.mjs +1 -1
  25. package/dist-lib/bridge-contract.cjs +1 -1
  26. package/dist-lib/bridge-contract.mjs +1 -1
  27. package/dist-lib/bundle-channel.cjs +8 -5
  28. package/dist-lib/capture-contract.cjs +1 -1
  29. package/dist-lib/capture-contract.mjs +1 -1
  30. package/dist-lib/cli-constants.cjs +1 -1
  31. package/dist-lib/cloud-contract.cjs +1 -1
  32. package/dist-lib/cloud-contract.mjs +1 -1
  33. package/dist-lib/cloud-test-args.cjs +1 -1
  34. package/dist-lib/cloud-test-args.mjs +1 -1
  35. package/dist-lib/cloud.cjs +1 -1
  36. package/dist-lib/cloud.mjs +1 -1
  37. package/dist-lib/config.cjs +1 -1
  38. package/dist-lib/detox/index.cjs +15 -18
  39. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  40. package/dist-lib/expo-swift-bundle.cjs +8 -5
  41. package/dist-lib/expo-swift-metadata.cjs +1 -1
  42. package/dist-lib/expo-swift-metadata.mjs +1 -1
  43. package/dist-lib/home-paths.cjs +1 -1
  44. package/dist-lib/host/bridge-host.cjs +8 -5
  45. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  46. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  47. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  48. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  49. package/dist-lib/host/websocket-proxy.cjs +1 -1
  50. package/dist-lib/index.cjs +1 -1
  51. package/dist-lib/jump-to-source-babel.cjs +1 -1
  52. package/dist-lib/jump-to-source-native.cjs +1 -1
  53. package/dist-lib/kotlin-host.cjs +1 -1
  54. package/dist-lib/menu.cjs +1 -1
  55. package/dist-lib/menu.mjs +1 -1
  56. package/dist-lib/metro-fingerprint-registry.cjs +1 -1
  57. package/dist-lib/metro-fingerprint-registry.mjs +1 -1
  58. package/dist-lib/metro-production-bundle.cjs +1 -1
  59. package/dist-lib/metro-production-bundle.mjs +1 -1
  60. package/dist-lib/metro.cjs +1 -1
  61. package/dist-lib/native-app-identity.cjs +1 -1
  62. package/dist-lib/native-app-identity.mjs +1 -1
  63. package/dist-lib/native-firebase-metadata.cjs +1 -1
  64. package/dist-lib/native-firebase-metadata.mjs +1 -1
  65. package/dist-lib/plist.cjs +1 -1
  66. package/dist-lib/plist.mjs +1 -1
  67. package/dist-lib/profiles.cjs +1 -1
  68. package/dist-lib/public-brand.cjs +1 -1
  69. package/dist-lib/react-native-host-modules.cjs +1 -1
  70. package/dist-lib/react-native-host-modules.mjs +1 -1
  71. package/dist-lib/render-mode.cjs +1 -1
  72. package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
  73. package/dist-lib/sdk.cjs +1 -1
  74. package/dist-lib/sdk.mjs +1 -1
  75. package/dist-lib/skills.cjs +136 -25
  76. package/dist-lib/swift-compile.cjs +1 -1
  77. package/dist-lib/swift-compile.mjs +1 -1
  78. package/dist-lib/swift-package.cjs +1 -1
  79. package/dist-lib/swift-package.mjs +1 -1
  80. package/dist-lib/swift-submit.cjs +1 -1
  81. package/dist-lib/swift-submit.mjs +1 -1
  82. package/dist-lib/swift-toolchain.cjs +1 -1
  83. package/dist-lib/swift.cjs +1 -1
  84. package/dist-lib/vite-swift.cjs +1 -1
  85. package/dist-lib/vite.cjs +1 -1
  86. package/dist-lib/worklet-executable.cjs +1 -1
  87. package/dist-lib/worklet-executable.mjs +1 -1
  88. package/kotlin/fork/NOTICE +3 -0
  89. package/kotlin/fork/README.md +10 -2
  90. package/kotlin/fork/build.sh +14 -14
  91. package/kotlin/fork/compose-worker-globals.patch +105 -0
  92. package/kotlin/fork/fork.json +3 -3
  93. package/kotlin/fork/publish.ts +8 -1
  94. package/kotlin/fork/skia-android-shaping.patch +30 -0
  95. package/kotlin/fork/skiko-local.init.gradle +10 -0
  96. package/kotlin/fork/skiko-worker-clock.patch +17 -0
  97. package/kotlin/toolchain.json +9 -9
  98. package/package.json +1 -1
  99. package/skills/peach-debug/SKILL.md +15 -153
  100. package/skills/peach-debug/references/accessibility.md +102 -0
  101. package/skills/peach-debug/references/commands.md +56 -0
  102. package/src/expo-swift-host.ts +15 -4
  103. package/src/vite-plugin.ts +3 -3
@@ -5,7 +5,7 @@
5
5
  import { dragScrollNode } from './gestures'
6
6
  import type { SootSimElement } from './element-types'
7
7
  import type { Matcher } from './matchers'
8
- import type { SootSimNodeInfo } from '@peach/globals'
8
+ import type { SootSimFocusedNodeInfo, SootSimNodeInfo } from '@peach/globals'
9
9
  import type { Page } from 'playwright-core'
10
10
 
11
11
  type FindFn = (matcher: Matcher) => Promise<any>
@@ -52,20 +52,27 @@ export function isNodeVisible(node: SootSimNodeInfo | null | undefined): boolean
52
52
  return visibleFraction(node) >= DEFAULT_VISIBILITY_THRESHOLD
53
53
  }
54
54
 
55
- // the engine tags each rendered node with its id, so DOM focus is the source of
56
- // truth for both the `expect` and `waitFor` forms of toBeFocused.
57
- async function isNodeFocused(node: any, page: Page): Promise<boolean> {
58
- const nodeId =
59
- typeof node?.nodeId === 'number'
60
- ? node.nodeId
61
- : typeof node?.id === 'number'
62
- ? node.id
63
- : null
64
- if (nodeId === null) return false
65
- return page.evaluate((id) => {
66
- const active = document.activeElement
67
- return active?.getAttribute('data-sootsim-id') === String(id)
68
- }, nodeId)
55
+ // a native host is focused when its editor child holds focus.
56
+ export function focusIsWithin(focused: SootSimFocusedNodeInfo, nodeId: number): boolean {
57
+ return focused.nodeId === nodeId || focused.ancestorNodeIds.includes(nodeId)
58
+ }
59
+
60
+ // the engine owns focus for canvas inputs and hosted native editors.
61
+ export async function isTextInputNodeFocused(
62
+ node: SootSimNodeInfo,
63
+ page: Page,
64
+ ): Promise<boolean> {
65
+ const focused = await page.evaluate(async () => window.__sootsimTest!.getFocusedNode())
66
+ return focused !== null && focusIsWithin(focused, node.nodeId)
67
+ }
68
+
69
+ async function isNodeFocused(node: SootSimNodeInfo, page: Page): Promise<boolean> {
70
+ if (node.isTextInput) return isTextInputNodeFocused(node, page)
71
+ return page.evaluate(
72
+ (nodeId) =>
73
+ document.activeElement?.getAttribute('data-sootsim-id') === String(nodeId),
74
+ node.nodeId,
75
+ )
69
76
  }
70
77
 
71
78
  export function describeNodeVisibility(node: SootSimNodeInfo | null | undefined): string {
package/detox/index.ts CHANGED
@@ -29,6 +29,8 @@ import {
29
29
  createExpect,
30
30
  createWaitFor,
31
31
  describeNodeVisibility,
32
+ focusIsWithin,
33
+ isTextInputNodeFocused,
32
34
  isNodeVisible,
33
35
  } from './expectations'
34
36
  import {
@@ -776,35 +778,18 @@ async function dispatchTapAtSootsimPoint(
776
778
  )
777
779
  }
778
780
 
779
- async function isFocusedTextInputNode(page: Page, nodeInfo: any): Promise<boolean> {
780
- const focused = await page.evaluate(
781
- async () => (await window.__sootsimTest!.getFocusedNode?.()) ?? null,
782
- )
783
- return !!focused && focusIsWithin(focused, nodeInfo?.nodeId)
784
- }
785
-
786
- // espresso's typeText taps the matched view and types into whatever took
787
- // focus, so a native host whose editor child holds focus takes the text.
788
- function focusIsWithin(
789
- focused: { nodeId: number; ancestorNodeIds: number[] },
790
- nodeId: number,
791
- ): boolean {
792
- return focused.nodeId === nodeId || focused.ancestorNodeIds.includes(nodeId)
793
- }
794
-
795
781
  async function focusElementForTextEntry(el: SootSimElement): Promise<void> {
796
782
  const page = getPage()
797
783
  const node = await findNodeByMatcher(el._matcher)
798
784
  if (!node) {
799
785
  throw new Error(`element not found for text entry: ${JSON.stringify(el._matcher)}`)
800
786
  }
801
- if (await isFocusedTextInputNode(page, node)) return
787
+ if (await isTextInputNodeFocused(node, page)) return
802
788
  await el.tap()
803
789
  // the tap reaches the worker on its own channel. keys pressed before it lands
804
790
  // would edit around a caret the tap then moves, so wait for its focus.
805
791
  await pollUntil(
806
- () =>
807
- page.evaluate(async () => (await window.__sootsimTest!.getFocusedNode?.()) ?? null),
792
+ () => page.evaluate(async () => window.__sootsimTest!.getFocusedNode()),
808
793
  (focused) => focused !== null && focusIsWithin(focused, node.nodeId),
809
794
  {
810
795
  timeoutMs: 5000,
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.899 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.908 | (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.899 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.908 | (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.899 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.908 | (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.899 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.908 | (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.899 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.908 | (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.899 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.908 | (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.899 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.908 | (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.899 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.908 | (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.899 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.908 | (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.899 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.908 | (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.899 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.908 | (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.899 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.908 | (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.899 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.908 | (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.899 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.908 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/bridge-contract.ts
4
4
  var REFUSED_PERFORM_STEP_TYPES = [
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.899 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.908 | (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;
@@ -8608,7 +8608,7 @@ async function collectExpoSwiftSources(appRoot) {
8608
8608
  const namespacesSeen = /* @__PURE__ */ new Set();
8609
8609
  let bytes = 0;
8610
8610
  let fileCount = 0;
8611
- for (const entry of Object.values(search)) {
8611
+ for (const [, entry] of Object.entries(search).sort(([a], [b]) => a.localeCompare(b))) {
8612
8612
  if (!entry || typeof entry !== "object")
8613
8613
  throw new Error("invalid Expo autolinking entry");
8614
8614
  const sourceRoot = Reflect.get(entry, "path");
@@ -8633,8 +8633,8 @@ async function collectExpoSwiftSources(appRoot) {
8633
8633
  const files2 = {};
8634
8634
  const classes = [];
8635
8635
  for (const module2 of modules) {
8636
- const className = module2 && typeof module2 === "object" ? Reflect.get(module2, "class") : null;
8637
- const name2 = module2 && typeof module2 === "object" ? Reflect.get(module2, "name") : null;
8636
+ const className = typeof module2 === "string" ? module2 : module2 && typeof module2 === "object" ? Reflect.get(module2, "class") : null;
8637
+ const name2 = typeof module2 === "string" ? null : module2 && typeof module2 === "object" ? Reflect.get(module2, "name") : null;
8638
8638
  if (typeof className !== "string" || !/^[A-Za-z_][A-Za-z0-9_]*(\.[A-Za-z_][A-Za-z0-9_]*)*$/.test(className) || name2 !== null && typeof name2 !== "string")
8639
8639
  throw new Error(`${sourceRoot}: invalid Expo Apple module descriptor`);
8640
8640
  classes.push({
@@ -8660,7 +8660,10 @@ async function collectExpoSwiftSources(appRoot) {
8660
8660
  fileCount++;
8661
8661
  if (fileCount > MAX_SWIFT_COMPILE_FILES - 2 || bytes > MAX_SWIFT_COMPILE_SOURCE_BYTES)
8662
8662
  throw new Error("Expo Swift sources exceed compile service caps");
8663
- files2[`Sources/${namespace}/${import_node_path16.default.relative(ios, file).split(import_node_path16.default.sep).join("/")}`] = `#sourceLocation(file: ${JSON.stringify(file)}, line: 1)
8663
+ files2[`Sources/${namespace}/${import_node_path16.default.relative(ios, file).split(import_node_path16.default.sep).join("/")}`] = // CocoaPods' iOS umbrella header imports UIKit into every Swift file
8664
+ // through the underlying module; these source units have no clang pod.
8665
+ `import UIKit
8666
+ #sourceLocation(file: ${JSON.stringify(file)}, line: 1)
8664
8667
  ${import_node_fs15.default.readFileSync(file, "utf8")}`;
8665
8668
  }
8666
8669
  };
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.899 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.908 | (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.899 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.908 | (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.899 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.908 | (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.899 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.908 | (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.899 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.908 | (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.899 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.908 | (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.899 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.908 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/cloud-test-args.ts
4
4
  var CLOUD_TEST_ARGS_MAX_COUNT = 32;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.899 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.908 | (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.899 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.908 | (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.899 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.908 | (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.899 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.908 | (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;
@@ -7387,13 +7387,19 @@ function visibleFraction(node) {
7387
7387
  function isNodeVisible(node) {
7388
7388
  return visibleFraction(node) >= DEFAULT_VISIBILITY_THRESHOLD;
7389
7389
  }
7390
+ function focusIsWithin(focused, nodeId) {
7391
+ return focused.nodeId === nodeId || focused.ancestorNodeIds.includes(nodeId);
7392
+ }
7393
+ async function isTextInputNodeFocused(node, page) {
7394
+ const focused = await page.evaluate(async () => window.__sootsimTest.getFocusedNode());
7395
+ return focused !== null && focusIsWithin(focused, node.nodeId);
7396
+ }
7390
7397
  async function isNodeFocused(node, page) {
7391
- const nodeId = typeof node?.nodeId === "number" ? node.nodeId : typeof node?.id === "number" ? node.id : null;
7392
- if (nodeId === null) return false;
7393
- return page.evaluate((id) => {
7394
- const active = document.activeElement;
7395
- return active?.getAttribute("data-sootsim-id") === String(id);
7396
- }, nodeId);
7398
+ if (node.isTextInput) return isTextInputNodeFocused(node, page);
7399
+ return page.evaluate(
7400
+ (nodeId) => document.activeElement?.getAttribute("data-sootsim-id") === String(nodeId),
7401
+ node.nodeId
7402
+ );
7397
7403
  }
7398
7404
  function describeNodeVisibility(node) {
7399
7405
  if (!node) return "not found";
@@ -8510,25 +8516,16 @@ async function dispatchTapAtSootsimPoint(page, x, y, token) {
8510
8516
  { x, y, token }
8511
8517
  );
8512
8518
  }
8513
- async function isFocusedTextInputNode(page, nodeInfo) {
8514
- const focused = await page.evaluate(
8515
- async () => await window.__sootsimTest.getFocusedNode?.() ?? null
8516
- );
8517
- return !!focused && focusIsWithin(focused, nodeInfo?.nodeId);
8518
- }
8519
- function focusIsWithin(focused, nodeId) {
8520
- return focused.nodeId === nodeId || focused.ancestorNodeIds.includes(nodeId);
8521
- }
8522
8519
  async function focusElementForTextEntry(el) {
8523
8520
  const page = getPage();
8524
8521
  const node = await findNodeByMatcher(el._matcher);
8525
8522
  if (!node) {
8526
8523
  throw new Error(`element not found for text entry: ${JSON.stringify(el._matcher)}`);
8527
8524
  }
8528
- if (await isFocusedTextInputNode(page, node)) return;
8525
+ if (await isTextInputNodeFocused(node, page)) return;
8529
8526
  await el.tap();
8530
8527
  await pollUntil(
8531
- () => page.evaluate(async () => await window.__sootsimTest.getFocusedNode?.() ?? null),
8528
+ () => page.evaluate(async () => window.__sootsimTest.getFocusedNode()),
8532
8529
  (focused) => focused !== null && focusIsWithin(focused, node.nodeId),
8533
8530
  {
8534
8531
  timeoutMs: 5e3,
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.899 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.908 | (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.899 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.908 | (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;
@@ -8415,7 +8415,7 @@ async function collectExpoSwiftSources(appRoot) {
8415
8415
  const namespacesSeen = /* @__PURE__ */ new Set();
8416
8416
  let bytes = 0;
8417
8417
  let fileCount = 0;
8418
- for (const entry of Object.values(search)) {
8418
+ for (const [, entry] of Object.entries(search).sort(([a], [b]) => a.localeCompare(b))) {
8419
8419
  if (!entry || typeof entry !== "object")
8420
8420
  throw new Error("invalid Expo autolinking entry");
8421
8421
  const sourceRoot = Reflect.get(entry, "path");
@@ -8440,8 +8440,8 @@ async function collectExpoSwiftSources(appRoot) {
8440
8440
  const files2 = {};
8441
8441
  const classes = [];
8442
8442
  for (const module2 of modules) {
8443
- const className = module2 && typeof module2 === "object" ? Reflect.get(module2, "class") : null;
8444
- const name2 = module2 && typeof module2 === "object" ? Reflect.get(module2, "name") : null;
8443
+ const className = typeof module2 === "string" ? module2 : module2 && typeof module2 === "object" ? Reflect.get(module2, "class") : null;
8444
+ const name2 = typeof module2 === "string" ? null : module2 && typeof module2 === "object" ? Reflect.get(module2, "name") : null;
8445
8445
  if (typeof className !== "string" || !/^[A-Za-z_][A-Za-z0-9_]*(\.[A-Za-z_][A-Za-z0-9_]*)*$/.test(className) || name2 !== null && typeof name2 !== "string")
8446
8446
  throw new Error(`${sourceRoot}: invalid Expo Apple module descriptor`);
8447
8447
  classes.push({
@@ -8467,7 +8467,10 @@ async function collectExpoSwiftSources(appRoot) {
8467
8467
  fileCount++;
8468
8468
  if (fileCount > MAX_SWIFT_COMPILE_FILES - 2 || bytes > MAX_SWIFT_COMPILE_SOURCE_BYTES)
8469
8469
  throw new Error("Expo Swift sources exceed compile service caps");
8470
- files2[`Sources/${namespace}/${import_node_path16.default.relative(ios, file).split(import_node_path16.default.sep).join("/")}`] = `#sourceLocation(file: ${JSON.stringify(file)}, line: 1)
8470
+ files2[`Sources/${namespace}/${import_node_path16.default.relative(ios, file).split(import_node_path16.default.sep).join("/")}`] = // CocoaPods' iOS umbrella header imports UIKit into every Swift file
8471
+ // through the underlying module; these source units have no clang pod.
8472
+ `import UIKit
8473
+ #sourceLocation(file: ${JSON.stringify(file)}, line: 1)
8471
8474
  ${import_node_fs15.default.readFileSync(file, "utf8")}`;
8472
8475
  }
8473
8476
  };
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.899 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.908 | (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.899 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.908 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/expoSwiftContract.ts
4
4
  function record(value) {
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.899 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.908 | (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.899 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.908 | (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;
@@ -17687,7 +17687,7 @@ async function collectExpoSwiftSources(appRoot) {
17687
17687
  const namespacesSeen = /* @__PURE__ */ new Set();
17688
17688
  let bytes = 0;
17689
17689
  let fileCount = 0;
17690
- for (const entry of Object.values(search)) {
17690
+ for (const [, entry] of Object.entries(search).sort(([a], [b]) => a.localeCompare(b))) {
17691
17691
  if (!entry || typeof entry !== "object")
17692
17692
  throw new Error("invalid Expo autolinking entry");
17693
17693
  const sourceRoot = Reflect.get(entry, "path");
@@ -17712,8 +17712,8 @@ async function collectExpoSwiftSources(appRoot) {
17712
17712
  const files2 = {};
17713
17713
  const classes = [];
17714
17714
  for (const module2 of modules) {
17715
- const className = module2 && typeof module2 === "object" ? Reflect.get(module2, "class") : null;
17716
- const name2 = module2 && typeof module2 === "object" ? Reflect.get(module2, "name") : null;
17715
+ const className = typeof module2 === "string" ? module2 : module2 && typeof module2 === "object" ? Reflect.get(module2, "class") : null;
17716
+ const name2 = typeof module2 === "string" ? null : module2 && typeof module2 === "object" ? Reflect.get(module2, "name") : null;
17717
17717
  if (typeof className !== "string" || !/^[A-Za-z_][A-Za-z0-9_]*(\.[A-Za-z_][A-Za-z0-9_]*)*$/.test(className) || name2 !== null && typeof name2 !== "string")
17718
17718
  throw new Error(`${sourceRoot}: invalid Expo Apple module descriptor`);
17719
17719
  classes.push({
@@ -17739,7 +17739,10 @@ async function collectExpoSwiftSources(appRoot) {
17739
17739
  fileCount++;
17740
17740
  if (fileCount > MAX_SWIFT_COMPILE_FILES - 2 || bytes > MAX_SWIFT_COMPILE_SOURCE_BYTES)
17741
17741
  throw new Error("Expo Swift sources exceed compile service caps");
17742
- files2[`Sources/${namespace}/${import_node_path21.default.relative(ios, file).split(import_node_path21.default.sep).join("/")}`] = `#sourceLocation(file: ${JSON.stringify(file)}, line: 1)
17742
+ files2[`Sources/${namespace}/${import_node_path21.default.relative(ios, file).split(import_node_path21.default.sep).join("/")}`] = // CocoaPods' iOS umbrella header imports UIKit into every Swift file
17743
+ // through the underlying module; these source units have no clang pod.
17744
+ `import UIKit
17745
+ #sourceLocation(file: ${JSON.stringify(file)}, line: 1)
17743
17746
  ${import_node_fs20.default.readFileSync(file, "utf8")}`;
17744
17747
  }
17745
17748
  };
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.899 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.908 | (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.899 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.908 | (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.899 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.908 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/host/fetch-proxy-overrides.ts
4
4
  var FETCH_PROXY_NATIVE_USER_AGENT_HEADER = "x-sootsim-native-user-agent";
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.899 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.908 | (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.899 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.908 | (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.899 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.908 | (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.899 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.908 | (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.899 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.908 | (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.899 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.908 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
package/dist-lib/menu.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.899 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.908 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
package/dist-lib/menu.mjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.899 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.908 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/public-brand.ts
4
4
  var name = "Peach";
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.899 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.908 | (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.899 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.908 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/is-record.ts
4
4
  function isRecord(value) {
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.899 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.908 | (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.899 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.908 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/metro-production-bundle.ts
4
4
  var RNXSIM_METRO_MODULE_PATHS_PREFIX = "globalThis.__sootsimModulePaths=";
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.899 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.908 | (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.899 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.908 | (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;