peachsim 0.1.2182 → 0.1.2186

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 (106) hide show
  1. package/cli/commands/cpu-profile.ts +6 -2
  2. package/cli/commands/shell-url.ts +3 -6
  3. package/cli/outbound-endpoints.ts +11 -1
  4. package/dist-lib/agent-daemon-client.cjs +1 -1
  5. package/dist-lib/agent-events.cjs +1 -1
  6. package/dist-lib/attached-projects.cjs +1 -1
  7. package/dist-lib/auth/shared-session.cjs +1 -1
  8. package/dist-lib/backend-origin.cjs +1 -1
  9. package/dist-lib/beta.cjs +1 -1
  10. package/dist-lib/beta.mjs +1 -1
  11. package/dist-lib/bridge-constants.cjs +1 -1
  12. package/dist-lib/bridge-contract-input.cjs +1 -1
  13. package/dist-lib/bridge-contract-input.mjs +1 -1
  14. package/dist-lib/bridge-contract.cjs +1 -1
  15. package/dist-lib/bridge-contract.mjs +1 -1
  16. package/dist-lib/bundle-channel.cjs +371 -36
  17. package/dist-lib/capture-contract.cjs +1 -1
  18. package/dist-lib/capture-contract.mjs +1 -1
  19. package/dist-lib/cloud-contract.cjs +1 -1
  20. package/dist-lib/cloud-contract.mjs +1 -1
  21. package/dist-lib/cloud-test-args.cjs +1 -1
  22. package/dist-lib/cloud-test-args.mjs +1 -1
  23. package/dist-lib/cloud.cjs +1 -1
  24. package/dist-lib/cloud.mjs +1 -1
  25. package/dist-lib/config.cjs +1 -1
  26. package/dist-lib/config.mjs +1 -1
  27. package/dist-lib/detox/index.cjs +2 -2
  28. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  29. package/dist-lib/expo-swift-bundle.cjs +325 -28
  30. package/dist-lib/expo-swift-metadata.cjs +2 -1
  31. package/dist-lib/expo-swift-metadata.mjs +2 -1
  32. package/dist-lib/home-paths.cjs +1 -1
  33. package/dist-lib/host/bridge-host.cjs +364 -36
  34. package/dist-lib/host/fetch-proxy-handler.cjs +8 -5
  35. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  36. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  37. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  38. package/dist-lib/host/websocket-proxy.cjs +1 -1
  39. package/dist-lib/index.cjs +51 -7
  40. package/dist-lib/jump-to-source-babel.cjs +1 -1
  41. package/dist-lib/jump-to-source-native.cjs +1 -1
  42. package/dist-lib/kotlin-host.cjs +5 -3
  43. package/dist-lib/menu.cjs +1 -1
  44. package/dist-lib/menu.mjs +1 -1
  45. package/dist-lib/metro-fingerprint-registry.cjs +1 -1
  46. package/dist-lib/metro-fingerprint-registry.mjs +1 -1
  47. package/dist-lib/metro-production-bundle.cjs +1 -1
  48. package/dist-lib/metro-production-bundle.mjs +1 -1
  49. package/dist-lib/metro.cjs +51 -7
  50. package/dist-lib/native-app-identity-project.cjs +49 -5
  51. package/dist-lib/native-app-identity-project.mjs +49 -5
  52. package/dist-lib/native-app-identity.cjs +40 -2
  53. package/dist-lib/native-app-identity.mjs +40 -2
  54. package/dist-lib/native-firebase-metadata.cjs +1 -1
  55. package/dist-lib/native-firebase-metadata.mjs +1 -1
  56. package/dist-lib/pdfium-raster.cjs +1 -1
  57. package/dist-lib/pdfium-raster.mjs +1 -1
  58. package/dist-lib/plist.cjs +1 -1
  59. package/dist-lib/plist.mjs +1 -1
  60. package/dist-lib/profiles.cjs +1 -1
  61. package/dist-lib/public-brand.cjs +1 -1
  62. package/dist-lib/public-origins-lib-esm.json +25 -24
  63. package/dist-lib/public-origins-lib.json +63 -53
  64. package/dist-lib/react-native-host-modules.cjs +1 -1
  65. package/dist-lib/react-native-host-modules.mjs +1 -1
  66. package/dist-lib/reap-browser.cjs +1 -1
  67. package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
  68. package/dist-lib/sdk.cjs +1 -1
  69. package/dist-lib/sdk.mjs +1 -1
  70. package/dist-lib/skills.cjs +383 -39
  71. package/dist-lib/swift-compile.cjs +2 -2
  72. package/dist-lib/swift-compile.mjs +2 -2
  73. package/dist-lib/swift-package.cjs +26 -1
  74. package/dist-lib/swift-package.mjs +25 -1
  75. package/dist-lib/swift-submit.cjs +1 -1
  76. package/dist-lib/swift-submit.mjs +1 -1
  77. package/dist-lib/swift-toolchain.cjs +1 -1
  78. package/dist-lib/swift.cjs +1 -1
  79. package/dist-lib/vite-swift.cjs +286 -24
  80. package/dist-lib/vite.cjs +8 -5
  81. package/dist-lib/worklet-executable.cjs +1 -1
  82. package/dist-lib/worklet-executable.mjs +1 -1
  83. package/dist-types/packages/peach-engine/src/render-worker/compositor-backend.d.ts +1 -0
  84. package/kotlin/sdk.tar.gz +0 -0
  85. package/package.json +1 -1
  86. package/runtime-companion.json +1 -1
  87. package/sdk/ios/System/Library/Frameworks/ActivityKit.framework/Headers/ActivityKit.h +1 -0
  88. package/sdk/ios/System/Library/Frameworks/ActivityKit.framework/Modules/module.modulemap +4 -0
  89. package/sdk/ios/System/Library/Frameworks/UIKit.framework/Headers/UIImageAsset.h +1 -1
  90. package/sdk/ios/usr/lib/swift/ActivityKit.swiftmodule/arm64-apple-ios-simulator.swiftinterface +14 -0
  91. package/sdk/ios/usr/lib/swift/CoreGraphics.swiftmodule/arm64-apple-ios-simulator.swiftinterface +14 -0
  92. package/sdk/ios/usr/lib/swift/Dispatch.swiftmodule/arm64-apple-ios-simulator.swiftinterface +3 -0
  93. package/sdk/ios/usr/lib/swift/Foundation.swiftmodule/arm64-apple-ios-simulator.swiftinterface +147 -16
  94. package/sdk/ios/usr/lib/swift/UIKit.swiftmodule/arm64-apple-ios-simulator.swiftinterface +5 -0
  95. package/src/expo-native-workspace.ts +9 -2
  96. package/src/kotlin-host.ts +4 -2
  97. package/src/native-app-identity-project.ts +10 -2
  98. package/src/native-app-identity.ts +15 -1
  99. package/src/nativeAppIconContract.ts +37 -0
  100. package/src/swift-installed-targets.ts +8 -0
  101. package/src/swift-interface-bodies.ts +165 -0
  102. package/src/swift-objc-standin.ts +73 -13
  103. package/src/swift-package.ts +26 -0
  104. package/src/swift-source-pods.ts +27 -4
  105. package/src/swift-standin-emit.ts +30 -3
  106. package/src/swift-standins.ts +75 -12
package/dist-lib/vite.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.2182 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2186 | (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": "0b82b3773f9c0b27636f277d9c123b3e631b9c9980995d67d67efa6b3176df4a", "swift-source-file.ts": "93fd659ed63a27b67f54a7c229a7ceb636dc9c59e68414920ba36cff1eda1f94", "swift-toolchain.ts": "65a0698bf022ace2f4254f3f891828dedf403d61c102238e242084a2279e04eb", "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": "65a0698bf022ace2f4254f3f891828dedf403d61c102238e242084a2279e04eb", "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" };
43
43
  }
44
44
  });
45
45
 
@@ -1416,7 +1416,7 @@ function isValidRuntimeVersion(value) {
1416
1416
  }
1417
1417
 
1418
1418
  // runtime-companion.json
1419
- var runtime_companion_default = { abi: 1, sha256: "d1826a4d4d05c87a157d5b160177de9cd6f1fd10a3d142804a92a0d57ff3060f", file: "node/cli-d1826a4d4d05c87a157d5b160177de9cd6f1fd10a3d142804a92a0d57ff3060f.cjs" };
1419
+ var runtime_companion_default = { abi: 1, sha256: "c63f83dd24fd36986b72da8da6b6a51edce0a2d061e3bc05d3439d22b1a86c91", file: "node/cli-c63f83dd24fd36986b72da8da6b6a51edce0a2d061e3bc05d3439d22b1a86c91.cjs" };
1420
1420
 
1421
1421
  // src/answeredNativePackages.ts
1422
1422
  init_define_SWIFT_COVERAGE_SOURCE_DIGESTS();
@@ -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 ? "cc396d180b261e922288f645807b4a704fa92410ffc902bfbaac72b81af6413a" : standinSourceDigest();
1912
+ var STANDIN_SOURCE_DIGEST = true ? "62c7fc880aa6efc985c4786587cb8441b81094e44c28f8d65e1d6dffda9c24f4" : standinSourceDigest();
1913
1913
 
1914
1914
  // src/expo-native-workspace.ts
1915
1915
  init_define_SWIFT_COVERAGE_SOURCE_DIGESTS();
@@ -4994,6 +4994,9 @@ init_define_SWIFT_COVERAGE_SOURCE_DIGESTS();
4994
4994
  init_define_SWIFT_COVERAGE_SOURCE_DIGESTS();
4995
4995
  var import_node_crypto4 = require("node:crypto");
4996
4996
 
4997
+ // src/swift-interface-bodies.ts
4998
+ init_define_SWIFT_COVERAGE_SOURCE_DIGESTS();
4999
+
4997
5000
  // src/swift-objc-sdk.ts
4998
5001
  init_define_SWIFT_COVERAGE_SOURCE_DIGESTS();
4999
5002
  var import_node_path8 = __toESM(require("node:path"), 1);
@@ -5388,7 +5391,7 @@ var FOUNDATION_IMPLICIT_MODULES = [
5388
5391
  var FOUNDATION_IMPLICIT_FLAGS = FOUNDATION_IMPLICIT_MODULES.map(
5389
5392
  (module2) => `, "-Xfrontend", "-import-module", "-Xfrontend", "${module2}"`
5390
5393
  ).join("");
5391
- var compilerSourceDigest = true ? "73960368f0b83cf042511655d857d5f64204fa539e2c984423a12c08657b068e" : swiftCompilerSourceDigest2(__sootsim_import_meta_dirname);
5394
+ var compilerSourceDigest = true ? "0d2e8d6fb4545fb31a692a87bd3215ef3a9a64a8c3e1b2fc1f2a3e79511325ec" : swiftCompilerSourceDigest2(__sootsim_import_meta_dirname);
5392
5395
  var CORE_FOUNDATION_HANDLE_IMPORTS = [
5393
5396
  "CFAllocator",
5394
5397
  "CFArray",
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.2182 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2186 | (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.2182 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2186 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
 
3
3
  // src/worklet-executable.ts
4
4
  import { parse } from "acorn";
@@ -15,6 +15,7 @@ export type CompositorDeviceProbe = {
15
15
  readonly device: boolean;
16
16
  readonly error?: string;
17
17
  };
18
+ export declare function inNativeHost(): boolean;
18
19
  export interface CompositorBackendEnvironment {
19
20
  readonly webGpuApiAvailable: boolean;
20
21
  readonly nativeHost: boolean;
package/kotlin/sdk.tar.gz CHANGED
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "peachsim",
3
- "version": "0.1.2182",
3
+ "version": "0.1.2186",
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",
@@ -1 +1 @@
1
- {"abi":1,"sha256":"d1826a4d4d05c87a157d5b160177de9cd6f1fd10a3d142804a92a0d57ff3060f","file":"node/cli-d1826a4d4d05c87a157d5b160177de9cd6f1fd10a3d142804a92a0d57ff3060f.cjs"}
1
+ {"abi":1,"sha256":"c63f83dd24fd36986b72da8da6b6a51edce0a2d061e3bc05d3439d22b1a86c91","file":"node/cli-c63f83dd24fd36986b72da8da6b6a51edce0a2d061e3bc05d3439d22b1a86c91.cjs"}
@@ -0,0 +1 @@
1
+ #import <Foundation/Foundation.h>
@@ -0,0 +1,4 @@
1
+ framework module ActivityKit {
2
+ umbrella header "ActivityKit.h"
3
+ export *
4
+ }
@@ -15,7 +15,7 @@ NS_HEADER_AUDIT_BEGIN(nullability, sendability)
15
15
  @protocol UIImageConfiguration;
16
16
 
17
17
  UIKIT_EXTERN API_AVAILABLE(ios(8.0)) API_UNAVAILABLE(watchos) NS_SWIFT_SENDABLE
18
- @interface UIImageAsset : NSObject <NSSecureCoding>
18
+ PEACH_SWIFT_CLASS(UIKitCore) @interface UIImageAsset : NSObject <NSSecureCoding>
19
19
 
20
20
  - (instancetype)init NS_DESIGNATED_INITIALIZER;
21
21
  - (nullable instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER;
@@ -0,0 +1,14 @@
1
+ // swift-interface-format-version: 1.0
2
+ // swift-module-flags: -target arm64-apple-ios16.0-simulator -enable-objc-interop -enable-library-evolution -module-name ActivityKit
3
+ @_exported import ActivityKit
4
+ import Foundation
5
+ import Swift
6
+ import _Concurrency
7
+ public protocol ActivityAttributes : Swift.Decodable, Swift.Encodable {
8
+ associatedtype ContentState : Swift.Decodable, Swift.Encodable, Swift.Hashable
9
+ }
10
+ @available(iOS 16.1, *)
11
+ public struct Activity<Attributes> where Attributes : ActivityKit.ActivityAttributes {
12
+ public let id: Swift.String
13
+ public let attributes: Attributes
14
+ }
@@ -6,3 +6,17 @@ import Swift
6
6
  public init()
7
7
  public init(_ value: Swift.Double)
8
8
  }
9
+ extension CoreGraphics.CGPoint {
10
+ public static let zero: CoreGraphics.CGPoint
11
+ }
12
+ extension CoreGraphics.CGSize {
13
+ public static let zero: CoreGraphics.CGSize
14
+ }
15
+ extension CoreGraphics.CGVector {
16
+ public static let zero: CoreGraphics.CGVector
17
+ }
18
+ extension CoreGraphics.CGRect {
19
+ public static let zero: CoreGraphics.CGRect
20
+ public static let null: CoreGraphics.CGRect
21
+ public static let infinite: CoreGraphics.CGRect
22
+ }
@@ -3,3 +3,6 @@
3
3
  @_exported import Dispatch
4
4
  import Swift
5
5
  @_objcRuntimeName(_TtC8Dispatch17_DispatchWorkItem) public class DispatchWorkItem {}
6
+ extension Dispatch.DispatchQueue {
7
+ public class var main: Dispatch.DispatchQueue { get }
8
+ }
@@ -5,27 +5,137 @@
5
5
  @_exported import CoreGraphics
6
6
  import Swift
7
7
  import _Concurrency
8
- public struct URL {}
8
+ public struct URL : Swift.Hashable, Swift.Codable, Swift.Sendable, Swift.CustomStringConvertible {
9
+ public static func == (a: Foundation.URL, b: Foundation.URL) -> Swift.Bool
10
+ public func hash(into hasher: inout Swift.Hasher)
11
+ public func encode(to encoder: any Swift.Encoder) throws
12
+ public init(from decoder: any Swift.Decoder) throws
13
+ public var description: Swift.String { get }
14
+ }
9
15
  public struct Data {
10
16
  public typealias ReadingOptions = Foundation.NSData.ReadingOptions
11
17
  public typealias WritingOptions = Foundation.NSData.WritingOptions
12
18
  public typealias SearchOptions = Foundation.NSData.SearchOptions
19
+ public typealias Index = Swift.Int
20
+ }
21
+ public struct Date : Swift.Hashable, Swift.Codable, Swift.Sendable, Swift.Comparable, Swift.CustomStringConvertible {
22
+ public init()
23
+ public static var now: Foundation.Date { get }
24
+ public static let distantPast: Foundation.Date
25
+ public static let distantFuture: Foundation.Date
26
+ public static func == (a: Foundation.Date, b: Foundation.Date) -> Swift.Bool
27
+ public func hash(into hasher: inout Swift.Hasher)
28
+ public func encode(to encoder: any Swift.Encoder) throws
29
+ public init(from decoder: any Swift.Decoder) throws
30
+ public static func < (a: Foundation.Date, b: Foundation.Date) -> Swift.Bool
31
+ public var description: Swift.String { get }
32
+ }
33
+ public struct DateComponents : Swift.Hashable, Swift.Codable, Swift.Sendable, Swift.CustomStringConvertible {
34
+ public static func == (a: Foundation.DateComponents, b: Foundation.DateComponents) -> Swift.Bool
35
+ public func hash(into hasher: inout Swift.Hasher)
36
+ public func encode(to encoder: any Swift.Encoder) throws
37
+ public init(from decoder: any Swift.Decoder) throws
38
+ public var description: Swift.String { get }
39
+ }
40
+ public struct DateInterval : Swift.Hashable, Swift.Codable, Swift.Sendable, Swift.CustomStringConvertible {
41
+ public static func == (a: Foundation.DateInterval, b: Foundation.DateInterval) -> Swift.Bool
42
+ public func hash(into hasher: inout Swift.Hasher)
43
+ public func encode(to encoder: any Swift.Encoder) throws
44
+ public init(from decoder: any Swift.Decoder) throws
45
+ public var description: Swift.String { get }
46
+ }
47
+ public struct URLComponents : Swift.Hashable, Swift.Codable, Swift.Sendable, Swift.CustomStringConvertible {
48
+ public static func == (a: Foundation.URLComponents, b: Foundation.URLComponents) -> Swift.Bool
49
+ public func hash(into hasher: inout Swift.Hasher)
50
+ public func encode(to encoder: any Swift.Encoder) throws
51
+ public init(from decoder: any Swift.Decoder) throws
52
+ public var description: Swift.String { get }
53
+ }
54
+ public struct URLQueryItem : Swift.Hashable, Swift.Codable, Swift.Sendable, Swift.CustomStringConvertible {
55
+ public static func == (a: Foundation.URLQueryItem, b: Foundation.URLQueryItem) -> Swift.Bool
56
+ public func hash(into hasher: inout Swift.Hasher)
57
+ public func encode(to encoder: any Swift.Encoder) throws
58
+ public init(from decoder: any Swift.Decoder) throws
59
+ public var description: Swift.String { get }
60
+ }
61
+ public struct URLRequest : Swift.Hashable, Swift.Codable, Swift.Sendable, Swift.CustomStringConvertible {
62
+ public static func == (a: Foundation.URLRequest, b: Foundation.URLRequest) -> Swift.Bool
63
+ public func hash(into hasher: inout Swift.Hasher)
64
+ public func encode(to encoder: any Swift.Encoder) throws
65
+ public init(from decoder: any Swift.Decoder) throws
66
+ public var description: Swift.String { get }
67
+ }
68
+ public struct UUID : Swift.Hashable, Swift.Codable, Swift.Sendable, Swift.CustomStringConvertible {
69
+ public init()
70
+ public static func == (a: Foundation.UUID, b: Foundation.UUID) -> Swift.Bool
71
+ public func hash(into hasher: inout Swift.Hasher)
72
+ public func encode(to encoder: any Swift.Encoder) throws
73
+ public init(from decoder: any Swift.Decoder) throws
74
+ public var description: Swift.String { get }
75
+ }
76
+ public struct IndexPath : Swift.Hashable, Swift.Codable, Swift.Sendable, Swift.Comparable, Swift.CustomStringConvertible {
77
+ public static func == (a: Foundation.IndexPath, b: Foundation.IndexPath) -> Swift.Bool
78
+ public func hash(into hasher: inout Swift.Hasher)
79
+ public func encode(to encoder: any Swift.Encoder) throws
80
+ public init(from decoder: any Swift.Decoder) throws
81
+ public static func < (a: Foundation.IndexPath, b: Foundation.IndexPath) -> Swift.Bool
82
+ public var description: Swift.String { get }
83
+ }
84
+ public struct IndexSet : Swift.Hashable, Swift.Codable, Swift.Sendable, Swift.CustomStringConvertible {
85
+ public static func == (a: Foundation.IndexSet, b: Foundation.IndexSet) -> Swift.Bool
86
+ public func hash(into hasher: inout Swift.Hasher)
87
+ public func encode(to encoder: any Swift.Encoder) throws
88
+ public init(from decoder: any Swift.Decoder) throws
89
+ public var description: Swift.String { get }
90
+ }
91
+ public struct CharacterSet : Swift.Hashable, Swift.Codable, Swift.Sendable, Swift.CustomStringConvertible {
92
+ public static func == (a: Foundation.CharacterSet, b: Foundation.CharacterSet) -> Swift.Bool
93
+ public func hash(into hasher: inout Swift.Hasher)
94
+ public func encode(to encoder: any Swift.Encoder) throws
95
+ public init(from decoder: any Swift.Decoder) throws
96
+ public var description: Swift.String { get }
97
+ }
98
+ public struct Locale : Swift.Hashable, Swift.Codable, Swift.Sendable, Swift.CustomStringConvertible {
99
+ public static var current: Foundation.Locale { get }
100
+ public static func == (a: Foundation.Locale, b: Foundation.Locale) -> Swift.Bool
101
+ public func hash(into hasher: inout Swift.Hasher)
102
+ public func encode(to encoder: any Swift.Encoder) throws
103
+ public init(from decoder: any Swift.Decoder) throws
104
+ public var description: Swift.String { get }
105
+ }
106
+ public struct TimeZone : Swift.Hashable, Swift.Codable, Swift.Sendable, Swift.CustomStringConvertible {
107
+ public static var current: Foundation.TimeZone { get }
108
+ public static func == (a: Foundation.TimeZone, b: Foundation.TimeZone) -> Swift.Bool
109
+ public func hash(into hasher: inout Swift.Hasher)
110
+ public func encode(to encoder: any Swift.Encoder) throws
111
+ public init(from decoder: any Swift.Decoder) throws
112
+ public var description: Swift.String { get }
113
+ }
114
+ public struct Calendar : Swift.Hashable, Swift.Codable, Swift.Sendable, Swift.CustomStringConvertible {
115
+ public static var current: Foundation.Calendar { get }
116
+ public static func == (a: Foundation.Calendar, b: Foundation.Calendar) -> Swift.Bool
117
+ public func hash(into hasher: inout Swift.Hasher)
118
+ public func encode(to encoder: any Swift.Encoder) throws
119
+ public init(from decoder: any Swift.Decoder) throws
120
+ public var description: Swift.String { get }
121
+ }
122
+ public struct Notification {
123
+ public struct Name {}
124
+ }
125
+ public struct Decimal : Swift.Hashable, Swift.Codable, Swift.Sendable, Swift.Comparable, Swift.CustomStringConvertible {
126
+ public static func == (a: Foundation.Decimal, b: Foundation.Decimal) -> Swift.Bool
127
+ public func hash(into hasher: inout Swift.Hasher)
128
+ public func encode(to encoder: any Swift.Encoder) throws
129
+ public init(from decoder: any Swift.Decoder) throws
130
+ public static func < (a: Foundation.Decimal, b: Foundation.Decimal) -> Swift.Bool
131
+ public var description: Swift.String { get }
132
+ }
133
+ open class JSONDecoder {
134
+ public init()
135
+ }
136
+ open class JSONEncoder {
137
+ public init()
13
138
  }
14
- public struct Date {}
15
- public struct DateComponents {}
16
- public struct DateInterval {}
17
- public struct URLComponents {}
18
- public struct URLQueryItem {}
19
- public struct URLRequest {}
20
- public struct UUID {}
21
- public struct IndexPath {}
22
- public struct IndexSet {}
23
- public struct CharacterSet {}
24
- public struct Locale {}
25
- public struct TimeZone {}
26
- public struct Calendar {}
27
- public struct Notification {}
28
- public struct Decimal {}
29
139
  public typealias NSErrorPointer = Swift.AutoreleasingUnsafeMutablePointer<Foundation.NSError?>?
30
140
  public typealias ErrorPointer = Foundation.NSErrorPointer
31
141
  public protocol CustomNSError : Swift.Error {
@@ -33,6 +143,18 @@ public protocol CustomNSError : Swift.Error {
33
143
  var errorCode: Swift.Int { get }
34
144
  var errorUserInfo: [Swift.String : Any] { get }
35
145
  }
146
+ public protocol LocalizedError : Swift.Error {
147
+ var errorDescription: Swift.String? { get }
148
+ var failureReason: Swift.String? { get }
149
+ var recoverySuggestion: Swift.String? { get }
150
+ var helpAnchor: Swift.String? { get }
151
+ }
152
+ extension Foundation.LocalizedError {
153
+ public var errorDescription: Swift.String? { get }
154
+ public var failureReason: Swift.String? { get }
155
+ public var recoverySuggestion: Swift.String? { get }
156
+ public var helpAnchor: Swift.String? { get }
157
+ }
36
158
  public protocol _ObjectiveCBridgeableError : Swift.Error {
37
159
  init?(_bridgedNSError: __shared Foundation.NSError)
38
160
  }
@@ -313,6 +435,15 @@ public func _convertErrorToNSError(_ error: any Swift.Error) -> Foundation.NSErr
313
435
  public protocol ContiguousBytes {
314
436
  func withUnsafeBytes<R>(_ body: (Swift.UnsafeRawBufferPointer) throws -> R) rethrows -> R
315
437
  }
438
+ extension Foundation.Data : Swift.RandomAccessCollection, Swift.MutableCollection, Swift.RangeReplaceableCollection {
439
+ public typealias Element = Swift.UInt8
440
+ public typealias Indices = Swift.Range<Swift.Int>
441
+ public init()
442
+ public var startIndex: Swift.Int { get }
443
+ public var endIndex: Swift.Int { get }
444
+ public subscript(position: Swift.Int) -> Swift.UInt8 { get set }
445
+ public mutating func replaceSubrange<C>(_ subrange: Swift.Range<Swift.Int>, with newElements: C) where C : Swift.Collection, C.Element == Swift.UInt8
446
+ }
316
447
  extension Foundation.Data : Swift.Hashable, Swift.Codable, Foundation.ContiguousBytes, Swift.Sendable {
317
448
  public static func == (lhs: Foundation.Data, rhs: Foundation.Data) -> Swift.Bool
318
449
  public func hash(into hasher: inout Swift.Hasher)
@@ -11,3 +11,8 @@ extension UIKit.UIWindow {
11
11
  extension UIKit.UIDevice {
12
12
  public typealias BatteryState = UIKit.UIDeviceBatteryState
13
13
  }
14
+ extension UIKit.NSLayoutConstraint {
15
+ public typealias Relation = UIKit.NSLayoutRelation
16
+ public typealias Attribute = UIKit.NSLayoutAttribute
17
+ public typealias FormatOptions = UIKit.NSLayoutFormatOptions
18
+ }
@@ -745,7 +745,8 @@ function initializeWorkspaceGit(root: string, work: string) {
745
745
  })
746
746
  const tracked = trackedSourceFiles(root, work)
747
747
  if (tracked.length > 0)
748
- execFileSync('git', ['add', '-f', '--pathspec-from-file=-', '--pathspec-file-nul'], {
748
+ // update-index takes exact paths; add matches every file against every pathspec, which is quadratic here
749
+ execFileSync('git', ['update-index', '--add', '-z', '--stdin'], {
749
750
  cwd: work,
750
751
  env: { ...process.env, ...isolatedGitEnv },
751
752
  input: tracked.join('\0'),
@@ -904,7 +905,13 @@ async function prepareWorkspace(
904
905
  const command = [...prefix, ...args]
905
906
  await run(command[0]!, command.slice(1), cwd, env)
906
907
  }
907
- if (manager.startsWith('bun@') && (!projectReady || !fs.existsSync(bunExecutable)))
908
+ const installedBun = manager.startsWith('bun@')
909
+ ? spawnSync(bunExecutable, ['--version'], { encoding: 'utf8' })
910
+ : null
911
+ if (
912
+ manager.startsWith('bun@') &&
913
+ (installedBun?.status !== 0 || installedBun.stdout.trim() !== manager.slice(4))
914
+ )
908
915
  await execute(
909
916
  [
910
917
  'npm',
@@ -131,10 +131,11 @@ function entrySource(ids: string[]): string {
131
131
  '',
132
132
  '@OptIn(kotlin.js.ExperimentalJsExport::class)',
133
133
  '@JsExport',
134
- 'fun peachSetAndroidDeviceInfo(model: String, release: String, apiLevel: Int, locale: String, timeZone: String) {',
134
+ 'fun peachSetAndroidDeviceInfo(model: String, release: String, apiLevel: Int, locale: String, timeZone: String, settings: String) {',
135
135
  ' Build.setDevice(model, release, apiLevel)',
136
136
  ' java.util.Locale.setDefault(java.util.Locale.forLanguageTag(locale))',
137
137
  ' java.util.TimeZone.setDevice(timeZone)',
138
+ ' dev.peach.android.ProcessSettings.configure(settings)',
138
139
  '}',
139
140
  '',
140
141
  '@OptIn(kotlin.js.ExperimentalJsExport::class, kotlinx.coroutines.DelicateCoroutinesApi::class)',
@@ -730,10 +731,11 @@ export async function expoKotlinArtifact(
730
731
  ' ))',
731
732
  '}',
732
733
  '',
733
- '@JsExport fun peachSetAndroidDeviceInfo(model: String, release: String, apiLevel: Int, locale: String, timeZone: String) {',
734
+ '@JsExport fun peachSetAndroidDeviceInfo(model: String, release: String, apiLevel: Int, locale: String, timeZone: String, settings: String) {',
734
735
  ' android.os.Build.setDevice(model, release, apiLevel)',
735
736
  ' java.util.Locale.setDefault(java.util.Locale.forLanguageTag(locale))',
736
737
  ' java.util.TimeZone.setDevice(timeZone)',
738
+ ' dev.peach.android.ProcessSettings.configure(settings)',
737
739
  ' PeachExpoRuntime.configureProcessLocale(locale)',
738
740
  '}',
739
741
  '',
@@ -10,7 +10,10 @@ import {
10
10
  readGoogleSignInConfiguration,
11
11
  selectNativeAppIdentityReader,
12
12
  } from './native-app-identity'
13
- import { resolveNativeAppIconArtwork } from './nativeAppIconContract'
13
+ import {
14
+ resolveNativeAppIconArtwork,
15
+ resolveNativeBundleIcons,
16
+ } from './nativeAppIconContract'
14
17
  import { parsePlistSource } from './plist'
15
18
  import { NATIVE_GRAPH_SDK_VERSION } from './swift-objc-standin'
16
19
  import {
@@ -91,11 +94,15 @@ export function readNativeAppIdentityFromXcodeTarget(
91
94
  }
92
95
  const alternateSetting =
93
96
  settings?.('ASSETCATALOG_COMPILER_ALTERNATE_APPICON_NAMES') ?? ''
97
+ const catalogAlternateNames: string[] = []
94
98
  for (const match of alternateSetting
95
99
  .replace(/\\"/g, '"')
96
100
  .matchAll(/"([^"]*)"|([^\s(),]+)/g)) {
97
101
  const val = match[1] ?? match[2]
98
- if (val) alternateIconNames.add(val)
102
+ if (val) {
103
+ alternateIconNames.add(val)
104
+ catalogAlternateNames.push(val)
105
+ }
99
106
  }
100
107
 
101
108
  const permissionUsageDescriptions: Record<string, unknown> = {}
@@ -204,6 +211,7 @@ export function readNativeAppIdentityFromXcodeTarget(
204
211
  ipadSupportedInterfaceOrientations,
205
212
  ...(defaultScreenOrientationMask ? { defaultScreenOrientationMask } : {}),
206
213
  alternateIconNames: [...alternateIconNames],
214
+ bundleIcons: resolveNativeBundleIcons(icons, catalogAlternateNames, (value) => value),
207
215
  appIconArtwork: resolveNativeAppIconArtwork(
208
216
  app.resources,
209
217
  (file) => fs.readFileSync(file, 'utf8'),
@@ -13,6 +13,7 @@ import { nativeAppIdentityFromAndroidManifest } from './android-app-identity'
13
13
  import { isRecord } from './is-record'
14
14
  import {
15
15
  resolveNativeAppIconArtwork,
16
+ resolveNativeBundleIcons,
16
17
  isNativeAppIconArtwork,
17
18
  readNativeAppIconArtwork,
18
19
  type NativeAppIconArtwork,
@@ -87,6 +88,7 @@ export interface NativeAppIdentity {
87
88
  rtcAppGroupIdentifier?: string
88
89
  screenShareExtensionBundleId?: string
89
90
  alternateIconNames?: readonly string[]
91
+ bundleIcons?: Readonly<Record<string, unknown>>
90
92
  appIconArtwork?: NativeAppIconArtwork
91
93
  // resolved Reanimated compile flags from the native build inputs.
92
94
  reanimatedStaticFeatureFlags?: Readonly<Record<string, boolean>>
@@ -183,6 +185,7 @@ export function isNativeAppIdentity(value: unknown): value is NativeAppIdentity
183
185
  )
184
186
  return false
185
187
  if (value.googleSignIn !== undefined && !isRecord(value.googleSignIn)) return false
188
+ if (value.bundleIcons !== undefined && !isRecord(value.bundleIcons)) return false
186
189
  const descriptions = value.permissionUsageDescriptions
187
190
  if (
188
191
  value.reanimatedStaticFeatureFlags !== undefined &&
@@ -355,6 +358,9 @@ export function readNativeAppIdentity(value: unknown): NativeAppIdentity | null
355
358
  ...(value.alternateIconNames === undefined
356
359
  ? {}
357
360
  : { alternateIconNames: [...value.alternateIconNames] }),
361
+ ...(value.bundleIcons === undefined
362
+ ? {}
363
+ : { bundleIcons: structuredClone(value.bundleIcons) }),
358
364
  ...(value.androidManifestPermissions === undefined
359
365
  ? {}
360
366
  : {
@@ -1003,10 +1009,13 @@ function nativeAppIdentityFromIos(
1003
1009
  )
1004
1010
  if (alternateSetting === null)
1005
1011
  throw new Error('native alternate icon setting is unresolved')
1012
+ const catalogAlternateNames: string[] = []
1006
1013
  for (const match of alternateSetting
1007
1014
  .replace(/\\"/g, '"')
1008
1015
  .matchAll(/"([^"]*)"|([^\s(),]+)/g)) {
1009
- alternateIconNames.add(match[1] ?? match[2])
1016
+ const name = match[1] ?? match[2]
1017
+ alternateIconNames.add(name)
1018
+ catalogAlternateNames.push(name)
1010
1019
  }
1011
1020
  // swift casts the whole configured value to [String]; a mixed array grants none.
1012
1021
  const intentIds = dictionary.OneAppIntentIdentifiers
@@ -1208,6 +1217,11 @@ function nativeAppIdentityFromIos(
1208
1217
  ? {}
1209
1218
  : { defaultScreenOrientationMask }),
1210
1219
  alternateIconNames: [...alternateIconNames],
1220
+ bundleIcons: resolveNativeBundleIcons(icons, catalogAlternateNames, (value) => {
1221
+ const resolved = resolveBuildSetting(value, settings)
1222
+ if (resolved === null) throw new Error('native bundle icon reference is unresolved')
1223
+ return resolved
1224
+ }),
1211
1225
  ...(resourceUri
1212
1226
  ? {
1213
1227
  appIconArtwork: resolveNativeAppIconArtwork(
@@ -6,6 +6,43 @@ export interface NativeAppIconArtwork {
6
6
  alternates: Record<string, SwiftImageVariants>
7
7
  }
8
8
 
9
+ export function resolveNativeBundleIcons(
10
+ icons: unknown,
11
+ catalogNames: readonly string[],
12
+ resolveReference: (value: string) => string,
13
+ ): Record<string, unknown> | undefined {
14
+ if (!isRecord(icons) && catalogNames.length === 0) return undefined
15
+ const resolve = (value: unknown): unknown => {
16
+ if (typeof value === 'string') return resolveReference(value)
17
+ if (Array.isArray(value)) return value.map(resolve)
18
+ if (isRecord(value))
19
+ return Object.fromEntries(
20
+ Object.entries(value).map(([key, entry]) => [
21
+ resolveReference(key),
22
+ resolve(entry),
23
+ ]),
24
+ )
25
+ return value
26
+ }
27
+ const dictionary = isRecord(icons)
28
+ ? Object.fromEntries(
29
+ Object.entries(icons).map(([key, value]) => [key, resolve(value)]),
30
+ )
31
+ : {}
32
+ if (catalogNames.length === 0) return dictionary
33
+ return {
34
+ ...dictionary,
35
+ CFBundleAlternateIcons: {
36
+ ...Object.fromEntries(
37
+ catalogNames.map((name) => [name, { CFBundleIconName: name }]),
38
+ ),
39
+ ...(isRecord(dictionary.CFBundleAlternateIcons)
40
+ ? dictionary.CFBundleAlternateIcons
41
+ : {}),
42
+ },
43
+ }
44
+ }
45
+
9
46
  export function isNativeAppIconArtwork(value: unknown): value is NativeAppIconArtwork {
10
47
  return (
11
48
  isRecord(value) &&
@@ -201,6 +201,14 @@ export function applyInstalledSwiftTargets(
201
201
  return !collection.targets.some((target) => target.name === module)
202
202
  })
203
203
  dropSuppliedHeaders(generated, native)
204
+ if (native.flattensPublicHeaders && native.publicHeaders.length > 0)
205
+ generated.swiftFlags = [
206
+ ...(generated.swiftFlags ?? []),
207
+ '-Xcc',
208
+ '-I',
209
+ '-Xcc',
210
+ `$(PEACH_INPUT_ROOT)/.build/peach-cxx-headers/${native.name}`,
211
+ ]
204
212
  const flags = originalModuleFlags(native.flags)
205
213
  generated.clangSettings = [
206
214
  { tool: 'c', flags: [...flags, ...ndebug, ...search] },