peachsim 0.1.1469 → 0.1.1481

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 (102) hide show
  1. package/cli/commands/control.ts +68 -42
  2. package/cli/commands/detox.ts +15 -10
  3. package/cli/commands/flow.ts +1 -2
  4. package/cli/commands/inspect/settling.ts +5 -1
  5. package/cli/commands/setup.ts +20 -13
  6. package/cli/commands/test.ts +2 -1
  7. package/cli/dev-build-freshness.ts +14 -14
  8. package/cli/drivers/playwright-sim-host.ts +7 -2
  9. package/cli/drivers/playwright.ts +6 -6
  10. package/cli/outbound-endpoints.ts +80 -6
  11. package/detox/index.ts +27 -14
  12. package/detox/matchers.ts +17 -6
  13. package/dist-lib/agent-daemon-client.cjs +1 -1
  14. package/dist-lib/agent-events.cjs +1 -1
  15. package/dist-lib/attached-projects.cjs +1 -1
  16. package/dist-lib/auth/shared-session.cjs +1 -1
  17. package/dist-lib/backend-origin.cjs +1 -1
  18. package/dist-lib/beta.cjs +1 -1
  19. package/dist-lib/beta.mjs +1 -1
  20. package/dist-lib/bridge-constants.cjs +1 -1
  21. package/dist-lib/bridge-contract-input.cjs +1 -1
  22. package/dist-lib/bridge-contract-input.mjs +1 -1
  23. package/dist-lib/bridge-contract.cjs +1 -1
  24. package/dist-lib/bridge-contract.mjs +1 -1
  25. package/dist-lib/bundle-channel.cjs +54 -15
  26. package/dist-lib/capture-contract.cjs +1 -1
  27. package/dist-lib/capture-contract.mjs +1 -1
  28. package/dist-lib/cloud-contract.cjs +1 -1
  29. package/dist-lib/cloud-contract.mjs +1 -1
  30. package/dist-lib/cloud-test-args.cjs +1 -1
  31. package/dist-lib/cloud-test-args.mjs +1 -1
  32. package/dist-lib/cloud.cjs +1 -1
  33. package/dist-lib/cloud.mjs +1 -1
  34. package/dist-lib/config.cjs +19 -3
  35. package/dist-lib/config.mjs +19 -3
  36. package/dist-lib/detox/index.cjs +125 -52
  37. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  38. package/dist-lib/expo-swift-bundle.cjs +30 -9
  39. package/dist-lib/expo-swift-metadata.cjs +18 -6
  40. package/dist-lib/expo-swift-metadata.mjs +18 -6
  41. package/dist-lib/home-paths.cjs +1 -1
  42. package/dist-lib/host/bridge-host.cjs +621 -390
  43. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  44. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  45. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  46. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  47. package/dist-lib/host/websocket-proxy.cjs +1 -1
  48. package/dist-lib/index.cjs +46 -19
  49. package/dist-lib/jump-to-source-babel.cjs +1 -1
  50. package/dist-lib/jump-to-source-native.cjs +1 -1
  51. package/dist-lib/kotlin-host.cjs +1 -1
  52. package/dist-lib/menu.cjs +1 -1
  53. package/dist-lib/menu.mjs +1 -1
  54. package/dist-lib/metro-fingerprint-registry.cjs +1 -1
  55. package/dist-lib/metro-fingerprint-registry.mjs +1 -1
  56. package/dist-lib/metro-production-bundle.cjs +24 -6
  57. package/dist-lib/metro-production-bundle.mjs +22 -6
  58. package/dist-lib/metro.cjs +41 -18
  59. package/dist-lib/native-app-identity-project.cjs +1 -1
  60. package/dist-lib/native-app-identity-project.mjs +1 -1
  61. package/dist-lib/native-app-identity.cjs +19 -5
  62. package/dist-lib/native-app-identity.mjs +19 -5
  63. package/dist-lib/native-firebase-metadata.cjs +22 -7
  64. package/dist-lib/native-firebase-metadata.mjs +20 -7
  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 +3 -1
  70. package/dist-lib/react-native-host-modules.mjs +3 -1
  71. package/dist-lib/scripts/dev-server-scanner.cjs +404 -279
  72. package/dist-lib/sdk.cjs +6 -2
  73. package/dist-lib/sdk.mjs +6 -2
  74. package/dist-lib/skills.cjs +757 -531
  75. package/dist-lib/swift-compile.cjs +7 -2
  76. package/dist-lib/swift-compile.mjs +7 -2
  77. package/dist-lib/swift-package.cjs +1 -1
  78. package/dist-lib/swift-package.mjs +1 -1
  79. package/dist-lib/swift-submit.cjs +1 -1
  80. package/dist-lib/swift-submit.mjs +1 -1
  81. package/dist-lib/swift-toolchain.cjs +1 -1
  82. package/dist-lib/swift.cjs +1 -1
  83. package/dist-lib/vite-swift.cjs +7 -2
  84. package/dist-lib/vite.cjs +1 -1
  85. package/dist-lib/worklet-executable.cjs +27 -7
  86. package/dist-lib/worklet-executable.mjs +27 -7
  87. package/package.json +1 -1
  88. package/scripts/dev-server-scanner.ts +493 -188
  89. package/src/admitted-mac-build.ts +12 -0
  90. package/src/bridge-constants.ts +5 -3
  91. package/src/bundleGlobalFooter.ts +26 -3
  92. package/src/config.ts +3 -2
  93. package/src/configured-bundle-producer.ts +2 -1
  94. package/src/expo-swift-host.ts +33 -7
  95. package/src/host/bridge-host.ts +34 -6
  96. package/src/metro-production-bundle.ts +11 -4
  97. package/src/native-app-identity.ts +3 -2
  98. package/src/native-firebase-metadata.ts +5 -3
  99. package/src/react-native-host-modules.ts +2 -0
  100. package/src/swift-compile.ts +5 -4
  101. package/src/worker-system-chunks.ts +61 -58
  102. package/src/worklet-executable.ts +38 -6
package/detox/index.ts CHANGED
@@ -657,10 +657,19 @@ export async function waitForSootsimIdle(
657
657
  // find a node in the sootsim tree matching a matcher descriptor
658
658
  async function findNodeByMatcher(matcher: Matcher): Promise<any> {
659
659
  const page = getPage()
660
- if (matcher.index !== undefined || matcher.type === 'text') {
660
+ if (
661
+ matcher.regexFlags !== undefined ||
662
+ matcher.index !== undefined ||
663
+ matcher.type === 'text'
664
+ ) {
661
665
  return page.evaluate(async (indexedMatcher: Matcher) => {
662
- const filter =
663
- indexedMatcher.type === 'id'
666
+ const regex =
667
+ indexedMatcher.regexFlags !== undefined
668
+ ? new RegExp(indexedMatcher.value, indexedMatcher.regexFlags)
669
+ : null
670
+ const filter = regex
671
+ ? {}
672
+ : indexedMatcher.type === 'id'
664
673
  ? { hasId: indexedMatcher.value }
665
674
  : indexedMatcher.type === 'text'
666
675
  ? { hasText: indexedMatcher.value }
@@ -670,16 +679,18 @@ async function findNodeByMatcher(matcher: Matcher): Promise<any> {
670
679
  ? { hasRole: indexedMatcher.value }
671
680
  : { type: indexedMatcher.value }
672
681
  const results = await window.__sootsimTest!.queryAll(filter)
673
- // detox by.text matches exact text elements, with or without an index.
674
- // hasText also matches ancestors and substrings, which are not targets.
675
- const indexed =
676
- indexedMatcher.type === 'text'
677
- ? results.filter(
678
- (node) =>
679
- (node.type === 'text' || node.nodeId < 0) &&
680
- node.text === indexedMatcher.value,
681
- )
682
- : results
682
+ // text targets exclude ancestors; string values keep exact matching.
683
+ const indexed = results.filter((node) => {
684
+ if (indexedMatcher.type === 'text' && node.type !== 'text' && node.nodeId >= 0)
685
+ return false
686
+ if (!regex)
687
+ return indexedMatcher.type !== 'text' || node.text === indexedMatcher.value
688
+ const matches = (value: string | null) =>
689
+ typeof value === 'string' && regex.test(value)
690
+ if (indexedMatcher.type === 'id') return matches(node.testID) || matches(node.id)
691
+ if (indexedMatcher.type === 'text') return matches(node.text)
692
+ return matches(node.accessibilityLabel || (node.accessible ? node.text : null))
693
+ })
683
694
  return indexed[indexedMatcher.index ?? 0] ?? null
684
695
  }, matcher)
685
696
  }
@@ -1290,8 +1301,10 @@ function createSootSimElement(matcher: Matcher): SootSimElement {
1290
1301
  async replaceText(text: string) {
1291
1302
  const page = getPage()
1292
1303
  const node = await findNodeByMatcher(matcher)
1304
+ const resolvedId = node?.testID ?? node?.id
1293
1305
  if (
1294
1306
  matcher.type === 'id' &&
1307
+ typeof resolvedId === 'string' &&
1295
1308
  typeof node?.nodeId === 'number' &&
1296
1309
  node.nodeId >= 0x40000000
1297
1310
  ) {
@@ -1301,7 +1314,7 @@ function createSootSimElement(matcher: Matcher): SootSimElement {
1301
1314
  if (typeof mainShell?.callTestBridge !== 'function') return false
1302
1315
  return mainShell.callTestBridge('replaceTextByTestId', id, value)
1303
1316
  },
1304
- { id: matcher.value, value: text },
1317
+ { id: resolvedId, value: text },
1305
1318
  )
1306
1319
  if (replaced === true) return
1307
1320
  }
package/detox/matchers.ts CHANGED
@@ -4,20 +4,31 @@
4
4
  export interface Matcher {
5
5
  type: 'id' | 'text' | 'label' | 'type' | 'role'
6
6
  value: string
7
+ regexFlags?: string
7
8
  index?: number
8
9
  }
9
10
 
11
+ function createMatcher(type: 'id' | 'text' | 'label', value: string | RegExp): Matcher {
12
+ if (typeof value === 'string') return { type, value }
13
+ // detox ignores global and sticky state and always uses unicode matching.
14
+ return {
15
+ type,
16
+ value: value.source,
17
+ regexFlags: value.flags.replace(/[^ims]/g, '') + 'u',
18
+ }
19
+ }
20
+
10
21
  export const by = {
11
- id(testID: string): Matcher {
12
- return { type: 'id', value: testID }
22
+ id(testID: string | RegExp): Matcher {
23
+ return createMatcher('id', testID)
13
24
  },
14
25
 
15
- text(text: string): Matcher {
16
- return { type: 'text', value: text }
26
+ text(text: string | RegExp): Matcher {
27
+ return createMatcher('text', text)
17
28
  },
18
29
 
19
- label(accessibilityLabel: string): Matcher {
20
- return { type: 'label', value: accessibilityLabel }
30
+ label(accessibilityLabel: string | RegExp): Matcher {
31
+ return createMatcher('label', accessibilityLabel)
21
32
  },
22
33
 
23
34
  type(nativeType: string): Matcher {
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.1469 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1481 | (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.1469 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1481 | (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.1469 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1481 | (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.1469 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1481 | (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.1469 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1481 | (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
- /*! peach v0.1.1469 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1481 | (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
- /*! peach v0.1.1469 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1481 | (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
- /*! peach v0.1.1469 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1481 | (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.1469 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1481 | (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.1469 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1481 | (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
- /*! peach v0.1.1469 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1481 | (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.1469 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1481 | (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
- /*! peach v0.1.1469 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1481 | (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;
@@ -76,6 +76,16 @@ var init_internal_child = __esm({
76
76
  }
77
77
  });
78
78
 
79
+ // src/admitted-mac-build.ts
80
+ function admittedMacBuilderSlot(env = process.env) {
81
+ return env.CONTRAST_REMOTE_BUILD === "mac" && env.REMOTE_MAC_SLOT_HELD === "1" && env.CONTRAST_HEAVY_ADMITTED === "1";
82
+ }
83
+ var init_admitted_mac_build = __esm({
84
+ "src/admitted-mac-build.ts"() {
85
+ "use strict";
86
+ }
87
+ });
88
+
79
89
  // src/is-record.ts
80
90
  function isRecord(value) {
81
91
  return typeof value === "object" && value !== null && !Array.isArray(value);
@@ -2329,7 +2339,7 @@ function compileSwiftProjectUnit(input, options) {
2329
2339
  };
2330
2340
  const hash = swiftArtifactHash(input, options.release, moduleRoot);
2331
2341
  return serialize(root, async () => {
2332
- if (process.platform === "darwin" && process.env.TM_SESSION && !process.env.CONTRAST_REMOTE_BUILD && process.env.CI !== "true" && moduleRoot === import_node_path2.default.resolve(__sootsim_import_meta_dirname, "../../sootsim-swift") && !swiftDistributionAt(moduleRoot)) {
2342
+ if (process.platform === "darwin" && process.env.TM_SESSION && !admittedMacBuilderSlot() && process.env.CI !== "true" && moduleRoot === import_node_path2.default.resolve(__sootsim_import_meta_dirname, "../../sootsim-swift") && !swiftDistributionAt(moduleRoot)) {
2333
2343
  const requestRoot = (0, import_node_fs2.mkdtempSync)(import_node_path2.default.join(root, ".builder-request-"));
2334
2344
  const output = import_node_path2.default.join(requestRoot, "output");
2335
2345
  const request = import_node_path2.default.join(requestRoot, "request.json");
@@ -2459,6 +2469,7 @@ var init_swift_compile = __esm({
2459
2469
  import_node_os = __toESM(require("node:os"), 1);
2460
2470
  import_node_path2 = __toESM(require("node:path"), 1);
2461
2471
  import_node_util2 = require("node:util");
2472
+ init_admitted_mac_build();
2462
2473
  init_swift_distribution_contract();
2463
2474
  init_swift_icu();
2464
2475
  init_swift_package();
@@ -9776,6 +9787,20 @@ ${[...new Set(units.map((unit) => unit.namespace))].map((namespace) => `import $
9776
9787
  }
9777
9788
  `;
9778
9789
  }
9790
+ function failureRecordPath(packagePath) {
9791
+ return `${packagePath}.failed.json`;
9792
+ }
9793
+ function readFailedCompilation(packagePath) {
9794
+ let record4;
9795
+ try {
9796
+ record4 = JSON.parse(import_node_fs15.default.readFileSync(failureRecordPath(packagePath), "utf8"));
9797
+ } catch {
9798
+ return null;
9799
+ }
9800
+ if (typeof record4 !== "object" || record4 === null || !("stamp" in record4) || !("diagnostic" in record4) || typeof record4.stamp !== "string" || typeof record4.diagnostic !== "string")
9801
+ return null;
9802
+ return { stamp: record4.stamp, diagnostic: record4.diagnostic };
9803
+ }
9779
9804
  async function compileExpoSwiftModules(root, base, publishArtifact) {
9780
9805
  const units = await collectExpoSwiftSources(root);
9781
9806
  if (!units) return null;
@@ -9811,12 +9836,12 @@ async function compileExpoSwiftModules(root, base, publishArtifact) {
9811
9836
  )
9812
9837
  );
9813
9838
  const stamp = sourceStamp(packagePath, module2.root);
9814
- const failed = failedCompilations.get(packagePath);
9839
+ const failed = readFailedCompilation(packagePath);
9815
9840
  if (failed?.stamp === stamp) {
9816
9841
  failures.set(unit.moduleId, failed.diagnostic);
9817
9842
  continue;
9818
9843
  }
9819
- failedCompilations.delete(packagePath);
9844
+ import_node_fs15.default.rmSync(failureRecordPath(packagePath), { force: true });
9820
9845
  stamps.set(unit, stamp);
9821
9846
  candidates.push(unit);
9822
9847
  }
@@ -9880,10 +9905,13 @@ let package = Package(name: "PeachExpo", targets: [${targets.map((name2) => `.ta
9880
9905
  throw error;
9881
9906
  const missing = error instanceof SwiftMissingModulesError;
9882
9907
  if ((sourceErrors.length && sourceErrors.length === errors.length || missing) && sourceStamp(packagePath, module2.root) === stamps.get(unit)) {
9883
- failedCompilations.set(packagePath, {
9884
- stamp: stamps.get(unit),
9885
- diagnostic: missing ? diagnostic : sourceErrors.join("\n")
9886
- });
9908
+ import_node_fs15.default.writeFileSync(
9909
+ failureRecordPath(packagePath),
9910
+ JSON.stringify({
9911
+ stamp: stamps.get(unit),
9912
+ diagnostic: missing ? diagnostic : sourceErrors.join("\n")
9913
+ })
9914
+ );
9887
9915
  }
9888
9916
  failures.set(
9889
9917
  unit.moduleId,
@@ -9912,7 +9940,7 @@ let package = Package(name: "PeachExpo", targets: [${targets.map((name2) => `.ta
9912
9940
  }
9913
9941
  return result;
9914
9942
  }
9915
- var import_node_child_process9, import_node_crypto8, import_node_fs15, import_node_module, import_node_os9, import_node_path16, import_node_util3, run3, scriptEnv, EXPO_SWIFT_ENTRY, failedCompilations;
9943
+ var import_node_child_process9, import_node_crypto8, import_node_fs15, import_node_module, import_node_os9, import_node_path16, import_node_util3, run3, scriptEnv, EXPO_SWIFT_ENTRY;
9916
9944
  var init_expo_swift_host = __esm({
9917
9945
  "src/expo-swift-host.ts"() {
9918
9946
  "use strict";
@@ -9932,7 +9960,6 @@ var init_expo_swift_host = __esm({
9932
9960
  run3 = (0, import_node_util3.promisify)(import_node_child_process9.execFile);
9933
9961
  scriptEnv = { ...process.env, [RNX_FORKED_SCRIPT_ENV]: "1" };
9934
9962
  EXPO_SWIFT_ENTRY = "Sources/PeachExpoApp/PeachExpoEntry.swift";
9935
- failedCompilations = /* @__PURE__ */ new Map();
9936
9963
  }
9937
9964
  });
9938
9965
 
@@ -11413,10 +11440,23 @@ async function terminateProcessGroup(child, signal = "SIGTERM", gracefulTimeoutM
11413
11440
  init_backend_origin();
11414
11441
 
11415
11442
  // src/bundleGlobalFooter.ts
11443
+ function findBundleFooter(source, prefix) {
11444
+ let end = source.length;
11445
+ while (end > 0) {
11446
+ const newline = source.lastIndexOf("\n", end - 1);
11447
+ if (newline < 0) return -1;
11448
+ const line = newline + 1;
11449
+ if (source.startsWith(prefix, line)) return newline;
11450
+ if (line !== end && !source.startsWith("globalThis.", line) && !source.startsWith("//", line)) {
11451
+ return -1;
11452
+ }
11453
+ end = newline;
11454
+ }
11455
+ return -1;
11456
+ }
11416
11457
  function readBundleGlobalFooter(source, name2) {
11417
11458
  const prefix = `globalThis.${name2}=`;
11418
- const start = source.lastIndexOf(`
11419
- ${prefix}`);
11459
+ const start = findBundleFooter(source, prefix);
11420
11460
  if (start < 0) return null;
11421
11461
  const end = source.indexOf("\n", start + 1);
11422
11462
  const line = source.slice(start + 1, end < 0 ? void 0 : end);
@@ -11427,8 +11467,7 @@ ${prefix}`);
11427
11467
  }
11428
11468
  function insertBundleGlobalFooter(source, name2, value) {
11429
11469
  const prefix = `globalThis.${name2}=`;
11430
- const start = source.lastIndexOf(`
11431
- ${prefix}`);
11470
+ const start = findBundleFooter(source, prefix);
11432
11471
  if (start >= 0) {
11433
11472
  readBundleGlobalFooter(source, name2);
11434
11473
  const end = source.indexOf("\n", start + 1);
@@ -11437,7 +11476,7 @@ ${prefix}`);
11437
11476
  const json = JSON.stringify(value).replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029").replace(/<\//g, "<\\/");
11438
11477
  const footer = `
11439
11478
  ${prefix}${json};`;
11440
- const identity = source.lastIndexOf("\nglobalThis.__sootsimModulePaths=");
11479
+ const identity = findBundleFooter(source, "globalThis.__sootsimModulePaths=");
11441
11480
  return identity < 0 ? source + footer : source.slice(0, identity) + footer + source.slice(identity);
11442
11481
  }
11443
11482
 
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.1469 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1481 | (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.1469 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1481 | (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
- /*! peach v0.1.1469 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1481 | (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.1469 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1481 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
 
3
3
  // src/cloud-contract.ts
4
4
  var RNX_CLOUD_MAX_ARTIFACT_BYTES = 40761776;
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.1469 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1481 | (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.1469 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1481 | (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
- /*! peach v0.1.1469 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1481 | (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.1469 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1481 | (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
- /*! peach v0.1.1469 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1481 | (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;
@@ -44,6 +44,22 @@ function isValidRuntimeVersion(value) {
44
44
  return value.length <= 100 && /^[0-9A-Za-z][0-9A-Za-z._+-]*$/.test(value);
45
45
  }
46
46
 
47
+ // src/bundleGlobalFooter.ts
48
+ function findBundleFooter(source, prefix) {
49
+ let end = source.length;
50
+ while (end > 0) {
51
+ const newline = source.lastIndexOf("\n", end - 1);
52
+ if (newline < 0) return -1;
53
+ const line = newline + 1;
54
+ if (source.startsWith(prefix, line)) return newline;
55
+ if (line !== end && !source.startsWith("globalThis.", line) && !source.startsWith("//", line)) {
56
+ return -1;
57
+ }
58
+ end = newline;
59
+ }
60
+ return -1;
61
+ }
62
+
47
63
  // src/is-record.ts
48
64
  function isRecord(value) {
49
65
  return typeof value === "object" && value !== null && !Array.isArray(value);
@@ -94,7 +110,7 @@ function readPeachBundleConfig(value) {
94
110
  return { config: value.config, runtimePackages: [...value.runtimePackages] };
95
111
  }
96
112
  function readPeachBundleConfigFooter(source) {
97
- const start = source.lastIndexOf("\n" + BUNDLE_CONFIG_PREFIX);
113
+ const start = findBundleFooter(source, BUNDLE_CONFIG_PREFIX);
98
114
  if (start < 0) return null;
99
115
  const end = source.indexOf("\n", start + 1);
100
116
  const line = source.slice(start + 1, end < 0 ? void 0 : end);
@@ -112,7 +128,7 @@ function createPeachBundleConfigFooter(config) {
112
128
  function detachPeachBundleConfigFooter(source) {
113
129
  const configuredBundle = readPeachBundleConfigFooter(source);
114
130
  if (!configuredBundle) return { source, configuredBundle };
115
- const start = source.lastIndexOf("\n" + BUNDLE_CONFIG_PREFIX);
131
+ const start = findBundleFooter(source, BUNDLE_CONFIG_PREFIX);
116
132
  const end = source.indexOf("\n", start + 1);
117
133
  return {
118
134
  source: source.slice(0, start) + source.slice(end < 0 ? source.length : end),
@@ -1,8 +1,24 @@
1
- /*! peach v0.1.1469 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1481 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
 
3
3
  // src/config.ts
4
4
  import { isValidRuntimeVersion } from "@contrast/runtime-delivery/version";
5
5
 
6
+ // src/bundleGlobalFooter.ts
7
+ function findBundleFooter(source, prefix) {
8
+ let end = source.length;
9
+ while (end > 0) {
10
+ const newline = source.lastIndexOf("\n", end - 1);
11
+ if (newline < 0) return -1;
12
+ const line = newline + 1;
13
+ if (source.startsWith(prefix, line)) return newline;
14
+ if (line !== end && !source.startsWith("globalThis.", line) && !source.startsWith("//", line)) {
15
+ return -1;
16
+ }
17
+ end = newline;
18
+ }
19
+ return -1;
20
+ }
21
+
6
22
  // src/is-record.ts
7
23
  function isRecord(value) {
8
24
  return typeof value === "object" && value !== null && !Array.isArray(value);
@@ -53,7 +69,7 @@ function readPeachBundleConfig(value) {
53
69
  return { config: value.config, runtimePackages: [...value.runtimePackages] };
54
70
  }
55
71
  function readPeachBundleConfigFooter(source) {
56
- const start = source.lastIndexOf("\n" + BUNDLE_CONFIG_PREFIX);
72
+ const start = findBundleFooter(source, BUNDLE_CONFIG_PREFIX);
57
73
  if (start < 0) return null;
58
74
  const end = source.indexOf("\n", start + 1);
59
75
  const line = source.slice(start + 1, end < 0 ? void 0 : end);
@@ -71,7 +87,7 @@ function createPeachBundleConfigFooter(config) {
71
87
  function detachPeachBundleConfigFooter(source) {
72
88
  const configuredBundle = readPeachBundleConfigFooter(source);
73
89
  if (!configuredBundle) return { source, configuredBundle };
74
- const start = source.lastIndexOf("\n" + BUNDLE_CONFIG_PREFIX);
90
+ const start = findBundleFooter(source, BUNDLE_CONFIG_PREFIX);
75
91
  const end = source.indexOf("\n", start + 1);
76
92
  return {
77
93
  source: source.slice(0, start) + source.slice(end < 0 ? source.length : end),