peachsim 0.1.2188 → 0.1.2190

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 (97) hide show
  1. package/cli/commands/daemon.ts +13 -1
  2. package/cli/commands/package.ts +1 -1
  3. package/cli/commands/setup.ts +4 -2
  4. package/cli/commands/shell-url.ts +1 -1
  5. package/cli/main.ts +2 -0
  6. package/dist-lib/agent-daemon-client.cjs +1 -1
  7. package/dist-lib/agent-events.cjs +1 -1
  8. package/dist-lib/attached-projects.cjs +1 -1
  9. package/dist-lib/auth/shared-session.cjs +1 -1
  10. package/dist-lib/backend-origin.cjs +1 -1
  11. package/dist-lib/beta.cjs +1 -1
  12. package/dist-lib/beta.mjs +1 -1
  13. package/dist-lib/bridge-constants.cjs +1 -1
  14. package/dist-lib/bridge-contract-input.cjs +1 -1
  15. package/dist-lib/bridge-contract-input.mjs +1 -1
  16. package/dist-lib/bridge-contract.cjs +1 -1
  17. package/dist-lib/bridge-contract.mjs +1 -1
  18. package/dist-lib/bundle-channel.cjs +53 -30
  19. package/dist-lib/capture-contract.cjs +1 -1
  20. package/dist-lib/capture-contract.mjs +1 -1
  21. package/dist-lib/cloud-contract.cjs +1 -1
  22. package/dist-lib/cloud-contract.mjs +1 -1
  23. package/dist-lib/cloud-test-args.cjs +1 -1
  24. package/dist-lib/cloud-test-args.mjs +1 -1
  25. package/dist-lib/cloud.cjs +1 -1
  26. package/dist-lib/cloud.mjs +1 -1
  27. package/dist-lib/config.cjs +1 -1
  28. package/dist-lib/config.mjs +1 -1
  29. package/dist-lib/detox/index.cjs +1 -1
  30. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  31. package/dist-lib/expo-swift-bundle.cjs +33 -27
  32. package/dist-lib/expo-swift-metadata.cjs +1 -1
  33. package/dist-lib/expo-swift-metadata.mjs +1 -1
  34. package/dist-lib/home-paths.cjs +1 -1
  35. package/dist-lib/host/bridge-host.cjs +53 -30
  36. package/dist-lib/host/fetch-proxy-handler.cjs +4 -4
  37. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  38. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  39. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  40. package/dist-lib/host/websocket-proxy.cjs +1 -1
  41. package/dist-lib/index.cjs +5 -5
  42. package/dist-lib/jump-to-source-babel.cjs +1 -1
  43. package/dist-lib/jump-to-source-native.cjs +1 -1
  44. package/dist-lib/kotlin-host.cjs +1 -1
  45. package/dist-lib/menu.cjs +1 -1
  46. package/dist-lib/menu.mjs +1 -1
  47. package/dist-lib/metro-fingerprint-registry.cjs +1 -1
  48. package/dist-lib/metro-fingerprint-registry.mjs +1 -1
  49. package/dist-lib/metro-production-bundle.cjs +1 -1
  50. package/dist-lib/metro-production-bundle.mjs +1 -1
  51. package/dist-lib/metro.cjs +5 -5
  52. package/dist-lib/native-app-identity-project.cjs +4 -4
  53. package/dist-lib/native-app-identity-project.mjs +4 -4
  54. package/dist-lib/native-app-identity.cjs +1 -1
  55. package/dist-lib/native-app-identity.mjs +1 -1
  56. package/dist-lib/native-firebase-metadata.cjs +1 -1
  57. package/dist-lib/native-firebase-metadata.mjs +1 -1
  58. package/dist-lib/pdfium-raster.cjs +1 -1
  59. package/dist-lib/pdfium-raster.mjs +1 -1
  60. package/dist-lib/plist.cjs +1 -1
  61. package/dist-lib/plist.mjs +1 -1
  62. package/dist-lib/profiles.cjs +1 -1
  63. package/dist-lib/public-brand.cjs +1 -1
  64. package/dist-lib/public-origins-lib-esm.json +24 -24
  65. package/dist-lib/public-origins-lib.json +53 -53
  66. package/dist-lib/react-native-host-modules.cjs +1 -1
  67. package/dist-lib/react-native-host-modules.mjs +1 -1
  68. package/dist-lib/reap-browser.cjs +1 -1
  69. package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
  70. package/dist-lib/sdk.cjs +1 -1
  71. package/dist-lib/sdk.mjs +1 -1
  72. package/dist-lib/skills.cjs +73 -34
  73. package/dist-lib/swift-compile.cjs +28 -22
  74. package/dist-lib/swift-compile.mjs +28 -22
  75. package/dist-lib/swift-package.cjs +1 -1
  76. package/dist-lib/swift-package.mjs +1 -1
  77. package/dist-lib/swift-submit.cjs +1 -1
  78. package/dist-lib/swift-submit.mjs +1 -1
  79. package/dist-lib/swift-toolchain.cjs +2 -2
  80. package/dist-lib/swift.cjs +1 -1
  81. package/dist-lib/vite-swift.cjs +31 -25
  82. package/dist-lib/vite.cjs +4 -4
  83. package/dist-lib/worklet-executable.cjs +1 -1
  84. package/dist-lib/worklet-executable.mjs +1 -1
  85. package/dist-types/packages/peach-engine/src/engine/computed-padding.d.ts +40 -0
  86. package/dist-types/packages/peach-engine/src/engine/layout-engine.d.ts +3 -0
  87. package/dist-types/packages/peach-engine/src/engine/yoga-layout.d.ts +60 -0
  88. package/dist-types/packages/peach-engine/src/render-worker/shell-tree-wire.d.ts +2 -0
  89. package/dist-types/packages/peach-engine/src/settings/device-spec-bus.d.ts +10 -0
  90. package/package.json +1 -1
  91. package/sdk/ios/System/Library/Frameworks/UIKit.framework/Headers/UIFindSession.h +2 -12
  92. package/sdk/ios/System/Library/Frameworks/UIKitTypes.framework/Headers/UIKitTypes.h +12 -0
  93. package/src/podspec-sources.ts +21 -2
  94. package/src/swift-compile.ts +28 -18
  95. package/src/swift-guest-source-plan.ts +8 -4
  96. package/src/swift-toolchain.ts +3 -2
  97. package/src/xcode-project.ts +3 -1
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.2188 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2190 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = '', __sootsim_import_meta_filename = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; __sootsim_import_meta_filename = __filename; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -39,7 +39,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
39
39
  var define_SWIFT_COVERAGE_SOURCE_DIGESTS_default;
40
40
  var init_define_SWIFT_COVERAGE_SOURCE_DIGESTS = __esm({
41
41
  "<define:__SWIFT_COVERAGE_SOURCE_DIGESTS__>"() {
42
- define_SWIFT_COVERAGE_SOURCE_DIGESTS_default = { "swift-coverage/indexdump.ts": "0d82d8eeb96bf377f409ea7e33274c341a710c0e071f6b6e17571a23d8d92412", "swift-coverage/indexing.ts": "633ccf19eec1f382a8847d0ee1dca42a2792a3c60aafd43622ed5152b09b8272", "swift-coverage/types.ts": "bd8fae54ea6c53e110cd8a5d7b57c1d532dd0166e09fdaea63c4f270c3780dd1", "swift-coverage/source.ts": "c151758a9f67631bc61473c375df0dc017da6902a34533b2cf4fc4fd7d19b6ee", "swift-coverage/package.ts": "1f0068be7461fa7c5a7a891faf318f305cbed2e94c19667ba76627f7e5be260b", "swift-coverage/xcode.ts": "65a500b806ce1c3a496de27f2e0ad77287c0f6795c618342c08af647f92af1fa", "swift-coverage/xcode-assets.ts": "99e03b74c961d2449afd58c2cbc415ba91d1d469a4f89e461c137fd6c305b27c", "swift-coverage/xcode-asset-symbols.ts": "1b2a67733bc9d139b351466270205452a6172140bc25080d72619e2952c44671", "swift-coverage/xcode-bridging.ts": "33184be8c5daf6646aa5a1276a4e15531f1be27b7c26f56550e0fbb1fc678a11", "swift-coverage/xcode-packages.ts": "8e6020d17d24474150a5a50d042aca6261819ef75c79680a287a66f395909915", "swift-coverage/xcode-strings.ts": "f2dd4c7cd8ef77035184b0132909c2fa09fd20ed06b7757c2f1f960bfdde031c", "swift-coverage/reader.ts": "da559b67ecd1161dea70c980b5f98f2c55af3550f0714479100fa5e9e813625c", "swift-coverage/provenance.ts": "eb3b41ae8b58b48f6758f084800f188dfb1edb227e483abdd6b80cde66e849b9", "swift-package-manifest.ts": "4b7d4a715cdaf57468ead23f2ff9dce76d02c6a888d73d144d4baa2ae571ba3c", "swift-package.ts": "338cfef9a34a930206ac2e1a8a90b85c8d61f776d9a41e6445dc18e0c5385cdb", "swift-source-file.ts": "93fd659ed63a27b67f54a7c229a7ceb636dc9c59e68414920ba36cff1eda1f94", "swift-toolchain.ts": "a2817a624e79c3fa231a2cc0282988cac3fe3a27cf4c5d9237c77a4bd031e217", "home-paths.ts": "f5583b61f8bdd81823b3b29ff519a48daf9993719f194ddb7de22218472e90f9", "xcode-header-search.ts": "f8c3d557b4eca5ddad32907545353eb7ad53b2ebd0969d9ed8f7275e109a13b1", "xcode-project.ts": "5f41cd0bd86cb0cffbfb0047348b963f81d5e51cb0e8dd574c739b1a27aa56de", "xcode-target-members.ts": "ad7589132bffab265e8a10b64e24484fe88b4a2b1cc0ee19a97f151a002eca77", "xcode-json-project.ts": "41990ebbe4b488eef34e74c4608b4b48e5a5b299ba98ca7fbcfdfa0e77be63b6", "openstep-plist.ts": "74e6ce1dac80c9c318e0e9f5e3e8cd19a898a8820c36fc160609695bcb59dcd3" };
42
+ define_SWIFT_COVERAGE_SOURCE_DIGESTS_default = { "swift-coverage/indexdump.ts": "0d82d8eeb96bf377f409ea7e33274c341a710c0e071f6b6e17571a23d8d92412", "swift-coverage/indexing.ts": "633ccf19eec1f382a8847d0ee1dca42a2792a3c60aafd43622ed5152b09b8272", "swift-coverage/types.ts": "bd8fae54ea6c53e110cd8a5d7b57c1d532dd0166e09fdaea63c4f270c3780dd1", "swift-coverage/source.ts": "c151758a9f67631bc61473c375df0dc017da6902a34533b2cf4fc4fd7d19b6ee", "swift-coverage/package.ts": "1f0068be7461fa7c5a7a891faf318f305cbed2e94c19667ba76627f7e5be260b", "swift-coverage/xcode.ts": "65a500b806ce1c3a496de27f2e0ad77287c0f6795c618342c08af647f92af1fa", "swift-coverage/xcode-assets.ts": "99e03b74c961d2449afd58c2cbc415ba91d1d469a4f89e461c137fd6c305b27c", "swift-coverage/xcode-asset-symbols.ts": "1b2a67733bc9d139b351466270205452a6172140bc25080d72619e2952c44671", "swift-coverage/xcode-bridging.ts": "33184be8c5daf6646aa5a1276a4e15531f1be27b7c26f56550e0fbb1fc678a11", "swift-coverage/xcode-packages.ts": "8e6020d17d24474150a5a50d042aca6261819ef75c79680a287a66f395909915", "swift-coverage/xcode-strings.ts": "f2dd4c7cd8ef77035184b0132909c2fa09fd20ed06b7757c2f1f960bfdde031c", "swift-coverage/reader.ts": "da559b67ecd1161dea70c980b5f98f2c55af3550f0714479100fa5e9e813625c", "swift-coverage/provenance.ts": "eb3b41ae8b58b48f6758f084800f188dfb1edb227e483abdd6b80cde66e849b9", "swift-package-manifest.ts": "4b7d4a715cdaf57468ead23f2ff9dce76d02c6a888d73d144d4baa2ae571ba3c", "swift-package.ts": "338cfef9a34a930206ac2e1a8a90b85c8d61f776d9a41e6445dc18e0c5385cdb", "swift-source-file.ts": "93fd659ed63a27b67f54a7c229a7ceb636dc9c59e68414920ba36cff1eda1f94", "swift-toolchain.ts": "e7cf8a143d47ff86b4ee2db4a8266e96b100926104990dba795321bc5923df3e", "home-paths.ts": "f5583b61f8bdd81823b3b29ff519a48daf9993719f194ddb7de22218472e90f9", "xcode-header-search.ts": "f8c3d557b4eca5ddad32907545353eb7ad53b2ebd0969d9ed8f7275e109a13b1", "xcode-project.ts": "8ffd57670829ddd2b10e812defbd9016859744be88713c5ba65847aa6e26dff4", "xcode-target-members.ts": "ad7589132bffab265e8a10b64e24484fe88b4a2b1cc0ee19a97f151a002eca77", "xcode-json-project.ts": "41990ebbe4b488eef34e74c4608b4b48e5a5b299ba98ca7fbcfdfa0e77be63b6", "openstep-plist.ts": "74e6ce1dac80c9c318e0e9f5e3e8cd19a898a8820c36fc160609695bcb59dcd3" };
43
43
  }
44
44
  });
45
45
 
@@ -4757,7 +4757,7 @@ for arg in "$@"; do
4757
4757
  case $arg in
4758
4758
  @*)
4759
4759
  rsp=\${arg#@}
4760
- awk 'BEGIN { RS = " "; ORS = " " } /^"-l/ { if (seen[$0]++) next }${omitLibraries.map((name3) => ` $0 == "\\"-l${name3}\\"" { next }`).join("")} { print }' "$rsp" > "$rsp.dedup"
4760
+ awk 'BEGIN { RS = " "; ORS = " " } /^"-l/ { if (seen[$0]++) next }${omitLibraries.map((name3) => ` $0 == "\\"-l${name3}\\"" { next }`).join("")} $0 == "\\"-ObjC\\"" { next } { print }' "$rsp" > "$rsp.dedup"
4761
4761
  mv "$rsp.dedup" "$rsp"
4762
4762
  if [ "\${PEACH_DEFER_WASM_LINK:-}" = "1" ] && grep -q '"--start-lib"' "$rsp"; then
4763
4763
  cp "$rsp" ${JSON.stringify(import_node_path4.default.join(directory, ".peach-link.rsp"))}
@@ -12922,9 +12922,12 @@ function guestSourceObjects(graph, buildDirectory, objects, generatedOwners) {
12922
12922
  (target) => target.sourceTarget === null ? [] : [target.sourceTarget]
12923
12923
  )
12924
12924
  );
12925
- const owners = new Map(
12926
- [...generatedOwners].map(([name3, owner]) => [swiftTargetModuleName(name3), owner])
12927
- );
12925
+ const owners = new Map([
12926
+ ...[...names].map((name3) => [swiftTargetModuleName(name3), name3]),
12927
+ ...[...generatedOwners].map(
12928
+ ([name3, owner]) => [swiftTargetModuleName(name3), owner]
12929
+ )
12930
+ ]);
12928
12931
  const libraries = new Map(
12929
12932
  graph.targets.flatMap(
12930
12933
  (target) => target.productType === "swiftpm.target.binary" && target.sourceTarget !== null ? [[target.productName, target.sourceTarget]] : []
@@ -17269,7 +17272,7 @@ var darwinRecordsRegion = (quoted) => quoted.length ? ["-Wl,--start-lib", ...quo
17269
17272
  var REACTOR_FLAG = '"-Xclang-linker", "-mexec-model=reactor",\n';
17270
17273
  var MULTI_MANIFEST_VERSION = 68;
17271
17274
  var SWIFT_HEADER_PRODUCTS_TARGET = "PeachHeaderProducts";
17272
- var compilerSourceDigest = true ? "02a45415d48ad9eb28df54607ec6601ccbe130e18dcc1522b7ad9adba9921f43" : swiftCompilerSourceDigest(__sootsim_import_meta_dirname);
17275
+ var compilerSourceDigest = true ? "382ff03994dc241ff825d788eb5f8eb92462420da0b20538d9fcc1ff79e096c6" : swiftCompilerSourceDigest(__sootsim_import_meta_dirname);
17273
17276
  function swiftArtifactHash(input, release, moduleRoot) {
17274
17277
  const hash = (0, import_node_crypto13.createHash)("sha256");
17275
17278
  hash.update(`swift-compile
@@ -19649,22 +19652,19 @@ ${swiftProjectFilesProblems(input.projectFiles).join("\n")}`
19649
19652
  allowExisting: true
19650
19653
  });
19651
19654
  if (modulemap.endsWith("/Modules/module.modulemap")) {
19652
- const headers = import_node_path27.default.posix.join(
19653
- import_node_path27.default.posix.dirname(import_node_path27.default.posix.dirname(modulemap)),
19654
- "Headers"
19655
- );
19656
- const mirrored = import_node_path27.default.posix.join(import_node_path27.default.posix.dirname(modulemap), "Headers");
19657
- for (const [, umbrella] of moduleContents.toString().matchAll(/\bumbrella\s+header\s+"([^"]+)"/g)) {
19658
- const source = settings.productHeaders[import_node_path27.default.posix.join(headers, umbrella)];
19659
- const contents = source === void 0 ? void 0 : input.files[source];
19660
- if (contents !== void 0)
19661
- stageTargetFile(
19662
- target.name,
19663
- import_node_path27.default.join(layout2.root, mirrored, umbrella),
19664
- contents,
19665
- { allowExisting: true }
19666
- );
19667
- }
19655
+ const framework = import_node_path27.default.posix.dirname(import_node_path27.default.posix.dirname(modulemap));
19656
+ for (const [, header] of moduleContents.toString().matchAll(/\bheader\s+"([^"]+)"/g))
19657
+ for (const folder of ["Headers", "PrivateHeaders"]) {
19658
+ const source = settings.productHeaders[import_node_path27.default.posix.join(framework, folder, header)];
19659
+ const contents = source === void 0 ? void 0 : input.files[source];
19660
+ if (contents !== void 0)
19661
+ stageTargetFile(
19662
+ target.name,
19663
+ import_node_path27.default.join(layout2.root, import_node_path27.default.posix.dirname(modulemap), folder, header),
19664
+ contents,
19665
+ { allowExisting: true }
19666
+ );
19667
+ }
19668
19668
  }
19669
19669
  if (nativeC && import_node_path27.default.posix.basename(modulemap) !== "module.modulemap") {
19670
19670
  stageTargetFile(
@@ -20016,7 +20016,13 @@ module ${moduleName}.Swift {
20016
20016
  swiftModules.delete(name3);
20017
20017
  projectOverlayFrameworks.delete(name3);
20018
20018
  }
20019
+ const mixedModules = new Set(
20020
+ [...native].flatMap(
20021
+ ([name3, value]) => value.mixed ? [swiftTargetModuleName(name3)] : []
20022
+ )
20023
+ );
20019
20024
  for (const name3 of sourceModules) swiftModules.add(name3);
20025
+ for (const name3 of mixedModules) swiftModules.delete(name3);
20020
20026
  for (const [file, contents] of Object.entries(input.files))
20021
20027
  if (file.endsWith(".modulemap"))
20022
20028
  addSwiftOverlayFrameworks(contents, swiftModules, projectOverlayFrameworks);
@@ -29601,7 +29607,7 @@ function readXcodeAppTarget(input, targetName, configurationName, options = {})
29601
29607
  installName: settings2("LD_DYLIB_INSTALL_NAME") || null,
29602
29608
  buildVersion: {
29603
29609
  platform: settings2("PLATFORM_NAME") || null,
29604
- minimumOS: settings2("IPHONEOS_DEPLOYMENT_TARGET") || null,
29610
+ minimumOS: settings2("IPHONEOS_DEPLOYMENT_TARGET") || XCODE_DEFAULT_IOS_DEPLOYMENT_TARGET,
29605
29611
  sdk: settings2("SDK_VERSION") || null
29606
29612
  },
29607
29613
  machOType: settings2("MACH_O_TYPE") || null,
@@ -30672,7 +30678,7 @@ function sourceClosureDigest(srcDir, entrypoints) {
30672
30678
  return hash.digest("hex");
30673
30679
  }
30674
30680
  var standinSourceDigest = (srcDir = __sootsim_import_meta_dirname) => sourceClosureDigest(srcDir, STANDIN_DIGEST_ENTRYPOINTS);
30675
- var STANDIN_SOURCE_DIGEST = true ? "534310cfac2856971a0189d9835d2bc10e471963394e3c17bdc2815a82872e0f" : standinSourceDigest();
30681
+ var STANDIN_SOURCE_DIGEST = true ? "8357df1eb62bbe4eb3a2bc4588867a6b75d1052c41e274e31fec2fde3700676e" : standinSourceDigest();
30676
30682
 
30677
30683
  // src/swift-standins.ts
30678
30684
  init_define_SWIFT_COVERAGE_SOURCE_DIGESTS();
package/dist-lib/vite.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.2188 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2190 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = '', __sootsim_import_meta_filename = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; __sootsim_import_meta_filename = __filename; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -39,7 +39,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
39
39
  var define_SWIFT_COVERAGE_SOURCE_DIGESTS_default;
40
40
  var init_define_SWIFT_COVERAGE_SOURCE_DIGESTS = __esm({
41
41
  "<define:__SWIFT_COVERAGE_SOURCE_DIGESTS__>"() {
42
- define_SWIFT_COVERAGE_SOURCE_DIGESTS_default = { "swift-coverage/indexdump.ts": "0d82d8eeb96bf377f409ea7e33274c341a710c0e071f6b6e17571a23d8d92412", "swift-coverage/indexing.ts": "633ccf19eec1f382a8847d0ee1dca42a2792a3c60aafd43622ed5152b09b8272", "swift-coverage/types.ts": "bd8fae54ea6c53e110cd8a5d7b57c1d532dd0166e09fdaea63c4f270c3780dd1", "swift-coverage/source.ts": "c151758a9f67631bc61473c375df0dc017da6902a34533b2cf4fc4fd7d19b6ee", "swift-coverage/package.ts": "1f0068be7461fa7c5a7a891faf318f305cbed2e94c19667ba76627f7e5be260b", "swift-coverage/xcode.ts": "65a500b806ce1c3a496de27f2e0ad77287c0f6795c618342c08af647f92af1fa", "swift-coverage/xcode-assets.ts": "99e03b74c961d2449afd58c2cbc415ba91d1d469a4f89e461c137fd6c305b27c", "swift-coverage/xcode-asset-symbols.ts": "1b2a67733bc9d139b351466270205452a6172140bc25080d72619e2952c44671", "swift-coverage/xcode-bridging.ts": "33184be8c5daf6646aa5a1276a4e15531f1be27b7c26f56550e0fbb1fc678a11", "swift-coverage/xcode-packages.ts": "8e6020d17d24474150a5a50d042aca6261819ef75c79680a287a66f395909915", "swift-coverage/xcode-strings.ts": "f2dd4c7cd8ef77035184b0132909c2fa09fd20ed06b7757c2f1f960bfdde031c", "swift-coverage/reader.ts": "da559b67ecd1161dea70c980b5f98f2c55af3550f0714479100fa5e9e813625c", "swift-coverage/provenance.ts": "eb3b41ae8b58b48f6758f084800f188dfb1edb227e483abdd6b80cde66e849b9", "swift-package-manifest.ts": "4b7d4a715cdaf57468ead23f2ff9dce76d02c6a888d73d144d4baa2ae571ba3c", "swift-package.ts": "338cfef9a34a930206ac2e1a8a90b85c8d61f776d9a41e6445dc18e0c5385cdb", "swift-source-file.ts": "93fd659ed63a27b67f54a7c229a7ceb636dc9c59e68414920ba36cff1eda1f94", "swift-toolchain.ts": "a2817a624e79c3fa231a2cc0282988cac3fe3a27cf4c5d9237c77a4bd031e217", "home-paths.ts": "f5583b61f8bdd81823b3b29ff519a48daf9993719f194ddb7de22218472e90f9", "xcode-header-search.ts": "f8c3d557b4eca5ddad32907545353eb7ad53b2ebd0969d9ed8f7275e109a13b1", "xcode-project.ts": "5f41cd0bd86cb0cffbfb0047348b963f81d5e51cb0e8dd574c739b1a27aa56de", "xcode-target-members.ts": "ad7589132bffab265e8a10b64e24484fe88b4a2b1cc0ee19a97f151a002eca77", "xcode-json-project.ts": "41990ebbe4b488eef34e74c4608b4b48e5a5b299ba98ca7fbcfdfa0e77be63b6", "openstep-plist.ts": "74e6ce1dac80c9c318e0e9f5e3e8cd19a898a8820c36fc160609695bcb59dcd3" };
42
+ define_SWIFT_COVERAGE_SOURCE_DIGESTS_default = { "swift-coverage/indexdump.ts": "0d82d8eeb96bf377f409ea7e33274c341a710c0e071f6b6e17571a23d8d92412", "swift-coverage/indexing.ts": "633ccf19eec1f382a8847d0ee1dca42a2792a3c60aafd43622ed5152b09b8272", "swift-coverage/types.ts": "bd8fae54ea6c53e110cd8a5d7b57c1d532dd0166e09fdaea63c4f270c3780dd1", "swift-coverage/source.ts": "c151758a9f67631bc61473c375df0dc017da6902a34533b2cf4fc4fd7d19b6ee", "swift-coverage/package.ts": "1f0068be7461fa7c5a7a891faf318f305cbed2e94c19667ba76627f7e5be260b", "swift-coverage/xcode.ts": "65a500b806ce1c3a496de27f2e0ad77287c0f6795c618342c08af647f92af1fa", "swift-coverage/xcode-assets.ts": "99e03b74c961d2449afd58c2cbc415ba91d1d469a4f89e461c137fd6c305b27c", "swift-coverage/xcode-asset-symbols.ts": "1b2a67733bc9d139b351466270205452a6172140bc25080d72619e2952c44671", "swift-coverage/xcode-bridging.ts": "33184be8c5daf6646aa5a1276a4e15531f1be27b7c26f56550e0fbb1fc678a11", "swift-coverage/xcode-packages.ts": "8e6020d17d24474150a5a50d042aca6261819ef75c79680a287a66f395909915", "swift-coverage/xcode-strings.ts": "f2dd4c7cd8ef77035184b0132909c2fa09fd20ed06b7757c2f1f960bfdde031c", "swift-coverage/reader.ts": "da559b67ecd1161dea70c980b5f98f2c55af3550f0714479100fa5e9e813625c", "swift-coverage/provenance.ts": "eb3b41ae8b58b48f6758f084800f188dfb1edb227e483abdd6b80cde66e849b9", "swift-package-manifest.ts": "4b7d4a715cdaf57468ead23f2ff9dce76d02c6a888d73d144d4baa2ae571ba3c", "swift-package.ts": "338cfef9a34a930206ac2e1a8a90b85c8d61f776d9a41e6445dc18e0c5385cdb", "swift-source-file.ts": "93fd659ed63a27b67f54a7c229a7ceb636dc9c59e68414920ba36cff1eda1f94", "swift-toolchain.ts": "e7cf8a143d47ff86b4ee2db4a8266e96b100926104990dba795321bc5923df3e", "home-paths.ts": "f5583b61f8bdd81823b3b29ff519a48daf9993719f194ddb7de22218472e90f9", "xcode-header-search.ts": "f8c3d557b4eca5ddad32907545353eb7ad53b2ebd0969d9ed8f7275e109a13b1", "xcode-project.ts": "8ffd57670829ddd2b10e812defbd9016859744be88713c5ba65847aa6e26dff4", "xcode-target-members.ts": "ad7589132bffab265e8a10b64e24484fe88b4a2b1cc0ee19a97f151a002eca77", "xcode-json-project.ts": "41990ebbe4b488eef34e74c4608b4b48e5a5b299ba98ca7fbcfdfa0e77be63b6", "openstep-plist.ts": "74e6ce1dac80c9c318e0e9f5e3e8cd19a898a8820c36fc160609695bcb59dcd3" };
43
43
  }
44
44
  });
45
45
 
@@ -1909,7 +1909,7 @@ function readIosSdkTree(root) {
1909
1909
 
1910
1910
  // src/swift-standin-digest.ts
1911
1911
  init_define_SWIFT_COVERAGE_SOURCE_DIGESTS();
1912
- var STANDIN_SOURCE_DIGEST = true ? "534310cfac2856971a0189d9835d2bc10e471963394e3c17bdc2815a82872e0f" : standinSourceDigest();
1912
+ var STANDIN_SOURCE_DIGEST = true ? "8357df1eb62bbe4eb3a2bc4588867a6b75d1052c41e274e31fec2fde3700676e" : standinSourceDigest();
1913
1913
 
1914
1914
  // src/expo-native-workspace.ts
1915
1915
  init_define_SWIFT_COVERAGE_SOURCE_DIGESTS();
@@ -5391,7 +5391,7 @@ var FOUNDATION_IMPLICIT_MODULES = [
5391
5391
  var FOUNDATION_IMPLICIT_FLAGS = FOUNDATION_IMPLICIT_MODULES.map(
5392
5392
  (module2) => `, "-Xfrontend", "-import-module", "-Xfrontend", "${module2}"`
5393
5393
  ).join("");
5394
- var compilerSourceDigest = true ? "02a45415d48ad9eb28df54607ec6601ccbe130e18dcc1522b7ad9adba9921f43" : swiftCompilerSourceDigest2(__sootsim_import_meta_dirname);
5394
+ var compilerSourceDigest = true ? "382ff03994dc241ff825d788eb5f8eb92462420da0b20538d9fcc1ff79e096c6" : swiftCompilerSourceDigest2(__sootsim_import_meta_dirname);
5395
5395
  var CORE_FOUNDATION_HANDLE_IMPORTS = [
5396
5396
  "CFAllocator",
5397
5397
  "CFArray",
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.2188 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2190 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = '', __sootsim_import_meta_filename = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; __sootsim_import_meta_filename = __filename; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.2188 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2190 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
 
3
3
  // src/worklet-executable.ts
4
4
  import { parse } from "acorn";
@@ -0,0 +1,40 @@
1
+ import type { SootSimNode } from './node.d.ts';
2
+ import type { SootSimStyle } from './types.d.ts';
3
+ type EdgeStyle = Readonly<Partial<Record<keyof SootSimStyle, unknown>>>;
4
+ export declare function resolveStylePadding(style: SootSimStyle): {
5
+ left: number;
6
+ top: number;
7
+ right: number;
8
+ bottom: number;
9
+ };
10
+ export declare function resolveStyleMargin(style: SootSimStyle): {
11
+ left: number;
12
+ top: number;
13
+ right: number;
14
+ bottom: number;
15
+ };
16
+ export declare function getComputedPadding(node: SootSimNode): {
17
+ left: number;
18
+ top: number;
19
+ right: number;
20
+ bottom: number;
21
+ };
22
+ export declare function resolveStyleBorderWidth(style: EdgeStyle): {
23
+ left: number;
24
+ top: number;
25
+ right: number;
26
+ bottom: number;
27
+ };
28
+ export declare function getComputedBorderWidth(node: SootSimNode): {
29
+ left: number;
30
+ top: number;
31
+ right: number;
32
+ bottom: number;
33
+ };
34
+ export declare function getTextContentInset(node: SootSimNode): {
35
+ left: number;
36
+ top: number;
37
+ right: number;
38
+ bottom: number;
39
+ };
40
+ export {};
@@ -0,0 +1,3 @@
1
+ export { getComputedPadding, getTextContentInset, resolveStylePadding, } from './computed-padding.d.ts';
2
+ export { computeLayout, laidOutRightToLeft, resolvesRightToLeft, layoutDirection, layoutRecordTakesAnimatedStyle, measureText, nativeLayoutFrameRoot, } from './yoga-layout.d.ts';
3
+ export { setLayoutAnimRenderCallback, layoutAnimComplete, getLayoutAnimStats, invalidateAllTextMeasurements, invalidateLazyFontWaiters, publishUnwrappedTextMeasurements, seedUnwrappedTextMeasurements, takeUnwrappedTextMeasurements, type UnwrappedTextMeasurement, } from './yoga-layout.d.ts';
@@ -0,0 +1,60 @@
1
+ import { type LayoutHookPlacement, SootSimNode } from './node.d.ts';
2
+ import { type TextGuides } from './text-first-baseline.d.ts';
3
+ import type { SootSimStyle, SootSimLayout, SootSimTextLayoutLine, MeasureContext } from './types.d.ts';
4
+ export declare function setLayoutEventDispatcher(dispatcher: ((callback: () => void) => void) | null): void;
5
+ export interface TextInkBox {
6
+ left: number;
7
+ top: number;
8
+ right: number;
9
+ bottom: number;
10
+ }
11
+ export interface MeasuredTextResult {
12
+ textLayoutKey: string;
13
+ measuredWidth: number;
14
+ unroundedWidth: number;
15
+ unroundedHeight: number;
16
+ measuredHeight: number;
17
+ fontScale: number | null;
18
+ textLayoutLines: SootSimTextLayoutLine[] | null;
19
+ textGuides: TextGuides | null;
20
+ ink: TextInkBox | null;
21
+ }
22
+ export interface UnwrappedTextMeasurement {
23
+ key: string;
24
+ intrinsicWidth: number;
25
+ measured: MeasuredTextResult;
26
+ }
27
+ export declare function publishUnwrappedTextMeasurements(): void;
28
+ export declare function takeUnwrappedTextMeasurements(): UnwrappedTextMeasurement[] | undefined;
29
+ export declare function seedUnwrappedTextMeasurements(entries: readonly UnwrappedTextMeasurement[]): void;
30
+ export declare function setLayoutBoundNodeCollector(begin: ((node: SootSimNode) => void) | null, end: ((node: SootSimNode, retainEmpty?: boolean) => void) | null): void;
31
+ export { roundToLayoutGrid } from '../settings/device-spec-bus.d.ts';
32
+ export declare function invalidateYogaTextMeasure(node: SootSimNode): void;
33
+ export declare function invalidateAllTextMeasurements(): void;
34
+ export declare function invalidateLazyFontWaiters(nodes: readonly SootSimNode[]): void;
35
+ export declare function shouldApplyMeasuredTextStretchWidth(node: SootSimNode): boolean;
36
+ export declare function setLayoutAnimRenderCallback(cb: (() => void) | null): void;
37
+ export declare function layoutAnimComplete(node: SootSimNode): void;
38
+ export declare function getLayoutAnimStats(): {
39
+ layoutAnimNodeCount: number;
40
+ layoutAnimTickCount: number;
41
+ hasLayoutAnimRafScheduled: boolean;
42
+ };
43
+ export declare function laidOutRightToLeft(node: SootSimNode): boolean;
44
+ export declare function resolvesRightToLeft(node: SootSimNode): boolean;
45
+ export declare function layoutDirection(): number;
46
+ export declare function queuePendingRootLayoutMeasure(nodeOrRoot: unknown, key: object, callback: () => void): (() => void) | undefined;
47
+ export interface LayoutWatch {
48
+ moving(nodes: readonly SootSimNode[], resized?: boolean): void;
49
+ scrollSynced(node: SootSimNode): void;
50
+ }
51
+ export declare function layoutRecordTakesAnimatedStyle(node: SootSimNode, keys: readonly string[]): boolean;
52
+ export declare function computeLayout(root: SootSimNode, width: number, height: number, ctx: MeasureContext, watch?: LayoutWatch | null, preserveRootOrigin?: boolean): boolean;
53
+ export declare function nativeLayoutFrameRoot(root: SootSimNode, width: number, height: number, ctx: MeasureContext): number;
54
+ export declare function setLayoutHook(target: unknown, hook: ((view: SootSimNode) => void) | null): void;
55
+ export declare function placeFromLayoutHook(target: unknown, placement: LayoutHookPlacement | null): void;
56
+ export declare function layoutHookFrame(target: unknown): SootSimLayout | null;
57
+ export declare function releaseYogaRoot(root: SootSimNode): void;
58
+ export declare function parkYogaRoot(root: SootSimNode): void;
59
+ export declare function freeYogaTree(node: SootSimNode, seen?: Set<SootSimNode>): void;
60
+ export declare function measureText(text: string, sourceStyle: SootSimStyle, maxWidth: number, ctx: MeasureContext, props?: Record<string, any>, node?: SootSimNode, includeInk?: boolean): MeasuredTextResult;
@@ -1,6 +1,7 @@
1
1
  import { type AnimatedDrivenStyleLease, type AnimatedDrivenStyleRetirement } from '../engine/animated-driven-style.d.ts';
2
2
  import { type LayoutSlotRead } from '../engine/layout-sab.d.ts';
3
3
  import { SootSimNode, SootSimTextNode, type LayoutHookPlacement } from '../engine/node.d.ts';
4
+ import type { UnwrappedTextMeasurement } from '../engine/layout-engine.d.ts';
4
5
  import type { SootSimNodeType } from '../engine/types.d.ts';
5
6
  import type { LayoutAnimationConfig } from '../react-native/layout-animation.d.ts';
6
7
  import type { GraphPresentation } from './graph-linked-value.d.ts';
@@ -64,6 +65,7 @@ export type WireSurfaceUpdate = WireDelta & {
64
65
  graphPresentations?: GraphPresentation[];
65
66
  graphPresentationEnds?: number[];
66
67
  inlineSources?: WireInlineSources;
68
+ unwrappedMeasurements?: UnwrappedTextMeasurement[];
67
69
  };
68
70
  export declare function sanitizeProps(props: Record<string, unknown>, nodeType?: SootSimNodeType): Record<string, unknown>;
69
71
  export declare function sanitizeStyle(style: Record<string, unknown>): Record<string, unknown>;
@@ -0,0 +1,10 @@
1
+ import type { DeviceSpec } from '../../../../../src/device-catalog.ts';
2
+ type Listener = () => void;
3
+ export declare const ANDROID_EMULATOR_MODEL = "sdk_gphone64_arm64";
4
+ export declare function getDeviceSpec(): DeviceSpec;
5
+ export declare function peekDeviceSpec(): DeviceSpec | undefined;
6
+ export declare function getDevicePixelScale(): number;
7
+ export declare function roundToLayoutGrid(value: number): number;
8
+ export declare function publishDeviceSpec(spec: DeviceSpec): void;
9
+ export declare function onDeviceSpecChange(listener: Listener): () => void;
10
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "peachsim",
3
- "version": "0.1.2188",
3
+ "version": "0.1.2190",
4
4
  "description": "Vite and Metro plugins, testing drivers, and SDK exports for peach.",
5
5
  "author": "Tamagui LLC",
6
6
  "license": "SEE LICENSE IN LICENSE",
@@ -15,20 +15,10 @@ NS_HEADER_AUDIT_BEGIN(nullability, sendability)
15
15
 
16
16
 
17
17
 
18
- API_AVAILABLE(ios(16.0)) API_UNAVAILABLE(watchos, tvos)
19
- typedef NS_ENUM(NSInteger, UITextSearchMatchMethod) {
20
- /// Word contains search string.
21
- UITextSearchMatchMethodContains,
22
-
23
- /// Word contains the search string as a prefix.
24
- UITextSearchMatchMethodStartsWith,
25
-
26
- /// Word is an exact match for the search string.
27
- UITextSearchMatchMethodFullWord,
28
- } NS_SWIFT_NAME(UITextSearchOptions.WordMatchMethod) API_UNAVAILABLE(watchos);
18
+
29
19
 
30
20
  UIKIT_EXTERN API_AVAILABLE(ios(16.0)) API_UNAVAILABLE(watchos, tvos) NS_SWIFT_UI_ACTOR
31
- @interface UITextSearchOptions : NSObject
21
+ PEACH_SWIFT_CLASS(UIKitCore) @interface UITextSearchOptions : NSObject
32
22
  /// See UITextSearchMatchMethod above.
33
23
  @property (nonatomic, readonly) UITextSearchMatchMethod wordMatchMethod;
34
24
 
@@ -2389,6 +2389,18 @@ typedef NS_ENUM(NSInteger, UIScrollViewContentInsetAdjustmentBehavior) {
2389
2389
  UIScrollViewContentInsetAdjustmentNever, // contentInset is not adjusted
2390
2390
  UIScrollViewContentInsetAdjustmentAlways, // contentInset is always adjusted by the scroll view's safeAreaInsets
2391
2391
  } API_AVAILABLE(ios(11.0), tvos(11.0)) API_UNAVAILABLE(watchos);
2392
+
2393
+ API_AVAILABLE(ios(16.0)) API_UNAVAILABLE(watchos, tvos)
2394
+ typedef NS_ENUM(NSInteger, UITextSearchMatchMethod) {
2395
+ /// Word contains search string.
2396
+ UITextSearchMatchMethodContains,
2397
+
2398
+ /// Word contains the search string as a prefix.
2399
+ UITextSearchMatchMethodStartsWith,
2400
+
2401
+ /// Word is an exact match for the search string.
2402
+ UITextSearchMatchMethodFullWord,
2403
+ } API_UNAVAILABLE(watchos);
2392
2404
  PEACH_SWIFT_CLASS(UIKitCore) @interface UIColor : NSObject <NSSecureCoding, NSCopying>
2393
2405
  @end
2394
2406
 
@@ -595,7 +595,8 @@ class ExprParser {
595
595
 
596
596
  or = (): Node => this.binary(['||'], this.and)
597
597
  and = (): Node => this.binary(['&&'], this.eq)
598
- eq = (): Node => this.binary(['==', '!='], this.shift)
598
+ eq = (): Node => this.binary(['==', '!='], this.compare)
599
+ compare = (): Node => this.binary(['<', '>', '<=', '>='], this.shift)
599
600
  shift = (): Node => this.binary(['<<'], this.add)
600
601
  add = (): Node => this.binary(['+', '-'], this.unary)
601
602
 
@@ -768,6 +769,9 @@ class ExprParser {
768
769
  return { k: 'hash', pairs }
769
770
  }
770
771
  if (tok.v === '::') return this.fail('top-level constant')
772
+ // a global is whatever the Podfile assigned before evaluating the pod
773
+ if (tok.v === '$' && this.toks[this.i]?.t === 'id')
774
+ return { k: 'fail', why: `global $${this.toks[this.i++]!.v}` }
771
775
  return this.fail(`unexpected ${tok.v}`)
772
776
  }
773
777
  }
@@ -1054,7 +1058,16 @@ class Evaluator {
1054
1058
  }
1055
1059
  case 'bin': {
1056
1060
  if (node.op === '||' || node.op === '&&') {
1057
- const l = this.ev(scope, node.l)
1061
+ let l: Value
1062
+ try {
1063
+ l = this.ev(scope, node.l)
1064
+ } catch (error) {
1065
+ // an unestablished operand cannot change `x && falsy` or `x || truthy`
1066
+ if (!recoverable(error)) throw error
1067
+ const r = this.ev(scope, node.r)
1068
+ if (truthy(r) === (node.op === '||')) return r
1069
+ throw error
1070
+ }
1058
1071
  return truthy(l) === (node.op === '||') ? l : this.ev(scope, node.r)
1059
1072
  }
1060
1073
  const l = this.ev(scope, node.l)
@@ -1083,6 +1096,12 @@ class Evaluator {
1083
1096
  l.push(r)
1084
1097
  return l
1085
1098
  }
1099
+ if (typeof l === 'number' && typeof r === 'number') {
1100
+ if (node.op === '<') return l < r
1101
+ if (node.op === '>') return l > r
1102
+ if (node.op === '<=') return l <= r
1103
+ if (node.op === '>=') return l >= r
1104
+ }
1086
1105
  return this.fail(`operator ${node.op}`)
1087
1106
  }
1088
1107
  case 'method': {
@@ -4903,26 +4903,27 @@ export function writeSwiftProject(
4903
4903
  allowExisting: true,
4904
4904
  })
4905
4905
  // clang resolves a framework map loaded through extern module against
4906
- // the map directory, not the framework root, so mirror the umbrella there
4906
+ // the map directory, not the framework root, so mirror every header
4907
+ // the map names there. clang looks in Headers/ and PrivateHeaders/ for
4908
+ // a framework module's header, whatever its keyword (a podspec
4909
+ // module_map names private headers in explicit submodules).
4907
4910
  if (modulemap.endsWith('/Modules/module.modulemap')) {
4908
- const headers = path.posix.join(
4909
- path.posix.dirname(path.posix.dirname(modulemap)),
4910
- 'Headers',
4911
- )
4912
- const mirrored = path.posix.join(path.posix.dirname(modulemap), 'Headers')
4913
- for (const [, umbrella] of moduleContents
4911
+ const framework = path.posix.dirname(path.posix.dirname(modulemap))
4912
+ for (const [, header] of moduleContents
4914
4913
  .toString()
4915
- .matchAll(/\bumbrella\s+header\s+"([^"]+)"/g)) {
4916
- const source = settings.productHeaders[path.posix.join(headers, umbrella!)]
4917
- const contents = source === undefined ? undefined : input.files[source]
4918
- if (contents !== undefined)
4919
- stageTargetFile(
4920
- target.name,
4921
- path.join(layout.root, mirrored, umbrella!),
4922
- contents,
4923
- { allowExisting: true },
4924
- )
4925
- }
4914
+ .matchAll(/\bheader\s+"([^"]+)"/g))
4915
+ for (const folder of ['Headers', 'PrivateHeaders']) {
4916
+ const source =
4917
+ settings.productHeaders[path.posix.join(framework, folder, header!)]
4918
+ const contents = source === undefined ? undefined : input.files[source]
4919
+ if (contents !== undefined)
4920
+ stageTargetFile(
4921
+ target.name,
4922
+ path.join(layout.root, path.posix.dirname(modulemap), folder, header!),
4923
+ contents,
4924
+ { allowExisting: true },
4925
+ )
4926
+ }
4926
4927
  }
4927
4928
  if (nativeC && path.posix.basename(modulemap) !== 'module.modulemap') {
4928
4929
  stageTargetFile(
@@ -5342,7 +5343,16 @@ export function writeSwiftProject(
5342
5343
  swiftModules.delete(name)
5343
5344
  projectOverlayFrameworks.delete(name)
5344
5345
  }
5346
+ // a mixed target's framework map is the clang half of its own module
5347
+ // (swift imports it as the underlying module), not a framework a Swift
5348
+ // module replaces, so its submodule imports stay.
5349
+ const mixedModules = new Set(
5350
+ [...native].flatMap(([name, value]) =>
5351
+ value.mixed ? [swiftTargetModuleName(name)] : [],
5352
+ ),
5353
+ )
5345
5354
  for (const name of sourceModules) swiftModules.add(name)
5355
+ for (const name of mixedModules) swiftModules.delete(name)
5346
5356
  for (const [file, contents] of Object.entries(input.files))
5347
5357
  if (file.endsWith('.modulemap'))
5348
5358
  addSwiftOverlayFrameworks(contents, swiftModules, projectOverlayFrameworks)
@@ -123,10 +123,14 @@ export function guestSourceObjects(
123
123
  target.sourceTarget === null ? [] : [target.sourceTarget],
124
124
  ),
125
125
  )
126
- // swiftpm names each build directory by its target's c99 module name
127
- const owners = new Map(
128
- [...generatedOwners].map(([name, owner]) => [swiftTargetModuleName(name), owner]),
129
- )
126
+ // swiftpm names each build directory by its target's c99 module name; a
127
+ // target of a package kept as a dependency builds into the same tree.
128
+ const owners = new Map([
129
+ ...[...names].map((name) => [swiftTargetModuleName(name), name] as const),
130
+ ...[...generatedOwners].map(
131
+ ([name, owner]) => [swiftTargetModuleName(name), owner] as const,
132
+ ),
133
+ ])
130
134
  // a binary target's prebuilt WebAssembly library is named for the target
131
135
  const libraries = new Map(
132
136
  graph.targets.flatMap((target) =>
@@ -529,7 +529,8 @@ export const SWIFT_AUTOLINK_LINKER = '.peach-wasm-ld'
529
529
  * for a 42MB output). the linker written here keeps the first copy of each
530
530
  * -l flag in clang's response file and runs the toolchain's wasm-ld, which
531
531
  * links the same bytes in about 1GiB. callers pass its path to clang with
532
- * `-Xclang-linker -fuse-ld=<path>`.
532
+ * `-Xclang-linker -fuse-ld=<path>`. it also drops apple ld's -ObjC, which wasm-ld
533
+ * rejects; the guest link loads objective-c archive members itself.
533
534
  */
534
535
  export function writeSwiftAutolinkLinker(
535
536
  directory: string,
@@ -543,7 +544,7 @@ for arg in "$@"; do
543
544
  case $arg in
544
545
  @*)
545
546
  rsp=\${arg#@}
546
- awk 'BEGIN { RS = " "; ORS = " " } /^"-l/ { if (seen[$0]++) next }${omitLibraries.map((name) => ` $0 == "\\"-l${name}\\"" { next }`).join('')} { print }' "$rsp" > "$rsp.dedup"
547
+ awk 'BEGIN { RS = " "; ORS = " " } /^"-l/ { if (seen[$0]++) next }${omitLibraries.map((name) => ` $0 == "\\"-l${name}\\"" { next }`).join('')} $0 == "\\"-ObjC\\"" { next } { print }' "$rsp" > "$rsp.dedup"
547
548
  mv "$rsp.dedup" "$rsp"
548
549
  if [ "\${PEACH_DEFER_WASM_LINK:-}" = "1" ] && grep -q '"--start-lib"' "$rsp"; then
549
550
  cp "$rsp" ${JSON.stringify(path.join(directory, '.peach-link.rsp'))}
@@ -3188,7 +3188,9 @@ export function readXcodeAppTarget(
3188
3188
  installName: settings('LD_DYLIB_INSTALL_NAME') || null,
3189
3189
  buildVersion: {
3190
3190
  platform: settings('PLATFORM_NAME') || null,
3191
- minimumOS: settings('IPHONEOS_DEPLOYMENT_TARGET') || null,
3191
+ minimumOS:
3192
+ settings('IPHONEOS_DEPLOYMENT_TARGET') ||
3193
+ XCODE_DEFAULT_IOS_DEPLOYMENT_TARGET,
3192
3194
  sdk: settings('SDK_VERSION') || null,
3193
3195
  },
3194
3196
  machOType: settings('MACH_O_TYPE') || null,