peachsim 0.1.2185 → 0.1.2187

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/cli/commands/cpu-profile.ts +6 -2
  2. package/cli/commands/shell-url.ts +3 -6
  3. package/dist-lib/agent-daemon-client.cjs +1 -1
  4. package/dist-lib/agent-events.cjs +1 -1
  5. package/dist-lib/attached-projects.cjs +1 -1
  6. package/dist-lib/auth/shared-session.cjs +1 -1
  7. package/dist-lib/backend-origin.cjs +1 -1
  8. package/dist-lib/beta.cjs +1 -1
  9. package/dist-lib/beta.mjs +1 -1
  10. package/dist-lib/bridge-constants.cjs +1 -1
  11. package/dist-lib/bridge-contract-input.cjs +1 -1
  12. package/dist-lib/bridge-contract-input.mjs +1 -1
  13. package/dist-lib/bridge-contract.cjs +1 -1
  14. package/dist-lib/bridge-contract.mjs +1 -1
  15. package/dist-lib/bundle-channel.cjs +2755 -2385
  16. package/dist-lib/capture-contract.cjs +1 -1
  17. package/dist-lib/capture-contract.mjs +1 -1
  18. package/dist-lib/cloud-contract.cjs +1 -1
  19. package/dist-lib/cloud-contract.mjs +1 -1
  20. package/dist-lib/cloud-test-args.cjs +1 -1
  21. package/dist-lib/cloud-test-args.mjs +1 -1
  22. package/dist-lib/cloud.cjs +1 -1
  23. package/dist-lib/cloud.mjs +1 -1
  24. package/dist-lib/config.cjs +1 -1
  25. package/dist-lib/config.mjs +1 -1
  26. package/dist-lib/detox/index.cjs +2 -2
  27. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  28. package/dist-lib/expo-swift-bundle.cjs +3265 -3223
  29. package/dist-lib/expo-swift-metadata.cjs +2 -1
  30. package/dist-lib/expo-swift-metadata.mjs +2 -1
  31. package/dist-lib/home-paths.cjs +1 -1
  32. package/dist-lib/host/bridge-host.cjs +4587 -4217
  33. package/dist-lib/host/fetch-proxy-handler.cjs +8 -7
  34. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  35. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  36. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  37. package/dist-lib/host/websocket-proxy.cjs +1 -1
  38. package/dist-lib/index.cjs +474 -283
  39. package/dist-lib/jump-to-source-babel.cjs +1 -1
  40. package/dist-lib/jump-to-source-native.cjs +1 -1
  41. package/dist-lib/kotlin-host.cjs +647 -284
  42. package/dist-lib/menu.cjs +1 -1
  43. package/dist-lib/menu.mjs +1 -1
  44. package/dist-lib/metro-fingerprint-registry.cjs +1 -1
  45. package/dist-lib/metro-fingerprint-registry.mjs +1 -1
  46. package/dist-lib/metro-production-bundle.cjs +1 -1
  47. package/dist-lib/metro-production-bundle.mjs +1 -1
  48. package/dist-lib/metro.cjs +775 -584
  49. package/dist-lib/native-app-identity-project.cjs +45 -4
  50. package/dist-lib/native-app-identity-project.mjs +45 -4
  51. package/dist-lib/native-app-identity.cjs +40 -2
  52. package/dist-lib/native-app-identity.mjs +40 -2
  53. package/dist-lib/native-firebase-metadata.cjs +1 -1
  54. package/dist-lib/native-firebase-metadata.mjs +1 -1
  55. package/dist-lib/pdfium-raster.cjs +1 -1
  56. package/dist-lib/pdfium-raster.mjs +1 -1
  57. package/dist-lib/plist.cjs +1 -1
  58. package/dist-lib/plist.mjs +1 -1
  59. package/dist-lib/profiles.cjs +1 -1
  60. package/dist-lib/public-brand.cjs +1 -1
  61. package/dist-lib/public-origins-lib-esm.json +24 -24
  62. package/dist-lib/public-origins-lib.json +99 -59
  63. package/dist-lib/react-native-host-modules.cjs +1 -1
  64. package/dist-lib/react-native-host-modules.mjs +1 -1
  65. package/dist-lib/reap-browser.cjs +1 -1
  66. package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
  67. package/dist-lib/sdk.cjs +1 -1
  68. package/dist-lib/sdk.mjs +1 -1
  69. package/dist-lib/skills.cjs +5257 -4878
  70. package/dist-lib/swift-compile.cjs +2 -2
  71. package/dist-lib/swift-compile.mjs +2 -2
  72. package/dist-lib/swift-package.cjs +1 -1
  73. package/dist-lib/swift-package.mjs +1 -1
  74. package/dist-lib/swift-submit.cjs +1 -1
  75. package/dist-lib/swift-submit.mjs +1 -1
  76. package/dist-lib/swift-toolchain.cjs +1 -1
  77. package/dist-lib/swift.cjs +1 -1
  78. package/dist-lib/vite-swift.cjs +3 -3
  79. package/dist-lib/vite.cjs +8 -7
  80. package/dist-lib/worklet-executable.cjs +1 -1
  81. package/dist-lib/worklet-executable.mjs +1 -1
  82. package/dist-types/packages/peach-engine/src/render-worker/compositor-backend.d.ts +1 -0
  83. package/kotlin/sdk.tar.gz +0 -0
  84. package/package.json +1 -1
  85. package/runtime-companion.json +1 -1
  86. package/sdk/ios/System/Library/Frameworks/CFNetwork.framework/Headers/CFNetwork.h +10 -0
  87. package/sdk/ios/System/Library/Frameworks/UIKit.framework/Headers/UIImageAsset.h +1 -1
  88. package/src/android-autolinking.ts +45 -4
  89. package/src/android-bridge-packages.ts +2 -2
  90. package/src/android-gradle-sources.ts +143 -0
  91. package/src/androidAutolinkingContract.ts +8 -0
  92. package/src/androidGradleContract.ts +14 -0
  93. package/src/expo-kotlin-host.ts +3 -0
  94. package/src/expo-native-workspace.ts +7 -1
  95. package/src/java-module-abi.ts +145 -0
  96. package/src/javaAbiContract.ts +14 -0
  97. package/src/kotlin-host.ts +57 -3
  98. package/src/native-app-identity-project.ts +10 -2
  99. package/src/native-app-identity.ts +15 -1
  100. package/src/nativeAppIconContract.ts +37 -0
  101. package/src/nitro-source.ts +2 -167
  102. package/src/react-native-autolinking.ts +153 -0
  103. package/src/swift-installed-targets.ts +8 -0
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.2185 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2187 | (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;
@@ -1389,6 +1389,34 @@ init_define_SWIFT_COVERAGE_SOURCE_DIGESTS();
1389
1389
  init_define_SWIFT_COVERAGE_SOURCE_DIGESTS();
1390
1390
 
1391
1391
  // src/nativeAppIconContract.ts
1392
+ function resolveNativeBundleIcons(icons, catalogNames, resolveReference) {
1393
+ if (!isRecord(icons) && catalogNames.length === 0) return void 0;
1394
+ const resolve = (value) => {
1395
+ if (typeof value === "string") return resolveReference(value);
1396
+ if (Array.isArray(value)) return value.map(resolve);
1397
+ if (isRecord(value))
1398
+ return Object.fromEntries(
1399
+ Object.entries(value).map(([key, entry]) => [
1400
+ resolveReference(key),
1401
+ resolve(entry)
1402
+ ])
1403
+ );
1404
+ return value;
1405
+ };
1406
+ const dictionary = isRecord(icons) ? Object.fromEntries(
1407
+ Object.entries(icons).map(([key, value]) => [key, resolve(value)])
1408
+ ) : {};
1409
+ if (catalogNames.length === 0) return dictionary;
1410
+ return {
1411
+ ...dictionary,
1412
+ CFBundleAlternateIcons: {
1413
+ ...Object.fromEntries(
1414
+ catalogNames.map((name) => [name, { CFBundleIconName: name }])
1415
+ ),
1416
+ ...isRecord(dictionary.CFBundleAlternateIcons) ? dictionary.CFBundleAlternateIcons : {}
1417
+ }
1418
+ };
1419
+ }
1392
1420
  function resolveNativeAppIconArtwork(resources, readText, resourceUri, icons, primaryName, alternateNames, resolveReference) {
1393
1421
  const members = new Set(resources);
1394
1422
  const dictionary = isRecord(icons) ? icons : {};
@@ -1965,8 +1993,11 @@ function nativeAppIdentityFromIos(files, parseInfoPlist, iosTarget, resourceUri)
1965
1993
  );
1966
1994
  if (alternateSetting === null)
1967
1995
  throw new Error("native alternate icon setting is unresolved");
1996
+ const catalogAlternateNames = [];
1968
1997
  for (const match of alternateSetting.replace(/\\"/g, '"').matchAll(/"([^"]*)"|([^\s(),]+)/g)) {
1969
- alternateIconNames.add(match[1] ?? match[2]);
1998
+ const name = match[1] ?? match[2];
1999
+ alternateIconNames.add(name);
2000
+ catalogAlternateNames.push(name);
1970
2001
  }
1971
2002
  const intentIds = dictionary.OneAppIntentIdentifiers;
1972
2003
  const appIntentIdentifiers = Array.isArray(intentIds) && intentIds.every((value) => typeof value === "string") ? intentIds.map((value) => resolveBuildSetting(value, settings)) : [];
@@ -2114,6 +2145,11 @@ function nativeAppIdentityFromIos(files, parseInfoPlist, iosTarget, resourceUri)
2114
2145
  ipadSupportedInterfaceOrientations,
2115
2146
  ...defaultScreenOrientationMask === void 0 ? {} : { defaultScreenOrientationMask },
2116
2147
  alternateIconNames: [...alternateIconNames],
2148
+ bundleIcons: resolveNativeBundleIcons(icons, catalogAlternateNames, (value) => {
2149
+ const resolved = resolveBuildSetting(value, settings);
2150
+ if (resolved === null) throw new Error("native bundle icon reference is unresolved");
2151
+ return resolved;
2152
+ }),
2117
2153
  ...resourceUri ? {
2118
2154
  appIconArtwork: resolveNativeAppIconArtwork(
2119
2155
  [...resources],
@@ -3282,7 +3318,7 @@ var FOUNDATION_IMPLICIT_MODULES = [
3282
3318
  var FOUNDATION_IMPLICIT_FLAGS = FOUNDATION_IMPLICIT_MODULES.map(
3283
3319
  (module2) => `, "-Xfrontend", "-import-module", "-Xfrontend", "${module2}"`
3284
3320
  ).join("");
3285
- var compilerSourceDigest = true ? "e48d05f659c020e9d4ddc0f6a17da7924aae807faacd6bef7cbed911c43d08cc" : swiftCompilerSourceDigest(__sootsim_import_meta_dirname);
3321
+ var compilerSourceDigest = true ? "08a3436f8de8fff57c3ffe7822dc37ac9addd391678cb64d73212534a6e94aa1" : swiftCompilerSourceDigest(__sootsim_import_meta_dirname);
3286
3322
  var CORE_FOUNDATION_HANDLE_IMPORTS = [
3287
3323
  "CFAllocator",
3288
3324
  "CFArray",
@@ -5878,9 +5914,13 @@ function readNativeAppIdentityFromXcodeTarget(app, parseInfoPlist = parsePlistSo
5878
5914
  }
5879
5915
  }
5880
5916
  const alternateSetting = settings?.("ASSETCATALOG_COMPILER_ALTERNATE_APPICON_NAMES") ?? "";
5917
+ const catalogAlternateNames = [];
5881
5918
  for (const match of alternateSetting.replace(/\\"/g, '"').matchAll(/"([^"]*)"|([^\s(),]+)/g)) {
5882
5919
  const val = match[1] ?? match[2];
5883
- if (val) alternateIconNames.add(val);
5920
+ if (val) {
5921
+ alternateIconNames.add(val);
5922
+ catalogAlternateNames.push(val);
5923
+ }
5884
5924
  }
5885
5925
  const permissionUsageDescriptions = {};
5886
5926
  for (const [key, value] of Object.entries(dictionary)) {
@@ -5943,6 +5983,7 @@ function readNativeAppIdentityFromXcodeTarget(app, parseInfoPlist = parsePlistSo
5943
5983
  ipadSupportedInterfaceOrientations,
5944
5984
  ...defaultScreenOrientationMask ? { defaultScreenOrientationMask } : {},
5945
5985
  alternateIconNames: [...alternateIconNames],
5986
+ bundleIcons: resolveNativeBundleIcons(icons, catalogAlternateNames, (value) => value),
5946
5987
  appIconArtwork: resolveNativeAppIconArtwork(
5947
5988
  app.resources,
5948
5989
  (file) => import_node_fs7.default.readFileSync(file, "utf8"),
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.2185 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2187 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  var __create = Object.create;
3
3
  var __defProp = Object.defineProperty;
4
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -1373,6 +1373,34 @@ init_define_SWIFT_COVERAGE_SOURCE_DIGESTS();
1373
1373
  init_define_SWIFT_COVERAGE_SOURCE_DIGESTS();
1374
1374
 
1375
1375
  // src/nativeAppIconContract.ts
1376
+ function resolveNativeBundleIcons(icons, catalogNames, resolveReference) {
1377
+ if (!isRecord(icons) && catalogNames.length === 0) return void 0;
1378
+ const resolve = (value) => {
1379
+ if (typeof value === "string") return resolveReference(value);
1380
+ if (Array.isArray(value)) return value.map(resolve);
1381
+ if (isRecord(value))
1382
+ return Object.fromEntries(
1383
+ Object.entries(value).map(([key, entry]) => [
1384
+ resolveReference(key),
1385
+ resolve(entry)
1386
+ ])
1387
+ );
1388
+ return value;
1389
+ };
1390
+ const dictionary = isRecord(icons) ? Object.fromEntries(
1391
+ Object.entries(icons).map(([key, value]) => [key, resolve(value)])
1392
+ ) : {};
1393
+ if (catalogNames.length === 0) return dictionary;
1394
+ return {
1395
+ ...dictionary,
1396
+ CFBundleAlternateIcons: {
1397
+ ...Object.fromEntries(
1398
+ catalogNames.map((name) => [name, { CFBundleIconName: name }])
1399
+ ),
1400
+ ...isRecord(dictionary.CFBundleAlternateIcons) ? dictionary.CFBundleAlternateIcons : {}
1401
+ }
1402
+ };
1403
+ }
1376
1404
  function resolveNativeAppIconArtwork(resources, readText, resourceUri, icons, primaryName, alternateNames, resolveReference) {
1377
1405
  const members = new Set(resources);
1378
1406
  const dictionary = isRecord(icons) ? icons : {};
@@ -1949,8 +1977,11 @@ function nativeAppIdentityFromIos(files, parseInfoPlist, iosTarget, resourceUri)
1949
1977
  );
1950
1978
  if (alternateSetting === null)
1951
1979
  throw new Error("native alternate icon setting is unresolved");
1980
+ const catalogAlternateNames = [];
1952
1981
  for (const match of alternateSetting.replace(/\\"/g, '"').matchAll(/"([^"]*)"|([^\s(),]+)/g)) {
1953
- alternateIconNames.add(match[1] ?? match[2]);
1982
+ const name = match[1] ?? match[2];
1983
+ alternateIconNames.add(name);
1984
+ catalogAlternateNames.push(name);
1954
1985
  }
1955
1986
  const intentIds = dictionary.OneAppIntentIdentifiers;
1956
1987
  const appIntentIdentifiers = Array.isArray(intentIds) && intentIds.every((value) => typeof value === "string") ? intentIds.map((value) => resolveBuildSetting(value, settings)) : [];
@@ -2098,6 +2129,11 @@ function nativeAppIdentityFromIos(files, parseInfoPlist, iosTarget, resourceUri)
2098
2129
  ipadSupportedInterfaceOrientations,
2099
2130
  ...defaultScreenOrientationMask === void 0 ? {} : { defaultScreenOrientationMask },
2100
2131
  alternateIconNames: [...alternateIconNames],
2132
+ bundleIcons: resolveNativeBundleIcons(icons, catalogAlternateNames, (value) => {
2133
+ const resolved = resolveBuildSetting(value, settings);
2134
+ if (resolved === null) throw new Error("native bundle icon reference is unresolved");
2135
+ return resolved;
2136
+ }),
2101
2137
  ...resourceUri ? {
2102
2138
  appIconArtwork: resolveNativeAppIconArtwork(
2103
2139
  [...resources],
@@ -3442,7 +3478,7 @@ var FOUNDATION_IMPLICIT_MODULES = [
3442
3478
  var FOUNDATION_IMPLICIT_FLAGS = FOUNDATION_IMPLICIT_MODULES.map(
3443
3479
  (module) => `, "-Xfrontend", "-import-module", "-Xfrontend", "${module}"`
3444
3480
  ).join("");
3445
- var compilerSourceDigest = true ? "e48d05f659c020e9d4ddc0f6a17da7924aae807faacd6bef7cbed911c43d08cc" : swiftCompilerSourceDigest(import.meta.dirname);
3481
+ var compilerSourceDigest = true ? "08a3436f8de8fff57c3ffe7822dc37ac9addd391678cb64d73212534a6e94aa1" : swiftCompilerSourceDigest(import.meta.dirname);
3446
3482
  var CORE_FOUNDATION_HANDLE_IMPORTS = [
3447
3483
  "CFAllocator",
3448
3484
  "CFArray",
@@ -6046,9 +6082,13 @@ function readNativeAppIdentityFromXcodeTarget(app, parseInfoPlist = parsePlistSo
6046
6082
  }
6047
6083
  }
6048
6084
  const alternateSetting = settings?.("ASSETCATALOG_COMPILER_ALTERNATE_APPICON_NAMES") ?? "";
6085
+ const catalogAlternateNames = [];
6049
6086
  for (const match of alternateSetting.replace(/\\"/g, '"').matchAll(/"([^"]*)"|([^\s(),]+)/g)) {
6050
6087
  const val = match[1] ?? match[2];
6051
- if (val) alternateIconNames.add(val);
6088
+ if (val) {
6089
+ alternateIconNames.add(val);
6090
+ catalogAlternateNames.push(val);
6091
+ }
6052
6092
  }
6053
6093
  const permissionUsageDescriptions = {};
6054
6094
  for (const [key, value] of Object.entries(dictionary)) {
@@ -6111,6 +6151,7 @@ function readNativeAppIdentityFromXcodeTarget(app, parseInfoPlist = parsePlistSo
6111
6151
  ipadSupportedInterfaceOrientations,
6112
6152
  ...defaultScreenOrientationMask ? { defaultScreenOrientationMask } : {},
6113
6153
  alternateIconNames: [...alternateIconNames],
6154
+ bundleIcons: resolveNativeBundleIcons(icons, catalogAlternateNames, (value) => value),
6114
6155
  appIconArtwork: resolveNativeAppIconArtwork(
6115
6156
  app.resources,
6116
6157
  (file) => fs17.readFileSync(file, "utf8"),
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.2185 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2187 | (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;
@@ -265,6 +265,34 @@ function isSwiftImageVariants(value) {
265
265
  }
266
266
 
267
267
  // src/nativeAppIconContract.ts
268
+ function resolveNativeBundleIcons(icons, catalogNames, resolveReference) {
269
+ if (!isRecord(icons) && catalogNames.length === 0) return void 0;
270
+ const resolve = (value) => {
271
+ if (typeof value === "string") return resolveReference(value);
272
+ if (Array.isArray(value)) return value.map(resolve);
273
+ if (isRecord(value))
274
+ return Object.fromEntries(
275
+ Object.entries(value).map(([key, entry]) => [
276
+ resolveReference(key),
277
+ resolve(entry)
278
+ ])
279
+ );
280
+ return value;
281
+ };
282
+ const dictionary = isRecord(icons) ? Object.fromEntries(
283
+ Object.entries(icons).map(([key, value]) => [key, resolve(value)])
284
+ ) : {};
285
+ if (catalogNames.length === 0) return dictionary;
286
+ return {
287
+ ...dictionary,
288
+ CFBundleAlternateIcons: {
289
+ ...Object.fromEntries(
290
+ catalogNames.map((name) => [name, { CFBundleIconName: name }])
291
+ ),
292
+ ...isRecord(dictionary.CFBundleAlternateIcons) ? dictionary.CFBundleAlternateIcons : {}
293
+ }
294
+ };
295
+ }
268
296
  function isNativeAppIconArtwork(value) {
269
297
  return isRecord(value) && (value.primary === void 0 || isSwiftImageVariants(value.primary)) && isRecord(value.alternates) && Object.values(value.alternates).every(isSwiftImageVariants);
270
298
  }
@@ -597,6 +625,7 @@ function isNativeAppIdentity(value) {
597
625
  if (value.androidPhotoLibraryAddOnly !== void 0 && value.androidPhotoLibraryAddOnly !== true)
598
626
  return false;
599
627
  if (value.googleSignIn !== void 0 && !isRecord(value.googleSignIn)) return false;
628
+ if (value.bundleIcons !== void 0 && !isRecord(value.bundleIcons)) return false;
600
629
  const descriptions = value.permissionUsageDescriptions;
601
630
  if (value.reanimatedStaticFeatureFlags !== void 0 && (!isRecord(value.reanimatedStaticFeatureFlags) || !Object.values(value.reanimatedStaticFeatureFlags).every(
602
631
  (flag) => typeof flag === "boolean"
@@ -687,6 +716,7 @@ function readNativeAppIdentity(value) {
687
716
  ...value.reanimatedStaticFeatureFlags === void 0 ? {} : { reanimatedStaticFeatureFlags: { ...value.reanimatedStaticFeatureFlags } },
688
717
  ...value.appIconArtwork === void 0 ? {} : { appIconArtwork: readNativeAppIconArtwork(value.appIconArtwork) },
689
718
  ...value.alternateIconNames === void 0 ? {} : { alternateIconNames: [...value.alternateIconNames] },
719
+ ...value.bundleIcons === void 0 ? {} : { bundleIcons: structuredClone(value.bundleIcons) },
690
720
  ...value.androidManifestPermissions === void 0 ? {} : {
691
721
  androidManifestPermissions: value.androidManifestPermissions.map(
692
722
  (permission) => ({ ...permission })
@@ -1109,8 +1139,11 @@ function nativeAppIdentityFromIos(files, parseInfoPlist, iosTarget, resourceUri)
1109
1139
  );
1110
1140
  if (alternateSetting === null)
1111
1141
  throw new Error("native alternate icon setting is unresolved");
1142
+ const catalogAlternateNames = [];
1112
1143
  for (const match of alternateSetting.replace(/\\"/g, '"').matchAll(/"([^"]*)"|([^\s(),]+)/g)) {
1113
- alternateIconNames.add(match[1] ?? match[2]);
1144
+ const name = match[1] ?? match[2];
1145
+ alternateIconNames.add(name);
1146
+ catalogAlternateNames.push(name);
1114
1147
  }
1115
1148
  const intentIds = dictionary.OneAppIntentIdentifiers;
1116
1149
  const appIntentIdentifiers = Array.isArray(intentIds) && intentIds.every((value) => typeof value === "string") ? intentIds.map((value) => resolveBuildSetting(value, settings)) : [];
@@ -1258,6 +1291,11 @@ function nativeAppIdentityFromIos(files, parseInfoPlist, iosTarget, resourceUri)
1258
1291
  ipadSupportedInterfaceOrientations,
1259
1292
  ...defaultScreenOrientationMask === void 0 ? {} : { defaultScreenOrientationMask },
1260
1293
  alternateIconNames: [...alternateIconNames],
1294
+ bundleIcons: resolveNativeBundleIcons(icons, catalogAlternateNames, (value) => {
1295
+ const resolved = resolveBuildSetting(value, settings);
1296
+ if (resolved === null) throw new Error("native bundle icon reference is unresolved");
1297
+ return resolved;
1298
+ }),
1261
1299
  ...resourceUri ? {
1262
1300
  appIconArtwork: resolveNativeAppIconArtwork(
1263
1301
  [...resources],
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.2185 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2187 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
 
3
3
  // ../peach-globals/src/bundle-global-footer.ts
4
4
  function findBundleFooter(source, prefix) {
@@ -220,6 +220,34 @@ function isSwiftImageVariants(value) {
220
220
  }
221
221
 
222
222
  // src/nativeAppIconContract.ts
223
+ function resolveNativeBundleIcons(icons, catalogNames, resolveReference) {
224
+ if (!isRecord(icons) && catalogNames.length === 0) return void 0;
225
+ const resolve = (value) => {
226
+ if (typeof value === "string") return resolveReference(value);
227
+ if (Array.isArray(value)) return value.map(resolve);
228
+ if (isRecord(value))
229
+ return Object.fromEntries(
230
+ Object.entries(value).map(([key, entry]) => [
231
+ resolveReference(key),
232
+ resolve(entry)
233
+ ])
234
+ );
235
+ return value;
236
+ };
237
+ const dictionary = isRecord(icons) ? Object.fromEntries(
238
+ Object.entries(icons).map(([key, value]) => [key, resolve(value)])
239
+ ) : {};
240
+ if (catalogNames.length === 0) return dictionary;
241
+ return {
242
+ ...dictionary,
243
+ CFBundleAlternateIcons: {
244
+ ...Object.fromEntries(
245
+ catalogNames.map((name) => [name, { CFBundleIconName: name }])
246
+ ),
247
+ ...isRecord(dictionary.CFBundleAlternateIcons) ? dictionary.CFBundleAlternateIcons : {}
248
+ }
249
+ };
250
+ }
223
251
  function isNativeAppIconArtwork(value) {
224
252
  return isRecord(value) && (value.primary === void 0 || isSwiftImageVariants(value.primary)) && isRecord(value.alternates) && Object.values(value.alternates).every(isSwiftImageVariants);
225
253
  }
@@ -552,6 +580,7 @@ function isNativeAppIdentity(value) {
552
580
  if (value.androidPhotoLibraryAddOnly !== void 0 && value.androidPhotoLibraryAddOnly !== true)
553
581
  return false;
554
582
  if (value.googleSignIn !== void 0 && !isRecord(value.googleSignIn)) return false;
583
+ if (value.bundleIcons !== void 0 && !isRecord(value.bundleIcons)) return false;
555
584
  const descriptions = value.permissionUsageDescriptions;
556
585
  if (value.reanimatedStaticFeatureFlags !== void 0 && (!isRecord(value.reanimatedStaticFeatureFlags) || !Object.values(value.reanimatedStaticFeatureFlags).every(
557
586
  (flag) => typeof flag === "boolean"
@@ -642,6 +671,7 @@ function readNativeAppIdentity(value) {
642
671
  ...value.reanimatedStaticFeatureFlags === void 0 ? {} : { reanimatedStaticFeatureFlags: { ...value.reanimatedStaticFeatureFlags } },
643
672
  ...value.appIconArtwork === void 0 ? {} : { appIconArtwork: readNativeAppIconArtwork(value.appIconArtwork) },
644
673
  ...value.alternateIconNames === void 0 ? {} : { alternateIconNames: [...value.alternateIconNames] },
674
+ ...value.bundleIcons === void 0 ? {} : { bundleIcons: structuredClone(value.bundleIcons) },
645
675
  ...value.androidManifestPermissions === void 0 ? {} : {
646
676
  androidManifestPermissions: value.androidManifestPermissions.map(
647
677
  (permission) => ({ ...permission })
@@ -1064,8 +1094,11 @@ function nativeAppIdentityFromIos(files, parseInfoPlist, iosTarget, resourceUri)
1064
1094
  );
1065
1095
  if (alternateSetting === null)
1066
1096
  throw new Error("native alternate icon setting is unresolved");
1097
+ const catalogAlternateNames = [];
1067
1098
  for (const match of alternateSetting.replace(/\\"/g, '"').matchAll(/"([^"]*)"|([^\s(),]+)/g)) {
1068
- alternateIconNames.add(match[1] ?? match[2]);
1099
+ const name = match[1] ?? match[2];
1100
+ alternateIconNames.add(name);
1101
+ catalogAlternateNames.push(name);
1069
1102
  }
1070
1103
  const intentIds = dictionary.OneAppIntentIdentifiers;
1071
1104
  const appIntentIdentifiers = Array.isArray(intentIds) && intentIds.every((value) => typeof value === "string") ? intentIds.map((value) => resolveBuildSetting(value, settings)) : [];
@@ -1213,6 +1246,11 @@ function nativeAppIdentityFromIos(files, parseInfoPlist, iosTarget, resourceUri)
1213
1246
  ipadSupportedInterfaceOrientations,
1214
1247
  ...defaultScreenOrientationMask === void 0 ? {} : { defaultScreenOrientationMask },
1215
1248
  alternateIconNames: [...alternateIconNames],
1249
+ bundleIcons: resolveNativeBundleIcons(icons, catalogAlternateNames, (value) => {
1250
+ const resolved = resolveBuildSetting(value, settings);
1251
+ if (resolved === null) throw new Error("native bundle icon reference is unresolved");
1252
+ return resolved;
1253
+ }),
1216
1254
  ...resourceUri ? {
1217
1255
  appIconArtwork: resolveNativeAppIconArtwork(
1218
1256
  [...resources],
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.2185 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2187 | (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.2185 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2187 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
 
3
3
  // ../peach-globals/src/bundle-global-footer.ts
4
4
  function findBundleFooter(source, prefix) {
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.2185 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2187 | (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.2185 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2187 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
 
3
3
  // src/pdfium-raster.ts
4
4
  import { PDFiumLibrary } from "@hyzyla/pdfium/inline";
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.2185 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2187 | (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;
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.2185 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2187 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
 
3
3
  // src/plist.ts
4
4
  import plist from "plist";
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.2185 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2187 | (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;
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.2185 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2187 | (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;
@@ -2,37 +2,37 @@
2
2
  "version": 1,
3
3
  "outputs": {
4
4
  "beta.mjs": {
5
- "sha256": "71eb62ccda6fae590e95ee7376f17f8e289b03af784994f0b49ec165c8c0754e",
5
+ "sha256": "aa911f2dc04e00586223f1be26e855623027af47b06a4c25479cef038127ed64",
6
6
  "inputs": [
7
7
  "packages/peachsim/src/beta.ts"
8
8
  ]
9
9
  },
10
10
  "bridge-contract.mjs": {
11
- "sha256": "a19365d054562f248aaa919a8a54d64a3dd6c4c3e11d7a3dceeeb0dd117e497f",
11
+ "sha256": "ce6881033d110e599fa092193725db7fe1156149e24327639707d52105766dd2",
12
12
  "inputs": [
13
13
  "packages/peachsim/src/bridge-contract.ts"
14
14
  ]
15
15
  },
16
16
  "capture-contract.mjs": {
17
- "sha256": "8fee293ff5195e096414202d9f974bbf5452f9a4a2ef4a71a701e2c7072e96ac",
17
+ "sha256": "1153849bebe2df13c7badd5f00497f001d34fb97fa70910dab7ca71b1f199803",
18
18
  "inputs": [
19
19
  "packages/peachsim/src/capture-contract.ts"
20
20
  ]
21
21
  },
22
22
  "cloud-contract.mjs": {
23
- "sha256": "bcfc61b63dda77357f5280d164a63b40a2444e5d2366323794c865b5cd1d704c",
23
+ "sha256": "e8303b6bbb3cb2dc9a49c5e26bd07ba872cb4516851f6ba80d6fa29f26f62900",
24
24
  "inputs": [
25
25
  "packages/peachsim/src/cloud-contract.ts"
26
26
  ]
27
27
  },
28
28
  "cloud-test-args.mjs": {
29
- "sha256": "13f668992e13d970c0acc1b9b5d6d39c4b3782bfe4c1c17c6788138cdc8a15f8",
29
+ "sha256": "6f63dd3824ace28bb44bb4bbd98d2a3cf6d495304d8d07cd429a51de9fe8110a",
30
30
  "inputs": [
31
31
  "packages/peachsim/src/cloud-test-args.ts"
32
32
  ]
33
33
  },
34
34
  "cloud.mjs": {
35
- "sha256": "5df9789a929b77278cea50e218994d7ea53e656f74d1a1bb954c7e279366ce2f",
35
+ "sha256": "dbe3c5030f2bba78fcbaf73a81c99fe3972374f110a9dac8bd759ed903e8db3f",
36
36
  "inputs": [
37
37
  "packages/peachsim/src/backend-origin.ts",
38
38
  "packages/peachsim/src/capture-contract.ts",
@@ -44,14 +44,14 @@
44
44
  ]
45
45
  },
46
46
  "menu.mjs": {
47
- "sha256": "74a046973e2baf6ff2db3e252579aed05011257545ac9337ee80fb7fa65d69cf",
47
+ "sha256": "6a6e3962d389b90898601c48e59eaa7f8a83e3a9db06773e50273e5681bf2365",
48
48
  "inputs": [
49
49
  "packages/peachsim/src/public-brand.ts",
50
50
  "packages/peachsim/src/menu.ts"
51
51
  ]
52
52
  },
53
53
  "config.mjs": {
54
- "sha256": "7ab23391ce13466746805fc190732f6e845301043e3d57c9a9f783c2ea74cd51",
54
+ "sha256": "338ca2e095e70132d854fbce1e1301943d17a0956e240dcc37d3d1b8f65a6b38",
55
55
  "inputs": [
56
56
  "packages/contrast-runtime-delivery/src/version.ts",
57
57
  "packages/peach-globals/src/bundle-global-footer.ts",
@@ -61,20 +61,20 @@
61
61
  ]
62
62
  },
63
63
  "host/fetch-proxy-overrides.mjs": {
64
- "sha256": "1ebce1a63a154e0c9f172eb54eb80637edc3bc47a83954acb0c86ce661da88f0",
64
+ "sha256": "d04e9c9aeff5bdd6ef1031b1b5d5996b3ce69f8cafcc52fe534e6151ecfb3c19",
65
65
  "inputs": [
66
66
  "packages/peachsim/src/host/fetch-proxy-overrides.ts"
67
67
  ]
68
68
  },
69
69
  "metro-fingerprint-registry.mjs": {
70
- "sha256": "608c8910c98467645be65690e4b87bdad918326ac665ae3d42bc99961560e92f",
70
+ "sha256": "8a76c8a4bf6f52f1d995052e205dc7d7c505be973a24ceb20721494754f6a1d9",
71
71
  "inputs": [
72
72
  "packages/peachsim/src/is-record.ts",
73
73
  "packages/peachsim/src/metro-fingerprint-registry.ts"
74
74
  ]
75
75
  },
76
76
  "metro-production-bundle.mjs": {
77
- "sha256": "46d79f4947ddafccafdd3326a1b76e77e382d9756fe320fb5a9ef1d40290ded6",
77
+ "sha256": "ebbe1592210f74ab39a76f2b01f4699eac7d2d6dcf07fd40a90d74f103f93433",
78
78
  "inputs": [
79
79
  "packages/peachsim/src/swift-coverage/indexdump.ts",
80
80
  "packages/peachsim/src/swift-coverage/indexing.ts",
@@ -105,13 +105,13 @@
105
105
  ]
106
106
  },
107
107
  "worklet-executable.mjs": {
108
- "sha256": "82beb7c10e9e8abbe469bc1285dccd4bf3e54ca0377c1c3e16db6afd84a330c0",
108
+ "sha256": "bd82946e4e5d7650d0c4b40a7db380d4d2f18ce9d0a7aae14b5370d82e5a43a6",
109
109
  "inputs": [
110
110
  "packages/peachsim/src/worklet-executable.ts"
111
111
  ]
112
112
  },
113
113
  "native-app-identity.mjs": {
114
- "sha256": "e860876e64686989c2ba11eeb51ca57a0017ec934a31e7bd2b8ec35b8f8b7df2",
114
+ "sha256": "d355fb654bf152c47c221b7aad0694349863750144fac51dd71ad7afb037c246",
115
115
  "inputs": [
116
116
  "packages/peach-globals/src/bundle-global-footer.ts",
117
117
  "packages/peachsim/src/android-string-value.ts",
@@ -126,7 +126,7 @@
126
126
  ]
127
127
  },
128
128
  "native-app-identity-project.mjs": {
129
- "sha256": "5f80451b547ddd66dea8b88bc699169d1107d388a3ee6ef9682090be65e2b993",
129
+ "sha256": "3942d44214df285a6198d40ea950b07ad3b4ef228309e6fb9f6e5e382e0805f3",
130
130
  "inputs": [
131
131
  "packages/peachsim/src/swift-coverage/indexdump.ts",
132
132
  "packages/peachsim/src/swift-coverage/indexing.ts",
@@ -241,26 +241,26 @@
241
241
  ]
242
242
  },
243
243
  "native-firebase-metadata.mjs": {
244
- "sha256": "3279a08b572856a95a800ac7c02e206fb069a06565f93a079654fb5178b77263",
244
+ "sha256": "c80d8560d452bdca06a19011ecb3c170e163e535aa952505ec7de91666b3cf6b",
245
245
  "inputs": [
246
246
  "packages/peach-globals/src/bundle-global-footer.ts",
247
247
  "packages/peachsim/src/native-firebase-metadata.ts"
248
248
  ]
249
249
  },
250
250
  "plist.mjs": {
251
- "sha256": "08fd5c9b6408b736f80e4e263fc548c882403829685992bf21425904038d09ff",
251
+ "sha256": "b29235d1a903bca642a33fbedf96062a40cc21327e80fa16b0ab8ebe1d3ff856",
252
252
  "inputs": [
253
253
  "packages/peachsim/src/plist.ts"
254
254
  ]
255
255
  },
256
256
  "react-native-host-modules.mjs": {
257
- "sha256": "0048157e28b46b45ff8556eb93ff4f79434d86e9c1ee3a654fa067cc7a3d55b4",
257
+ "sha256": "66740247c36fcd2e2ad206e1f6452714f5e502d2f9b22efe5d6246d5fac438e8",
258
258
  "inputs": [
259
259
  "packages/peachsim/src/react-native-host-modules.ts"
260
260
  ]
261
261
  },
262
262
  "sdk.mjs": {
263
- "sha256": "b90f5645d49e05f3f57e5336961b806c55f33205616e2f04be466adc86550046",
263
+ "sha256": "7d6600d2a283423d819105a97ad1147bd7441a3759146ecbd9d4573a32d3ab70",
264
264
  "inputs": [
265
265
  "packages/peachsim/src/bridge-contract.ts",
266
266
  "packages/peachsim/src/is-record.ts",
@@ -277,7 +277,7 @@
277
277
  ]
278
278
  },
279
279
  "bridge-contract-input.mjs": {
280
- "sha256": "7c58fd670a765daf60a46efb11f3d95d67013c6128560755fbe8a264bfb9d338",
280
+ "sha256": "6708e5bfa735c83c09744eb9db5cddb0da29ed06dd68599f793f3769d8aa5d4c",
281
281
  "inputs": [
282
282
  "packages/peachsim/src/bridge-contract.ts",
283
283
  "packages/peachsim/src/is-record.ts",
@@ -285,7 +285,7 @@
285
285
  ]
286
286
  },
287
287
  "swift-submit.mjs": {
288
- "sha256": "0b177b7d2a98be7ab70092ea4a8f29daa89a509387ff13900e27b27f8b9b23b6",
288
+ "sha256": "be163375eb7dafcb26d162c2212a1b8858c4cd40dfa27a58b5049472b858b97b",
289
289
  "inputs": [
290
290
  "packages/peachsim/src/is-record.ts",
291
291
  "packages/peachsim/src/swiftContract.ts",
@@ -293,19 +293,19 @@
293
293
  ]
294
294
  },
295
295
  "pdfium-raster.mjs": {
296
- "sha256": "0f9e5980fc57da09e1329adc84306df9b12e467192c10a62c6a920cd7c6ca3e9",
296
+ "sha256": "4d6421f0880b25a22933ef74ca81dc311c0c888096894be4d636482430097d92",
297
297
  "inputs": [
298
298
  "packages/peachsim/src/pdfium-raster.ts"
299
299
  ]
300
300
  },
301
301
  "swift-package.mjs": {
302
- "sha256": "8a3f6ca599a21b2238b1da4de29aacf4e1ac6927cd40a6dbc0dc40731e661a1b",
302
+ "sha256": "a503e7666cf701dc29fee8ef48c14dba2dd764a278ceb7b808c7d55bb97d6fa0",
303
303
  "inputs": [
304
304
  "packages/peachsim/src/swift-package.ts"
305
305
  ]
306
306
  },
307
307
  "swift-compile.mjs": {
308
- "sha256": "a2f49cb109c379c9b7174d469d1907e78b40468468fcc8cb110bdb9751fb532c",
308
+ "sha256": "c098dec7413ce96d5268855afc039af5775437f1a911e3a1d0d17921fca41383",
309
309
  "inputs": [
310
310
  "packages/peachsim/src/swift-compile.ts",
311
311
  "packages/peachsim/src/admitted-mac-build.ts",
@@ -362,7 +362,7 @@
362
362
  ]
363
363
  },
364
364
  "expo-swift-metadata.mjs": {
365
- "sha256": "11a6de552bc2273179709550b1e656c17365ad69a3d0469c98ce00e01b867aff",
365
+ "sha256": "53b3a35c9302f2c367e872c58ef028933d0dc4aea650d9725b1c3107549be01a",
366
366
  "inputs": [
367
367
  "packages/peach-globals/src/bundle-global-footer.ts",
368
368
  "packages/peachsim/src/is-record.ts",