peachsim 0.1.1640 → 0.1.1641

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 (109) hide show
  1. package/README.md +5 -0
  2. package/cli/app-stubs.ts +38 -13
  3. package/cli/cloud-session.ts +16 -0
  4. package/cli/commands/assert.ts +17 -4
  5. package/cli/commands/box.ts +33 -19
  6. package/cli/commands/doctor.ts +24 -15
  7. package/cli/commands/inspect/actions.ts +3 -2
  8. package/cli/commands/inspect/core.ts +0 -8
  9. package/cli/commands/inspect.ts +0 -14
  10. package/cli/commands/platform.ts +2 -1
  11. package/cli/commands/record.ts +64 -28
  12. package/cli/commands/swift.ts +10 -2
  13. package/cli/commands/three-mode.ts +4 -38
  14. package/cli/commands/upload.ts +8 -8
  15. package/cli/flow-live-status.ts +0 -2
  16. package/cli/main.ts +1 -1
  17. package/cli/ws-bridge.ts +0 -6
  18. package/detox/attempt-events.cjs +41 -5
  19. package/detox/index.ts +155 -109
  20. package/detox/jest-environment.cjs +5 -1
  21. package/dist-lib/agent-daemon-client.cjs +1 -1
  22. package/dist-lib/agent-events.cjs +1 -1
  23. package/dist-lib/attached-projects.cjs +1 -1
  24. package/dist-lib/auth/shared-session.cjs +1 -1
  25. package/dist-lib/backend-origin.cjs +10 -1
  26. package/dist-lib/beta.cjs +1 -1
  27. package/dist-lib/beta.mjs +1 -1
  28. package/dist-lib/bridge-constants.cjs +1 -1
  29. package/dist-lib/bridge-contract-input.cjs +1 -1
  30. package/dist-lib/bridge-contract-input.mjs +1 -1
  31. package/dist-lib/bridge-contract.cjs +1 -1
  32. package/dist-lib/bridge-contract.mjs +1 -1
  33. package/dist-lib/bundle-channel.cjs +2059 -1368
  34. package/dist-lib/capture-contract.cjs +1 -1
  35. package/dist-lib/capture-contract.mjs +1 -1
  36. package/dist-lib/cloud-contract.cjs +1 -1
  37. package/dist-lib/cloud-contract.mjs +1 -1
  38. package/dist-lib/cloud-test-args.cjs +1 -1
  39. package/dist-lib/cloud-test-args.mjs +1 -1
  40. package/dist-lib/cloud.cjs +1 -1
  41. package/dist-lib/cloud.mjs +1 -1
  42. package/dist-lib/config.cjs +1 -1
  43. package/dist-lib/config.mjs +1 -1
  44. package/dist-lib/detox/index.cjs +572 -125
  45. package/dist-lib/detox/jest-environment.cjs +5 -1
  46. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  47. package/dist-lib/expo-swift-bundle.cjs +1837 -1164
  48. package/dist-lib/expo-swift-metadata.cjs +1 -1
  49. package/dist-lib/expo-swift-metadata.mjs +1 -1
  50. package/dist-lib/home-paths.cjs +1 -1
  51. package/dist-lib/host/bridge-host.cjs +2290 -1616
  52. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  53. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  54. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  55. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  56. package/dist-lib/host/websocket-proxy.cjs +1 -1
  57. package/dist-lib/index.cjs +44 -17
  58. package/dist-lib/jump-to-source-babel.cjs +1 -1
  59. package/dist-lib/jump-to-source-native.cjs +1 -1
  60. package/dist-lib/kotlin-host.cjs +1 -1
  61. package/dist-lib/menu.cjs +1 -1
  62. package/dist-lib/menu.mjs +1 -1
  63. package/dist-lib/metro-fingerprint-registry.cjs +1 -1
  64. package/dist-lib/metro-fingerprint-registry.mjs +1 -1
  65. package/dist-lib/metro-production-bundle.cjs +1 -1
  66. package/dist-lib/metro-production-bundle.mjs +1 -1
  67. package/dist-lib/metro.cjs +33 -13
  68. package/dist-lib/native-app-identity-project.cjs +7 -4
  69. package/dist-lib/native-app-identity-project.mjs +7 -4
  70. package/dist-lib/native-app-identity.cjs +1 -1
  71. package/dist-lib/native-app-identity.mjs +1 -1
  72. package/dist-lib/native-firebase-metadata.cjs +1 -1
  73. package/dist-lib/native-firebase-metadata.mjs +1 -1
  74. package/dist-lib/plist.cjs +1 -1
  75. package/dist-lib/plist.mjs +1 -1
  76. package/dist-lib/profiles.cjs +1 -1
  77. package/dist-lib/public-brand.cjs +1 -1
  78. package/dist-lib/react-native-host-modules.cjs +1 -1
  79. package/dist-lib/react-native-host-modules.mjs +1 -1
  80. package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
  81. package/dist-lib/sdk.cjs +4 -3
  82. package/dist-lib/sdk.mjs +4 -3
  83. package/dist-lib/skills.cjs +2823 -2109
  84. package/dist-lib/swift-compile.cjs +370 -239
  85. package/dist-lib/swift-compile.mjs +368 -230
  86. package/dist-lib/swift-package.cjs +1 -1
  87. package/dist-lib/swift-package.mjs +1 -1
  88. package/dist-lib/swift-submit.cjs +8 -3
  89. package/dist-lib/swift-submit.mjs +8 -3
  90. package/dist-lib/swift-toolchain.cjs +1 -1
  91. package/dist-lib/swift.cjs +1 -1
  92. package/dist-lib/vite-swift.cjs +1757 -1108
  93. package/dist-lib/vite.cjs +1 -1
  94. package/dist-lib/worklet-executable.cjs +1 -1
  95. package/dist-lib/worklet-executable.mjs +1 -1
  96. package/package.json +1 -1
  97. package/src/backend-origin.ts +8 -0
  98. package/src/react-native-bridge-modules.ts +89 -76
  99. package/src/swift-compile.ts +134 -107
  100. package/src/swift-distribution.lock.json +9 -8
  101. package/src/swift-host.ts +6 -4
  102. package/src/swift-objc-compile.ts +385 -193
  103. package/src/swift-objc-metadata.ts +204 -0
  104. package/src/swift-objc-sdk.ts +195 -2
  105. package/src/swift-package-manifest.ts +6 -3
  106. package/src/swift-root-lock.ts +153 -0
  107. package/src/swift-submit.ts +15 -2
  108. package/src/swiftContract.ts +12 -0
  109. package/src/xcode-project.ts +10 -3
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.1640 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1641 | (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
- /*! peach v0.1.1640 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1641 | (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
- /*! peach v0.1.1640 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1641 | (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
- /*! peach v0.1.1640 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1641 | (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
- /*! peach v0.1.1640 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1641 | (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
- /*! peach v0.1.1640 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1641 | (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;
@@ -5532,15 +5532,28 @@ function packageNativeRequests(dir) {
5532
5532
  }
5533
5533
  function dependencyNativeOwners(appDir, manifest) {
5534
5534
  const owners = /* @__PURE__ */ new Map();
5535
- for (const name2 of Object.keys({
5535
+ const pending = Object.keys({
5536
5536
  ...manifest?.devDependencies,
5537
5537
  ...manifest?.dependencies
5538
- })) {
5539
- const dir = installedPackageDir(appDir, name2);
5540
- if (!dir || !dir.split("/").includes("node_modules")) continue;
5541
- for (const request of packageNativeRequests(dir))
5542
- if (!owners.has(`${request.kind}:${request.name}`))
5543
- owners.set(`${request.kind}:${request.name}`, name2);
5538
+ }).map((name2) => ({ from: appDir, name: name2 }));
5539
+ const visited = /* @__PURE__ */ new Set();
5540
+ for (let index = 0; index < pending.length; index++) {
5541
+ const { from, name: name2 } = pending[index];
5542
+ const dir = installedPackageDir(from, name2);
5543
+ if (!dir || visited.has(dir)) continue;
5544
+ visited.add(dir);
5545
+ const dependency = readProjectManifest(dir);
5546
+ const optional = readPackageJson(dir)?.optionalDependencies;
5547
+ if (dir.split("/").includes("node_modules") && (from === appDir || hasNativeCode(dir, "ios"))) {
5548
+ for (const request of packageNativeRequests(dir))
5549
+ if (!owners.has(`${request.kind}:${request.name}`))
5550
+ owners.set(`${request.kind}:${request.name}`, dependency?.name ?? name2);
5551
+ }
5552
+ for (const child of Object.keys({
5553
+ ...dependency?.dependencies,
5554
+ ...isRecord(optional) ? optional : {}
5555
+ }))
5556
+ pending.push({ from: dir, name: child });
5544
5557
  }
5545
5558
  return owners;
5546
5559
  }
@@ -5672,7 +5685,9 @@ function scanLocalNative(appDir, pkg, answered, platform, knownPackages = /* @__
5672
5685
  expoModuleDirs.map((dir) => [
5673
5686
  dir,
5674
5687
  scanRepository(dir).directories.flatMap(
5675
- (sub) => listDir(sub).filter((name2) => NATIVE_SOURCE_FILE.test(name2)).map((name2) => (0, import_node_path16.join)(sub, name2))
5688
+ (sub) => listDir(sub).filter(
5689
+ (name2) => NATIVE_SOURCE_FILE.test(name2) && (!platform || (platform === "ios" ? name2.endsWith(".swift") : name2.endsWith(".kt")))
5690
+ ).map((name2) => (0, import_node_path16.join)(sub, name2))
5676
5691
  )
5677
5692
  ])
5678
5693
  );
@@ -5701,7 +5716,9 @@ function scanLocalNative(appDir, pkg, answered, platform, knownPackages = /* @__
5701
5716
  path: `${(0, import_node_path16.relative)(appDir, file)}:${line}`,
5702
5717
  expoModule: moduleDir ? (0, import_node_path16.relative)(appDir, moduleDir) || "." : null,
5703
5718
  swift: moduleDir ? (nativeFilesByModule.get(moduleDir) ?? []).some(
5704
- (path20) => path20.endsWith(".swift")
5719
+ (path20) => path20.endsWith(".swift") && [...(readSmallFile(path20) ?? "").matchAll(/\bName\(\s*"(\w+)"\s*\)/g)].some(
5720
+ (match) => match[1] === name2
5721
+ )
5705
5722
  ) : false,
5706
5723
  answered: answered[kind].has(name2)
5707
5724
  });
@@ -7269,6 +7286,8 @@ function createCloudSession(input) {
7269
7286
  return session;
7270
7287
  }
7271
7288
  function createCloudBoxSession(input) {
7289
+ if (input.appFontsWireSha256 !== void 0 && !/^[a-f0-9]{64}$/.test(input.appFontsWireSha256))
7290
+ throw new Error("cloud box session has an invalid app-font wire digest");
7272
7291
  const session = {
7273
7292
  version: CLOUD_SESSION_VERSION,
7274
7293
  service: "box",
@@ -7277,7 +7296,8 @@ function createCloudBoxSession(input) {
7277
7296
  apiOrigin: normalizeCloudOrigin(input.apiOrigin.trim()),
7278
7297
  ...input.platform ? { platform: input.platform } : {},
7279
7298
  ...input.device?.trim() ? { device: input.device.trim() } : {},
7280
- ...input.artifact ? { artifact: input.artifact } : {}
7299
+ ...input.artifact ? { artifact: input.artifact } : {},
7300
+ ...input.appFontsWireSha256 !== void 0 ? { appFontsWireSha256: input.appFontsWireSha256 } : {}
7281
7301
  };
7282
7302
  if (!session.boxId || !session.boxToken) {
7283
7303
  throw new Error("cloud box session requires a box, an origin, and a box token");
@@ -7318,13 +7338,16 @@ function parseCloudSession(encoded) {
7318
7338
  try {
7319
7339
  if (parsed.service === "box") {
7320
7340
  if (!boxId || !boxToken) throw new Error("unreadable cloud box session");
7341
+ if (parsed.appFontsWireSha256 !== void 0 && typeof parsed.appFontsWireSha256 !== "string")
7342
+ throw new Error("unreadable app-font wire digest");
7321
7343
  return createCloudBoxSession({
7322
7344
  boxId,
7323
7345
  boxToken,
7324
7346
  apiOrigin,
7325
7347
  platform,
7326
7348
  device,
7327
- artifact
7349
+ artifact,
7350
+ appFontsWireSha256: parsed.appFontsWireSha256
7328
7351
  });
7329
7352
  }
7330
7353
  const simId = parsed.simId;
@@ -10381,9 +10404,10 @@ async function tapByText(bridge, query, options = {}, opts = {}) {
10381
10404
  });
10382
10405
  }
10383
10406
  async function resolveTextTapTarget(bridge, query, options = {}) {
10407
+ const needle = options.exact ? query : query.trim().toLowerCase();
10408
+ if (!needle) return { matched: 0, total: 0 };
10384
10409
  const { tree } = await inspectTree(bridge, 50);
10385
10410
  if (!Array.isArray(tree)) return { matched: 0, total: 0 };
10386
- const needle = options.exact ? query : query.toLowerCase();
10387
10411
  let candidates = collectTextCandidates(tree).filter(
10388
10412
  ({ node: node2, ancestorTestIDs, role }) => {
10389
10413
  const text2 = nodeText(node2);
@@ -10407,7 +10431,7 @@ async function resolveTextTapTarget(bridge, query, options = {}) {
10407
10431
  if (actionable.length > 0) candidates = actionable;
10408
10432
  if (!options.exact) {
10409
10433
  const whole = candidates.filter(
10410
- ({ node: node2 }) => nodeText(node2).trim().toLowerCase() === needle.trim()
10434
+ ({ node: node2 }) => nodeText(node2).trim().toLowerCase() === needle
10411
10435
  );
10412
10436
  if (whole.length > 0) candidates = whole;
10413
10437
  }
@@ -15908,11 +15932,14 @@ function targetSettings(ref, configuration, builtins, options = {}) {
15908
15932
  if (!config) return [];
15909
15933
  const name2 = str(config.name) ?? configuration;
15910
15934
  const base = str(config.baseConfigurationReference);
15935
+ const anchor = str(config.baseConfigurationReferenceAnchor);
15936
+ const relative3 = str(config.baseConfigurationReferenceRelativePath);
15911
15937
  const own = isDict(config.buildSettings) ? config.buildSettings : {};
15912
- const baseFile = base ? project.resolvePath(base) : null;
15913
- if (options.requireSources !== false && base && (!baseFile || !import_node_fs13.default.existsSync(baseFile)))
15938
+ const directory = anchor ? project.resolvePath(anchor) : null;
15939
+ const baseFile = base ? project.resolvePath(base) : directory && relative3 ? import_node_path13.default.resolve(directory, relative3) : null;
15940
+ if (options.requireSources !== false && (base || anchor || relative3) && (!baseFile || !import_node_fs13.default.existsSync(baseFile)))
15914
15941
  throw new Error(
15915
- `Unable to open base configuration reference file '${baseFile ?? base}'`
15942
+ `Unable to open base configuration reference file '${baseFile ?? base ?? relative3 ?? anchor}'`
15916
15943
  );
15917
15944
  const read = [];
15918
15945
  const fromFile = baseFile ? readXcconfig(baseFile, read) : {};
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.1640 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1641 | (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
- /*! peach v0.1.1640 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1641 | (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
- /*! peach v0.1.1640 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1641 | (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
- /*! peach v0.1.1640 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1641 | (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
- /*! peach v0.1.1640 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1641 | (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
- /*! peach v0.1.1640 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1641 | (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
- /*! peach v0.1.1640 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1641 | (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
- /*! peach v0.1.1640 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1641 | (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
- /*! peach v0.1.1640 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1641 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  var __defProp = Object.defineProperty;
3
3
  var __getOwnPropNames = Object.getOwnPropertyNames;
4
4
  var __esm = (fn, res) => function __init() {
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.1640 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1641 | (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;
@@ -5500,15 +5500,28 @@ function packageNativeRequests(dir) {
5500
5500
  }
5501
5501
  function dependencyNativeOwners(appDir, manifest) {
5502
5502
  const owners = /* @__PURE__ */ new Map();
5503
- for (const name2 of Object.keys({
5503
+ const pending = Object.keys({
5504
5504
  ...manifest?.devDependencies,
5505
5505
  ...manifest?.dependencies
5506
- })) {
5507
- const dir = installedPackageDir(appDir, name2);
5508
- if (!dir || !dir.split("/").includes("node_modules")) continue;
5509
- for (const request of packageNativeRequests(dir))
5510
- if (!owners.has(`${request.kind}:${request.name}`))
5511
- owners.set(`${request.kind}:${request.name}`, name2);
5506
+ }).map((name2) => ({ from: appDir, name: name2 }));
5507
+ const visited = /* @__PURE__ */ new Set();
5508
+ for (let index = 0; index < pending.length; index++) {
5509
+ const { from, name: name2 } = pending[index];
5510
+ const dir = installedPackageDir(from, name2);
5511
+ if (!dir || visited.has(dir)) continue;
5512
+ visited.add(dir);
5513
+ const dependency = readProjectManifest(dir);
5514
+ const optional = readPackageJson(dir)?.optionalDependencies;
5515
+ if (dir.split("/").includes("node_modules") && (from === appDir || hasNativeCode(dir, "ios"))) {
5516
+ for (const request of packageNativeRequests(dir))
5517
+ if (!owners.has(`${request.kind}:${request.name}`))
5518
+ owners.set(`${request.kind}:${request.name}`, dependency?.name ?? name2);
5519
+ }
5520
+ for (const child of Object.keys({
5521
+ ...dependency?.dependencies,
5522
+ ...isRecord(optional) ? optional : {}
5523
+ }))
5524
+ pending.push({ from: dir, name: child });
5512
5525
  }
5513
5526
  return owners;
5514
5527
  }
@@ -5640,7 +5653,9 @@ function scanLocalNative(appDir, pkg, answered, platform, knownPackages = /* @__
5640
5653
  expoModuleDirs.map((dir) => [
5641
5654
  dir,
5642
5655
  scanRepository(dir).directories.flatMap(
5643
- (sub) => listDir(sub).filter((name2) => NATIVE_SOURCE_FILE.test(name2)).map((name2) => (0, import_node_path10.join)(sub, name2))
5656
+ (sub) => listDir(sub).filter(
5657
+ (name2) => NATIVE_SOURCE_FILE.test(name2) && (!platform || (platform === "ios" ? name2.endsWith(".swift") : name2.endsWith(".kt")))
5658
+ ).map((name2) => (0, import_node_path10.join)(sub, name2))
5644
5659
  )
5645
5660
  ])
5646
5661
  );
@@ -5669,7 +5684,9 @@ function scanLocalNative(appDir, pkg, answered, platform, knownPackages = /* @__
5669
5684
  path: `${(0, import_node_path10.relative)(appDir, file)}:${line}`,
5670
5685
  expoModule: moduleDir ? (0, import_node_path10.relative)(appDir, moduleDir) || "." : null,
5671
5686
  swift: moduleDir ? (nativeFilesByModule.get(moduleDir) ?? []).some(
5672
- (path14) => path14.endsWith(".swift")
5687
+ (path14) => path14.endsWith(".swift") && [...(readSmallFile(path14) ?? "").matchAll(/\bName\(\s*"(\w+)"\s*\)/g)].some(
5688
+ (match) => match[1] === name2
5689
+ )
5673
5690
  ) : false,
5674
5691
  answered: answered[kind].has(name2)
5675
5692
  });
@@ -9948,11 +9965,14 @@ function targetSettings(ref, configuration, builtins, options = {}) {
9948
9965
  if (!config) return [];
9949
9966
  const name2 = str(config.name) ?? configuration;
9950
9967
  const base = str(config.baseConfigurationReference);
9968
+ const anchor = str(config.baseConfigurationReferenceAnchor);
9969
+ const relative3 = str(config.baseConfigurationReferenceRelativePath);
9951
9970
  const own = isDict(config.buildSettings) ? config.buildSettings : {};
9952
- const baseFile = base ? project.resolvePath(base) : null;
9953
- if (options.requireSources !== false && base && (!baseFile || !import_node_fs5.default.existsSync(baseFile)))
9971
+ const directory = anchor ? project.resolvePath(anchor) : null;
9972
+ const baseFile = base ? project.resolvePath(base) : directory && relative3 ? import_node_path5.default.resolve(directory, relative3) : null;
9973
+ if (options.requireSources !== false && (base || anchor || relative3) && (!baseFile || !import_node_fs5.default.existsSync(baseFile)))
9954
9974
  throw new Error(
9955
- `Unable to open base configuration reference file '${baseFile ?? base}'`
9975
+ `Unable to open base configuration reference file '${baseFile ?? base ?? relative3 ?? anchor}'`
9956
9976
  );
9957
9977
  const read = [];
9958
9978
  const fromFile = baseFile ? readXcconfig(baseFile, read) : {};
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.1640 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1641 | (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;
@@ -2832,11 +2832,14 @@ function targetSettings(ref, configuration, builtins, options = {}) {
2832
2832
  if (!config) return [];
2833
2833
  const name = str(config.name) ?? configuration;
2834
2834
  const base = str(config.baseConfigurationReference);
2835
+ const anchor = str(config.baseConfigurationReferenceAnchor);
2836
+ const relative = str(config.baseConfigurationReferenceRelativePath);
2835
2837
  const own = isDict(config.buildSettings) ? config.buildSettings : {};
2836
- const baseFile = base ? project.resolvePath(base) : null;
2837
- if (options.requireSources !== false && base && (!baseFile || !import_node_fs.default.existsSync(baseFile)))
2838
+ const directory = anchor ? project.resolvePath(anchor) : null;
2839
+ const baseFile = base ? project.resolvePath(base) : directory && relative ? import_node_path2.default.resolve(directory, relative) : null;
2840
+ if (options.requireSources !== false && (base || anchor || relative) && (!baseFile || !import_node_fs.default.existsSync(baseFile)))
2838
2841
  throw new Error(
2839
- `Unable to open base configuration reference file '${baseFile ?? base}'`
2842
+ `Unable to open base configuration reference file '${baseFile ?? base ?? relative ?? anchor}'`
2840
2843
  );
2841
2844
  const read = [];
2842
2845
  const fromFile = baseFile ? readXcconfig(baseFile, read) : {};
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.1640 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1641 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
 
3
3
  // src/native-app-identity-project.ts
4
4
  import fs2 from "node:fs";
@@ -1441,11 +1441,14 @@ function targetSettings(ref, configuration, builtins, options = {}) {
1441
1441
  if (!config) return [];
1442
1442
  const name = str(config.name) ?? configuration;
1443
1443
  const base = str(config.baseConfigurationReference);
1444
+ const anchor = str(config.baseConfigurationReferenceAnchor);
1445
+ const relative = str(config.baseConfigurationReferenceRelativePath);
1444
1446
  const own = isDict(config.buildSettings) ? config.buildSettings : {};
1445
- const baseFile = base ? project.resolvePath(base) : null;
1446
- if (options.requireSources !== false && base && (!baseFile || !fs.existsSync(baseFile)))
1447
+ const directory = anchor ? project.resolvePath(anchor) : null;
1448
+ const baseFile = base ? project.resolvePath(base) : directory && relative ? path2.resolve(directory, relative) : null;
1449
+ if (options.requireSources !== false && (base || anchor || relative) && (!baseFile || !fs.existsSync(baseFile)))
1447
1450
  throw new Error(
1448
- `Unable to open base configuration reference file '${baseFile ?? base}'`
1451
+ `Unable to open base configuration reference file '${baseFile ?? base ?? relative ?? anchor}'`
1449
1452
  );
1450
1453
  const read = [];
1451
1454
  const fromFile = baseFile ? readXcconfig(baseFile, read) : {};
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.1640 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1641 | (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
- /*! peach v0.1.1640 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1641 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
 
3
3
  // src/android-string-value.ts
4
4
  function compileAndroidStringValue(text, where) {
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.1640 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1641 | (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
- /*! peach v0.1.1640 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1641 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
 
3
3
  // src/bundleGlobalFooter.ts
4
4
  function findBundleFooter(source, prefix) {
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.1640 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1641 | (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
- /*! peach v0.1.1640 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1641 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
 
3
3
  // src/plist.ts
4
4
  import plist from "plist";
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.1640 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1641 | (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
- /*! peach v0.1.1640 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1641 | (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
- /*! peach v0.1.1640 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1641 | (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
- /*! peach v0.1.1640 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1641 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
 
3
3
  // src/react-native-host-modules.ts
4
4
  var REACT_NATIVE_PASSTHROUGH_SPECIFIERS = [
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.1640 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1641 | (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/sdk.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.1640 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1641 | (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;
@@ -2497,9 +2497,10 @@ async function tapByText(bridge, query, options = {}, opts = {}) {
2497
2497
  });
2498
2498
  }
2499
2499
  async function resolveTextTapTarget(bridge, query, options = {}) {
2500
+ const needle = options.exact ? query : query.trim().toLowerCase();
2501
+ if (!needle) return { matched: 0, total: 0 };
2500
2502
  const { tree } = await inspectTree(bridge, 50);
2501
2503
  if (!Array.isArray(tree)) return { matched: 0, total: 0 };
2502
- const needle = options.exact ? query : query.toLowerCase();
2503
2504
  let candidates = collectTextCandidates(tree).filter(
2504
2505
  ({ node: node2, ancestorTestIDs, role }) => {
2505
2506
  const text = nodeText(node2);
@@ -2523,7 +2524,7 @@ async function resolveTextTapTarget(bridge, query, options = {}) {
2523
2524
  if (actionable.length > 0) candidates = actionable;
2524
2525
  if (!options.exact) {
2525
2526
  const whole = candidates.filter(
2526
- ({ node: node2 }) => nodeText(node2).trim().toLowerCase() === needle.trim()
2527
+ ({ node: node2 }) => nodeText(node2).trim().toLowerCase() === needle
2527
2528
  );
2528
2529
  if (whole.length > 0) candidates = whole;
2529
2530
  }
package/dist-lib/sdk.mjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.1640 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1641 | (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);
@@ -2392,9 +2392,10 @@ async function tapByText(bridge, query, options = {}, opts = {}) {
2392
2392
  });
2393
2393
  }
2394
2394
  async function resolveTextTapTarget(bridge, query, options = {}) {
2395
+ const needle = options.exact ? query : query.trim().toLowerCase();
2396
+ if (!needle) return { matched: 0, total: 0 };
2395
2397
  const { tree } = await inspectTree(bridge, 50);
2396
2398
  if (!Array.isArray(tree)) return { matched: 0, total: 0 };
2397
- const needle = options.exact ? query : query.toLowerCase();
2398
2399
  let candidates = collectTextCandidates(tree).filter(
2399
2400
  ({ node: node2, ancestorTestIDs, role }) => {
2400
2401
  const text = nodeText(node2);
@@ -2418,7 +2419,7 @@ async function resolveTextTapTarget(bridge, query, options = {}) {
2418
2419
  if (actionable.length > 0) candidates = actionable;
2419
2420
  if (!options.exact) {
2420
2421
  const whole = candidates.filter(
2421
- ({ node: node2 }) => nodeText(node2).trim().toLowerCase() === needle.trim()
2422
+ ({ node: node2 }) => nodeText(node2).trim().toLowerCase() === needle
2422
2423
  );
2423
2424
  if (whole.length > 0) candidates = whole;
2424
2425
  }