peachsim 0.1.2221 → 0.1.2223

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 (127) hide show
  1. package/cli/commands/compat.ts +4 -4
  2. package/cli/commands/report-issue.ts +1 -1
  3. package/cli/runtime-compat.ts +7 -2
  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 +461 -369
  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 +3 -2
  28. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  29. package/dist-lib/expo-swift-bundle.cjs +458 -367
  30. package/dist-lib/expo-swift-metadata.cjs +1 -1
  31. package/dist-lib/expo-swift-metadata.mjs +1 -1
  32. package/dist-lib/home-paths.cjs +1 -1
  33. package/dist-lib/host/bridge-host.cjs +681 -562
  34. package/dist-lib/host/fetch-proxy-handler.cjs +10 -7
  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 +8232 -7815
  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 +1 -1
  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 +8146 -7737
  50. package/dist-lib/native-app-identity-project.cjs +331 -13
  51. package/dist-lib/native-app-identity-project.mjs +331 -13
  52. package/dist-lib/native-app-identity.cjs +16 -3
  53. package/dist-lib/native-app-identity.mjs +16 -3
  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 +99 -96
  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 +518 -408
  71. package/dist-lib/swift-compile.cjs +69 -36
  72. package/dist-lib/swift-compile.mjs +69 -36
  73. package/dist-lib/swift-package.cjs +1 -1
  74. package/dist-lib/swift-package.mjs +1 -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 +143 -56
  80. package/dist-lib/vite.cjs +2930 -2800
  81. package/dist-lib/worklet-executable.cjs +1 -1
  82. package/dist-lib/worklet-executable.mjs +1 -1
  83. package/dist-types/packages/peach-compat/src/stubs/native-seams/react-native-cookies.d.ts +2 -1
  84. package/dist-types/packages/peach-engine/src/cli-companion.d.ts +1 -0
  85. package/dist-types/packages/peach-engine/src/cli-host-terser.d.ts +7 -0
  86. package/dist-types/packages/peach-engine/src/engine/glass-material.d.ts +1 -1
  87. package/dist-types/packages/peach-engine/src/engine/liquid-glass.d.ts +1 -0
  88. package/dist-types/packages/peach-engine/src/engine/native-layout.d.ts +1 -0
  89. package/dist-types/packages/peach-engine/src/engine/node.d.ts +5 -0
  90. package/dist-types/packages/peach-engine/src/engine/scene-table.d.ts +8 -1
  91. package/dist-types/packages/peach-engine/src/engine/types.d.ts +3 -0
  92. package/dist-types/packages/peach-engine/src/engine/yoga-layout.d.ts +1 -1
  93. package/dist-types/packages/peach-engine/src/remote-stream/cloud-display.d.ts +2 -2
  94. package/dist-types/packages/peach-engine/src/render-worker/shell-tree-wire.d.ts +1 -2
  95. package/dist-types/packages/peach-globals/src/browser-object-url.d.ts +10 -0
  96. package/dist-types/packages/peach-kit/src/internal.d.ts +1 -0
  97. package/dist-types/packages/peach-kit/src/ios-tint.d.ts +1 -0
  98. package/dist-types/packages/peach-kit/src/transitions/screen-transition-math.d.ts +25 -0
  99. package/kotlin/sdk.tar.gz +0 -0
  100. package/package.json +1 -1
  101. package/runtime-companion.json +1 -1
  102. package/sdk/ios/System/Library/Frameworks/SceneKit.framework/Headers/SCNAnimation.h +4 -4
  103. package/sdk/ios/System/Library/Frameworks/SceneKit.framework/Headers/SCNCameraController.h +1 -1
  104. package/sdk/ios/System/Library/Frameworks/SceneKit.framework/Headers/SCNConstraint.h +5 -5
  105. package/sdk/ios/System/Library/Frameworks/SceneKit.framework/Headers/SCNGeometry.h +1 -1
  106. package/sdk/ios/System/Library/Frameworks/SceneKit.framework/Headers/SCNLevelOfDetail.h +1 -1
  107. package/sdk/ios/System/Library/Frameworks/SceneKit.framework/Headers/SCNParametricGeometry.h +9 -9
  108. package/sdk/ios/System/Library/Frameworks/SceneKit.framework/Headers/SCNParticleSystem.h +1 -1
  109. package/sdk/ios/System/Library/Frameworks/SceneKit.framework/Headers/SCNPhysicsBehavior.h +7 -7
  110. package/sdk/ios/System/Library/Frameworks/SceneKit.framework/Headers/SCNRenderer.h +1 -1
  111. package/sdk/ios/System/Library/Frameworks/SceneKit.framework/Headers/SCNShadable.h +1 -1
  112. package/sdk/ios/System/Library/Frameworks/SceneKit.framework/Headers/SCNTechnique.h +1 -1
  113. package/sdk/ios/System/Library/Frameworks/UIKit.framework/Headers/UISegmentedControl.h +1 -1
  114. package/sdk/ios/System/Library/Frameworks/UIKit.framework/Headers/UITabBar.h +1 -1
  115. package/src/cli-runtime.ts +1 -0
  116. package/src/conformance-pixel-comparison.ts +16 -3
  117. package/src/expo-native-workspace.ts +14 -10
  118. package/src/expo-workspace-exclusion.ts +10 -7
  119. package/src/react-native-autolinking.ts +2 -1
  120. package/src/runtime-delivery.ts +7 -0
  121. package/src/swift-compile.ts +51 -35
  122. package/src/swift-coverage/xcode-assets.ts +4 -2
  123. package/src/swift-host.ts +53 -14
  124. package/src/swift-root-lock.ts +27 -4
  125. package/src/wasm-optimize.ts +5 -1
  126. package/src/xcode-project.ts +26 -5
  127. package/src/xcode-target-members.ts +25 -3
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.2221 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2223 | (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;
@@ -10254,7 +10254,8 @@ var FEATURES = [
10254
10254
  "reference-types",
10255
10255
  "sign-ext"
10256
10256
  ];
10257
- var WASM_OPTIMIZE_IDENTITY = `wasm-opt ${import_wasm_opt.BINARYEN_VERSION} -Oz ${FEATURES.join(",")}`;
10257
+ var KEEP_WASM_NAMES = process.env.PEACH_SWIFT_NAMES === "1";
10258
+ var WASM_OPTIMIZE_IDENTITY = `wasm-opt ${import_wasm_opt.BINARYEN_VERSION} -Oz ${FEATURES.join(",")}${KEEP_WASM_NAMES ? " -g" : ""}`;
10258
10259
  var PINNED_BINARYEN_VERSION = "132";
10259
10260
  var BINARYEN_RELEASES = /* @__PURE__ */ new Map([
10260
10261
  [
@@ -10290,6 +10291,7 @@ async function runWasmOpt(file, output, skipPasses, binary) {
10290
10291
  const result = await (0, import_wasm_opt.wasmOpt)(
10291
10292
  [
10292
10293
  "-Oz",
10294
+ ...KEEP_WASM_NAMES ? ["-g"] : [],
10293
10295
  ...skipPasses.flatMap((pass) => ["--skip-pass", pass]),
10294
10296
  ...FEATURES.map((feature) => `--enable-${feature}`),
10295
10297
  file,
@@ -11164,6 +11166,7 @@ var import_node_fs22 = require("node:fs");
11164
11166
  var import_node_os10 = require("node:os");
11165
11167
  var import_node_path23 = __toESM(require("node:path"), 1);
11166
11168
  var POLL_MS = 250;
11169
+ var INSPECT_ATTEMPTS = 5;
11167
11170
  var START_TOLERANCE_MS = 2e3;
11168
11171
  function errorCode(error) {
11169
11172
  return error instanceof Error && "code" in error && typeof error.code === "string" ? error.code : void 0;
@@ -11177,6 +11180,17 @@ function processTable(pid) {
11177
11180
  );
11178
11181
  }
11179
11182
  }
11183
+ async function processTableWithRetry(pid, signal) {
11184
+ for (let attempt = 1; ; attempt++) {
11185
+ try {
11186
+ return processTable(pid);
11187
+ } catch (error) {
11188
+ if (attempt >= INSPECT_ATTEMPTS) throw error;
11189
+ await pause(POLL_MS * attempt, signal);
11190
+ signal?.throwIfAborted();
11191
+ }
11192
+ }
11193
+ }
11180
11194
  function sameProcess(row, identity) {
11181
11195
  return row.pid === identity.pid && Math.abs(row.start - identity.start) <= START_TOLERANCE_MS;
11182
11196
  }
@@ -11246,7 +11260,11 @@ async function withSwiftRootLock(root, work, signal, wait = true) {
11246
11260
  );
11247
11261
  (0, import_node_fs22.mkdirSync)(directory, { recursive: true });
11248
11262
  const token = (0, import_node_crypto12.randomUUID)();
11249
- const owner = JSON.stringify(ownIdentity(process.pid));
11263
+ const ownRow = (await processTableWithRetry(process.pid, signal)).find(
11264
+ (candidate) => candidate.pid === process.pid && !candidate.zombie
11265
+ );
11266
+ if (!ownRow) throw new Error(`swift root lock cannot find process ${process.pid}`);
11267
+ const owner = JSON.stringify({ pid: process.pid, start: ownRow.start });
11250
11268
  const pending = import_node_path23.default.join(directory, `pending.${token}`);
11251
11269
  let held = 0;
11252
11270
  for (; ; ) {
@@ -11255,15 +11273,15 @@ async function withSwiftRootLock(root, work, signal, wait = true) {
11255
11273
  const current = newest > 0 ? readGeneration(directory, newest) : null;
11256
11274
  if (newest > 0 && !current) continue;
11257
11275
  if (current && !current.released) {
11258
- const owner2 = processTable(current.holder.pid);
11259
- if (owner2.some((row) => !row.zombie && sameProcess(row, current.holder))) {
11276
+ const holder = await processTableWithRetry(current.holder.pid, signal);
11277
+ if (holder.some((row) => !row.zombie && sameProcess(row, current.holder))) {
11260
11278
  if (!wait) return void 0;
11261
11279
  await pause(POLL_MS, signal);
11262
11280
  continue;
11263
11281
  }
11264
11282
  const children2 = readChildren(directory, newest);
11265
11283
  if (children2.length) {
11266
- const table = processTable();
11284
+ const table = await processTableWithRetry(void 0, signal);
11267
11285
  if (children2.some((child) => groupAlive(table, child))) {
11268
11286
  if (!wait) return void 0;
11269
11287
  await pause(POLL_MS, signal);
@@ -12068,7 +12086,8 @@ var OPTIONAL_FRAMEWORK_DEPENDENCIES = {
12068
12086
  PeachCFNetwork: [],
12069
12087
  JavaScriptCore: ["PeachJavaScriptCore"],
12070
12088
  PeachJavaScriptCore: [],
12071
- GameplayKit: [],
12089
+ // GameplayKit names SpriteKit and SceneKit nodes, as on iOS
12090
+ GameplayKit: ["SpriteKit", "SceneKit", "PeachBox2D", "simd", "GLKit"],
12072
12091
  simd: [],
12073
12092
  ModelIO: ["simd"],
12074
12093
  GLKit: ["ModelIO"],
@@ -12579,10 +12598,21 @@ function swiftTargetDependencies(files, targets, frameworks = OPTIONAL_FRAMEWORK
12579
12598
  return siblings;
12580
12599
  }
12581
12600
  var ONE_PRODUCT = '.product(name: "One", package: "sootsim-swift")';
12582
- var SPRITEKIT_PRODUCT = '.product(name: "SpriteKit", package: "sootsim-swift")';
12583
- var importsSpriteKit = (files) => Object.entries(files).some(
12584
- ([file, contents]) => file.endsWith(".swift") && swiftImportNames(contents).includes("SpriteKit")
12585
- );
12601
+ var GAME_FAMILY = ["SpriteKit", "SceneKit"];
12602
+ var gameProducts = (files) => {
12603
+ const imported = new Set(
12604
+ Object.entries(files).flatMap(
12605
+ ([file, contents]) => file.endsWith(".swift") ? swiftImportNames(contents) : []
12606
+ )
12607
+ );
12608
+ if (imported.has("SceneKit")) return [...GAME_FAMILY];
12609
+ return imported.has("SpriteKit") ? ["SpriteKit"] : [];
12610
+ };
12611
+ var gameProduct = (name2) => `.product(name: "${name2}", package: "sootsim-swift")`;
12612
+ var GAME_REACH = {
12613
+ SpriteKit: ["SpriteKit", "PeachBox2D", "simd", "GLKit"],
12614
+ SceneKit: ["SceneKit"]
12615
+ };
12586
12616
  var FOUNDATION_IMPLICIT_MODULES = [
12587
12617
  "PeachObjC",
12588
12618
  "Dispatch",
@@ -12609,7 +12639,7 @@ var darwinRecordsRegion = (quoted) => quoted.length ? ["-Wl,--start-lib", ...quo
12609
12639
  var REACTOR_FLAG = '"-Xclang-linker", "-mexec-model=reactor",\n';
12610
12640
  var MULTI_MANIFEST_VERSION = 68;
12611
12641
  var SWIFT_HEADER_PRODUCTS_TARGET = "PeachHeaderProducts";
12612
- var compilerSourceDigest = true ? "2e9f321a97a408a1b3b8b7d85bbcfb108f0761ed9726b832a3c6c2cc52102806" : swiftCompilerSourceDigest(__sootsim_import_meta_dirname);
12642
+ var compilerSourceDigest = true ? "ae9e08389e6ab1901846342a7b347d7c10f8074172cf5d4d6505f7e955879ad4" : swiftCompilerSourceDigest(__sootsim_import_meta_dirname);
12613
12643
  function swiftArtifactHash(input, release, moduleRoot) {
12614
12644
  const hash = (0, import_node_crypto13.createHash)("sha256");
12615
12645
  hash.update(`swift-compile
@@ -12617,6 +12647,7 @@ ${release}
12617
12647
  `);
12618
12648
  hash.update(compilerSourceDigest);
12619
12649
  if (input.oneModule) hash.update("one-module\n");
12650
+ if (KEEP_WASM_NAMES) hash.update("names\n");
12620
12651
  hash.update(swiftModuleDigest(moduleRoot));
12621
12652
  if (input.optimize) hash.update(`optimize
12622
12653
  ${WASM_OPTIMIZE_IDENTITY}
@@ -12731,7 +12762,14 @@ function toolsetOrdersLibcxxBeforeDarwinOverlay(options) {
12731
12762
  return libcxx >= 0 && overlay > libcxx;
12732
12763
  }
12733
12764
  function emitSwiftPackageManifest(args) {
12734
- const { targets, siblings, moduleRoot, oneModule, spriteKit, distribution } = args;
12765
+ const {
12766
+ targets,
12767
+ siblings,
12768
+ moduleRoot,
12769
+ oneModule,
12770
+ gameProducts: gameProducts2 = [],
12771
+ distribution
12772
+ } = args;
12735
12773
  const prebuilt = args.prebuilt;
12736
12774
  const linkedObjects = Boolean(distribution || prebuilt);
12737
12775
  const cxxFlagsFor = (flags) => args.deferDarwinOverlay ? withoutWasmOverlayIsystem(flags) : flags;
@@ -12760,9 +12798,8 @@ function emitSwiftPackageManifest(args) {
12760
12798
  for (const name2 of [...siblings.values()].flat())
12761
12799
  if (OPTIONAL_FRAMEWORKS.has(name2) && !targets.some((target) => target.name === name2))
12762
12800
  reach(name2);
12763
- if (spriteKit) {
12764
- for (const name2 of ["SpriteKit", "PeachBox2D", "simd", "GLKit"]) reach(name2);
12765
- }
12801
+ for (const product of gameProducts2)
12802
+ for (const name2 of GAME_REACH[product] ?? []) reach(name2);
12766
12803
  let distributionLinkPath;
12767
12804
  const distributionLink = args.distributionLink;
12768
12805
  if (distribution && distributionLink) {
@@ -12785,7 +12822,7 @@ function emitSwiftPackageManifest(args) {
12785
12822
  (object3) => !isProvider(object3) && !replacedObjects.has(object3)
12786
12823
  );
12787
12824
  const objects = available.filter(
12788
- (object3) => !targets.some((target) => object3.startsWith(`lib/${target.name}-`)) && [...OPTIONAL_FRAMEWORKS, "SpriteKit", "PeachBox2D"].every(
12825
+ (object3) => !targets.some((target) => object3.startsWith(`lib/${target.name}-`)) && [...OPTIONAL_FRAMEWORKS, ...GAME_FAMILY, "PeachBox2D"].every(
12789
12826
  (name2) => !object3.startsWith(`lib/${name2}-`) || reachedFrameworks.has(name2)
12790
12827
  )
12791
12828
  );
@@ -12948,7 +12985,7 @@ function emitSwiftPackageManifest(args) {
12948
12985
  ...linkedObjects || clang && !target.executable ? [] : [
12949
12986
  '.product(name: "SwiftUI", package: "sootsim-swift")',
12950
12987
  ...oneModule ? [ONE_PRODUCT] : [],
12951
- ...spriteKit ? [SPRITEKIT_PRODUCT] : []
12988
+ ...gameProducts2.map(gameProduct)
12952
12989
  ],
12953
12990
  ...(siblings.get(target.name) ?? []).flatMap(
12954
12991
  (dependency) => clang && // textual native headers can include one another without imposing
@@ -12980,7 +13017,7 @@ function emitSwiftPackageManifest(args) {
12980
13017
  .unsafeFlags(${flagArray(`[
12981
13018
  ${REACTOR_FLAG}${executableLinkFlags(args.root)} "-Xlinker", "--export-if-defined=__main_argc_argv"${library},
12982
13019
  ]`)}),
12983
- .unsafeFlags(["-Xlinker", "--strip-all"], .when(configuration: .release)),
13020
+ ${KEEP_WASM_NAMES ? "" : '.unsafeFlags(["-Xlinker", "--strip-all"], .when(configuration: .release)),'}
12984
13021
  ]` : librarySettings.length > 0 ? `,
12985
13022
  linkerSettings: [${librarySettings.join(", ")}]` : "";
12986
13023
  const cDefines = macroSettings(target.cDefines);
@@ -13585,8 +13622,6 @@ var FOUNDATION_OVERLAY_GLOBALS = /* @__PURE__ */ new Set([
13585
13622
  "NSURLProtectionSpaceHTTPS",
13586
13623
  "NSURLProtectionSpaceHTTPSProxy",
13587
13624
  "NSURLProtectionSpaceSOCKSProxy",
13588
- "NSURLSessionDownloadTaskResumeData",
13589
- "NSURLSessionTransferSizeUnknown",
13590
13625
  "NSURLSessionUploadTaskResumeData",
13591
13626
  "NSUTF16BigEndianStringEncoding",
13592
13627
  "NSUTF16LittleEndianStringEncoding",
@@ -15315,8 +15350,8 @@ ${swiftProjectFilesProblems(input.projectFiles).join("\n")}`
15315
15350
  const moduleName = swiftTargetModuleName(name2);
15316
15351
  const originalMap = originalMaps.get(moduleName);
15317
15352
  const stagedMap = sourceModuleMaps.get(moduleName);
15318
- const originalPath = originalMap ? import_node_path27.default.join(layout2.root, originalMap) : stagedMap?.path;
15319
- const originalContents = originalMap ? input.files[originalMap] : stagedMap?.contents;
15353
+ const originalPath = stagedMap?.path ?? (originalMap ? import_node_path27.default.join(layout2.root, originalMap) : void 0);
15354
+ const originalContents = stagedMap?.contents ?? (originalMap && input.files[originalMap]);
15320
15355
  const originalTokens = originalContents ? moduleMapTokens(originalContents) : [];
15321
15356
  if (originalPath && originalTokens.some(
15322
15357
  (token, index) => token === "module" && (originalTokens[index + 1] === "Swift" || originalTokens[index + 1] === `${moduleName}.Swift`)
@@ -15591,14 +15626,17 @@ module ${moduleName}.Swift {
15591
15626
  manifest = manifest.replace(product, `${product}
15592
15627
  ${ONE_PRODUCT},`).replace(flags, `${flags}${ONE_IMPLICIT_FLAGS}`);
15593
15628
  }
15594
- if (importsSpriteKit(input.files)) {
15629
+ const games = gameProducts(input.files);
15630
+ if (games.length > 0) {
15595
15631
  const anchor = '.product(name: "CoreLocation", package: "sootsim-swift"),';
15596
15632
  if (!manifest.includes(anchor))
15597
15633
  throw new Error(
15598
- "scripts/contrast-app-Package.swift lost the line the SpriteKit product links at"
15634
+ "scripts/contrast-app-Package.swift lost the line the game products link at"
15599
15635
  );
15600
- manifest = manifest.replace(anchor, `${anchor}
15601
- ${SPRITEKIT_PRODUCT},`);
15636
+ manifest = manifest.replace(
15637
+ anchor,
15638
+ [anchor, ...games.map((name2) => `${gameProduct(name2)},`)].join("\n ")
15639
+ );
15602
15640
  }
15603
15641
  files.set(import_node_path27.default.join(layout2.root, "Package.swift"), manifest + moduleFiles);
15604
15642
  } else {
@@ -15713,7 +15751,7 @@ module ${moduleName}.Swift {
15713
15751
  siblings: moduleSiblings,
15714
15752
  moduleRoot,
15715
15753
  oneModule: input.oneModule,
15716
- spriteKit: importsSpriteKit(input.files),
15754
+ gameProducts: gameProducts(input.files),
15717
15755
  distribution: distribution ?? void 0,
15718
15756
  moduleExcludes,
15719
15757
  deferDarwinOverlay: native.size > 0 && toolsetOrdersLibcxxBeforeDarwinOverlay(
@@ -16120,14 +16158,9 @@ function linkedFrameworkTargets(moduleRoot, input) {
16120
16158
  ))
16121
16159
  reach(match[1]);
16122
16160
  }
16123
- if (importsSpriteKit(input.files))
16124
- for (const name2 of ["SpriteKit", "PeachBox2D", "simd", "GLKit"]) reach(name2);
16125
- const wanted = [
16126
- "PeachApp",
16127
- ...input.oneModule ? ["One"] : [],
16128
- ...importsSpriteKit(input.files) ? ["SpriteKit"] : [],
16129
- ...reached
16130
- ];
16161
+ const games = gameProducts(input.files);
16162
+ for (const product of games) for (const name2 of GAME_REACH[product] ?? []) reach(name2);
16163
+ const wanted = ["PeachApp", ...input.oneModule ? ["One"] : [], ...games, ...reached];
16131
16164
  const linked = [...new Set(wanted)].filter((name2) => libraries.has(name2));
16132
16165
  if (!linked.includes("PeachApp"))
16133
16166
  throw new Error("swift-compile: the framework package declares no PeachApp library");
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.2221 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2223 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
 
3
3
  // src/swift-compile.ts
4
4
  import {
@@ -10209,7 +10209,8 @@ var FEATURES = [
10209
10209
  "reference-types",
10210
10210
  "sign-ext"
10211
10211
  ];
10212
- var WASM_OPTIMIZE_IDENTITY = `wasm-opt ${BINARYEN_VERSION} -Oz ${FEATURES.join(",")}`;
10212
+ var KEEP_WASM_NAMES = process.env.PEACH_SWIFT_NAMES === "1";
10213
+ var WASM_OPTIMIZE_IDENTITY = `wasm-opt ${BINARYEN_VERSION} -Oz ${FEATURES.join(",")}${KEEP_WASM_NAMES ? " -g" : ""}`;
10213
10214
  var PINNED_BINARYEN_VERSION = "132";
10214
10215
  var BINARYEN_RELEASES = /* @__PURE__ */ new Map([
10215
10216
  [
@@ -10245,6 +10246,7 @@ async function runWasmOpt(file, output, skipPasses, binary) {
10245
10246
  const result = await wasmOpt(
10246
10247
  [
10247
10248
  "-Oz",
10249
+ ...KEEP_WASM_NAMES ? ["-g"] : [],
10248
10250
  ...skipPasses.flatMap((pass) => ["--skip-pass", pass]),
10249
10251
  ...FEATURES.map((feature) => `--enable-${feature}`),
10250
10252
  file,
@@ -11143,6 +11145,7 @@ import {
11143
11145
  import { homedir as homedir2 } from "node:os";
11144
11146
  import path23 from "node:path";
11145
11147
  var POLL_MS = 250;
11148
+ var INSPECT_ATTEMPTS = 5;
11146
11149
  var START_TOLERANCE_MS = 2e3;
11147
11150
  function errorCode(error) {
11148
11151
  return error instanceof Error && "code" in error && typeof error.code === "string" ? error.code : void 0;
@@ -11156,6 +11159,17 @@ function processTable(pid) {
11156
11159
  );
11157
11160
  }
11158
11161
  }
11162
+ async function processTableWithRetry(pid, signal) {
11163
+ for (let attempt = 1; ; attempt++) {
11164
+ try {
11165
+ return processTable(pid);
11166
+ } catch (error) {
11167
+ if (attempt >= INSPECT_ATTEMPTS) throw error;
11168
+ await pause(POLL_MS * attempt, signal);
11169
+ signal?.throwIfAborted();
11170
+ }
11171
+ }
11172
+ }
11159
11173
  function sameProcess(row, identity) {
11160
11174
  return row.pid === identity.pid && Math.abs(row.start - identity.start) <= START_TOLERANCE_MS;
11161
11175
  }
@@ -11225,7 +11239,11 @@ async function withSwiftRootLock(root, work, signal, wait = true) {
11225
11239
  );
11226
11240
  mkdirSync4(directory, { recursive: true });
11227
11241
  const token = randomUUID4();
11228
- const owner = JSON.stringify(ownIdentity(process.pid));
11242
+ const ownRow = (await processTableWithRetry(process.pid, signal)).find(
11243
+ (candidate) => candidate.pid === process.pid && !candidate.zombie
11244
+ );
11245
+ if (!ownRow) throw new Error(`swift root lock cannot find process ${process.pid}`);
11246
+ const owner = JSON.stringify({ pid: process.pid, start: ownRow.start });
11229
11247
  const pending = path23.join(directory, `pending.${token}`);
11230
11248
  let held = 0;
11231
11249
  for (; ; ) {
@@ -11234,15 +11252,15 @@ async function withSwiftRootLock(root, work, signal, wait = true) {
11234
11252
  const current = newest > 0 ? readGeneration(directory, newest) : null;
11235
11253
  if (newest > 0 && !current) continue;
11236
11254
  if (current && !current.released) {
11237
- const owner2 = processTable(current.holder.pid);
11238
- if (owner2.some((row) => !row.zombie && sameProcess(row, current.holder))) {
11255
+ const holder = await processTableWithRetry(current.holder.pid, signal);
11256
+ if (holder.some((row) => !row.zombie && sameProcess(row, current.holder))) {
11239
11257
  if (!wait) return void 0;
11240
11258
  await pause(POLL_MS, signal);
11241
11259
  continue;
11242
11260
  }
11243
11261
  const children2 = readChildren(directory, newest);
11244
11262
  if (children2.length) {
11245
- const table = processTable();
11263
+ const table = await processTableWithRetry(void 0, signal);
11246
11264
  if (children2.some((child) => groupAlive(table, child))) {
11247
11265
  if (!wait) return void 0;
11248
11266
  await pause(POLL_MS, signal);
@@ -12047,7 +12065,8 @@ var OPTIONAL_FRAMEWORK_DEPENDENCIES = {
12047
12065
  PeachCFNetwork: [],
12048
12066
  JavaScriptCore: ["PeachJavaScriptCore"],
12049
12067
  PeachJavaScriptCore: [],
12050
- GameplayKit: [],
12068
+ // GameplayKit names SpriteKit and SceneKit nodes, as on iOS
12069
+ GameplayKit: ["SpriteKit", "SceneKit", "PeachBox2D", "simd", "GLKit"],
12051
12070
  simd: [],
12052
12071
  ModelIO: ["simd"],
12053
12072
  GLKit: ["ModelIO"],
@@ -12558,10 +12577,21 @@ function swiftTargetDependencies(files, targets, frameworks = OPTIONAL_FRAMEWORK
12558
12577
  return siblings;
12559
12578
  }
12560
12579
  var ONE_PRODUCT = '.product(name: "One", package: "sootsim-swift")';
12561
- var SPRITEKIT_PRODUCT = '.product(name: "SpriteKit", package: "sootsim-swift")';
12562
- var importsSpriteKit = (files) => Object.entries(files).some(
12563
- ([file, contents]) => file.endsWith(".swift") && swiftImportNames(contents).includes("SpriteKit")
12564
- );
12580
+ var GAME_FAMILY = ["SpriteKit", "SceneKit"];
12581
+ var gameProducts = (files) => {
12582
+ const imported = new Set(
12583
+ Object.entries(files).flatMap(
12584
+ ([file, contents]) => file.endsWith(".swift") ? swiftImportNames(contents) : []
12585
+ )
12586
+ );
12587
+ if (imported.has("SceneKit")) return [...GAME_FAMILY];
12588
+ return imported.has("SpriteKit") ? ["SpriteKit"] : [];
12589
+ };
12590
+ var gameProduct = (name2) => `.product(name: "${name2}", package: "sootsim-swift")`;
12591
+ var GAME_REACH = {
12592
+ SpriteKit: ["SpriteKit", "PeachBox2D", "simd", "GLKit"],
12593
+ SceneKit: ["SceneKit"]
12594
+ };
12565
12595
  var FOUNDATION_IMPLICIT_MODULES = [
12566
12596
  "PeachObjC",
12567
12597
  "Dispatch",
@@ -12588,7 +12618,7 @@ var darwinRecordsRegion = (quoted) => quoted.length ? ["-Wl,--start-lib", ...quo
12588
12618
  var REACTOR_FLAG = '"-Xclang-linker", "-mexec-model=reactor",\n';
12589
12619
  var MULTI_MANIFEST_VERSION = 68;
12590
12620
  var SWIFT_HEADER_PRODUCTS_TARGET = "PeachHeaderProducts";
12591
- var compilerSourceDigest = true ? "2e9f321a97a408a1b3b8b7d85bbcfb108f0761ed9726b832a3c6c2cc52102806" : swiftCompilerSourceDigest(import.meta.dirname);
12621
+ var compilerSourceDigest = true ? "ae9e08389e6ab1901846342a7b347d7c10f8074172cf5d4d6505f7e955879ad4" : swiftCompilerSourceDigest(import.meta.dirname);
12592
12622
  function swiftArtifactHash(input, release, moduleRoot) {
12593
12623
  const hash = createHash13("sha256");
12594
12624
  hash.update(`swift-compile
@@ -12596,6 +12626,7 @@ ${release}
12596
12626
  `);
12597
12627
  hash.update(compilerSourceDigest);
12598
12628
  if (input.oneModule) hash.update("one-module\n");
12629
+ if (KEEP_WASM_NAMES) hash.update("names\n");
12599
12630
  hash.update(swiftModuleDigest(moduleRoot));
12600
12631
  if (input.optimize) hash.update(`optimize
12601
12632
  ${WASM_OPTIMIZE_IDENTITY}
@@ -12710,7 +12741,14 @@ function toolsetOrdersLibcxxBeforeDarwinOverlay(options) {
12710
12741
  return libcxx >= 0 && overlay > libcxx;
12711
12742
  }
12712
12743
  function emitSwiftPackageManifest(args) {
12713
- const { targets, siblings, moduleRoot, oneModule, spriteKit, distribution } = args;
12744
+ const {
12745
+ targets,
12746
+ siblings,
12747
+ moduleRoot,
12748
+ oneModule,
12749
+ gameProducts: gameProducts2 = [],
12750
+ distribution
12751
+ } = args;
12714
12752
  const prebuilt = args.prebuilt;
12715
12753
  const linkedObjects = Boolean(distribution || prebuilt);
12716
12754
  const cxxFlagsFor = (flags) => args.deferDarwinOverlay ? withoutWasmOverlayIsystem(flags) : flags;
@@ -12739,9 +12777,8 @@ function emitSwiftPackageManifest(args) {
12739
12777
  for (const name2 of [...siblings.values()].flat())
12740
12778
  if (OPTIONAL_FRAMEWORKS.has(name2) && !targets.some((target) => target.name === name2))
12741
12779
  reach(name2);
12742
- if (spriteKit) {
12743
- for (const name2 of ["SpriteKit", "PeachBox2D", "simd", "GLKit"]) reach(name2);
12744
- }
12780
+ for (const product of gameProducts2)
12781
+ for (const name2 of GAME_REACH[product] ?? []) reach(name2);
12745
12782
  let distributionLinkPath;
12746
12783
  const distributionLink = args.distributionLink;
12747
12784
  if (distribution && distributionLink) {
@@ -12764,7 +12801,7 @@ function emitSwiftPackageManifest(args) {
12764
12801
  (object3) => !isProvider(object3) && !replacedObjects.has(object3)
12765
12802
  );
12766
12803
  const objects = available.filter(
12767
- (object3) => !targets.some((target) => object3.startsWith(`lib/${target.name}-`)) && [...OPTIONAL_FRAMEWORKS, "SpriteKit", "PeachBox2D"].every(
12804
+ (object3) => !targets.some((target) => object3.startsWith(`lib/${target.name}-`)) && [...OPTIONAL_FRAMEWORKS, ...GAME_FAMILY, "PeachBox2D"].every(
12768
12805
  (name2) => !object3.startsWith(`lib/${name2}-`) || reachedFrameworks.has(name2)
12769
12806
  )
12770
12807
  );
@@ -12927,7 +12964,7 @@ function emitSwiftPackageManifest(args) {
12927
12964
  ...linkedObjects || clang && !target.executable ? [] : [
12928
12965
  '.product(name: "SwiftUI", package: "sootsim-swift")',
12929
12966
  ...oneModule ? [ONE_PRODUCT] : [],
12930
- ...spriteKit ? [SPRITEKIT_PRODUCT] : []
12967
+ ...gameProducts2.map(gameProduct)
12931
12968
  ],
12932
12969
  ...(siblings.get(target.name) ?? []).flatMap(
12933
12970
  (dependency) => clang && // textual native headers can include one another without imposing
@@ -12959,7 +12996,7 @@ function emitSwiftPackageManifest(args) {
12959
12996
  .unsafeFlags(${flagArray(`[
12960
12997
  ${REACTOR_FLAG}${executableLinkFlags(args.root)} "-Xlinker", "--export-if-defined=__main_argc_argv"${library},
12961
12998
  ]`)}),
12962
- .unsafeFlags(["-Xlinker", "--strip-all"], .when(configuration: .release)),
12999
+ ${KEEP_WASM_NAMES ? "" : '.unsafeFlags(["-Xlinker", "--strip-all"], .when(configuration: .release)),'}
12963
13000
  ]` : librarySettings.length > 0 ? `,
12964
13001
  linkerSettings: [${librarySettings.join(", ")}]` : "";
12965
13002
  const cDefines = macroSettings(target.cDefines);
@@ -13564,8 +13601,6 @@ var FOUNDATION_OVERLAY_GLOBALS = /* @__PURE__ */ new Set([
13564
13601
  "NSURLProtectionSpaceHTTPS",
13565
13602
  "NSURLProtectionSpaceHTTPSProxy",
13566
13603
  "NSURLProtectionSpaceSOCKSProxy",
13567
- "NSURLSessionDownloadTaskResumeData",
13568
- "NSURLSessionTransferSizeUnknown",
13569
13604
  "NSURLSessionUploadTaskResumeData",
13570
13605
  "NSUTF16BigEndianStringEncoding",
13571
13606
  "NSUTF16LittleEndianStringEncoding",
@@ -15294,8 +15329,8 @@ ${swiftProjectFilesProblems(input.projectFiles).join("\n")}`
15294
15329
  const moduleName = swiftTargetModuleName(name2);
15295
15330
  const originalMap = originalMaps.get(moduleName);
15296
15331
  const stagedMap = sourceModuleMaps.get(moduleName);
15297
- const originalPath = originalMap ? path27.join(layout2.root, originalMap) : stagedMap?.path;
15298
- const originalContents = originalMap ? input.files[originalMap] : stagedMap?.contents;
15332
+ const originalPath = stagedMap?.path ?? (originalMap ? path27.join(layout2.root, originalMap) : void 0);
15333
+ const originalContents = stagedMap?.contents ?? (originalMap && input.files[originalMap]);
15299
15334
  const originalTokens = originalContents ? moduleMapTokens(originalContents) : [];
15300
15335
  if (originalPath && originalTokens.some(
15301
15336
  (token, index) => token === "module" && (originalTokens[index + 1] === "Swift" || originalTokens[index + 1] === `${moduleName}.Swift`)
@@ -15570,14 +15605,17 @@ module ${moduleName}.Swift {
15570
15605
  manifest = manifest.replace(product, `${product}
15571
15606
  ${ONE_PRODUCT},`).replace(flags, `${flags}${ONE_IMPLICIT_FLAGS}`);
15572
15607
  }
15573
- if (importsSpriteKit(input.files)) {
15608
+ const games = gameProducts(input.files);
15609
+ if (games.length > 0) {
15574
15610
  const anchor = '.product(name: "CoreLocation", package: "sootsim-swift"),';
15575
15611
  if (!manifest.includes(anchor))
15576
15612
  throw new Error(
15577
- "scripts/contrast-app-Package.swift lost the line the SpriteKit product links at"
15613
+ "scripts/contrast-app-Package.swift lost the line the game products link at"
15578
15614
  );
15579
- manifest = manifest.replace(anchor, `${anchor}
15580
- ${SPRITEKIT_PRODUCT},`);
15615
+ manifest = manifest.replace(
15616
+ anchor,
15617
+ [anchor, ...games.map((name2) => `${gameProduct(name2)},`)].join("\n ")
15618
+ );
15581
15619
  }
15582
15620
  files.set(path27.join(layout2.root, "Package.swift"), manifest + moduleFiles);
15583
15621
  } else {
@@ -15692,7 +15730,7 @@ module ${moduleName}.Swift {
15692
15730
  siblings: moduleSiblings,
15693
15731
  moduleRoot,
15694
15732
  oneModule: input.oneModule,
15695
- spriteKit: importsSpriteKit(input.files),
15733
+ gameProducts: gameProducts(input.files),
15696
15734
  distribution: distribution ?? void 0,
15697
15735
  moduleExcludes,
15698
15736
  deferDarwinOverlay: native.size > 0 && toolsetOrdersLibcxxBeforeDarwinOverlay(
@@ -16099,14 +16137,9 @@ function linkedFrameworkTargets(moduleRoot, input) {
16099
16137
  ))
16100
16138
  reach(match[1]);
16101
16139
  }
16102
- if (importsSpriteKit(input.files))
16103
- for (const name2 of ["SpriteKit", "PeachBox2D", "simd", "GLKit"]) reach(name2);
16104
- const wanted = [
16105
- "PeachApp",
16106
- ...input.oneModule ? ["One"] : [],
16107
- ...importsSpriteKit(input.files) ? ["SpriteKit"] : [],
16108
- ...reached
16109
- ];
16140
+ const games = gameProducts(input.files);
16141
+ for (const product of games) for (const name2 of GAME_REACH[product] ?? []) reach(name2);
16142
+ const wanted = ["PeachApp", ...input.oneModule ? ["One"] : [], ...games, ...reached];
16110
16143
  const linked = [...new Set(wanted)].filter((name2) => libraries.has(name2));
16111
16144
  if (!linked.includes("PeachApp"))
16112
16145
  throw new Error("swift-compile: the framework package declares no PeachApp library");
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.2221 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2223 | (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.2221 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2223 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
 
3
3
  // src/swift-package.ts
4
4
  function swiftManifestSettings(target) {
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.2221 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2223 | (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.2221 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2223 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
 
3
3
  // src/is-record.ts
4
4
  function isRecord(value) {
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.2221 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2223 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = '', __sootsim_import_meta_filename = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; __sootsim_import_meta_filename = __filename; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.2221 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2223 | (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;