peachsim 0.1.2190 → 0.1.2192

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 (101) hide show
  1. package/dist-lib/agent-daemon-client.cjs +1 -1
  2. package/dist-lib/agent-events.cjs +1 -1
  3. package/dist-lib/attached-projects.cjs +1 -1
  4. package/dist-lib/auth/shared-session.cjs +1 -1
  5. package/dist-lib/backend-origin.cjs +1 -1
  6. package/dist-lib/beta.cjs +1 -1
  7. package/dist-lib/beta.mjs +1 -1
  8. package/dist-lib/bridge-constants.cjs +1 -1
  9. package/dist-lib/bridge-contract-input.cjs +1 -1
  10. package/dist-lib/bridge-contract-input.mjs +1 -1
  11. package/dist-lib/bridge-contract.cjs +1 -1
  12. package/dist-lib/bridge-contract.mjs +1 -1
  13. package/dist-lib/bundle-channel.cjs +126 -181
  14. package/dist-lib/capture-contract.cjs +1 -1
  15. package/dist-lib/capture-contract.mjs +1 -1
  16. package/dist-lib/cloud-contract.cjs +1 -1
  17. package/dist-lib/cloud-contract.mjs +1 -1
  18. package/dist-lib/cloud-test-args.cjs +1 -1
  19. package/dist-lib/cloud-test-args.mjs +1 -1
  20. package/dist-lib/cloud.cjs +1 -1
  21. package/dist-lib/cloud.mjs +1 -1
  22. package/dist-lib/config.cjs +1 -1
  23. package/dist-lib/config.mjs +1 -1
  24. package/dist-lib/detox/index.cjs +1 -1
  25. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  26. package/dist-lib/expo-swift-bundle.cjs +115 -175
  27. package/dist-lib/expo-swift-metadata.cjs +1 -1
  28. package/dist-lib/expo-swift-metadata.mjs +1 -1
  29. package/dist-lib/home-paths.cjs +1 -6
  30. package/dist-lib/host/bridge-host.cjs +126 -181
  31. package/dist-lib/host/fetch-proxy-handler.cjs +4 -4
  32. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  33. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  34. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  35. package/dist-lib/host/websocket-proxy.cjs +1 -1
  36. package/dist-lib/index.cjs +7 -5
  37. package/dist-lib/jump-to-source-babel.cjs +1 -1
  38. package/dist-lib/jump-to-source-native.cjs +1 -1
  39. package/dist-lib/kotlin-host.cjs +7 -2
  40. package/dist-lib/menu.cjs +1 -1
  41. package/dist-lib/menu.mjs +1 -1
  42. package/dist-lib/metro-fingerprint-registry.cjs +1 -1
  43. package/dist-lib/metro-fingerprint-registry.mjs +1 -1
  44. package/dist-lib/metro-production-bundle.cjs +1 -1
  45. package/dist-lib/metro-production-bundle.mjs +1 -1
  46. package/dist-lib/metro.cjs +7 -5
  47. package/dist-lib/native-app-identity-project.cjs +6 -4
  48. package/dist-lib/native-app-identity-project.mjs +6 -4
  49. package/dist-lib/native-app-identity.cjs +1 -1
  50. package/dist-lib/native-app-identity.mjs +1 -1
  51. package/dist-lib/native-firebase-metadata.cjs +1 -1
  52. package/dist-lib/native-firebase-metadata.mjs +1 -1
  53. package/dist-lib/pdfium-raster.cjs +1 -1
  54. package/dist-lib/pdfium-raster.mjs +1 -1
  55. package/dist-lib/plist.cjs +1 -1
  56. package/dist-lib/plist.mjs +1 -1
  57. package/dist-lib/profiles.cjs +1 -1
  58. package/dist-lib/public-brand.cjs +1 -1
  59. package/dist-lib/public-origins-lib-esm.json +24 -24
  60. package/dist-lib/public-origins-lib.json +53 -53
  61. package/dist-lib/react-native-host-modules.cjs +1 -1
  62. package/dist-lib/react-native-host-modules.mjs +1 -1
  63. package/dist-lib/reap-browser.cjs +1 -1
  64. package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
  65. package/dist-lib/sdk.cjs +1 -1
  66. package/dist-lib/sdk.mjs +1 -1
  67. package/dist-lib/skills.cjs +126 -182
  68. package/dist-lib/swift-compile.cjs +20 -132
  69. package/dist-lib/swift-compile.mjs +20 -132
  70. package/dist-lib/swift-package.cjs +1 -1
  71. package/dist-lib/swift-package.mjs +1 -1
  72. package/dist-lib/swift-submit.cjs +1 -1
  73. package/dist-lib/swift-submit.mjs +1 -1
  74. package/dist-lib/swift-toolchain.cjs +41 -23
  75. package/dist-lib/swift.cjs +1 -1
  76. package/dist-lib/vite-swift.cjs +97 -157
  77. package/dist-lib/vite.cjs +4 -4
  78. package/dist-lib/worklet-executable.cjs +1 -1
  79. package/dist-lib/worklet-executable.mjs +1 -1
  80. package/dist-types/packages/peach-engine/src/engine/node.d.ts +3 -0
  81. package/dist-types/packages/peach-engine/src/engine/scroll-momentum-math.d.ts +2 -1
  82. package/dist-types/packages/peach-engine/src/render-worker/compositor-protocol.d.ts +1 -0
  83. package/dist-types/packages/peach-engine/src/render-worker/scroll-mirror.d.ts +1 -0
  84. package/kotlin/sdk.tar.gz +0 -0
  85. package/package.json +1 -1
  86. package/src/expo-native-workspace.ts +21 -20
  87. package/src/home-paths.ts +0 -5
  88. package/src/kotlin-host.ts +6 -1
  89. package/src/nitro-adapter.lock.json +265 -265
  90. package/src/nitro-superset.lock.json +4 -4
  91. package/src/swift-compile.ts +21 -114
  92. package/src/swift-distribution.lock.json +17 -11
  93. package/src/swift-distribution.ts +3 -3
  94. package/src/swift-host.ts +12 -8
  95. package/src/swift-interface-bodies.ts +7 -1
  96. package/src/swift-objc-standin.ts +46 -8
  97. package/src/swift-packages.ts +1 -0
  98. package/src/swift-toolchain.ts +40 -30
  99. package/src/swift-wasm-prune.ts +3 -2
  100. package/src/turbo-runtime.lock.json +21 -21
  101. package/src/xcode-project.ts +6 -4
@@ -2255,6 +2255,11 @@ export function emitSwiftPackageManifest(args: {
2255
2255
  ...(!native?.clang && target.publicHeadersPath !== undefined
2256
2256
  ? [` publicHeadersPath: ${JSON.stringify(target.publicHeadersPath)},`]
2257
2257
  : []),
2258
+ // swiftpm appends the root package's name after a target's own flags
2259
+ // unless the target opts out of package access
2260
+ ...(!clang && target.swiftFlags?.includes('-package-name')
2261
+ ? [' packageAccess: false,']
2262
+ : []),
2258
2263
  // the native backend supplies dependency module maps without their
2259
2264
  // compiled modules. textual c++ includes keep those dependencies usable.
2260
2265
  ` ${clang ? nativeSettings : swiftSettings}${link}`,
@@ -2733,117 +2738,6 @@ const FOUNDATION_OVERLAY_GLOBALS = new Set([
2733
2738
  'NSFileErrorMinimum',
2734
2739
  'NSFormattingErrorMaximum',
2735
2740
  'NSFormattingErrorMinimum',
2736
- 'NSFoundationVersionNumber',
2737
- 'NSFoundationVersionNumber10_0',
2738
- 'NSFoundationVersionNumber10_1',
2739
- 'NSFoundationVersionNumber10_10',
2740
- 'NSFoundationVersionNumber10_10_1',
2741
- 'NSFoundationVersionNumber10_10_2',
2742
- 'NSFoundationVersionNumber10_10_3',
2743
- 'NSFoundationVersionNumber10_10_4',
2744
- 'NSFoundationVersionNumber10_10_5',
2745
- 'NSFoundationVersionNumber10_10_Max',
2746
- 'NSFoundationVersionNumber10_11',
2747
- 'NSFoundationVersionNumber10_11_1',
2748
- 'NSFoundationVersionNumber10_11_2',
2749
- 'NSFoundationVersionNumber10_11_3',
2750
- 'NSFoundationVersionNumber10_11_4',
2751
- 'NSFoundationVersionNumber10_11_Max',
2752
- 'NSFoundationVersionNumber10_1_1',
2753
- 'NSFoundationVersionNumber10_1_2',
2754
- 'NSFoundationVersionNumber10_1_3',
2755
- 'NSFoundationVersionNumber10_1_4',
2756
- 'NSFoundationVersionNumber10_2',
2757
- 'NSFoundationVersionNumber10_2_1',
2758
- 'NSFoundationVersionNumber10_2_2',
2759
- 'NSFoundationVersionNumber10_2_3',
2760
- 'NSFoundationVersionNumber10_2_4',
2761
- 'NSFoundationVersionNumber10_2_5',
2762
- 'NSFoundationVersionNumber10_2_6',
2763
- 'NSFoundationVersionNumber10_2_7',
2764
- 'NSFoundationVersionNumber10_2_8',
2765
- 'NSFoundationVersionNumber10_3',
2766
- 'NSFoundationVersionNumber10_3_1',
2767
- 'NSFoundationVersionNumber10_3_2',
2768
- 'NSFoundationVersionNumber10_3_3',
2769
- 'NSFoundationVersionNumber10_3_4',
2770
- 'NSFoundationVersionNumber10_3_5',
2771
- 'NSFoundationVersionNumber10_3_6',
2772
- 'NSFoundationVersionNumber10_3_7',
2773
- 'NSFoundationVersionNumber10_3_8',
2774
- 'NSFoundationVersionNumber10_3_9',
2775
- 'NSFoundationVersionNumber10_4',
2776
- 'NSFoundationVersionNumber10_4_1',
2777
- 'NSFoundationVersionNumber10_4_10',
2778
- 'NSFoundationVersionNumber10_4_11',
2779
- 'NSFoundationVersionNumber10_4_2',
2780
- 'NSFoundationVersionNumber10_4_3',
2781
- 'NSFoundationVersionNumber10_4_4_Intel',
2782
- 'NSFoundationVersionNumber10_4_4_PowerPC',
2783
- 'NSFoundationVersionNumber10_4_5',
2784
- 'NSFoundationVersionNumber10_4_6',
2785
- 'NSFoundationVersionNumber10_4_7',
2786
- 'NSFoundationVersionNumber10_4_8',
2787
- 'NSFoundationVersionNumber10_4_9',
2788
- 'NSFoundationVersionNumber10_5',
2789
- 'NSFoundationVersionNumber10_5_1',
2790
- 'NSFoundationVersionNumber10_5_2',
2791
- 'NSFoundationVersionNumber10_5_3',
2792
- 'NSFoundationVersionNumber10_5_4',
2793
- 'NSFoundationVersionNumber10_5_5',
2794
- 'NSFoundationVersionNumber10_5_6',
2795
- 'NSFoundationVersionNumber10_5_7',
2796
- 'NSFoundationVersionNumber10_5_8',
2797
- 'NSFoundationVersionNumber10_6',
2798
- 'NSFoundationVersionNumber10_6_1',
2799
- 'NSFoundationVersionNumber10_6_2',
2800
- 'NSFoundationVersionNumber10_6_3',
2801
- 'NSFoundationVersionNumber10_6_4',
2802
- 'NSFoundationVersionNumber10_6_5',
2803
- 'NSFoundationVersionNumber10_6_6',
2804
- 'NSFoundationVersionNumber10_6_7',
2805
- 'NSFoundationVersionNumber10_6_8',
2806
- 'NSFoundationVersionNumber10_7',
2807
- 'NSFoundationVersionNumber10_7_1',
2808
- 'NSFoundationVersionNumber10_7_2',
2809
- 'NSFoundationVersionNumber10_7_3',
2810
- 'NSFoundationVersionNumber10_7_4',
2811
- 'NSFoundationVersionNumber10_8',
2812
- 'NSFoundationVersionNumber10_8_1',
2813
- 'NSFoundationVersionNumber10_8_2',
2814
- 'NSFoundationVersionNumber10_8_3',
2815
- 'NSFoundationVersionNumber10_8_4',
2816
- 'NSFoundationVersionNumber10_9',
2817
- 'NSFoundationVersionNumber10_9_1',
2818
- 'NSFoundationVersionNumber10_9_2',
2819
- 'NSFoundationVersionNumber_iOS_4_0',
2820
- 'NSFoundationVersionNumber_iOS_4_1',
2821
- 'NSFoundationVersionNumber_iOS_4_2',
2822
- 'NSFoundationVersionNumber_iOS_4_3',
2823
- 'NSFoundationVersionNumber_iOS_5_0',
2824
- 'NSFoundationVersionNumber_iOS_5_1',
2825
- 'NSFoundationVersionNumber_iOS_6_0',
2826
- 'NSFoundationVersionNumber_iOS_6_1',
2827
- 'NSFoundationVersionNumber_iOS_7_0',
2828
- 'NSFoundationVersionNumber_iOS_7_1',
2829
- 'NSFoundationVersionNumber_iOS_8_0',
2830
- 'NSFoundationVersionNumber_iOS_8_1',
2831
- 'NSFoundationVersionNumber_iOS_8_2',
2832
- 'NSFoundationVersionNumber_iOS_8_3',
2833
- 'NSFoundationVersionNumber_iOS_8_4',
2834
- 'NSFoundationVersionNumber_iOS_8_x_Max',
2835
- 'NSFoundationVersionNumber_iOS_9_0',
2836
- 'NSFoundationVersionNumber_iOS_9_1',
2837
- 'NSFoundationVersionNumber_iOS_9_2',
2838
- 'NSFoundationVersionNumber_iOS_9_3',
2839
- 'NSFoundationVersionNumber_iOS_9_4',
2840
- 'NSFoundationVersionNumber_iOS_9_x_Max',
2841
- 'NSFoundationVersionNumber_iPhoneOS_2_0',
2842
- 'NSFoundationVersionNumber_iPhoneOS_2_1',
2843
- 'NSFoundationVersionNumber_iPhoneOS_2_2',
2844
- 'NSFoundationVersionNumber_iPhoneOS_3_0',
2845
- 'NSFoundationVersionNumber_iPhoneOS_3_1',
2846
- 'NSFoundationVersionNumber_iPhoneOS_3_2',
2847
2741
  'NSFoundationVersionWithFileManagerResourceForkSupport',
2848
2742
  'NSFreeHashTable',
2849
2743
  'NSFreeMapTable',
@@ -4328,7 +4222,13 @@ export function writeSwiftProject(
4328
4222
  for (const file of Object.keys(input.files)) {
4329
4223
  if (!file.endsWith('.swift')) continue
4330
4224
  const target = bySourcePath.find(
4331
- (candidate) => candidate.path === '.' || file.startsWith(`${candidate.path}/`),
4225
+ (candidate) =>
4226
+ (candidate.path === '.' || file.startsWith(`${candidate.path}/`)) &&
4227
+ (candidate.sources === undefined ||
4228
+ candidate.sources.some((source) => {
4229
+ const selected = path.posix.join(candidate.path, source)
4230
+ return file === selected || file.startsWith(`${selected}/`)
4231
+ })),
4332
4232
  )
4333
4233
  // swiftpm never compiles an excluded file (a prebuilt core's Swift)
4334
4234
  const excluded = target?.exclude?.some(
@@ -4401,9 +4301,17 @@ export function writeSwiftProject(
4401
4301
  }
4402
4302
  const targetEntries = (target: SwiftPackageTarget) => {
4403
4303
  const prefix = target.path === '.' ? '' : `${target.path}/`
4304
+ // targets may share a directory and pick their compiled files with `sources`;
4305
+ // swiftpm leaves every header on disk for relative includes
4404
4306
  return Object.entries(input.files).filter(
4405
4307
  ([file]) =>
4406
4308
  file.startsWith(prefix) &&
4309
+ (target.sources === undefined ||
4310
+ !(file.endsWith('.swift') || isSwiftNativeTranslationUnit(file)) ||
4311
+ target.sources.some((source) => {
4312
+ const selected = path.posix.join(prefix, source)
4313
+ return file === selected || file.startsWith(`${selected}/`)
4314
+ })) &&
4407
4315
  !target.exclude?.some(
4408
4316
  (excluded) =>
4409
4317
  file === `${prefix}${excluded}` || file.startsWith(`${prefix}${excluded}/`),
@@ -4615,8 +4523,7 @@ export function writeSwiftProject(
4615
4523
  )) {
4616
4524
  const include = match[1]!
4617
4525
  const producer = /(?:^|\/)([^/]+)-Swift\.h$/.exec(include)?.[1]
4618
- if (producer && targets.some((value) => value.name === producer))
4619
- producers.add(producer)
4526
+ if (producer && swiftTargets.has(producer)) producers.add(producer)
4620
4527
  const local = [
4621
4528
  path.posix.join(path.posix.dirname(file), include),
4622
4529
  `${includes}${include}`,
@@ -1,10 +1,10 @@
1
1
  {
2
- "id": "2405235872029d30",
2
+ "id": "87fc4d2ff9d5d588",
3
3
  "release": "swift-6.4.0-RELEASE-custom-11345d60dca47496",
4
- "wasmSdkId": "swift-6.4.0-RELEASE_wasm-peach-3452e5a2",
5
- "wasmSdkUrl": "https://r2.sootsim.com/swift-wasm-sdk/swift-6.4.0-RELEASE_wasm-peach-3452e5a2.artifactbundle.tar.gz",
6
- "wasmSdkChecksum": "fe042506d9418d5b73a3a30d62157931439c23e3bcb869871a0fcb8747223a02",
7
- "source": "cdb449bf1d82ad311bfa5b7ce329fd557d753be6",
4
+ "wasmSdkId": "swift-6.4.0-RELEASE_wasm-peach-19471d4b",
5
+ "wasmSdkUrl": "https://r2.sootsim.com/swift-wasm-sdk/swift-6.4.0-RELEASE_wasm-peach-19471d4b.artifactbundle.tar.gz",
6
+ "wasmSdkChecksum": "764c16e7e34156bf90d6c3372a2b77b98b9d8c3470235520d0f9619f90f33456",
7
+ "source": "08519cc5f11db43a2f85f28c47ec6c8930843f93",
8
8
  "targets": [
9
9
  "ImagePlayground",
10
10
  "QuickLookThumbnailing",
@@ -131,6 +131,12 @@
131
131
  "CryptoKit",
132
132
  "CryptoTokenKit",
133
133
  "TikTokBusinessSDK",
134
+ "EXUpdatesInterface",
135
+ "EXManifests",
136
+ "EASClient",
137
+ "EXStructuredHeaders",
138
+ "EXUpdatesBSPatch",
139
+ "Reachability",
134
140
  "EXUpdates",
135
141
  "nSure",
136
142
  "TOCropViewController",
@@ -238,16 +244,16 @@
238
244
  },
239
245
  "hosts": {
240
246
  "darwin-arm64": {
241
- "sha256": "58613631263d88f7717d8eae765f2b60485cc5b5f855c07d7945bae221ddc96e",
242
- "size": 101433697
247
+ "sha256": "7444ad87688bb551601a49fee6b48d15978fcd877982a25a944280f553f439b5",
248
+ "size": 103297800
243
249
  },
244
250
  "linux-x64": {
245
- "sha256": "974238270fadebc4d5ab105a808f4e96a6b8c2b594e3fea6b5313be8f4d5ac7a",
246
- "size": 104150538
251
+ "sha256": "03edd8359c024c592bb53b8917d9efc59f9b76871966b41189838deb2b9c27f2",
252
+ "size": 106017072
247
253
  },
248
254
  "linux-arm64": {
249
- "sha256": "62e2f1537e2418fb8a49e97004f2646aaaa8ea1cb3b2b0ff5426e16fdc7a7281",
250
- "size": 103641611
255
+ "sha256": "00a89f46a581f73ea6b0343f21fa330bbe1ae444a1d29ad7251e87a86e4bc91b",
256
+ "size": 105508093
251
257
  }
252
258
  }
253
259
  }
@@ -10,7 +10,7 @@ import os from 'node:os'
10
10
  import path from 'node:path'
11
11
  import { installVerifiedTarball } from '@contrast/runtime-delivery'
12
12
  import { ensureLinuxBrowserLibraries } from '../cli/drivers/linux-browser-libs'
13
- import { peachSwiftSdksDir, rnxHomeDir } from './home-paths'
13
+ import { rnxHomeDir } from './home-paths'
14
14
  import { swiftDistributionAt, swiftModuleSdk } from './swift-compile'
15
15
  import {
16
16
  SWIFT_DISTRIBUTION_MANIFEST,
@@ -22,6 +22,7 @@ import {
22
22
  confineSwiftScratch,
23
23
  ensureSwiftLinuxRuntime,
24
24
  installSwiftWasmSdk,
25
+ peachSwiftSdksDir,
25
26
  privateSwiftDistributionRoot,
26
27
  SWIFT_PRIVATE_DISTRIBUTION_ENV,
27
28
  swiftCompiler,
@@ -208,7 +209,6 @@ async function installSwiftToolchain(
208
209
  signal?: AbortSignal,
209
210
  compilerOnly = false,
210
211
  ): Promise<string> {
211
- process.env.PEACH_SWIFT_SDKS_PATH = peachSwiftSdksDir()
212
212
  const root = path.resolve(swiftToolchainBin(release), '../..')
213
213
  // macOS installs where the locator looks first, the user's Toolchains
214
214
  // directory, and only into a directory without a compiler; linux installs
@@ -260,7 +260,7 @@ async function installSwiftToolchain(
260
260
  const ready = swiftToolchainReady(release, sdk)
261
261
  if (ready) return ready
262
262
  signal?.throwIfAborted()
263
- const directory = process.env.PEACH_SWIFT_SDKS_PATH
263
+ const directory = peachSwiftSdksDir()
264
264
  process.stderr.write(`peach: installing Swift SDK ${sdk.wasmSdkId} to ${directory}…\n`)
265
265
  try {
266
266
  installSwiftWasmSdk(release, sdk)
package/src/swift-host.ts CHANGED
@@ -1078,13 +1078,17 @@ async function buildXcodeLayout(root: string): Promise<XcodeLayout | null> {
1078
1078
  feature.configuration === packageConfiguration,
1079
1079
  )
1080
1080
  .map((feature) => feature.name),
1081
- swiftFlags: target.packageSwiftFlags
1082
- .filter(
1083
- (setting) =>
1084
- setting.configuration === null ||
1085
- setting.configuration === packageConfiguration,
1086
- )
1087
- .flatMap((setting) => setting.flags),
1081
+ // the flat build gives every module one package; swiftpm names each
1082
+ // module for its own package, which `@retroactive` and `package` read
1083
+ swiftFlags: ['-package-name', swiftPackageIdentity(target.packageDir)].concat(
1084
+ target.packageSwiftFlags
1085
+ .filter(
1086
+ (setting) =>
1087
+ setting.configuration === null ||
1088
+ setting.configuration === packageConfiguration,
1089
+ )
1090
+ .flatMap((setting) => setting.flags),
1091
+ ),
1088
1092
  linkedLibraries: target.packageLibraries
1089
1093
  .filter(
1090
1094
  (library) =>
@@ -1575,7 +1579,7 @@ function xcodeManifest(layout: XcodeLayout): string {
1575
1579
  ...layout.targets.map((target) =>
1576
1580
  target.systemLibrary
1577
1581
  ? ` .systemLibrary(name: "${target.name}", path: "${target.path}"),`
1578
- : ` .target(name: "${target.name}", ${target.dependencies === undefined ? '' : `dependencies: [${dependencies(target)}], `}path: "${target.path}", ${target.exclude.length > 0 ? `exclude: ${JSON.stringify(target.exclude)}, ` : ''}${target.resources ? 'resources: [], ' : ''}${target.publicHeadersPath === undefined ? '' : `publicHeadersPath: ${JSON.stringify(target.publicHeadersPath)}, `}${clangSettings(target)}${swiftManifestSettings(target)}${libraries(target)}),`,
1582
+ : ` .target(name: "${target.name}", ${target.dependencies === undefined ? '' : `dependencies: [${dependencies(target)}], `}path: "${target.path}", ${target.exclude.length > 0 ? `exclude: ${JSON.stringify(target.exclude)}, ` : ''}${target.sources === undefined ? '' : `sources: ${JSON.stringify(target.sources)}, `}${target.resources ? 'resources: [], ' : ''}${target.publicHeadersPath === undefined ? '' : `publicHeadersPath: ${JSON.stringify(target.publicHeadersPath)}, `}${clangSettings(target)}${swiftManifestSettings(target)}${libraries(target)}),`,
1579
1583
  ),
1580
1584
  '])',
1581
1585
  '',
@@ -119,7 +119,13 @@ export function swiftInterfaceWithoutBodies(text: string, keepDefaults = false):
119
119
  continue
120
120
  }
121
121
  const char = text[i]!
122
- if (char === '=' && parens > 0 && text[i - 1] === ' ' && text[i + 1] === ' ') {
122
+ if (
123
+ !keepDefaults &&
124
+ char === '=' &&
125
+ parens > 0 &&
126
+ text[i - 1] === ' ' &&
127
+ text[i + 1] === ' '
128
+ ) {
123
129
  out = out.trimEnd()
124
130
  i = skipExpression(text, i + 1)
125
131
  continue
@@ -800,10 +800,11 @@ export function objcView(
800
800
  '-module-cache-path',
801
801
  moduleCache,
802
802
  '-minimum-access-level',
803
- // symbol graphs hide public underscored names at the public threshold.
804
- // original clang headers remain the declaration boundary, and a swift
805
- // overlay names its underscored and spi declarations.
806
- original || surface.interface ? 'internal' : 'public',
803
+ // symbol graphs hide public underscored names at the public threshold,
804
+ // including a function with an underscored parameter. clang headers
805
+ // remain the declaration boundary, and a swift overlay names its
806
+ // underscored and spi declarations.
807
+ 'internal',
807
808
  ...(surface.interface ? ['-include-spi-symbols'] : []),
808
809
  '-skip-synthesized-members',
809
810
  '-omit-extension-block-symbols',
@@ -928,6 +929,16 @@ export function objcView(
928
929
  // clang's builtin typedefs (stddef's size_t), which an apple sdk keeps in
929
930
  // their own builtin modules.
930
931
  const ownHeaders = new Set(headerFiles(headersDir).map((name) => path.basename(name)))
932
+ // the graph prints a c function pointer typedef as a plain function type,
933
+ // whose function-typed parameters swift treats as non-escaping; the importer
934
+ // gives every c function pointer @convention(c), which always escapes
935
+ const functionPointers = new Set(
936
+ [...originals.values()].flatMap((text) =>
937
+ [...text.matchAll(/\btypedef\b[^;{}]*?\(\s*\*\s*(\w+)\s*\)\s*\(/g)].map(
938
+ (match) => match[1]!,
939
+ ),
940
+ ),
941
+ )
931
942
  const graphs = fs
932
943
  .readdirSync(out)
933
944
  .filter((name) => name.endsWith('.symbols.json'))
@@ -936,10 +947,37 @@ export function objcView(
936
947
  const graph: SymbolGraph = JSON.parse(fs.readFileSync(path.join(out, name), 'utf8'))
937
948
  return {
938
949
  ...graph,
939
- symbols: graph.symbols.filter((symbol) => {
940
- const header = /^c:([^@]+\.h)@/.exec(symbol.identifier.precise)?.[1]
941
- return !header || ownHeaders.has(header)
942
- }),
950
+ symbols: graph.symbols
951
+ .filter((symbol) => {
952
+ const header = /^c:([^@]+\.h)@/.exec(symbol.identifier.precise)?.[1]
953
+ return !header || ownHeaders.has(header)
954
+ })
955
+ .map((symbol) => {
956
+ if (
957
+ symbol.kind.identifier !== 'swift.typealias' ||
958
+ !symbol.identifier.precise.startsWith('c:') ||
959
+ !functionPointers.has(symbol.pathComponents.at(-1) ?? '')
960
+ )
961
+ return symbol
962
+ const fragments = symbol.declarationFragments ?? []
963
+ const equals = fragments.findIndex((fragment) =>
964
+ fragment.spelling.includes('='),
965
+ )
966
+ const arrow = fragments.findLastIndex((fragment) =>
967
+ fragment.spelling.includes('->'),
968
+ )
969
+ return {
970
+ ...symbol,
971
+ declarationFragments: fragments.map((fragment, index) =>
972
+ index > equals &&
973
+ index < arrow &&
974
+ fragment.kind === 'typeIdentifier' &&
975
+ functionPointers.has(fragment.spelling)
976
+ ? { ...fragment, spelling: `@escaping ${fragment.spelling}` }
977
+ : fragment,
978
+ ),
979
+ }
980
+ }),
943
981
  }
944
982
  })
945
983
  inheritedDefaultInits(stagedSurface, graphs, toolchainBin, search, moduleCache, work)
@@ -687,6 +687,7 @@ export function resolveSwiftPackages(options: {
687
687
  dir: target.dir,
688
688
  files,
689
689
  exclude: target.exclude,
690
+ ...(target.sources ? { sources: target.sources } : {}),
690
691
  packageDir: pkg.manifest.dir,
691
692
  remote: pkg.remote,
692
693
  iosDeployment: pkg.manifest.iosDeployment,
@@ -34,22 +34,7 @@ export function sourceSwiftCheckout(): string {
34
34
 
35
35
  /** swiftpm's SDK directory option, shared by discovery and compilation. */
36
36
  export function swiftSdkOptions(): string[] {
37
- const directory = process.env.PEACH_SWIFT_SDKS_PATH
38
- if (directory) return ['--swift-sdks-path', path.resolve(directory)]
39
- // child config is confined, but source checkouts still discover the SDK
40
- // from the caller's original linux default, including a custom xdg home.
41
- if (scratch && process.platform === 'linux') {
42
- const config = process.env.XDG_CONFIG_HOME
43
- if (config !== undefined && !path.isAbsolute(config))
44
- throw new Error('XDG_CONFIG_HOME must be an absolute path')
45
- return [
46
- '--swift-sdks-path',
47
- config === undefined
48
- ? path.join(os.userInfo().homedir, '.swiftpm', 'swift-sdks')
49
- : path.join(config, 'swiftpm', 'swift-sdks'),
50
- ]
51
- }
52
- return []
37
+ return ['--swift-sdks-path', path.resolve(peachSwiftSdksDir())]
53
38
  }
54
39
 
55
40
  // host archives include the official driver/runtime and the qualified patched frontend.
@@ -395,9 +380,22 @@ export function ensureSwiftLinuxRuntime(release: string): void {
395
380
  process.stderr.write(`peach: installing Linux runtime libxml2.so.2 into ${root}…\n`)
396
381
  const download = `${plan.dest}.${process.pid}.tmp`
397
382
  try {
398
- execFileSync('curl', ['-fsSL', '--show-error', plan.url, '-o', download], {
399
- stdio: 'inherit',
400
- })
383
+ execFileSync(
384
+ 'curl',
385
+ [
386
+ '-fsSL',
387
+ '--show-error',
388
+ '--retry',
389
+ '3',
390
+ '--retry-all-errors',
391
+ plan.url,
392
+ '-o',
393
+ download,
394
+ ],
395
+ {
396
+ stdio: 'inherit',
397
+ },
398
+ )
401
399
  if (swiftFileChecksum(download) !== plan.checksum)
402
400
  throw new Error('declared Linux runtime checksum mismatch')
403
401
  fs.renameSync(download, plan.dest)
@@ -573,6 +571,11 @@ export function peachHome(): string {
573
571
  return override ? path.resolve(override) : path.join(os.homedir(), '.peach')
574
572
  }
575
573
 
574
+ /** where the pinned wasm SDK installs unless PEACH_SWIFT_SDKS_PATH names another. */
575
+ export function peachSwiftSdksDir(): string {
576
+ return process.env.PEACH_SWIFT_SDKS_PATH ?? path.join(peachHome(), 'swift', 'sdks')
577
+ }
578
+
576
579
  export const BUILDERS_ROOT_ENV = 'CONTRAST_BUILDERS_ROOT'
577
580
 
578
581
  let agentBuildersRoot: string | undefined
@@ -935,10 +938,7 @@ function installSwiftSdkArchive(swift: string, sdk: SwiftWasmSdk, archive: strin
935
938
  store,
936
939
  ])
937
940
  const expected = swiftSdkPayloadChecksum(stagedBundle)
938
- const directory = process.env.PEACH_SWIFT_SDKS_PATH
939
- const locks = directory
940
- ? path.join(path.resolve(directory), '.peach-locks')
941
- : path.join(os.homedir(), '.swiftpm', 'builder-locks')
941
+ const locks = path.join(path.resolve(peachSwiftSdksDir()), '.peach-locks')
942
942
  fs.mkdirSync(locks, { recursive: true })
943
943
  execFileSync(
944
944
  'perl',
@@ -1004,9 +1004,22 @@ export function installSwiftWasmSdk(release: string, sdk: SwiftWasmSdk): void {
1004
1004
  if (sdk.wasmSdkUrl.startsWith('file:'))
1005
1005
  fs.copyFileSync(fileURLToPath(sdk.wasmSdkUrl), archive)
1006
1006
  else
1007
- execFileSync('curl', ['-fsSL', '--show-error', sdk.wasmSdkUrl, '-o', archive], {
1008
- stdio: 'inherit',
1009
- })
1007
+ execFileSync(
1008
+ 'curl',
1009
+ [
1010
+ '-fsSL',
1011
+ '--show-error',
1012
+ '--retry',
1013
+ '3',
1014
+ '--retry-all-errors',
1015
+ sdk.wasmSdkUrl,
1016
+ '-o',
1017
+ archive,
1018
+ ],
1019
+ {
1020
+ stdio: 'inherit',
1021
+ },
1022
+ )
1010
1023
  installSwiftSdkArchive(swift, sdk, archive)
1011
1024
  swiftToolchain(release, sdk)
1012
1025
  } finally {
@@ -1166,10 +1179,7 @@ export function swiftSdkInstallStep(release: string, wasmSdk: SwiftWasmSdk): str
1166
1179
  function swiftSdkInstallCommand(release: string, wasmSdk: SwiftWasmSdk): string {
1167
1180
  const { wasmSdkId, wasmSdkUrl, wasmSdkChecksum } = wasmSdk
1168
1181
  const program = `import { installSwiftWasmSdk } from "peachsim/swift-toolchain"; installSwiftWasmSdk(${JSON.stringify(release)}, ${JSON.stringify({ wasmSdkId, wasmSdkUrl, wasmSdkChecksum })})`
1169
- const directory = process.env.PEACH_SWIFT_SDKS_PATH
1170
- const environment = directory
1171
- ? `PEACH_SWIFT_SDKS_PATH='${path.resolve(directory).replaceAll("'", "'\\''")}' `
1172
- : ''
1182
+ const environment = `PEACH_SWIFT_SDKS_PATH='${path.resolve(peachSwiftSdksDir()).replaceAll("'", "'\\''")}' `
1173
1183
  return `${environment}node --input-type=module -e '${program.replaceAll("'", "'\\''")}'`
1174
1184
  }
1175
1185
 
@@ -1121,10 +1121,11 @@ export function pruneSwiftWasmLink(
1121
1121
  const distDir = path.join(moduleRoot, 'lib')
1122
1122
  // the app's own struct and class field descriptors stay: SwiftUI attaches
1123
1123
  // @State and @StateObject by reflecting the app's view structs.
1124
- // the shim reflects its own wrappers and views (State, ObservedObject, Published), so SwiftUI and Combine keep their descriptors
1124
+ // the shim reflects its own wrappers and views (State, ObservedObject, Published), so SwiftUI and Combine keep their descriptors.
1125
+ // a framework's SwiftUI overlay (_StoreKit_SwiftUI) declares views whose @State and @Environment attach the same way.
1125
1126
  const dropsReflection = (obj: ParsedObject, name: string | undefined) =>
1126
1127
  !!name &&
1127
- !/^(SwiftUI|Combine)-/.test(path.basename(obj.file)) &&
1128
+ !/^(SwiftUI|Combine|_[A-Za-z0-9]+_SwiftUI)-/.test(path.basename(obj.file)) &&
1128
1129
  (name.startsWith('l__swift5_reflection_descriptor') ||
1129
1130
  (name.startsWith('$s') &&
1130
1131
  (name.endsWith('CMF') || name.endsWith('VMF')) &&
@@ -8,11 +8,11 @@
8
8
  },
9
9
  "compiler": "swift-6.4.0-RELEASE-custom-11345d60dca47496",
10
10
  "sdk": {
11
- "id": "swift-6.4.0-RELEASE_wasm-peach-3452e5a2",
12
- "checksum": "fe042506d9418d5b73a3a30d62157931439c23e3bcb869871a0fcb8747223a02"
11
+ "id": "swift-6.4.0-RELEASE_wasm-peach-19471d4b",
12
+ "checksum": "764c16e7e34156bf90d6c3372a2b77b98b9d8c3470235520d0f9619f90f33456"
13
13
  },
14
14
  "framework": {
15
- "distribution": "2405235872029d30",
15
+ "distribution": "87fc4d2ff9d5d588",
16
16
  "wireAbi": "246b8412514b644113e6a26252c8ebd6de49ab4156ac5f5c98bb9e4c2ff2568b"
17
17
  },
18
18
  "archives": [
@@ -20,71 +20,71 @@
20
20
  "headers": {
21
21
  "reactNativeJsi": "0f8c2defbca69a27a848a81ae72363073bf9602fd316e57a75811be1a0528358"
22
22
  },
23
- "sha256": "038855e8522f39ea85557bcafc84eb64ec5d9b155c686dca3cff6fa397de0165",
24
- "size": 25395
23
+ "sha256": "6f416d065d88a6f592f0c34dca2d898f2c1adadeeacc07c2f8f4de453715f298",
24
+ "size": 25393
25
25
  },
26
26
  {
27
27
  "headers": {
28
28
  "reactNativeJsi": "21a624ea24fd17d56bf26832d496fc1177067f89640414c20e6486c7984dfb0a"
29
29
  },
30
- "sha256": "b815028eb321b50907658ba883329d13204d29368cc598dab5c39b2a249de88f",
30
+ "sha256": "0c68d14139a733fa990e55fa23224589fe9a74ce82db0ce5b9b52da51211390e",
31
31
  "size": 26139
32
32
  },
33
33
  {
34
34
  "headers": {
35
35
  "reactNativeJsi": "324aefd8591d9ce688bce7589c4c2b516cd33ecb95d35c47239a87a8fcf6a8da"
36
36
  },
37
- "sha256": "f8fd89f680b86d8abb42a644db8866eb33ff82b4370a7c373bc054efdec33095",
38
- "size": 25395
37
+ "sha256": "adba5b074a4fc2d6c367de74f24aa4b6273363f8b39c9ad9d15be2775f08a2e1",
38
+ "size": 25394
39
39
  },
40
40
  {
41
41
  "headers": {
42
42
  "reactNativeJsi": "33596664ee7d7a6623f0796a6feb429543316c3a41b211150acda6e1d835286c"
43
43
  },
44
- "sha256": "9190e3a9f312d8c156aacf727904cf1b9c543b30833f544164daa32e3c005d84",
45
- "size": 25168
44
+ "sha256": "778f943ad7fcfba7060e2f29d2bf9d3d7365c60d09b8e2fcccfe11f95920b321",
45
+ "size": 25165
46
46
  },
47
47
  {
48
48
  "headers": {
49
49
  "reactNativeJsi": "66b2cd5a38511195207f6c8a76aba735f9b9cc66a52a0d00780ffe5d331623f7"
50
50
  },
51
- "sha256": "89bc0c5214c848b06e50424dcecf1cb0d3b01b058270d606a86c2e799d529c15",
52
- "size": 25401
51
+ "sha256": "06cdf08b6f177a54dbf734f76f23ff192c4eb50238fae5207e923fa8e0cfb4bd",
52
+ "size": 25398
53
53
  },
54
54
  {
55
55
  "headers": {
56
56
  "reactNativeJsi": "96db4e758dd53e9320cef7cad485e00aa06e7a982cefd920f17007de8a5bd9f9"
57
57
  },
58
- "sha256": "8c0d4fa4b65b44dc649c7401df0832663c837098bb5794b143751073c800e66b",
59
- "size": 26139
58
+ "sha256": "62920d91d1805ae0df3ad0f672f6405575c04df4e66948ea37b4e165f39f8eb5",
59
+ "size": 26141
60
60
  },
61
61
  {
62
62
  "headers": {
63
63
  "reactNativeJsi": "aeab590ddd1218df963462242d3954ce467b0fa88f70e91429e4ffc74d230893"
64
64
  },
65
- "sha256": "ea3395926d0c9202404ca292fed40561c04537cbc11bb8b49ac8a7d9f983fa60",
65
+ "sha256": "fab02f584e10cee2197c10b5c488873d5203313e10f07b2940283bee3ae12a57",
66
66
  "size": 26138
67
67
  },
68
68
  {
69
69
  "headers": {
70
70
  "reactNativeJsi": "b5fb260522384dd7ab07d740cdc534b529922446fcec798341c7817d9eaa49f4"
71
71
  },
72
- "sha256": "7a17d6b3e143a8cf38d73b18b21e142b40fc2c0076d7a01dfb1837194c977f43",
73
- "size": 25268
72
+ "sha256": "72bbd117ff2d4495f46fceecd0959e8bd2a0647fdf514bf2e2e95922514bcb66",
73
+ "size": 25267
74
74
  },
75
75
  {
76
76
  "headers": {
77
77
  "reactNativeJsi": "c6b391a1e870ccf7cdd534be63582862840f8245b99ebd253317deece1e6ffd5"
78
78
  },
79
- "sha256": "96f6b7bb8bd33d20ee9b6249c0f747e2d160d80515efbf74f9a263f57d847667",
80
- "size": 26142
79
+ "sha256": "10e28d5ce3eb41c695bef897fa974f8919559558a2b847963047f13ce06dc6a0",
80
+ "size": 26144
81
81
  },
82
82
  {
83
83
  "headers": {
84
84
  "reactNativeJsi": "c8270f1315745ecc204c4209a4f50f58ff6f14b4a385ad6820a69800270b53c6"
85
85
  },
86
- "sha256": "bf587717d6b32d1e7abc630e952f0c70ea964488f87e83c20028b86781317b6f",
87
- "size": 25104
86
+ "sha256": "52226df9610d8b5f9b47fee6bedbdbaa04df7f2f562213bd8b433a5f998d8aa3",
87
+ "size": 25105
88
88
  }
89
89
  ]
90
90
  }
@@ -1509,7 +1509,9 @@ function projectTargets(project: LoadedProject): TargetRef[] {
1509
1509
  }
1510
1510
 
1511
1511
  // an application target peach builds, for the iOS simulator like every
1512
- // target here. one whose SDKROOT names another platform, such as a watchOS
1512
+ // target here. xcode builds a multiplatform target for an iOS destination
1513
+ // whenever its SUPPORTED_PLATFORMS lists one, whatever SDKROOT names; without
1514
+ // that list, a target whose SDKROOT names another platform, such as a watchOS
1513
1515
  // app beside the iOS one, is never the app peach runs.
1514
1516
  function isIosAppTarget(
1515
1517
  ref: TargetRef,
@@ -1524,10 +1526,10 @@ function isIosAppTarget(
1524
1526
  },
1525
1527
  options,
1526
1528
  )
1529
+ const platforms = settingList(get('SUPPORTED_PLATFORMS'))
1530
+ if (platforms.length > 0) return platforms.some(isIosPlatform)
1527
1531
  const sdk = get('SDKROOT')
1528
- return sdk === 'auto'
1529
- ? settingList(get('SUPPORTED_PLATFORMS')).some(isIosPlatform)
1530
- : sdk === '' || isIosPlatform(sdk)
1532
+ return sdk === '' || isIosPlatform(sdk)
1531
1533
  }
1532
1534
 
1533
1535
  // the device or simulator sdk, bare or versioned such as iphonesimulator18.0.