peachsim 0.1.669 → 0.1.670

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 (115) hide show
  1. package/cli/commands/control.ts +8 -5
  2. package/cli/commands/inspect/core.ts +7 -5
  3. package/cli/commands/inspect/wait-selector.ts +2 -11
  4. package/cli/commands/inspect.ts +6 -59
  5. package/cli/commands/kotlin.ts +6 -4
  6. package/cli/commands/skills.ts +28 -7
  7. package/cli/commands/upgrade.ts +18 -3
  8. package/cli/main.ts +21 -0
  9. package/cli/output-redaction.ts +182 -0
  10. package/cli/parse-args.ts +1 -0
  11. package/dist-lib/agent-daemon-client.cjs +1 -1
  12. package/dist-lib/agent-events.cjs +1 -1
  13. package/dist-lib/agent-identity.cjs +1 -1
  14. package/dist-lib/agent-sessions.cjs +1 -1
  15. package/dist-lib/attached-projects.cjs +1 -1
  16. package/dist-lib/auth/shared-session.cjs +1 -1
  17. package/dist-lib/backend-origin.cjs +1 -1
  18. package/dist-lib/beta.cjs +1 -1
  19. package/dist-lib/beta.mjs +1 -1
  20. package/dist-lib/bridge-constants.cjs +1 -1
  21. package/dist-lib/bridge-contract-input.cjs +1 -1
  22. package/dist-lib/bridge-contract-input.mjs +1 -1
  23. package/dist-lib/bridge-contract.cjs +1 -1
  24. package/dist-lib/bridge-contract.mjs +1 -1
  25. package/dist-lib/capture-contract.cjs +1 -1
  26. package/dist-lib/capture-contract.mjs +1 -1
  27. package/dist-lib/cli-constants.cjs +1 -1
  28. package/dist-lib/cloud-contract.cjs +1 -1
  29. package/dist-lib/cloud-contract.mjs +1 -1
  30. package/dist-lib/cloud-test-args.cjs +1 -1
  31. package/dist-lib/cloud-test-args.mjs +1 -1
  32. package/dist-lib/cloud.cjs +1 -1
  33. package/dist-lib/cloud.mjs +1 -1
  34. package/dist-lib/config.cjs +1 -1
  35. package/dist-lib/detox/index.cjs +1 -1
  36. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  37. package/dist-lib/home-paths.cjs +1 -1
  38. package/dist-lib/host/bridge-host.cjs +29 -19
  39. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  40. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  41. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  42. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  43. package/dist-lib/host/websocket-proxy.cjs +1 -1
  44. package/dist-lib/index.cjs +260 -17
  45. package/dist-lib/jump-to-source-babel.cjs +1 -1
  46. package/dist-lib/jump-to-source-native.cjs +1 -1
  47. package/dist-lib/kotlin-host.cjs +2 -1
  48. package/dist-lib/menu.cjs +1 -1
  49. package/dist-lib/menu.mjs +1 -1
  50. package/dist-lib/metro-fingerprint-registry.cjs +1 -1
  51. package/dist-lib/metro-fingerprint-registry.mjs +1 -1
  52. package/dist-lib/metro-production-bundle.cjs +1 -1
  53. package/dist-lib/metro-production-bundle.mjs +1 -1
  54. package/dist-lib/metro.cjs +259 -16
  55. package/dist-lib/native-app-identity.cjs +1 -1
  56. package/dist-lib/native-app-identity.mjs +1 -1
  57. package/dist-lib/native-firebase-metadata.cjs +115 -0
  58. package/dist-lib/native-firebase-metadata.mjs +86 -0
  59. package/dist-lib/plist.cjs +1 -1
  60. package/dist-lib/plist.mjs +1 -1
  61. package/dist-lib/profiles.cjs +1 -1
  62. package/dist-lib/public-brand.cjs +1 -1
  63. package/dist-lib/react-native-host-modules.cjs +1 -1
  64. package/dist-lib/react-native-host-modules.mjs +1 -1
  65. package/dist-lib/render-mode.cjs +1 -1
  66. package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
  67. package/dist-lib/sdk.cjs +2 -2
  68. package/dist-lib/sdk.mjs +2 -2
  69. package/dist-lib/skills.cjs +479 -203
  70. package/dist-lib/swift-compile.cjs +1 -1
  71. package/dist-lib/swift-compile.mjs +1 -1
  72. package/dist-lib/swift-package.cjs +1 -1
  73. package/dist-lib/swift-package.mjs +1 -1
  74. package/dist-lib/swift-submit.cjs +1 -1
  75. package/dist-lib/swift-submit.mjs +1 -1
  76. package/dist-lib/swift.cjs +1 -1
  77. package/dist-lib/vite-swift.cjs +21 -13
  78. package/dist-lib/vite.cjs +1 -1
  79. package/kotlin/AppSources/androidx/activity/ActivityFlags.kt +9 -0
  80. package/kotlin/AppSources/androidx/activity/BackEventCompat.kt +25 -4
  81. package/kotlin/AppSources/androidx/activity/ComponentActivity.kt +15 -4
  82. package/kotlin/AppSources/androidx/activity/EdgeToEdge.kt +12 -8
  83. package/kotlin/AppSources/androidx/activity/ExperimentalActivityApi.kt +6 -0
  84. package/kotlin/AppSources/androidx/activity/OnBackPressedCallback.kt +50 -9
  85. package/kotlin/AppSources/androidx/activity/OnBackPressedDispatcher.kt +67 -89
  86. package/kotlin/AppSources/androidx/activity/compose/BackHandler.kt +55 -24
  87. package/kotlin/AppSources/androidx/activity/compose/internal/BackHandlerCompat.kt +38 -0
  88. package/kotlin/AppSources/androidx/activity/compose/internal/BackHandlerDispatcherCompat.kt +27 -0
  89. package/kotlin/AppSources/dev/peach/app/PeachApp.kt +5 -5
  90. package/kotlin/ComposeSources/PeachComposeHost.kt +31 -7
  91. package/kotlin/fixtures/kotlin-app/app/build.gradle.kts +1 -1
  92. package/kotlin/fixtures/kotlin-app-variants/Browse.kt +73 -0
  93. package/kotlin/fixtures/kotlin-app-variants/Focus.kt +62 -0
  94. package/kotlin/fixtures/kotlin-app-variants/Lists.kt +57 -0
  95. package/kotlin/fixtures/kotlin-app-variants/Nav.kt +47 -0
  96. package/kotlin/fixtures/kotlin-app-variants/Nested.kt +64 -0
  97. package/kotlin/fixtures/kotlin-app-variants/Pan.kt +38 -0
  98. package/kotlin/fixtures/kotlin-app-variants/Pickers.kt +44 -0
  99. package/kotlin/fixtures/kotlin-app-variants/Press.kt +43 -0
  100. package/kotlin/fixtures/kotlin-app-variants/Transition.kt +69 -0
  101. package/kotlin/fixtures/kotlin-app-variants/ViewConfig.kt +22 -0
  102. package/kotlin/toolchain.json +30 -2
  103. package/package.json +8 -1
  104. package/skills/contrast/SKILL.md +2 -1
  105. package/skills/peach-debug/SKILL.md +2 -2
  106. package/skills/peach-test/SKILL.md +3 -3
  107. package/src/expo-swift-host.ts +13 -4
  108. package/src/kotlin-app.ts +35 -16
  109. package/src/kotlin-host.ts +1 -0
  110. package/src/metro-plugin.ts +24 -0
  111. package/src/native-firebase-config.ts +202 -21
  112. package/src/native-firebase-metadata.ts +114 -0
  113. package/src/swift-host.ts +30 -15
  114. package/src/vite-plugin.ts +46 -2
  115. package/kotlin/AppSources/androidx/activity/Cancellable.kt +0 -5
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.669 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.670 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.669 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.670 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/bridge-contract.ts
4
4
  var REFUSED_PERFORM_STEP_TYPES = [
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.669 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.670 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.669 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.670 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/capture-contract.ts
4
4
  var RNX_SCREEN_CAPTURE_VERSION = 1;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.669 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.670 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.669 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.670 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.669 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.670 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/cloud-contract.ts
4
4
  var RNX_CLOUD_MAX_ARTIFACT_BYTES = 20 * 1024 * 1024;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.669 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.670 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.669 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.670 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/cloud-test-args.ts
4
4
  var CLOUD_TEST_ARGS_MAX_COUNT = 32;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.669 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.670 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.669 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.670 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  var __defProp = Object.defineProperty;
3
3
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
4
4
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.669 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.670 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.669 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.670 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.669 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.670 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.669 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.670 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.669 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.670 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -2743,7 +2743,8 @@ async function readOrInferModuleIdentity(bundle, mode, inferModuleIdentity) {
2743
2743
  }
2744
2744
  async function buildRnxCloudArtifact(bundle, options = {}) {
2745
2745
  const mode = options.mode ?? "production";
2746
- const nativeIdentity = (0, import_native_app_identity.detachNativeAppIdentityFooter)(bundle);
2746
+ const firebase = (0, import_native_firebase_metadata.detachNativeFirebaseFooter)(bundle);
2747
+ const nativeIdentity = (0, import_native_app_identity.detachNativeAppIdentityFooter)(firebase.source);
2747
2748
  const identity = await readOrInferModuleIdentity(
2748
2749
  nativeIdentity.source,
2749
2750
  mode,
@@ -2771,7 +2772,7 @@ async function buildRnxCloudArtifact(bundle, options = {}) {
2771
2772
  })
2772
2773
  ]);
2773
2774
  const body = pieces.map((piece) => piece.code).join("\n");
2774
- const code = body + (nativeIdentity.identity ? (0, import_native_app_identity.createNativeAppIdentityFooter)(nativeIdentity.identity) : "") + (0, import_metro_production_bundle.createRNXMetroModuleIdentityFooter)({
2775
+ const code = body + (nativeIdentity.identity ? (0, import_native_app_identity.createNativeAppIdentityFooter)(nativeIdentity.identity) : "") + (firebase.config ? (0, import_native_firebase_metadata.createNativeFirebaseFooter)(firebase.config) : "") + (0, import_metro_production_bundle.createRNXMetroModuleIdentityFooter)({
2775
2776
  version: identity.version,
2776
2777
  identitySource: identity.identitySource,
2777
2778
  modulePaths: identity.modulePaths,
@@ -2834,12 +2835,13 @@ async function buildRnxCloudArtifact(bundle, options = {}) {
2834
2835
  }
2835
2836
  };
2836
2837
  }
2837
- var import_metro_production_bundle, import_native_app_identity, import_terser, MODULE_PATHS_REQUIRED, SOURCE_MAP_REQUIRED, MINIFY_OPTIONS;
2838
+ var import_metro_production_bundle, import_native_app_identity, import_native_firebase_metadata, import_terser, MODULE_PATHS_REQUIRED, SOURCE_MAP_REQUIRED, MINIFY_OPTIONS;
2838
2839
  var init_metroCloudArtifact = __esm({
2839
2840
  "../contrast-bundler/src/metroCloudArtifact.ts"() {
2840
2841
  "use strict";
2841
2842
  import_metro_production_bundle = require("peachsim/metro-production-bundle");
2842
2843
  import_native_app_identity = require("peachsim/native-app-identity");
2844
+ import_native_firebase_metadata = require("peachsim/native-firebase-metadata");
2843
2845
  import_terser = require("terser");
2844
2846
  init_metroAssetArtifact();
2845
2847
  init_metroDebugSourceMap();
@@ -7480,13 +7482,11 @@ async function compile(packagePath, entry, stamp, moduleRootOverride, hosted, sn
7480
7482
  stamp,
7481
7483
  package: content
7482
7484
  };
7483
- const toolchain = JSON.parse(
7484
- import_node_fs9.default.readFileSync(import_node_path9.default.join(moduleRoot, "toolchain.json"), "utf8")
7485
- );
7486
- const release = toolchain && typeof toolchain === "object" ? Reflect.get(toolchain, "release") : void 0;
7487
- if (typeof release !== "string") {
7488
- throw new Error(`swift toolchain manifest at ${moduleRoot} has no release`);
7489
- }
7485
+ const toolchain = localSwiftToolchain(moduleRoot);
7486
+ if (!toolchain)
7487
+ throw new Error(
7488
+ `the Swift toolchain ${moduleRoot}/toolchain.json names is not installed under ~/Library/Developer/Toolchains`
7489
+ );
7490
7490
  const artifact = await compileSwiftProjectUnit(snapshotCompileInput(snapshot, entry), {
7491
7491
  // the compile rewrites Sources/App in its root before swiftpm builds, and
7492
7492
  // its lock orders one process only: two vites on one root (a lane's dev
@@ -7499,14 +7499,24 @@ async function compile(packagePath, entry, stamp, moduleRootOverride, hosted, sn
7499
7499
  (0, import_node_crypto4.createHash)("sha256").update(`${moduleRoot}\0${import_node_path9.default.resolve(packagePath)}`).digest("hex").slice(0, 16)
7500
7500
  ),
7501
7501
  moduleRoot,
7502
- release,
7503
- toolchainBin: import_node_path9.default.join(
7504
- import_node_os3.default.homedir(),
7505
- `Library/Developer/Toolchains/${release}.xctoolchain/usr/bin`
7506
- )
7502
+ ...toolchain
7507
7503
  });
7508
7504
  return { ...artifact, stamp, package: content };
7509
7505
  }
7506
+ function localSwiftToolchain(moduleRoot) {
7507
+ const manifest = import_node_path9.default.join(moduleRoot, "toolchain.json");
7508
+ if (!import_node_fs9.default.existsSync(manifest)) return null;
7509
+ const toolchain = JSON.parse(import_node_fs9.default.readFileSync(manifest, "utf8"));
7510
+ const release = toolchain && typeof toolchain === "object" ? Reflect.get(toolchain, "release") : void 0;
7511
+ if (typeof release !== "string") {
7512
+ throw new Error(`swift toolchain manifest at ${moduleRoot} has no release`);
7513
+ }
7514
+ const toolchainBin = import_node_path9.default.join(
7515
+ import_node_os3.default.homedir(),
7516
+ `Library/Developer/Toolchains/${release}.xctoolchain/usr/bin`
7517
+ );
7518
+ return import_node_fs9.default.existsSync(import_node_path9.default.join(toolchainBin, "swift")) ? { release, toolchainBin } : null;
7519
+ }
7510
7520
  async function compileRemote(packagePath, entry, snapshot, hosted) {
7511
7521
  const auth = hosted ? null : resolveCliAuth();
7512
7522
  if (!hosted && (!auth || auth.kind === "github")) {
@@ -7822,6 +7832,8 @@ async function handleExpoSwiftRequest(req, res) {
7822
7832
  pending = (async () => {
7823
7833
  const files = await collectExpoSwiftSources(root);
7824
7834
  if (!files) return null;
7835
+ const moduleRoot = import_node_path10.default.resolve(import_meta2.dirname, "../../sootsim-swift");
7836
+ if (!localSwiftToolchain(moduleRoot)) return null;
7825
7837
  const key = (0, import_node_crypto5.createHash)("sha256").update(import_node_fs10.default.realpathSync(root)).digest("hex");
7826
7838
  const packagePath = import_node_path10.default.join(import_node_os4.default.tmpdir(), "peach-expo-swift", key);
7827
7839
  const sources = import_node_path10.default.join(packagePath, "Sources");
@@ -7832,12 +7844,10 @@ async function handleExpoSwiftRequest(req, res) {
7832
7844
  import_node_fs10.default.mkdirSync(import_node_path10.default.dirname(target), { recursive: true });
7833
7845
  import_node_fs10.default.writeFileSync(target, content);
7834
7846
  }
7835
- const moduleRoot = import_node_path10.default.resolve(import_meta2.dirname, "../../sootsim-swift");
7836
- const local = import_node_fs10.default.existsSync(import_node_path10.default.join(moduleRoot, "toolchain.json"));
7837
7847
  const artifact = await artifactFor(
7838
7848
  projectFor(packagePath),
7839
7849
  EXPO_SWIFT_ENTRY,
7840
- local ? moduleRoot : void 0
7850
+ moduleRoot
7841
7851
  );
7842
7852
  const host2 = req.headers.host;
7843
7853
  if (!host2) throw new Error("Expo Swift request has no host");
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.669 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.670 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.669 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.670 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.669 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.670 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/host/fetch-proxy-overrides.ts
4
4
  var FETCH_PROXY_BROWSER_USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36";
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.669 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.670 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.669 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.670 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.669 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.670 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -4805,27 +4805,177 @@ function parsePlistSource(source) {
4805
4805
  }
4806
4806
 
4807
4807
  // src/native-firebase-config.ts
4808
- function readNativeFirebaseConfig(projectRoot) {
4808
+ function readNativeFirebaseConfig(projectRoot, platforms = ["ios", "android"]) {
4809
4809
  const result = {};
4810
- if (![
4811
- "app.json",
4810
+ let config = {};
4811
+ const appJsonPath = import_node_path6.default.join(projectRoot, "app.json");
4812
+ const appJson = import_node_fs6.default.existsSync(appJsonPath) ? JSON.parse(import_node_fs6.default.readFileSync(appJsonPath, "utf8")) : null;
4813
+ const staticExpo = isRecord(appJson) && (isRecord(appJson.expo) || [appJson.ios, appJson.android].some(
4814
+ (value) => isRecord(value) && typeof value.googleServicesFile === "string"
4815
+ ));
4816
+ const dynamicExpo = [
4812
4817
  "app.config.js",
4813
4818
  "app.config.ts",
4814
4819
  "app.config.cjs",
4815
4820
  "app.config.mjs"
4816
- ].some((name2) => import_node_fs6.default.existsSync(import_node_path6.default.join(projectRoot, name2))))
4817
- return result;
4818
- const require2 = (0, import_node_module2.createRequire)(import_node_path6.default.join(projectRoot, "package.json"));
4819
- const configModule = require2("@expo/config");
4820
- if (!isRecord(configModule) || typeof configModule.getConfig !== "function") {
4821
- throw new Error("Expo native configuration is unavailable.");
4822
- }
4823
- const resolved = Reflect.apply(configModule.getConfig, configModule, [
4824
- projectRoot,
4825
- { skipSDKVersionRequirement: true }
4826
- ]);
4827
- const config = isRecord(resolved) && isRecord(resolved.exp) ? resolved.exp : {};
4828
- for (const platform of ["ios", "android"]) {
4821
+ ].some((name2) => import_node_fs6.default.existsSync(import_node_path6.default.join(projectRoot, name2)));
4822
+ if (staticExpo || dynamicExpo) {
4823
+ const require2 = (0, import_node_module2.createRequire)(import_node_path6.default.join(projectRoot, "package.json"));
4824
+ const configModule = require2("@expo/config");
4825
+ if (!isRecord(configModule) || typeof configModule.getConfig !== "function")
4826
+ throw new Error("Expo native configuration is unavailable.");
4827
+ const resolved = Reflect.apply(configModule.getConfig, configModule, [
4828
+ projectRoot,
4829
+ { skipSDKVersionRequirement: true }
4830
+ ]);
4831
+ config = isRecord(resolved) && isRecord(resolved.exp) ? resolved.exp : {};
4832
+ }
4833
+ const ios = config.ios;
4834
+ if (platforms.includes("ios") && (!isRecord(ios) || typeof ios.googleServicesFile !== "string")) {
4835
+ const iosRoot = import_node_path6.default.join(projectRoot, "ios");
4836
+ if (import_node_fs6.default.existsSync(iosRoot)) {
4837
+ const projects = import_node_fs6.default.readdirSync(iosRoot, { withFileTypes: true }).filter((entry) => entry.isDirectory() && entry.name.endsWith(".xcodeproj"));
4838
+ if (projects.length > 1)
4839
+ throw new Error("native Firebase configuration requires a selected Xcode project");
4840
+ if (projects.length === 1) {
4841
+ const require2 = (0, import_node_module2.createRequire)(import_node_path6.default.join(projectRoot, "package.json"));
4842
+ const xcode = require2("xcode");
4843
+ if (!isRecord(xcode) || typeof xcode.project !== "function")
4844
+ throw new Error("native Xcode project parser is unavailable");
4845
+ const project = Reflect.apply(xcode.project, xcode, [
4846
+ import_node_path6.default.join(iosRoot, projects[0].name, "project.pbxproj")
4847
+ ]);
4848
+ if (!isRecord(project) || typeof project.parseSync !== "function")
4849
+ throw new Error("native Xcode project is malformed");
4850
+ Reflect.apply(project.parseSync, project, []);
4851
+ const hash = project.hash;
4852
+ const native = isRecord(hash) ? hash.project : null;
4853
+ const objects = isRecord(native) ? native.objects : null;
4854
+ if (!isRecord(objects)) throw new Error("native Xcode objects are malformed");
4855
+ const unquote = (value) => typeof value === "string" ? value.replace(/^"|"$/g, "") : "";
4856
+ const targets = isRecord(objects.PBXNativeTarget) ? Object.values(objects.PBXNativeTarget).filter(
4857
+ (target2) => isRecord(target2) && unquote(target2.productType) === "com.apple.product-type.application"
4858
+ ) : [];
4859
+ if (targets.length > 1)
4860
+ throw new Error("native Firebase configuration requires a selected app target");
4861
+ const target = targets[0];
4862
+ if (isRecord(target) && Array.isArray(target.buildPhases)) {
4863
+ const buildPhases = target.buildPhases;
4864
+ const filePaths = /* @__PURE__ */ new Map();
4865
+ const groups = isRecord(objects.PBXGroup) ? objects.PBXGroup : {};
4866
+ const references = isRecord(objects.PBXFileReference) ? objects.PBXFileReference : {};
4867
+ const nativeProjects = isRecord(objects.PBXProject) ? Object.values(objects.PBXProject) : [];
4868
+ const roots = nativeProjects.filter(isRecord).map((value) => value.mainGroup);
4869
+ const pending = roots.filter((id) => typeof id === "string").map((id) => ({ id, base: iosRoot }));
4870
+ const visited = /* @__PURE__ */ new Map();
4871
+ while (pending.length) {
4872
+ const item = pending.pop();
4873
+ if (!item) break;
4874
+ const previous = visited.get(item.id);
4875
+ if (previous !== void 0) {
4876
+ if (previous !== item.base)
4877
+ throw new Error("native Xcode group has ambiguous parents");
4878
+ continue;
4879
+ }
4880
+ visited.set(item.id, item.base);
4881
+ const group = groups[item.id];
4882
+ if (!isRecord(group) || !Array.isArray(group.children)) continue;
4883
+ const sourceTree = unquote(group.sourceTree);
4884
+ if (sourceTree && sourceTree !== "<group>" && sourceTree !== "SOURCE_ROOT")
4885
+ continue;
4886
+ const directory = import_node_path6.default.resolve(
4887
+ sourceTree === "SOURCE_ROOT" ? iosRoot : item.base,
4888
+ unquote(group.path)
4889
+ );
4890
+ for (const child of group.children) {
4891
+ if (!isRecord(child) || typeof child.value !== "string") continue;
4892
+ if (isRecord(groups[child.value])) {
4893
+ pending.push({ id: child.value, base: directory });
4894
+ continue;
4895
+ }
4896
+ const file = references[child.value];
4897
+ if (!isRecord(file)) continue;
4898
+ const tree = unquote(file.sourceTree);
4899
+ if (tree !== "<group>" && tree !== "SOURCE_ROOT") continue;
4900
+ const filePath = import_node_path6.default.resolve(
4901
+ tree === "SOURCE_ROOT" ? iosRoot : directory,
4902
+ unquote(file.path)
4903
+ );
4904
+ const values = filePaths.get(child.value) ?? /* @__PURE__ */ new Set();
4905
+ values.add(filePath);
4906
+ filePaths.set(child.value, values);
4907
+ }
4908
+ }
4909
+ const buildFiles = isRecord(objects.PBXBuildFile) ? objects.PBXBuildFile : {};
4910
+ const filesInPhase = (section, name2) => {
4911
+ if (!isRecord(section)) return [];
4912
+ const paths = [];
4913
+ for (const phase of buildPhases) {
4914
+ if (!isRecord(phase) || typeof phase.value !== "string") continue;
4915
+ const value = section[phase.value];
4916
+ if (!isRecord(value) || !Array.isArray(value.files)) continue;
4917
+ for (const entry of value.files) {
4918
+ if (!isRecord(entry) || typeof entry.value !== "string") continue;
4919
+ const file = buildFiles[entry.value];
4920
+ if (!isRecord(file) || typeof file.fileRef !== "string") continue;
4921
+ const reference = references[file.fileRef];
4922
+ if (!isRecord(reference) || !name2.test(import_node_path6.default.basename(unquote(reference.path))))
4923
+ continue;
4924
+ const candidates = filePaths.get(file.fileRef);
4925
+ if (!candidates || candidates.size !== 1)
4926
+ throw new Error("native Firebase build resource path is unresolved");
4927
+ paths.push(...candidates);
4928
+ }
4929
+ }
4930
+ return paths;
4931
+ };
4932
+ const delegates = filesInPhase(
4933
+ objects.PBXSourcesBuildPhase,
4934
+ /^AppDelegate\.(swift|mm|m)$/
4935
+ );
4936
+ const defaultConfigured = delegates.some((file) => {
4937
+ const source = import_node_fs6.default.readFileSync(file, "utf8").replace(
4938
+ /\/\*[\s\S]*?\*\/|\/\/[^\n]*|"(?:\\.|[^"\\])*"/g,
4939
+ (token) => token.startsWith('"') ? '""' : token.replace(/[^\n]/g, " ")
4940
+ );
4941
+ const launch = /(?:\bfunc\s+application\s*\([\s\S]*?didFinishLaunchingWithOptions[\s\S]*?\)\s*->\s*Bool|^-\s*\(BOOL\)\s*application\s*:[\s\S]*?didFinishLaunchingWithOptions[^\{]*)\s*\{/m.exec(
4942
+ source
4943
+ );
4944
+ if (!launch) return false;
4945
+ const body = source.slice(launch.index + launch[0].length);
4946
+ const configure = /^\s*(?:FirebaseApp\s*\.\s*configure\s*\(\s*\)|\[FIRApp\s+configure\])/m.exec(
4947
+ body
4948
+ );
4949
+ if (!configure) return false;
4950
+ const before = body.slice(0, configure.index);
4951
+ let depth = 1;
4952
+ for (const token of before) {
4953
+ if (token === "{") depth += 1;
4954
+ if (token === "}") depth -= 1;
4955
+ if (depth === 0) return false;
4956
+ }
4957
+ if (depth !== 1 || /\b(?:return|throw)\b|^\s*#(?:if|elseif|else)/m.test(before))
4958
+ throw new Error(
4959
+ "native Firebase initialization must be unconditional in the app launch method"
4960
+ );
4961
+ return true;
4962
+ });
4963
+ if (defaultConfigured) {
4964
+ const resources = filesInPhase(
4965
+ objects.PBXResourcesBuildPhase,
4966
+ /^GoogleService-Info\.plist$/
4967
+ );
4968
+ if (resources.length !== 1)
4969
+ throw new Error(
4970
+ "native Firebase default initialization requires one GoogleService-Info.plist build resource"
4971
+ );
4972
+ config.ios = { googleServicesFile: import_node_path6.default.relative(projectRoot, resources[0]) };
4973
+ }
4974
+ }
4975
+ }
4976
+ }
4977
+ }
4978
+ for (const platform of platforms) {
4829
4979
  const native = config[platform];
4830
4980
  if (!isRecord(native) || typeof native.googleServicesFile !== "string") continue;
4831
4981
  try {
@@ -4883,6 +5033,84 @@ function readNativeFirebaseConfig(projectRoot) {
4883
5033
  return result;
4884
5034
  }
4885
5035
 
5036
+ // src/native-firebase-metadata.ts
5037
+ var PREFIX = "globalThis.__peachNativeFirebaseConfig=";
5038
+ var MODULE_PREFIX = "globalThis.__sootsimModulePaths=";
5039
+ var PLATFORMS = ["ios", "android"];
5040
+ function readNativeFirebaseMetadata(value) {
5041
+ if (value === null || value === void 0) return null;
5042
+ if (typeof value !== "object" || Array.isArray(value))
5043
+ throw new Error("native Firebase configuration is malformed");
5044
+ if (Object.keys(value).some((key) => !PLATFORMS.some((name2) => name2 === key)))
5045
+ throw new Error("native Firebase configuration has an invalid platform");
5046
+ const result = {};
5047
+ for (const platform of PLATFORMS) {
5048
+ const options = Reflect.get(value, platform);
5049
+ if (options === void 0) continue;
5050
+ if (!options || typeof options !== "object" || Array.isArray(options))
5051
+ throw new Error("native Firebase options are malformed");
5052
+ const error = Reflect.get(options, "error");
5053
+ if (typeof error === "string")
5054
+ throw new Error(`native Firebase configuration: ${error}`);
5055
+ const apiKey = Reflect.get(options, "apiKey");
5056
+ const appId = Reflect.get(options, "appId");
5057
+ const projectId = Reflect.get(options, "projectId");
5058
+ if (typeof apiKey !== "string" || !apiKey || typeof appId !== "string" || !appId || typeof projectId !== "string" || !projectId)
5059
+ throw new Error("native Firebase options require apiKey, appId and projectId");
5060
+ const native = { apiKey, appId, projectId };
5061
+ for (const key of [
5062
+ "databaseURL",
5063
+ "gaTrackingId",
5064
+ "storageBucket",
5065
+ "messagingSenderId",
5066
+ "clientId",
5067
+ "androidClientID",
5068
+ "deepLinkUrlScheme"
5069
+ ]) {
5070
+ const field = Reflect.get(options, key);
5071
+ if (field === void 0) continue;
5072
+ if (typeof field !== "string")
5073
+ throw new Error(`native Firebase option ${key} is malformed`);
5074
+ native[key] = field;
5075
+ }
5076
+ result[platform] = native;
5077
+ }
5078
+ return result;
5079
+ }
5080
+ function createNativeFirebaseFooter(config) {
5081
+ const json = JSON.stringify(config).replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029").replace(/<\//g, "<\\/");
5082
+ return `
5083
+ ${PREFIX}${json};`;
5084
+ }
5085
+ function readNativeFirebaseFooter(source) {
5086
+ const start = source.lastIndexOf(`
5087
+ ${PREFIX}`);
5088
+ if (start < 0) return null;
5089
+ const lineEnd = source.indexOf("\n", start + 1);
5090
+ const line = source.slice(start + 1, lineEnd < 0 ? void 0 : lineEnd);
5091
+ if (!line.endsWith(";")) throw new Error("native Firebase footer is truncated");
5092
+ const parsed = JSON.parse(line.slice(PREFIX.length, -1));
5093
+ const config = readNativeFirebaseMetadata(parsed);
5094
+ if (config === null) throw new Error("native Firebase footer has no configuration");
5095
+ return config;
5096
+ }
5097
+ function detachNativeFirebaseFooter(source) {
5098
+ const config = readNativeFirebaseFooter(source);
5099
+ if (config === null) return { source, config };
5100
+ const start = source.lastIndexOf(`
5101
+ ${PREFIX}`);
5102
+ const lineEnd = source.indexOf("\n", start + 1);
5103
+ const end = lineEnd < 0 ? source.length : lineEnd;
5104
+ return { source: source.slice(0, start) + source.slice(end), config };
5105
+ }
5106
+ function insertNativeFirebaseFooter(source, config) {
5107
+ const detached = detachNativeFirebaseFooter(source).source;
5108
+ const start = detached.lastIndexOf(`
5109
+ ${MODULE_PREFIX}`);
5110
+ const footer = createNativeFirebaseFooter(config);
5111
+ return start < 0 ? detached + footer : detached.slice(0, start) + footer + detached.slice(start);
5112
+ }
5113
+
4886
5114
  // src/metro-plugin.ts
4887
5115
  var prefix = "/__soot";
4888
5116
  function readCallableMetroExport(moduleValue, label) {
@@ -5005,6 +5233,21 @@ function withRNX(config) {
5005
5233
  };
5006
5234
  }
5007
5235
  }
5236
+ if ([...graph.dependencies?.values() ?? []].some(
5237
+ (module2) => module2.path.replace(/\\/g, "/").includes("/@react-native-firebase/app/")
5238
+ )) {
5239
+ const firebase = readNativeFirebaseMetadata(
5240
+ readNativeFirebaseConfig(
5241
+ cfgProjectRoot,
5242
+ typeof bundlePlatform === "string" ? [bundlePlatform] : void 0
5243
+ )
5244
+ );
5245
+ if (firebase)
5246
+ annotated = typeof annotated === "string" ? insertNativeFirebaseFooter(annotated, firebase) : {
5247
+ ...annotated,
5248
+ code: insertNativeFirebaseFooter(annotated.code, firebase)
5249
+ };
5250
+ }
5008
5251
  return annotated;
5009
5252
  }
5010
5253
  }
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.669 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.670 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.669 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.670 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.669 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.670 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -405,6 +405,7 @@ async function kotlinAppArtifact(app, moduleRoot, origin) {
405
405
  ` { ${app.applicationClass ?? "android.app.Application"}() },`,
406
406
  ` { ${app.launcher.targetClass}() },`,
407
407
  ` ${app.handlesUiMode},`,
408
+ ` ${kotlinString(app.softInputAdjust)},`,
408
409
  " androidx.lifecycle.viewmodel.viewModelFactory {",
409
410
  ...viewModels.map(viewModelInitializer),
410
411
  " },",
package/dist-lib/menu.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.669 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.670 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
package/dist-lib/menu.mjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.669 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.670 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/public-brand.ts
4
4
  var name = "Peach";
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.669 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.670 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.669 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.670 | (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
- /*! rnx v0.1.669 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.670 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.669 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.670 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/metro-production-bundle.ts
4
4
  var RNXSIM_METRO_MODULE_PATHS_PREFIX = "globalThis.__sootsimModulePaths=";