peachsim 0.1.2225 → 0.1.2229

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 (118) hide show
  1. package/cli/bridge-flow-runner.ts +56 -3
  2. package/cli/commands/control.ts +27 -1
  3. package/cli/commands/device.ts +1 -1
  4. package/cli/commands/flow.ts +27 -1
  5. package/cli/commands/package.ts +9 -2
  6. package/cli/drivers/playwright.ts +1 -0
  7. package/cli/drivers/types.ts +3 -0
  8. package/dist-lib/agent-daemon-client.cjs +1 -1
  9. package/dist-lib/agent-events.cjs +1 -1
  10. package/dist-lib/attached-projects.cjs +1 -1
  11. package/dist-lib/auth/shared-session.cjs +1 -1
  12. package/dist-lib/backend-origin.cjs +1 -1
  13. package/dist-lib/beta.cjs +1 -1
  14. package/dist-lib/beta.mjs +1 -1
  15. package/dist-lib/bridge-constants.cjs +1 -1
  16. package/dist-lib/bridge-contract-input.cjs +1 -1
  17. package/dist-lib/bridge-contract-input.mjs +1 -1
  18. package/dist-lib/bridge-contract.cjs +1 -1
  19. package/dist-lib/bridge-contract.mjs +1 -1
  20. package/dist-lib/bundle-channel.cjs +108 -13
  21. package/dist-lib/capture-contract.cjs +1 -1
  22. package/dist-lib/capture-contract.mjs +1 -1
  23. package/dist-lib/cloud-contract.cjs +1 -1
  24. package/dist-lib/cloud-contract.mjs +1 -1
  25. package/dist-lib/cloud-test-args.cjs +1 -1
  26. package/dist-lib/cloud-test-args.mjs +1 -1
  27. package/dist-lib/cloud.cjs +1 -1
  28. package/dist-lib/cloud.mjs +1 -1
  29. package/dist-lib/config.cjs +1 -1
  30. package/dist-lib/config.mjs +1 -1
  31. package/dist-lib/detox/index.cjs +5 -2
  32. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  33. package/dist-lib/expo-swift-bundle.cjs +106 -11
  34. package/dist-lib/expo-swift-metadata.cjs +1 -1
  35. package/dist-lib/expo-swift-metadata.mjs +1 -1
  36. package/dist-lib/home-paths.cjs +1 -1
  37. package/dist-lib/host/bridge-host.cjs +108 -13
  38. package/dist-lib/host/fetch-proxy-handler.cjs +5 -5
  39. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  40. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  41. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  42. package/dist-lib/host/websocket-proxy.cjs +1 -1
  43. package/dist-lib/index.cjs +8 -6
  44. package/dist-lib/jump-to-source-babel.cjs +1 -1
  45. package/dist-lib/jump-to-source-native.cjs +1 -1
  46. package/dist-lib/kotlin-host.cjs +1 -1
  47. package/dist-lib/menu.cjs +16 -14
  48. package/dist-lib/menu.mjs +16 -14
  49. package/dist-lib/metro-fingerprint-registry.cjs +1 -1
  50. package/dist-lib/metro-fingerprint-registry.mjs +1 -1
  51. package/dist-lib/metro-production-bundle.cjs +11 -4
  52. package/dist-lib/metro-production-bundle.mjs +10 -4
  53. package/dist-lib/metro.cjs +8 -6
  54. package/dist-lib/native-app-identity-project.cjs +6 -4
  55. package/dist-lib/native-app-identity-project.mjs +6 -4
  56. package/dist-lib/native-app-identity.cjs +1 -1
  57. package/dist-lib/native-app-identity.mjs +1 -1
  58. package/dist-lib/native-firebase-metadata.cjs +1 -1
  59. package/dist-lib/native-firebase-metadata.mjs +1 -1
  60. package/dist-lib/pdfium-raster.cjs +1 -1
  61. package/dist-lib/pdfium-raster.mjs +1 -1
  62. package/dist-lib/plist.cjs +1 -1
  63. package/dist-lib/plist.mjs +1 -1
  64. package/dist-lib/profiles.cjs +1 -1
  65. package/dist-lib/public-brand.cjs +1 -1
  66. package/dist-lib/public-origins-lib-esm.json +25 -24
  67. package/dist-lib/public-origins-lib.json +56 -53
  68. package/dist-lib/react-native-host-modules.cjs +1 -1
  69. package/dist-lib/react-native-host-modules.mjs +1 -1
  70. package/dist-lib/reap-browser.cjs +1 -1
  71. package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
  72. package/dist-lib/sdk.cjs +1 -1
  73. package/dist-lib/sdk.mjs +1 -1
  74. package/dist-lib/skills.cjs +183 -27
  75. package/dist-lib/swift-compile.cjs +68 -4
  76. package/dist-lib/swift-compile.mjs +67 -4
  77. package/dist-lib/swift-package.cjs +1 -1
  78. package/dist-lib/swift-package.mjs +1 -1
  79. package/dist-lib/swift-submit.cjs +1 -1
  80. package/dist-lib/swift-submit.mjs +1 -1
  81. package/dist-lib/swift-toolchain.cjs +1 -1
  82. package/dist-lib/swift.cjs +1 -1
  83. package/dist-lib/vite-swift.cjs +105 -10
  84. package/dist-lib/vite.cjs +5 -5
  85. package/dist-lib/worklet-executable.cjs +1 -1
  86. package/dist-lib/worklet-executable.mjs +1 -1
  87. package/dist-types/packages/peach-engine/src/bundle-parse-receipt.d.ts +17 -0
  88. package/dist-types/packages/peach-engine/src/engine/canvaskit-api.d.ts +5 -1
  89. package/dist-types/packages/peach-engine/src/engine/font-config.d.ts +2 -2
  90. package/dist-types/packages/peach-engine/src/engine/native-layout.d.ts +11 -3
  91. package/dist-types/packages/peach-engine/src/engine/native-paragraph.d.ts +4 -0
  92. package/dist-types/packages/peach-engine/src/engine/node.d.ts +2 -0
  93. package/dist-types/packages/peach-engine/src/engine/scene-table.d.ts +1 -1
  94. package/dist-types/packages/peach-engine/src/engine/types.d.ts +9 -1
  95. package/dist-types/packages/peach-engine/src/engine/yoga-layout.d.ts +2 -0
  96. package/dist-types/packages/peach-engine/src/metro-fingerprint.d.ts +3 -2
  97. package/dist-types/packages/peach-engine/src/render-worker/compositor-protocol.d.ts +1 -0
  98. package/dist-types/packages/peach-engine/src/render-worker/protocol.d.ts +3 -3
  99. package/dist-types/packages/peach-engine/src/rolldown-bundle-inventory.d.ts +0 -5
  100. package/dist-types/packages/peach-kit/src/capabilities.d.ts +2 -0
  101. package/dist-types/packages/peach-kit/src/internal.d.ts +1 -1
  102. package/dist-types/packages/peach-kit/src/ios-tint.d.ts +2 -0
  103. package/kotlin/sdk.tar.gz +0 -0
  104. package/package.json +1 -1
  105. package/runtime-companion.json +1 -1
  106. package/sdk/ios/System/Library/Frameworks/UIKit.framework/Headers/UIControl.h +0 -26
  107. package/sdk/ios/System/Library/Frameworks/UIKitTypes.framework/Headers/UIKitTypes.h +27 -0
  108. package/sdk/ios/usr/include/ObjectiveC.apinotes +380 -7
  109. package/src/appPackageContract.ts +1 -1
  110. package/src/menu.ts +17 -99
  111. package/src/menuContract.ts +102 -0
  112. package/src/metro-production-bundle.ts +15 -2
  113. package/src/settingsContract.ts +8 -8
  114. package/src/swift-compile.ts +77 -2
  115. package/src/swift-host.ts +27 -2
  116. package/src/swift-standin-emit.ts +1 -0
  117. package/src/swift-standins.ts +8 -0
  118. package/src/xcode-project.ts +8 -2
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.2225 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2229 | (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;
package/dist-lib/sdk.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.2225 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2229 | (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;
package/dist-lib/sdk.mjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.2225 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2229 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  var __defProp = Object.defineProperty;
3
3
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
4
4
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.2225 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2229 | (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": "d98d6294b359528f7733b26db6f80f554782354faa235605f9562be4ad98b8a3", "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": "bfde06f157f52d3dd76577b3c6059c95c0393180b054ced773624ea89558992b", "swift-package.ts": "338cfef9a34a930206ac2e1a8a90b85c8d61f776d9a41e6445dc18e0c5385cdb", "swift-source-file.ts": "93fd659ed63a27b67f54a7c229a7ceb636dc9c59e68414920ba36cff1eda1f94", "swift-toolchain.ts": "8deef5a824ed49209458a4b398cd8e88df260a0c8f1894d568279f6211866547", "home-paths.ts": "d1606390f0e8e50f0ff72544eadb3d49dfabf08e004c1218f2998c36fb8995dd", "xcode-header-search.ts": "f8c3d557b4eca5ddad32907545353eb7ad53b2ebd0969d9ed8f7275e109a13b1", "xcode-project.ts": "40ec039e7a2920e6b4e7610986eb3ba75c5811eed4ea41570c2a7e2424911721", "xcode-target-members.ts": "d49af77a690cff481b38333b5f63f6600123b1bb57f410b0adb298b010d2047b", "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": "d98d6294b359528f7733b26db6f80f554782354faa235605f9562be4ad98b8a3", "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": "bfde06f157f52d3dd76577b3c6059c95c0393180b054ced773624ea89558992b", "swift-package.ts": "338cfef9a34a930206ac2e1a8a90b85c8d61f776d9a41e6445dc18e0c5385cdb", "swift-source-file.ts": "93fd659ed63a27b67f54a7c229a7ceb636dc9c59e68414920ba36cff1eda1f94", "swift-toolchain.ts": "8deef5a824ed49209458a4b398cd8e88df260a0c8f1894d568279f6211866547", "home-paths.ts": "d1606390f0e8e50f0ff72544eadb3d49dfabf08e004c1218f2998c36fb8995dd", "xcode-header-search.ts": "f8c3d557b4eca5ddad32907545353eb7ad53b2ebd0969d9ed8f7275e109a13b1", "xcode-project.ts": "774c42f06f8d5c1f3f3a09f94379db2046af0016f1fcd6cbe595a9c2da5dcf95", "xcode-target-members.ts": "d49af77a690cff481b38333b5f63f6600123b1bb57f410b0adb298b010d2047b", "xcode-json-project.ts": "41990ebbe4b488eef34e74c4608b4b48e5a5b299ba98ca7fbcfdfa0e77be63b6", "openstep-plist.ts": "74e6ce1dac80c9c318e0e9f5e3e8cd19a898a8820c36fc160609695bcb59dcd3" };
43
43
  }
44
44
  });
45
45
 
@@ -44553,7 +44553,7 @@ function emitSwiftStandin(sourceGraphs, options) {
44553
44553
  "Equatable",
44554
44554
  "CustomStringConvertible",
44555
44555
  "CustomDebugStringConvertible"
44556
- ].includes(name3)) && !(name3 === nsObjectProtocol && externalRoot(id) === nsObject) && !options.unconformed?.get(path141)?.has(name3)
44556
+ ].includes(name3)) && !(name3 === nsObjectProtocol && externalRoot(id) === nsObject) && !options.unconformed?.get(path141)?.has(name3.split(/::|\./).pop()) && !options.unconformed?.get(path141)?.has(name3)
44557
44557
  )
44558
44558
  ].filter((name3, at, all2) => all2.indexOf(name3) === at);
44559
44559
  const parentSymbol = superId.has(id) ? byId.get(superId.get(id)) : void 0;
@@ -54492,6 +54492,20 @@ function swiftModuleInterface(moduleRoot, name3, interfaceRoot) {
54492
54492
  if (declared.size === 0) return null;
54493
54493
  return { declared, header: clangInterfaceHeader((0, import_node_fs54.readFileSync)(built2, "utf8")) };
54494
54494
  }
54495
+ function swiftHeaderWithSuperclassImports(header, interfaceFor) {
54496
+ const superclasses = new Set(
54497
+ [...header.matchAll(/@interface\s+\w+\s*:\s*(\w+)/g)].map((match) => match[1])
54498
+ );
54499
+ return header.replace(/^@import (\w+);$/gm, (statement, name3) => {
54500
+ const dependency = interfaceFor(name3);
54501
+ if (!dependency || ![...swiftInterfaceDeclarations(dependency.header)].some(
54502
+ (name4) => superclasses.has(name4)
54503
+ ))
54504
+ return statement;
54505
+ return `${statement}
54506
+ #import ${JSON.stringify(dependency.file)}`;
54507
+ });
54508
+ }
54495
54509
  function withoutSwiftDeclarations(text6, declared, interfaceImport) {
54496
54510
  const out = [];
54497
54511
  let skipping;
@@ -58870,6 +58884,51 @@ function compileSwiftProjectOnce(input, options) {
58870
58884
  if ((0, import_node_fs54.existsSync)(linked) && (0, import_node_fs54.statSync)(linked).size <= 8)
58871
58885
  (0, import_node_fs54.rmSync)(linked, { force: true });
58872
58886
  report("compiling and linking Swift modules");
58887
+ const frameworkInterfaces = /* @__PURE__ */ new Map();
58888
+ const frameworkInterface = (name3) => {
58889
+ if (frameworkInterfaces.has(name3)) return frameworkInterfaces.get(name3);
58890
+ const source = distribution ? import_node_path51.default.join(frameworkRoot, "modules", `${name3}-Swift.h`) : import_node_path51.default.join(
58891
+ prebuilt.modules,
58892
+ "..",
58893
+ `${name3}.build/include/${name3}-Swift.h`
58894
+ );
58895
+ if (!(0, import_node_fs54.existsSync)(source)) {
58896
+ frameworkInterfaces.set(name3, null);
58897
+ return null;
58898
+ }
58899
+ const headers = import_node_path51.default.join(
58900
+ swiftSdkPaths(frameworkRoot, options.toolchainBin).darwin,
58901
+ `System/Library/Frameworks/${name3}.framework/Headers`
58902
+ );
58903
+ const declared = /* @__PURE__ */ new Set();
58904
+ if ((0, import_node_fs54.existsSync)(headers)) {
58905
+ for (const file of (0, import_node_fs54.readdirSync)(headers, {
58906
+ recursive: true,
58907
+ encoding: "utf8"
58908
+ }))
58909
+ if (file.endsWith(".h"))
58910
+ for (const name4 of swiftInterfaceDeclarations(
58911
+ (0, import_node_fs54.readFileSync)(import_node_path51.default.join(headers, file), "utf8")
58912
+ ))
58913
+ declared.add(name4);
58914
+ }
58915
+ const header = withoutSwiftDeclarations(
58916
+ clangInterfaceHeader((0, import_node_fs54.readFileSync)(source, "utf8")),
58917
+ declared,
58918
+ `#import <${name3}/${name3}.h>`
58919
+ );
58920
+ const value = {
58921
+ file: import_node_path51.default.join(root, ".build/peach-framework-objc", `${name3}-Swift.h`),
58922
+ header
58923
+ };
58924
+ frameworkInterfaces.set(name3, value);
58925
+ writeBuildFile(
58926
+ value.file,
58927
+ ((0, import_node_fs54.existsSync)(import_node_path51.default.join(headers, `${name3}.h`)) ? `#import <${name3}/${name3}.h>
58928
+ ` : "") + swiftHeaderWithSuperclassImports(header, frameworkInterface)
58929
+ );
58930
+ return value;
58931
+ };
58873
58932
  try {
58874
58933
  const headerBuilds = preparation.headerProductTarget ? [
58875
58934
  ...Object.keys(preparation.nativeHeaderDeclarations),
@@ -58897,7 +58956,10 @@ function compileSwiftProjectOnce(input, options) {
58897
58956
  writeBuildFile(
58898
58957
  emitted,
58899
58958
  withoutSwiftDeclarations(
58900
- clangInterfaceHeader((0, import_node_fs54.readFileSync)(original, "utf8")),
58959
+ swiftHeaderWithSuperclassImports(
58960
+ clangInterfaceHeader((0, import_node_fs54.readFileSync)(original, "utf8")),
58961
+ frameworkInterface
58962
+ ),
58901
58963
  new Set(preparation.nativeHeaderDeclarations[producer]),
58902
58964
  `#import <${producer}/${producer}.h>`
58903
58965
  )
@@ -59173,7 +59235,7 @@ var init_swift_compile = __esm({
59173
59235
  ExpoModulesCore: []
59174
59236
  };
59175
59237
  OPTIONAL_FRAMEWORKS = new Set(Object.keys(OPTIONAL_FRAMEWORK_DEPENDENCIES));
59176
- SWIFT_IMPORT = /^\s*(?:@\w+(?:\([^)]*\))?\s+)*import\s+(?:(?:typealias|struct|class|enum|protocol|let|var|func)\s+)?([A-Za-z_][A-Za-z0-9_]*)/;
59238
+ SWIFT_IMPORT = /^\s*(?:@\w+(?:\([^)]*\))?\s+|(?:public|package|internal|fileprivate|private)\s+)*import\s+(?:(?:typealias|struct|class|enum|protocol|let|var|func)\s+)?([A-Za-z_][A-Za-z0-9_]*)/;
59177
59239
  kleeneNot = (value) => value === void 0 ? void 0 : !value;
59178
59240
  kleeneAnd = (left, right) => left === false || right === false ? false : left === true && right === true ? true : void 0;
59179
59241
  kleeneOr = (left, right) => left === true || right === true ? true : left === false && right === false ? false : void 0;
@@ -59270,7 +59332,7 @@ int EXUpdatesApplyBSDiffPatch(const char * _Nonnull oldFilePath,
59270
59332
  REACTOR_FLAG = '"-Xclang-linker", "-mexec-model=reactor",\n';
59271
59333
  MULTI_MANIFEST_VERSION = 68;
59272
59334
  SWIFT_HEADER_PRODUCTS_TARGET = "PeachHeaderProducts";
59273
- compilerSourceDigest = true ? "645b0e6bc4e374f7c82da4d402e0ec9ddedfc49d6e5a74b73284852f1fbd4efc" : swiftCompilerSourceDigest(__sootsim_import_meta_dirname);
59335
+ compilerSourceDigest = true ? "280e858b01b1c1393d3765c8d6ff1b3ce4a1a93d7fb7e3dd2d4d3e5f1d5f1ac2" : swiftCompilerSourceDigest(__sootsim_import_meta_dirname);
59274
59336
  nativeCxxCompilerFlags = ["-fno-cxx-modules"];
59275
59337
  cFlagArray = (flags) => JSON.stringify(withoutGlogModuleMap(flags));
59276
59338
  cxxFlagArray = (flags) => JSON.stringify([...nativeCxxCompilerFlags, ...withoutGlogModuleMap(flags)]);
@@ -63262,7 +63324,7 @@ function readXcodeAppTarget(input, targetName, configurationName, options = {})
63262
63324
  const postBundleScripts = [];
63263
63325
  for (const id of [...list(app.target.buildPhases)].reverse()) {
63264
63326
  const phase = app.project.object(id);
63265
- if (phase?.isa !== "PBXShellScriptBuildPhase" || list(phase.inputPaths).length || list(phase.inputFileListPaths).length || list(phase.outputPaths).length || list(phase.outputFileListPaths).length)
63327
+ if (phase?.isa !== "PBXShellScriptBuildPhase" || list(phase.outputPaths).length || list(phase.outputFileListPaths).length)
63266
63328
  break;
63267
63329
  postBundleScripts.unshift({
63268
63330
  name: str(phase.name) ?? id,
@@ -63271,6 +63333,8 @@ function readXcodeAppTarget(input, targetName, configurationName, options = {})
63271
63333
  str(phase.shellScript) ?? ""
63272
63334
  ),
63273
63335
  directory: app.project.projectDir,
63336
+ inputPaths: list(phase.inputPaths),
63337
+ inputFileListPaths: list(phase.inputFileListPaths),
63274
63338
  environment: Object.fromEntries(
63275
63339
  [...settingKeys].filter((key2) => /^[A-Za-z_][A-Za-z0-9_]*$/.test(key2)).map((key2) => [key2, settings(key2)])
63276
63340
  )
@@ -65756,7 +65820,7 @@ var init_swift_standin_digest = __esm({
65756
65820
  STANDIN_DIGEST_ENTRYPOINTS = ["swift-standins.ts", "swift-objc-compile.ts"];
65757
65821
  SPECIFIER = /from\s*['"]([^'"]+)['"]|import\s*\(\s*['"]([^'"]+)['"]\s*\)/g;
65758
65822
  standinSourceDigest = (srcDir = __sootsim_import_meta_dirname) => sourceClosureDigest(srcDir, STANDIN_DIGEST_ENTRYPOINTS);
65759
- STANDIN_SOURCE_DIGEST = true ? "7ad2d908aa8d716181e88c4bc1a8e1fb721aa69e8090d0d7ad5851f9b8de0944" : standinSourceDigest();
65823
+ STANDIN_SOURCE_DIGEST = true ? "f8700690d0cd621b5d9417ea570f1f45c7ec1ad54492b23aa9792102938e9e82" : standinSourceDigest();
65760
65824
  }
65761
65825
  });
65762
65826
 
@@ -66217,7 +66281,7 @@ var init_package_tree_digest = __esm({
66217
66281
 
66218
66282
  // src/expo-native-prebuilt.ts
66219
66283
  function expoNativeCompilerDigestValue() {
66220
- return true ? "5c577dbcb88d6c91ec20e51d76fe0d737f81c200e21973536cf1f8e51d076cbc" : expoNativeCompilerDigest(__sootsim_import_meta_dirname);
66284
+ return true ? "aab5589ba02cd96332e686f60153187e7357cc46c8a6ec5369f1400cea6f6da0" : expoNativeCompilerDigest(__sootsim_import_meta_dirname);
66221
66285
  }
66222
66286
  function readSources(value) {
66223
66287
  const sources = isRecord(value) ? value.sources : null;
@@ -69615,6 +69679,13 @@ function graphStandin(module2, graphs, values, wasm, binary2, toolchain, work, r
69615
69679
  unconformed.set(owner, /* @__PURE__ */ new Set([...unconformed.get(owner) ?? [], conformance]));
69616
69680
  continue;
69617
69681
  }
69682
+ const redundant = /^redundant conformance of '\w+' to protocol '(\w+)'$/.exec(
69683
+ match[3]
69684
+ )?.[1];
69685
+ if (owner && redundant) {
69686
+ unconformed.set(owner, /* @__PURE__ */ new Set([...unconformed.get(owner) ?? [], redundant]));
69687
+ continue;
69688
+ }
69618
69689
  if (owner && swiftPaths.has(owner))
69619
69690
  throw new Error(
69620
69691
  `Swift declaration ${module2}.${owner} does not typecheck: ${match[3]}`
@@ -76675,11 +76746,35 @@ function buildSwiftBundleFiles(packagePath, hosted, inputs, resourceBundles) {
76675
76746
  CONTENTS_FOLDER_PATH: wrapper,
76676
76747
  UNLOCALIZED_RESOURCES_FOLDER_PATH: wrapper,
76677
76748
  INFOPLIST_PATH: `${wrapper}/Info.plist`,
76678
- SCRIPT_INPUT_FILE_COUNT: "0",
76679
- SCRIPT_INPUT_FILE_LIST_COUNT: "0",
76749
+ SCRIPT_INPUT_FILE_COUNT: String(phase.inputPaths.length),
76750
+ SCRIPT_INPUT_FILE_LIST_COUNT: String(phase.inputFileListPaths.length),
76680
76751
  SCRIPT_OUTPUT_FILE_COUNT: "0",
76681
76752
  SCRIPT_OUTPUT_FILE_LIST_COUNT: "0"
76682
76753
  };
76754
+ const inputPath = (raw2) => {
76755
+ const file = import_node_path83.default.resolve(
76756
+ phase.directory,
76757
+ expand(raw2, (key2) => env[key2] ?? "")
76758
+ );
76759
+ if (!import_node_fs86.default.existsSync(file))
76760
+ throw new Error(
76761
+ `${xcode.app.name}: Run Script "${phase.name}" missing input ${file}`
76762
+ );
76763
+ if (!file.startsWith(`${dir}${import_node_path83.default.sep}`))
76764
+ watched.push(import_node_path83.default.relative(packagePath, file).split(import_node_path83.default.sep).join("/"));
76765
+ return file;
76766
+ };
76767
+ phase.inputPaths.forEach((raw2, index) => {
76768
+ env[`SCRIPT_INPUT_FILE_${index}`] = inputPath(raw2);
76769
+ });
76770
+ phase.inputFileListPaths.forEach((raw2, index) => {
76771
+ const source = inputPath(raw2);
76772
+ const entries = fileListEntries(source, inputPath);
76773
+ const expanded = import_node_path83.default.join(dir, `Input-${index}.xcfilelist`);
76774
+ import_node_fs86.default.writeFileSync(expanded, `${entries.join("\n")}
76775
+ `);
76776
+ env[`SCRIPT_INPUT_FILE_LIST_${index}`] = expanded;
76777
+ });
76683
76778
  try {
76684
76779
  const [shell, ...args] = phase.command;
76685
76780
  (0, import_node_child_process47.execFileSync)(shell, args, {
@@ -86921,7 +87016,7 @@ var init_nitro_superset = __esm({
86921
87016
  init_nitroContract();
86922
87017
  init_swift_standin_digest();
86923
87018
  NITRO_SUPERSET_ENTRY_NAME = "superset";
86924
- NITRO_COMPILER_DIGEST = true ? "322b637557bb18964a5466d2011e5e601f78b1eb19934e43f24e9bde93405f49" : nitroCompilerSourceDigest(__sootsim_import_meta_dirname, STANDIN_SOURCE_DIGEST2);
87019
+ NITRO_COMPILER_DIGEST = true ? "b3ae355413a190ba1006db08b3fa373b79f99034163c936bd1ec2c89b9bce038" : nitroCompilerSourceDigest(__sootsim_import_meta_dirname, STANDIN_SOURCE_DIGEST2);
86925
87020
  nitroSupersetLock = parseLock(nitro_superset_lock_default);
86926
87021
  nitroSupersetKey = (inputs) => nativeEntryKey({ ...inputs, compiler: NITRO_COMPILER_DIGEST });
86927
87022
  published2 = /* @__PURE__ */ new Map();
@@ -87633,7 +87728,7 @@ var init_one_sdk_bundle = __esm({
87633
87728
  var runtime_companion_default;
87634
87729
  var init_runtime_companion = __esm({
87635
87730
  "runtime-companion.json"() {
87636
- runtime_companion_default = { abi: 1, sha256: "ef38a3e8be87c77f4035640cf265efa9aff735577a2de14feb63c8a09afabd42", file: "node/cli-ef38a3e8be87c77f4035640cf265efa9aff735577a2de14feb63c8a09afabd42.cjs" };
87731
+ runtime_companion_default = { abi: 1, sha256: "00799b02f54a61aa35db60817d564847a255eef875cbc7225013f1f27991ccde", file: "node/cli-00799b02f54a61aa35db60817d564847a255eef875cbc7225013f1f27991ccde.cjs" };
87637
87732
  }
87638
87733
  });
87639
87734
 
@@ -98380,12 +98475,12 @@ function viewModelInitializer({ name: name3, signature: signature2 }) {
98380
98475
  )}) }`;
98381
98476
  }
98382
98477
  }
98383
- function windowTheme(window) {
98478
+ function windowTheme(window2) {
98384
98479
  return [
98385
98480
  " android.view.WindowTheme(",
98386
- ` ${window.edgeToEdgeEnforced}, ${argb(window.statusBarColor)}, ${argb(window.navigationBarColor)},`,
98387
- ` ${window.statusBarContrastEnforced}, ${window.navigationBarContrastEnforced},`,
98388
- ` ${window.lightStatusBar}, ${window.lightNavigationBar},`,
98481
+ ` ${window2.edgeToEdgeEnforced}, ${argb(window2.statusBarColor)}, ${argb(window2.navigationBarColor)},`,
98482
+ ` ${window2.statusBarContrastEnforced}, ${window2.navigationBarContrastEnforced},`,
98483
+ ` ${window2.lightStatusBar}, ${window2.lightNavigationBar},`,
98389
98484
  " ),"
98390
98485
  ];
98391
98486
  }
@@ -107340,6 +107435,27 @@ var init_agent_identity = __esm({
107340
107435
  }
107341
107436
  });
107342
107437
 
107438
+ // detox/launch-permissions.ts
107439
+ function buildPermissionSeedScript(seed) {
107440
+ const inbox = JSON.stringify(PERMISSION_BOOT_SEED_STORAGE_KEY);
107441
+ const marker = JSON.stringify(PERMISSION_BOOT_SEED_SENT_KEY);
107442
+ const payload = JSON.stringify(seed);
107443
+ return `(function(){var K=${inbox},M=${marker},S=${payload};
107444
+ if(typeof window!=='undefined'&&window!==window.top)return;
107445
+ try{var nav=typeof performance!=='undefined'&&performance.getEntriesByType?performance.getEntriesByType('navigation')[0]:null;if(nav&&nav.type==='reload')return;}catch(_){/* fall through to the marker */}
107446
+ try{if(sessionStorage.getItem(M))return;sessionStorage.setItem(M,'1');}catch(_){/* storage-less contexts seed every navigation */}
107447
+ try{localStorage.setItem(K,JSON.stringify(S));}catch(_){}})();`;
107448
+ }
107449
+ var PERMISSION_BOOT_SEED_STORAGE_KEY, PERMISSION_BOOT_SEED_SENT_KEY;
107450
+ var init_launch_permissions = __esm({
107451
+ "detox/launch-permissions.ts"() {
107452
+ "use strict";
107453
+ init_define_SWIFT_COVERAGE_SOURCE_DIGESTS();
107454
+ PERMISSION_BOOT_SEED_STORAGE_KEY = "peach:permission-boot-seed:v1";
107455
+ PERMISSION_BOOT_SEED_SENT_KEY = "peach:permission-boot-seed:sent:v1";
107456
+ }
107457
+ });
107458
+
107343
107459
  // src/app-url.ts
107344
107460
  function normalizeAppUrlTarget(target) {
107345
107461
  const trimmed = target.trim();
@@ -109939,6 +110055,7 @@ async function launch(opts) {
109939
110055
  PEACH_PW_FETCH_PROXY_SPKI: fetchProxySpki,
109940
110056
  SOOTSIM_PW_BRIDGE_PORT: opts.bridgePort ? String(opts.bridgePort) : "",
109941
110057
  SOOTSIM_PW_HEADLESS: headless ? "1" : "0",
110058
+ PEACH_PW_BOOT_SCRIPT: opts.bootScript ?? "",
109942
110059
  SOOTSIM_PW_USERDATADIR: resolveUserDataDir(opts),
109943
110060
  SOOTSIM_PW_CDP_PORT: cdpPort ? String(cdpPort) : "",
109944
110061
  PEACH_PW_HOST_COMMAND: hostCommand ? JSON.stringify(hostCommand) : "",
@@ -129538,7 +129655,7 @@ function readWindowTheme(theme, targetSdk, sources) {
129538
129655
  const optOut = flag("windowOptOutEdgeToEdgeEnforcement");
129539
129656
  const edgeToEdgeEnforced = targetSdk > 35 || targetSdk === 35 && !optOut;
129540
129657
  const targetQ = targetSdk >= 29;
129541
- const window = {
129658
+ const window2 = {
129542
129659
  edgeToEdgeEnforced,
129543
129660
  statusBarContrastEnforced: targetQ && flag("enforceStatusBarContrast"),
129544
129661
  navigationBarContrastEnforced: targetQ && flag("enforceNavigationBarContrast", true),
@@ -129551,7 +129668,7 @@ function readWindowTheme(theme, targetSdk, sources) {
129551
129668
  const navigationDefault = resourceColor("android", "navigation_bar_default", sources);
129552
129669
  const navigationTheme = navigationColor ?? navigationDefault;
129553
129670
  const navigationBarColor = navigationTheme === navigationDefault && !edgeToEdgeEnforced ? resourceColor("android", "navigation_bar_compatible", sources) : navigationTheme;
129554
- if (edgeToEdgeEnforced) return { ...window, statusBarColor: 0, navigationBarColor };
129671
+ if (edgeToEdgeEnforced) return { ...window2, statusBarColor: 0, navigationBarColor };
129555
129672
  if (!flag("windowDrawsSystemBarBackgrounds"))
129556
129673
  throw new Error(
129557
129674
  `${name3} does not draw system bar backgrounds; Peach draws only theme status bar colors`
@@ -129559,7 +129676,7 @@ function readWindowTheme(theme, targetSdk, sources) {
129559
129676
  const color2 = resolveThemeAttribute(name3, "statusBarColor", sources);
129560
129677
  if (typeof color2 === "boolean")
129561
129678
  throw new Error(`${name3}: statusBarColor is not a color`);
129562
- return { ...window, statusBarColor: color2 ?? 4278190080, navigationBarColor };
129679
+ return { ...window2, statusBarColor: color2 ?? 4278190080, navigationBarColor };
129563
129680
  }
129564
129681
  function enabled(element) {
129565
129682
  return element.attributes[`${ANDROID_NS}enabled`] !== "false";
@@ -132209,8 +132326,15 @@ async function openSim(args, opts) {
132209
132326
  }
132210
132327
  const connectWait = resolveDriverConnectWaitOptions();
132211
132328
  opts.signal?.throwIfAborted();
132329
+ const seededLaunchPermissions = driverId === "playwright" && shellUrlPlatform(builtShellUrl) === "ios" && getCliRuntime().render_worker_app_load.isAppBootTargetUrl(builtShellUrl) ? opts.launchPermissions : void 0;
132212
132330
  const result = await driver.launch({
132213
132331
  url: openUrl2,
132332
+ bootScript: seededLaunchPermissions && buildPermissionSeedScript({
132333
+ appId: null,
132334
+ platform: "ios",
132335
+ presets: seededLaunchPermissions,
132336
+ grantInstallPermissions: false
132337
+ }),
132214
132338
  // the shell serves the sim page but its WS bridge may have drifted off
132215
132339
  // the shell-port-implied default. inject the bridge this command settled
132216
132340
  // on so the page does not reconnect to a stale world. re-deriving it from
@@ -132235,7 +132359,10 @@ async function openSim(args, opts) {
132235
132359
  } : void 0),
132236
132360
  connectTimeoutMs: connectWait.hostTimeoutMs
132237
132361
  });
132238
- if (opts.resources) opts.resources.driver = { ...result, driverId };
132362
+ if (opts.resources) {
132363
+ opts.resources.driver = { ...result, driverId };
132364
+ opts.resources.launchPermissionsSeeded = seededLaunchPermissions !== void 0 && result.launched;
132365
+ }
132239
132366
  opts.signal?.throwIfAborted();
132240
132367
  if (!result.launched) {
132241
132368
  console.error(` ${driver.name} driver: ${result.message}`);
@@ -132662,6 +132789,7 @@ var init_control = __esm({
132662
132789
  init_src();
132663
132790
  import_ws7 = require("ws");
132664
132791
  init_agent_identity();
132792
+ init_launch_permissions();
132665
132793
  init_androidRootModuleContract();
132666
132794
  init_app_url();
132667
132795
  init_backend_origin();
@@ -134350,6 +134478,7 @@ var init_recording_access = __esm({
134350
134478
  var bridge_flow_runner_exports = {};
134351
134479
  __export(bridge_flow_runner_exports, {
134352
134480
  SootSimBridgeFlowRunner: () => SootSimBridgeFlowRunner,
134481
+ firstPlainLaunchPermissions: () => firstPlainLaunchPermissions,
134353
134482
  normalizeFlowScreenshotSpec: () => normalizeFlowScreenshotSpec,
134354
134483
  parseFlowSteps: () => parseFlowSteps,
134355
134484
  resolveFlowScreenshotPathWithMode: () => resolveFlowScreenshotPathWithMode
@@ -134600,6 +134729,19 @@ function readBooleanKey(value, key2) {
134600
134729
  if (!isObjectRecord(value)) return false;
134601
134730
  return value[key2] === true;
134602
134731
  }
134732
+ function firstPlainLaunchPermissions(steps) {
134733
+ const first = steps[0];
134734
+ if (first === void 0) return null;
134735
+ const step = typeof first === "string" ? normalizeBareStringStep(first) : first;
134736
+ if (!step.launchApp || JSON.stringify(step.launchApp).includes("${")) return null;
134737
+ return plainLaunchPermissions(step.launchApp);
134738
+ }
134739
+ function plainLaunchPermissions(opts) {
134740
+ if (isObjectRecord(opts) && (opts.clearState || opts.clearKeychain === true || opts.resetRuntime === true || opts.stopApp === false || Object.prototype.hasOwnProperty.call(opts, "arguments"))) {
134741
+ return null;
134742
+ }
134743
+ return maestroLaunchPermissions(isObjectRecord(opts) ? opts.permissions : void 0);
134744
+ }
134603
134745
  function maestroLaunchPermissions(permissions) {
134604
134746
  const entries = isObjectRecord(permissions) ? Object.entries(permissions) : [["all", "allow"]];
134605
134747
  const statuses = /* @__PURE__ */ new Map();
@@ -134896,6 +135038,9 @@ var init_bridge_flow_runner = __esm({
134896
135038
  this.opts = opts;
134897
135039
  }
134898
135040
  stepDelay = 0;
135041
+ // the launch permissions the open that started this sim deposited before
135042
+ // its app booted, while that boot is still the app's only one
135043
+ seededLaunchPermissions = null;
134899
135044
  // maestro-compatible JS context for the whole flow run (shared with
134900
135045
  // runFlow sub-flows): `${...}` templates, runScript, evalScript, output,
134901
135046
  // maestro.copiedText. one per runner = one per flow file, like upstream.
@@ -134947,11 +135092,11 @@ var init_bridge_flow_runner = __esm({
134947
135092
  const snapshot = await this.callTest(
134948
135093
  "getSurfaceMetricsSnapshot"
134949
135094
  );
134950
- const window = snapshot?.window;
134951
- if (!window || typeof window !== "object" || !("width" in window) || !("height" in window) || typeof window.width !== "number" || typeof window.height !== "number" || !Number.isFinite(window.width) || !Number.isFinite(window.height) || window.width <= 0 || window.height <= 0) {
135095
+ const window2 = snapshot?.window;
135096
+ if (!window2 || typeof window2 !== "object" || !("width" in window2) || !("height" in window2) || typeof window2.width !== "number" || typeof window2.height !== "number" || !Number.isFinite(window2.width) || !Number.isFinite(window2.height) || window2.width <= 0 || window2.height <= 0) {
134952
135097
  throw new Error("live screen dimensions are unavailable");
134953
135098
  }
134954
- return { x: 0, y: 0, width: window.width, height: window.height };
135099
+ return { x: 0, y: 0, width: window2.width, height: window2.height };
134955
135100
  }
134956
135101
  // ordered input batch executed inside the page in one round-trip; the
134957
135102
  // engine emits agent-cursor actions for every step natively.
@@ -136377,7 +136522,10 @@ var init_bridge_flow_runner = __esm({
136377
136522
  if (!this.firstLaunchDone && !this.appStopped) await this.waitForTree(12e4);
136378
136523
  await this.clearKeychain();
136379
136524
  }
136380
- await this.setLaunchPermissions(isObjectRecord(opts) ? opts.permissions : void 0);
136525
+ const bootedByOpen = this.openBootIsLaunch(opts);
136526
+ if (!bootedByOpen) {
136527
+ await this.setLaunchPermissions(isObjectRecord(opts) ? opts.permissions : void 0);
136528
+ }
136381
136529
  if (!this.firstLaunchDone) {
136382
136530
  this.firstLaunchDone = true;
136383
136531
  if (wantsClear) {
@@ -136411,8 +136559,8 @@ var init_bridge_flow_runner = __esm({
136411
136559
  await this.waitForTree(12e4);
136412
136560
  await this.waitForTree(3e4);
136413
136561
  } else {
136414
- const launched = await this.launchShellAppFromHomeIfNeeded(opts);
136415
- if (!launched && !wantsForeground) {
136562
+ const launched = !bootedByOpen && await this.launchShellAppFromHomeIfNeeded(opts);
136563
+ if (!launched && !wantsForeground && !bootedByOpen) {
136416
136564
  await this.waitForTree(12e4);
136417
136565
  await this.reloadGuestAppRuntime({
136418
136566
  launchArguments: null,
@@ -136454,6 +136602,14 @@ var init_bridge_flow_runner = __esm({
136454
136602
  await this.ensureRecordingStarted();
136455
136603
  }
136456
136604
  }
136605
+ // maestro sets permissions and then launches. a sim opened with this
136606
+ // step's permissions already deposited has done both in its one boot.
136607
+ openBootIsLaunch(opts) {
136608
+ const seeded = this.seededLaunchPermissions;
136609
+ if (!seeded || this.firstLaunchDone || this.appStopped) return false;
136610
+ const wanted = plainLaunchPermissions(opts);
136611
+ return wanted !== null && wanted.size === seeded.size && [...wanted].every(([kind, status]) => seeded.get(kind) === status);
136612
+ }
136457
136613
  async setLaunchPermissions(permissions) {
136458
136614
  const statuses = maestroLaunchPermissions(permissions);
136459
136615
  const appId = await this.callTest("permissionGuestAppId");
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.2225 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2229 | (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;
@@ -64,6 +64,7 @@ __export(swift_compile_exports, {
64
64
  swiftCompileSdkOptions: () => swiftCompileSdkOptions,
65
65
  swiftCrossImportFlags: () => swiftCrossImportFlags,
66
66
  swiftDistributionAt: () => swiftDistributionAt,
67
+ swiftHeaderWithSuperclassImports: () => swiftHeaderWithSuperclassImports,
67
68
  swiftIcuAddress: () => swiftIcuAddress,
68
69
  swiftIcuAsset: () => swiftIcuAsset,
69
70
  swiftIcuBundleAsset: () => swiftIcuBundleAsset,
@@ -12105,6 +12106,20 @@ var clangInterfaceHeader = (header) => header.replace(/^@import (?:UIKitCore|UIK
12105
12106
  /^@import (?:CoreFoundation|FoundationNetworking);$/gm,
12106
12107
  "@import Foundation;"
12107
12108
  ).replace(/\b_TtC10Foundation\d+(NS\w+)\b/g, "$1").replace(/\b__attribute__\(\(objc_subclassing_restricted\)\)\s*/g, "");
12109
+ function swiftHeaderWithSuperclassImports(header, interfaceFor) {
12110
+ const superclasses = new Set(
12111
+ [...header.matchAll(/@interface\s+\w+\s*:\s*(\w+)/g)].map((match) => match[1])
12112
+ );
12113
+ return header.replace(/^@import (\w+);$/gm, (statement, name2) => {
12114
+ const dependency = interfaceFor(name2);
12115
+ if (!dependency || ![...swiftInterfaceDeclarations(dependency.header)].some(
12116
+ (name3) => superclasses.has(name3)
12117
+ ))
12118
+ return statement;
12119
+ return `${statement}
12120
+ #import ${JSON.stringify(dependency.file)}`;
12121
+ });
12122
+ }
12108
12123
  var swiftInterfaceDeclarations = (header) => /* @__PURE__ */ new Set([
12109
12124
  ...[
12110
12125
  ...header.matchAll(
@@ -12462,7 +12477,7 @@ var OPTIONAL_FRAMEWORKS = new Set(Object.keys(OPTIONAL_FRAMEWORK_DEPENDENCIES));
12462
12477
  function swiftOptionalFramework(name2) {
12463
12478
  return OPTIONAL_FRAMEWORKS.has(name2);
12464
12479
  }
12465
- var SWIFT_IMPORT = /^\s*(?:@\w+(?:\([^)]*\))?\s+)*import\s+(?:(?:typealias|struct|class|enum|protocol|let|var|func)\s+)?([A-Za-z_][A-Za-z0-9_]*)/;
12480
+ var SWIFT_IMPORT = /^\s*(?:@\w+(?:\([^)]*\))?\s+|(?:public|package|internal|fileprivate|private)\s+)*import\s+(?:(?:typealias|struct|class|enum|protocol|let|var|func)\s+)?([A-Za-z_][A-Za-z0-9_]*)/;
12466
12481
  var kleeneNot = (value) => value === void 0 ? void 0 : !value;
12467
12482
  var kleeneAnd = (left, right) => left === false || right === false ? false : left === true && right === true ? true : void 0;
12468
12483
  var kleeneOr = (left, right) => left === true || right === true ? true : left === false && right === false ? false : void 0;
@@ -12963,7 +12978,7 @@ var darwinRecordsRegion = (quoted2) => quoted2.length ? ["-Wl,--start-lib", ...q
12963
12978
  var REACTOR_FLAG = '"-Xclang-linker", "-mexec-model=reactor",\n';
12964
12979
  var MULTI_MANIFEST_VERSION = 68;
12965
12980
  var SWIFT_HEADER_PRODUCTS_TARGET = "PeachHeaderProducts";
12966
- var compilerSourceDigest = true ? "645b0e6bc4e374f7c82da4d402e0ec9ddedfc49d6e5a74b73284852f1fbd4efc" : swiftCompilerSourceDigest(__sootsim_import_meta_dirname);
12981
+ var compilerSourceDigest = true ? "280e858b01b1c1393d3765c8d6ff1b3ce4a1a93d7fb7e3dd2d4d3e5f1d5f1ac2" : swiftCompilerSourceDigest(__sootsim_import_meta_dirname);
12967
12982
  function swiftArtifactHash(input, release, moduleRoot) {
12968
12983
  const hash = (0, import_node_crypto13.createHash)("sha256");
12969
12984
  hash.update(`swift-compile
@@ -17269,6 +17284,51 @@ function compileSwiftProjectOnce(input, options) {
17269
17284
  if ((0, import_node_fs25.existsSync)(linked) && (0, import_node_fs25.statSync)(linked).size <= 8)
17270
17285
  (0, import_node_fs25.rmSync)(linked, { force: true });
17271
17286
  report("compiling and linking Swift modules");
17287
+ const frameworkInterfaces = /* @__PURE__ */ new Map();
17288
+ const frameworkInterface = (name2) => {
17289
+ if (frameworkInterfaces.has(name2)) return frameworkInterfaces.get(name2);
17290
+ const source = distribution ? import_node_path27.default.join(frameworkRoot, "modules", `${name2}-Swift.h`) : import_node_path27.default.join(
17291
+ prebuilt.modules,
17292
+ "..",
17293
+ `${name2}.build/include/${name2}-Swift.h`
17294
+ );
17295
+ if (!(0, import_node_fs25.existsSync)(source)) {
17296
+ frameworkInterfaces.set(name2, null);
17297
+ return null;
17298
+ }
17299
+ const headers = import_node_path27.default.join(
17300
+ swiftSdkPaths(frameworkRoot, options.toolchainBin).darwin,
17301
+ `System/Library/Frameworks/${name2}.framework/Headers`
17302
+ );
17303
+ const declared = /* @__PURE__ */ new Set();
17304
+ if ((0, import_node_fs25.existsSync)(headers)) {
17305
+ for (const file of (0, import_node_fs25.readdirSync)(headers, {
17306
+ recursive: true,
17307
+ encoding: "utf8"
17308
+ }))
17309
+ if (file.endsWith(".h"))
17310
+ for (const name3 of swiftInterfaceDeclarations(
17311
+ (0, import_node_fs25.readFileSync)(import_node_path27.default.join(headers, file), "utf8")
17312
+ ))
17313
+ declared.add(name3);
17314
+ }
17315
+ const header = withoutSwiftDeclarations(
17316
+ clangInterfaceHeader((0, import_node_fs25.readFileSync)(source, "utf8")),
17317
+ declared,
17318
+ `#import <${name2}/${name2}.h>`
17319
+ );
17320
+ const value = {
17321
+ file: import_node_path27.default.join(root, ".build/peach-framework-objc", `${name2}-Swift.h`),
17322
+ header
17323
+ };
17324
+ frameworkInterfaces.set(name2, value);
17325
+ writeBuildFile(
17326
+ value.file,
17327
+ ((0, import_node_fs25.existsSync)(import_node_path27.default.join(headers, `${name2}.h`)) ? `#import <${name2}/${name2}.h>
17328
+ ` : "") + swiftHeaderWithSuperclassImports(header, frameworkInterface)
17329
+ );
17330
+ return value;
17331
+ };
17272
17332
  try {
17273
17333
  const headerBuilds = preparation.headerProductTarget ? [
17274
17334
  ...Object.keys(preparation.nativeHeaderDeclarations),
@@ -17296,7 +17356,10 @@ function compileSwiftProjectOnce(input, options) {
17296
17356
  writeBuildFile(
17297
17357
  emitted,
17298
17358
  withoutSwiftDeclarations(
17299
- clangInterfaceHeader((0, import_node_fs25.readFileSync)(original, "utf8")),
17359
+ swiftHeaderWithSuperclassImports(
17360
+ clangInterfaceHeader((0, import_node_fs25.readFileSync)(original, "utf8")),
17361
+ frameworkInterface
17362
+ ),
17300
17363
  new Set(preparation.nativeHeaderDeclarations[producer]),
17301
17364
  `#import <${producer}/${producer}.h>`
17302
17365
  )
@@ -17472,6 +17535,7 @@ function compileSwiftProjectOnce(input, options) {
17472
17535
  swiftCompileSdkOptions,
17473
17536
  swiftCrossImportFlags,
17474
17537
  swiftDistributionAt,
17538
+ swiftHeaderWithSuperclassImports,
17475
17539
  swiftIcuAddress,
17476
17540
  swiftIcuAsset,
17477
17541
  swiftIcuBundleAsset,