peachsim 0.1.1641 → 0.1.1644

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 (96) hide show
  1. package/cli/app-bundle-resources.ts +57 -0
  2. package/cli/commands/control.ts +12 -0
  3. package/cli/drivers/playwright.ts +39 -0
  4. package/cli/outbound-endpoints.ts +4 -2
  5. package/detox/motion-change.cjs +7 -5
  6. package/detox/motion-change.d.cts +1 -0
  7. package/detox/motion-leg-starts.cjs +20 -0
  8. package/detox/motion-leg-starts.d.cts +8 -0
  9. package/dist-lib/agent-daemon-client.cjs +1 -1
  10. package/dist-lib/agent-events.cjs +1 -1
  11. package/dist-lib/attached-projects.cjs +1 -1
  12. package/dist-lib/auth/shared-session.cjs +1 -1
  13. package/dist-lib/backend-origin.cjs +3 -3
  14. package/dist-lib/beta.cjs +1 -1
  15. package/dist-lib/beta.mjs +1 -1
  16. package/dist-lib/bridge-constants.cjs +1 -1
  17. package/dist-lib/bridge-contract-input.cjs +1 -1
  18. package/dist-lib/bridge-contract-input.mjs +1 -1
  19. package/dist-lib/bridge-contract.cjs +1 -1
  20. package/dist-lib/bridge-contract.mjs +1 -1
  21. package/dist-lib/bundle-channel.cjs +719 -572
  22. package/dist-lib/capture-contract.cjs +1 -1
  23. package/dist-lib/capture-contract.mjs +1 -1
  24. package/dist-lib/cloud-contract.cjs +1 -1
  25. package/dist-lib/cloud-contract.mjs +1 -1
  26. package/dist-lib/cloud-test-args.cjs +1 -1
  27. package/dist-lib/cloud-test-args.mjs +1 -1
  28. package/dist-lib/cloud.cjs +1 -1
  29. package/dist-lib/cloud.mjs +1 -1
  30. package/dist-lib/config.cjs +1 -1
  31. package/dist-lib/config.mjs +1 -1
  32. package/dist-lib/detox/index.cjs +7 -6
  33. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  34. package/dist-lib/expo-swift-bundle.cjs +656 -509
  35. package/dist-lib/expo-swift-metadata.cjs +1 -1
  36. package/dist-lib/expo-swift-metadata.mjs +1 -1
  37. package/dist-lib/home-paths.cjs +1 -1
  38. package/dist-lib/host/bridge-host.cjs +811 -658
  39. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  40. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  41. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  42. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  43. package/dist-lib/host/websocket-proxy.cjs +1 -1
  44. package/dist-lib/index.cjs +89 -41
  45. package/dist-lib/jump-to-source-babel.cjs +1 -1
  46. package/dist-lib/jump-to-source-native.cjs +1 -1
  47. package/dist-lib/kotlin-host.cjs +1 -1
  48. package/dist-lib/menu.cjs +14 -6
  49. package/dist-lib/menu.mjs +14 -6
  50. package/dist-lib/metro-fingerprint-registry.cjs +1 -1
  51. package/dist-lib/metro-fingerprint-registry.mjs +1 -1
  52. package/dist-lib/metro-production-bundle.cjs +1 -1
  53. package/dist-lib/metro-production-bundle.mjs +1 -1
  54. package/dist-lib/metro.cjs +88 -41
  55. package/dist-lib/native-app-identity-project.cjs +90 -41
  56. package/dist-lib/native-app-identity-project.mjs +89 -41
  57. package/dist-lib/native-app-identity.cjs +1 -1
  58. package/dist-lib/native-app-identity.mjs +1 -1
  59. package/dist-lib/native-firebase-metadata.cjs +1 -1
  60. package/dist-lib/native-firebase-metadata.mjs +1 -1
  61. package/dist-lib/plist.cjs +1 -1
  62. package/dist-lib/plist.mjs +1 -1
  63. package/dist-lib/profiles.cjs +1 -1
  64. package/dist-lib/public-brand.cjs +1 -1
  65. package/dist-lib/react-native-host-modules.cjs +1 -1
  66. package/dist-lib/react-native-host-modules.mjs +1 -1
  67. package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
  68. package/dist-lib/sdk.cjs +2 -1
  69. package/dist-lib/sdk.mjs +2 -1
  70. package/dist-lib/skills.cjs +1716 -1366
  71. package/dist-lib/swift-compile.cjs +297 -215
  72. package/dist-lib/swift-compile.mjs +315 -227
  73. package/dist-lib/swift-package.cjs +1 -1
  74. package/dist-lib/swift-package.mjs +1 -1
  75. package/dist-lib/swift-submit.cjs +1 -1
  76. package/dist-lib/swift-submit.mjs +1 -1
  77. package/dist-lib/swift-toolchain.cjs +1 -1
  78. package/dist-lib/swift.cjs +1 -1
  79. package/dist-lib/vite-swift.cjs +620 -473
  80. package/dist-lib/vite.cjs +1 -1
  81. package/dist-lib/worklet-executable.cjs +1 -1
  82. package/dist-lib/worklet-executable.mjs +1 -1
  83. package/package.json +1 -1
  84. package/src/appBundleResourcesContract.ts +51 -0
  85. package/src/backend-origin.ts +3 -1
  86. package/src/host/bridge-host.ts +17 -11
  87. package/src/host/staged-host-files.ts +28 -4
  88. package/src/launchMetadataContract.ts +1 -0
  89. package/src/menu.ts +12 -4
  90. package/src/native-app-identity-project.ts +47 -38
  91. package/src/runtime-delivery.ts +6 -7
  92. package/src/swift-compile.ts +18 -7
  93. package/src/swift-compiler-digest.ts +5 -3
  94. package/src/swift-objc-compile.ts +34 -4
  95. package/src/swift-root-lock.ts +241 -92
  96. package/src/xcode-project.ts +67 -4
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.1641 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1644 | (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.1641 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1644 | (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.1641 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1644 | (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.1641 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1644 | (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.1641 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1644 | (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.1641 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1644 | (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;
@@ -10558,6 +10558,7 @@ var LAUNCH_METADATA_KEYS = [
10558
10558
  "appFonts",
10559
10559
  "appSplash",
10560
10560
  "appCatalog",
10561
+ "appBundleResources",
10561
10562
  "nativeAppIdentity",
10562
10563
  "nativeFirebase",
10563
10564
  "appManifest",
@@ -15986,6 +15987,9 @@ function targetSettings(ref, configuration, builtins, options = {}) {
15986
15987
  return applyOperator(get("PRODUCT_NAME"), "c99extidentifier");
15987
15988
  case "EXECUTABLE_NAME":
15988
15989
  return get("PRODUCT_NAME");
15990
+ // the native default of CoreBuildSystem.xcspec
15991
+ case "EXCLUDED_RECURSIVE_SEARCH_PATH_SUBDIRECTORIES":
15992
+ return "*.nib *.lproj *.framework *.gch *.xcode* *.xcassets *.icon (*) .DS_Store CVS .svn .git .hg *.pbproj *.pbxproj";
15989
15993
  case "AppIdentifierPrefix":
15990
15994
  case "TeamIdentifierPrefix": {
15991
15995
  const team = get("DEVELOPMENT_TEAM");
@@ -16008,6 +16012,45 @@ function settingList(value) {
16008
16012
  items2.push((quoted ?? plain).replace(/\\(.)/g, "$1"));
16009
16013
  return items2;
16010
16014
  }
16015
+ function expandSearchPath(directory, rules) {
16016
+ if (import_node_path13.default.basename(directory) !== "**") return [directory];
16017
+ const expanded = [];
16018
+ const seen = /* @__PURE__ */ new Set();
16019
+ const queue = [import_node_path13.default.dirname(directory)];
16020
+ for (let at = 0; at < queue.length; at++) {
16021
+ const current = queue[at];
16022
+ let real;
16023
+ try {
16024
+ real = import_node_fs13.default.realpathSync(current);
16025
+ } catch {
16026
+ continue;
16027
+ }
16028
+ if (!import_node_fs13.default.statSync(real).isDirectory() || seen.has(real)) continue;
16029
+ seen.add(real);
16030
+ expanded.push(current);
16031
+ for (const entry of import_node_fs13.default.readdirSync(real, { withFileTypes: true }).sort((a, b) => a.name < b.name ? -1 : a.name > b.name ? 1 : 0)) {
16032
+ if (entry.isSymbolicLink() ? !rules.followLinks : !entry.isDirectory()) continue;
16033
+ if (rules.excluded.some((pattern) => pattern.test(entry.name)) && !rules.included.some((pattern) => pattern.test(entry.name)))
16034
+ continue;
16035
+ queue.push(import_node_path13.default.join(current, entry.name));
16036
+ }
16037
+ }
16038
+ return expanded;
16039
+ }
16040
+ function recursiveSearchRules(settings) {
16041
+ const glob = (pattern) => new RegExp(
16042
+ `^${pattern.replace(/[.+^${}()|[\]\\]/g, "\\$&").replaceAll("*", ".*").replaceAll("?", ".")}$`
16043
+ );
16044
+ return {
16045
+ excluded: settingList(settings("EXCLUDED_RECURSIVE_SEARCH_PATH_SUBDIRECTORIES")).map(
16046
+ glob
16047
+ ),
16048
+ included: settingList(settings("INCLUDED_RECURSIVE_SEARCH_PATH_SUBDIRECTORIES")).map(
16049
+ glob
16050
+ ),
16051
+ followLinks: settings("RECURSIVE_SEARCH_PATHS_FOLLOW_SYMLINKS") !== "NO"
16052
+ };
16053
+ }
16011
16054
  function compilationConditions(settings) {
16012
16055
  const flags = settingList(settings("OTHER_SWIFT_FLAGS"));
16013
16056
  const defined = flags.flatMap(
@@ -16370,6 +16413,7 @@ function readXcodeAppTarget(input, targetName, configurationName, options = {})
16370
16413
  for (const file of read) xcconfigs.add(file);
16371
16414
  const swiftVersion = Number.parseFloat(settings2("SWIFT_VERSION") || "5");
16372
16415
  const members = targetMembers(ref, settings2, options, keys, xcconfigs);
16416
+ const searchRules = recursiveSearchRules(settings2);
16373
16417
  const implementations = members.allSources.filter(
16374
16418
  (file) => /\.(c|cc|cpp|cxx|m|mm)$/.test(file)
16375
16419
  );
@@ -16412,10 +16456,10 @@ function readXcodeAppTarget(input, targetName, configurationName, options = {})
16412
16456
  headerSearchPaths: [
16413
16457
  ...settingList(settings2("HEADER_SEARCH_PATHS")),
16414
16458
  ...settingList(settings2("USER_HEADER_SEARCH_PATHS"))
16415
- ].map(absolute),
16416
- frameworkSearchPaths: settingList(settings2("FRAMEWORK_SEARCH_PATHS")).map(
16417
- absolute
16418
- ),
16459
+ ].flatMap((raw) => expandSearchPath(absolute(raw), searchRules)),
16460
+ frameworkSearchPaths: settingList(
16461
+ settings2("FRAMEWORK_SEARCH_PATHS")
16462
+ ).flatMap((raw) => expandSearchPath(absolute(raw), searchRules)),
16419
16463
  flags: [
16420
16464
  ...settings2("CLANG_ENABLE_OBJC_ARC") === "YES" ? ["-fobjc-arc"] : [],
16421
16465
  ...settings2("CLANG_ENABLE_OBJC_WEAK") === "YES" ? ["-fobjc-weak"] : [],
@@ -16788,42 +16832,8 @@ function readAndroidNativeAppIdentity(projectRoot, androidMergedManifest) {
16788
16832
  );
16789
16833
  }
16790
16834
  function readIosNativeAppIdentity(projectRoot, parseInfoPlist, iosTarget) {
16791
- const iosRoot = import_node_path14.default.join(projectRoot, "ios");
16792
- if (!import_node_fs14.default.existsSync(iosRoot)) return null;
16793
- const projects = import_node_fs14.default.readdirSync(iosRoot, { withFileTypes: true }).filter((entry) => entry.isDirectory() && entry.name.endsWith(".xcodeproj"));
16794
- if (projects.length === 0) return null;
16795
- if (projects.length > 1 && !iosTarget) {
16796
- throw new NativeAppTargetSelectionError(
16797
- `native app identity requires a selected Xcode project; set withPeach's iosTarget to an app target in one of: ${projects.map((entry) => entry.name).join(", ")}`
16798
- );
16799
- }
16800
- let project = projects[0];
16801
- if (iosTarget && projects.length > 1) {
16802
- const matches = projects.filter(
16803
- (entry) => listXcodeAppTargets(import_node_path14.default.join(iosRoot, entry.name), {
16804
- requireSources: false
16805
- }).includes(iosTarget)
16806
- );
16807
- if (matches.length === 0) {
16808
- throw new Error(`native app identity has no application target ${iosTarget}`);
16809
- }
16810
- if (matches.length > 1) {
16811
- throw new Error(
16812
- `native app identity target ${iosTarget} is ambiguous across ${matches.map((entry) => entry.name).join(", ")}`
16813
- );
16814
- }
16815
- project = matches[0];
16816
- }
16817
- const xcodeproj = import_node_path14.default.join(iosRoot, project.name);
16818
- const appTargets = listXcodeAppTargets(xcodeproj, { requireSources: false });
16819
- if (!iosTarget && appTargets.length > 1) {
16820
- throw new NativeAppTargetSelectionError(
16821
- `native app identity requires a selected app target; set withPeach's iosTarget to one of: ${appTargets.join(", ")}`
16822
- );
16823
- }
16824
- const app = readXcodeAppTarget(xcodeproj, iosTarget ?? appTargets[0], "Release", {
16825
- requireSources: false
16826
- });
16835
+ const app = readIosAppTarget(projectRoot, iosTarget);
16836
+ if (!app) return null;
16827
16837
  const identity = readNativeAppIdentityFromXcodeTarget(app, parseInfoPlist);
16828
16838
  const projectManifestPath = import_node_path14.default.join(projectRoot, "package.json");
16829
16839
  const projectRequire = (0, import_node_module3.createRequire)(projectManifestPath);
@@ -16876,6 +16886,44 @@ function readIosNativeAppIdentity(projectRoot, parseInfoPlist, iosTarget) {
16876
16886
  }
16877
16887
  return { ...identity, reanimatedStaticFeatureFlags: flags };
16878
16888
  }
16889
+ function readIosAppTarget(projectRoot, iosTarget) {
16890
+ const iosRoot = import_node_path14.default.join(projectRoot, "ios");
16891
+ if (!import_node_fs14.default.existsSync(iosRoot)) return null;
16892
+ const projects = import_node_fs14.default.readdirSync(iosRoot, { withFileTypes: true }).filter((entry) => entry.isDirectory() && entry.name.endsWith(".xcodeproj"));
16893
+ if (projects.length === 0) return null;
16894
+ if (projects.length > 1 && !iosTarget) {
16895
+ throw new NativeAppTargetSelectionError(
16896
+ `native app identity requires a selected Xcode project; set withPeach's iosTarget to an app target in one of: ${projects.map((entry) => entry.name).join(", ")}`
16897
+ );
16898
+ }
16899
+ let project = projects[0];
16900
+ if (iosTarget && projects.length > 1) {
16901
+ const matches = projects.filter(
16902
+ (entry) => listXcodeAppTargets(import_node_path14.default.join(iosRoot, entry.name), {
16903
+ requireSources: false
16904
+ }).includes(iosTarget)
16905
+ );
16906
+ if (matches.length === 0) {
16907
+ throw new Error(`native app identity has no application target ${iosTarget}`);
16908
+ }
16909
+ if (matches.length > 1) {
16910
+ throw new Error(
16911
+ `native app identity target ${iosTarget} is ambiguous across ${matches.map((entry) => entry.name).join(", ")}`
16912
+ );
16913
+ }
16914
+ project = matches[0];
16915
+ }
16916
+ const xcodeproj = import_node_path14.default.join(iosRoot, project.name);
16917
+ const appTargets = listXcodeAppTargets(xcodeproj, { requireSources: false });
16918
+ if (!iosTarget && appTargets.length > 1) {
16919
+ throw new NativeAppTargetSelectionError(
16920
+ `native app identity requires a selected app target; set withPeach's iosTarget to one of: ${appTargets.join(", ")}`
16921
+ );
16922
+ }
16923
+ return readXcodeAppTarget(xcodeproj, iosTarget ?? appTargets[0], "Release", {
16924
+ requireSources: false
16925
+ });
16926
+ }
16879
16927
 
16880
16928
  // src/native-firebase-config.ts
16881
16929
  var import_node_child_process6 = require("node:child_process");
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.1641 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1644 | (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.1641 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1644 | (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.1641 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1644 | (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.1641 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1644 | (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;
@@ -90,7 +90,13 @@ var SOOTSIM_RENDER_RESOLUTION_LABELS = {
90
90
  medium: "Medium",
91
91
  low: "Low"
92
92
  };
93
- var SOOTSIM_SCREEN_EFFECTS = ["none", "wireframe", "blueprint", "panel", "green"];
93
+ var SOOTSIM_SCREEN_EFFECTS = [
94
+ "none",
95
+ "wireframe",
96
+ "blueprint",
97
+ "panel",
98
+ "green"
99
+ ];
94
100
  function isSootSimScreenEffect(value) {
95
101
  return value === "none" || value === "wireframe" || value === "blueprint" || value === "panel" || value === "green";
96
102
  }
@@ -275,9 +281,9 @@ function deviceMenu(state, deviceChoices) {
275
281
  },
276
282
  { type: "separator" },
277
283
  { label: "Trigger Screenshot", action: "screenshot" },
278
- // pose controls for the current device: open/close on foldables,
279
- // rotate left/right wherever a turn changes geometry, the way ios
280
- // simulator holds them (rotate left is cmd+left, rotate right
284
+ // pose controls for the current device: open/close, book and laptop on
285
+ // foldables, rotate left/right wherever a turn changes geometry, the way
286
+ // ios simulator holds them (rotate left is cmd+left, rotate right
281
287
  // cmd+right). truthiness, not !== null: a partial state must hide
282
288
  // these, never show duo items for the wrong device.
283
289
  ...state.devicePosture || state.canRotate ? [
@@ -286,7 +292,9 @@ function deviceMenu(state, deviceChoices) {
286
292
  {
287
293
  label: state.devicePosture === "open" ? "Close iPhone Duo" : "Open iPhone Duo",
288
294
  action: "toggle-duo-posture"
289
- }
295
+ },
296
+ { label: "Book Pose", action: "fold-duo-book" },
297
+ { label: "Laptop Pose", action: "fold-duo-laptop" }
290
298
  ] : [],
291
299
  ...state.canRotate ? [
292
300
  {
package/dist-lib/menu.mjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.1641 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1644 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
 
3
3
  // src/public-brand.ts
4
4
  var name = "Peach";
@@ -43,7 +43,13 @@ var SOOTSIM_RENDER_RESOLUTION_LABELS = {
43
43
  medium: "Medium",
44
44
  low: "Low"
45
45
  };
46
- var SOOTSIM_SCREEN_EFFECTS = ["none", "wireframe", "blueprint", "panel", "green"];
46
+ var SOOTSIM_SCREEN_EFFECTS = [
47
+ "none",
48
+ "wireframe",
49
+ "blueprint",
50
+ "panel",
51
+ "green"
52
+ ];
47
53
  function isSootSimScreenEffect(value) {
48
54
  return value === "none" || value === "wireframe" || value === "blueprint" || value === "panel" || value === "green";
49
55
  }
@@ -228,9 +234,9 @@ function deviceMenu(state, deviceChoices) {
228
234
  },
229
235
  { type: "separator" },
230
236
  { label: "Trigger Screenshot", action: "screenshot" },
231
- // pose controls for the current device: open/close on foldables,
232
- // rotate left/right wherever a turn changes geometry, the way ios
233
- // simulator holds them (rotate left is cmd+left, rotate right
237
+ // pose controls for the current device: open/close, book and laptop on
238
+ // foldables, rotate left/right wherever a turn changes geometry, the way
239
+ // ios simulator holds them (rotate left is cmd+left, rotate right
234
240
  // cmd+right). truthiness, not !== null: a partial state must hide
235
241
  // these, never show duo items for the wrong device.
236
242
  ...state.devicePosture || state.canRotate ? [
@@ -239,7 +245,9 @@ function deviceMenu(state, deviceChoices) {
239
245
  {
240
246
  label: state.devicePosture === "open" ? "Close iPhone Duo" : "Open iPhone Duo",
241
247
  action: "toggle-duo-posture"
242
- }
248
+ },
249
+ { label: "Book Pose", action: "fold-duo-book" },
250
+ { label: "Laptop Pose", action: "fold-duo-laptop" }
243
251
  ] : [],
244
252
  ...state.canRotate ? [
245
253
  {
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.1641 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1644 | (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.1641 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1644 | (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.1641 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1644 | (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.1641 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1644 | (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.1641 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1644 | (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;
@@ -10019,6 +10019,9 @@ function targetSettings(ref, configuration, builtins, options = {}) {
10019
10019
  return applyOperator(get("PRODUCT_NAME"), "c99extidentifier");
10020
10020
  case "EXECUTABLE_NAME":
10021
10021
  return get("PRODUCT_NAME");
10022
+ // the native default of CoreBuildSystem.xcspec
10023
+ case "EXCLUDED_RECURSIVE_SEARCH_PATH_SUBDIRECTORIES":
10024
+ return "*.nib *.lproj *.framework *.gch *.xcode* *.xcassets *.icon (*) .DS_Store CVS .svn .git .hg *.pbproj *.pbxproj";
10022
10025
  case "AppIdentifierPrefix":
10023
10026
  case "TeamIdentifierPrefix": {
10024
10027
  const team = get("DEVELOPMENT_TEAM");
@@ -10041,6 +10044,45 @@ function settingList(value) {
10041
10044
  items2.push((quoted ?? plain).replace(/\\(.)/g, "$1"));
10042
10045
  return items2;
10043
10046
  }
10047
+ function expandSearchPath(directory, rules) {
10048
+ if (import_node_path5.default.basename(directory) !== "**") return [directory];
10049
+ const expanded = [];
10050
+ const seen = /* @__PURE__ */ new Set();
10051
+ const queue = [import_node_path5.default.dirname(directory)];
10052
+ for (let at = 0; at < queue.length; at++) {
10053
+ const current = queue[at];
10054
+ let real;
10055
+ try {
10056
+ real = import_node_fs5.default.realpathSync(current);
10057
+ } catch {
10058
+ continue;
10059
+ }
10060
+ if (!import_node_fs5.default.statSync(real).isDirectory() || seen.has(real)) continue;
10061
+ seen.add(real);
10062
+ expanded.push(current);
10063
+ for (const entry of import_node_fs5.default.readdirSync(real, { withFileTypes: true }).sort((a, b) => a.name < b.name ? -1 : a.name > b.name ? 1 : 0)) {
10064
+ if (entry.isSymbolicLink() ? !rules.followLinks : !entry.isDirectory()) continue;
10065
+ if (rules.excluded.some((pattern) => pattern.test(entry.name)) && !rules.included.some((pattern) => pattern.test(entry.name)))
10066
+ continue;
10067
+ queue.push(import_node_path5.default.join(current, entry.name));
10068
+ }
10069
+ }
10070
+ return expanded;
10071
+ }
10072
+ function recursiveSearchRules(settings) {
10073
+ const glob = (pattern) => new RegExp(
10074
+ `^${pattern.replace(/[.+^${}()|[\]\\]/g, "\\$&").replaceAll("*", ".*").replaceAll("?", ".")}$`
10075
+ );
10076
+ return {
10077
+ excluded: settingList(settings("EXCLUDED_RECURSIVE_SEARCH_PATH_SUBDIRECTORIES")).map(
10078
+ glob
10079
+ ),
10080
+ included: settingList(settings("INCLUDED_RECURSIVE_SEARCH_PATH_SUBDIRECTORIES")).map(
10081
+ glob
10082
+ ),
10083
+ followLinks: settings("RECURSIVE_SEARCH_PATHS_FOLLOW_SYMLINKS") !== "NO"
10084
+ };
10085
+ }
10044
10086
  function compilationConditions(settings) {
10045
10087
  const flags = settingList(settings("OTHER_SWIFT_FLAGS"));
10046
10088
  const defined = flags.flatMap(
@@ -10403,6 +10445,7 @@ function readXcodeAppTarget(input, targetName, configurationName, options = {})
10403
10445
  for (const file of read) xcconfigs.add(file);
10404
10446
  const swiftVersion = Number.parseFloat(settings2("SWIFT_VERSION") || "5");
10405
10447
  const members = targetMembers(ref, settings2, options, keys, xcconfigs);
10448
+ const searchRules = recursiveSearchRules(settings2);
10406
10449
  const implementations = members.allSources.filter(
10407
10450
  (file) => /\.(c|cc|cpp|cxx|m|mm)$/.test(file)
10408
10451
  );
@@ -10445,10 +10488,10 @@ function readXcodeAppTarget(input, targetName, configurationName, options = {})
10445
10488
  headerSearchPaths: [
10446
10489
  ...settingList(settings2("HEADER_SEARCH_PATHS")),
10447
10490
  ...settingList(settings2("USER_HEADER_SEARCH_PATHS"))
10448
- ].map(absolute),
10449
- frameworkSearchPaths: settingList(settings2("FRAMEWORK_SEARCH_PATHS")).map(
10450
- absolute
10451
- ),
10491
+ ].flatMap((raw) => expandSearchPath(absolute(raw), searchRules)),
10492
+ frameworkSearchPaths: settingList(
10493
+ settings2("FRAMEWORK_SEARCH_PATHS")
10494
+ ).flatMap((raw) => expandSearchPath(absolute(raw), searchRules)),
10452
10495
  flags: [
10453
10496
  ...settings2("CLANG_ENABLE_OBJC_ARC") === "YES" ? ["-fobjc-arc"] : [],
10454
10497
  ...settings2("CLANG_ENABLE_OBJC_WEAK") === "YES" ? ["-fobjc-weak"] : [],
@@ -10821,42 +10864,8 @@ function readAndroidNativeAppIdentity(projectRoot, androidMergedManifest) {
10821
10864
  );
10822
10865
  }
10823
10866
  function readIosNativeAppIdentity(projectRoot, parseInfoPlist, iosTarget) {
10824
- const iosRoot = import_node_path6.default.join(projectRoot, "ios");
10825
- if (!import_node_fs6.default.existsSync(iosRoot)) return null;
10826
- const projects = import_node_fs6.default.readdirSync(iosRoot, { withFileTypes: true }).filter((entry) => entry.isDirectory() && entry.name.endsWith(".xcodeproj"));
10827
- if (projects.length === 0) return null;
10828
- if (projects.length > 1 && !iosTarget) {
10829
- throw new NativeAppTargetSelectionError(
10830
- `native app identity requires a selected Xcode project; set withPeach's iosTarget to an app target in one of: ${projects.map((entry) => entry.name).join(", ")}`
10831
- );
10832
- }
10833
- let project = projects[0];
10834
- if (iosTarget && projects.length > 1) {
10835
- const matches = projects.filter(
10836
- (entry) => listXcodeAppTargets(import_node_path6.default.join(iosRoot, entry.name), {
10837
- requireSources: false
10838
- }).includes(iosTarget)
10839
- );
10840
- if (matches.length === 0) {
10841
- throw new Error(`native app identity has no application target ${iosTarget}`);
10842
- }
10843
- if (matches.length > 1) {
10844
- throw new Error(
10845
- `native app identity target ${iosTarget} is ambiguous across ${matches.map((entry) => entry.name).join(", ")}`
10846
- );
10847
- }
10848
- project = matches[0];
10849
- }
10850
- const xcodeproj = import_node_path6.default.join(iosRoot, project.name);
10851
- const appTargets = listXcodeAppTargets(xcodeproj, { requireSources: false });
10852
- if (!iosTarget && appTargets.length > 1) {
10853
- throw new NativeAppTargetSelectionError(
10854
- `native app identity requires a selected app target; set withPeach's iosTarget to one of: ${appTargets.join(", ")}`
10855
- );
10856
- }
10857
- const app = readXcodeAppTarget(xcodeproj, iosTarget ?? appTargets[0], "Release", {
10858
- requireSources: false
10859
- });
10867
+ const app = readIosAppTarget(projectRoot, iosTarget);
10868
+ if (!app) return null;
10860
10869
  const identity = readNativeAppIdentityFromXcodeTarget(app, parseInfoPlist);
10861
10870
  const projectManifestPath = import_node_path6.default.join(projectRoot, "package.json");
10862
10871
  const projectRequire = (0, import_node_module2.createRequire)(projectManifestPath);
@@ -10909,6 +10918,44 @@ function readIosNativeAppIdentity(projectRoot, parseInfoPlist, iosTarget) {
10909
10918
  }
10910
10919
  return { ...identity, reanimatedStaticFeatureFlags: flags };
10911
10920
  }
10921
+ function readIosAppTarget(projectRoot, iosTarget) {
10922
+ const iosRoot = import_node_path6.default.join(projectRoot, "ios");
10923
+ if (!import_node_fs6.default.existsSync(iosRoot)) return null;
10924
+ const projects = import_node_fs6.default.readdirSync(iosRoot, { withFileTypes: true }).filter((entry) => entry.isDirectory() && entry.name.endsWith(".xcodeproj"));
10925
+ if (projects.length === 0) return null;
10926
+ if (projects.length > 1 && !iosTarget) {
10927
+ throw new NativeAppTargetSelectionError(
10928
+ `native app identity requires a selected Xcode project; set withPeach's iosTarget to an app target in one of: ${projects.map((entry) => entry.name).join(", ")}`
10929
+ );
10930
+ }
10931
+ let project = projects[0];
10932
+ if (iosTarget && projects.length > 1) {
10933
+ const matches = projects.filter(
10934
+ (entry) => listXcodeAppTargets(import_node_path6.default.join(iosRoot, entry.name), {
10935
+ requireSources: false
10936
+ }).includes(iosTarget)
10937
+ );
10938
+ if (matches.length === 0) {
10939
+ throw new Error(`native app identity has no application target ${iosTarget}`);
10940
+ }
10941
+ if (matches.length > 1) {
10942
+ throw new Error(
10943
+ `native app identity target ${iosTarget} is ambiguous across ${matches.map((entry) => entry.name).join(", ")}`
10944
+ );
10945
+ }
10946
+ project = matches[0];
10947
+ }
10948
+ const xcodeproj = import_node_path6.default.join(iosRoot, project.name);
10949
+ const appTargets = listXcodeAppTargets(xcodeproj, { requireSources: false });
10950
+ if (!iosTarget && appTargets.length > 1) {
10951
+ throw new NativeAppTargetSelectionError(
10952
+ `native app identity requires a selected app target; set withPeach's iosTarget to one of: ${appTargets.join(", ")}`
10953
+ );
10954
+ }
10955
+ return readXcodeAppTarget(xcodeproj, iosTarget ?? appTargets[0], "Release", {
10956
+ requireSources: false
10957
+ });
10958
+ }
10912
10959
 
10913
10960
  // src/native-firebase-config.ts
10914
10961
  var import_node_child_process3 = require("node:child_process");