peachsim 0.1.1625 → 0.1.1640

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 (169) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +15 -2
  3. package/cli/app-config.ts +18 -6
  4. package/cli/app-fonts.ts +37 -17
  5. package/cli/app-stubs.ts +284 -20
  6. package/cli/bridge-flow-runner.ts +66 -45
  7. package/cli/cloud-client.ts +60 -40
  8. package/cli/command-registry.ts +1 -0
  9. package/cli/commands/control.ts +283 -49
  10. package/cli/commands/doctor.ts +30 -189
  11. package/cli/commands/flow.ts +79 -11
  12. package/cli/commands/inspect/core.ts +10 -5
  13. package/cli/commands/inspect/settling.ts +14 -2
  14. package/cli/commands/inspect/shared.ts +9 -4
  15. package/cli/commands/inspect/wait-ready.ts +12 -0
  16. package/cli/commands/inspect.ts +91 -50
  17. package/cli/commands/install-desktop.ts +1 -0
  18. package/cli/commands/maestro-compare.ts +97 -38
  19. package/cli/commands/maestro.ts +9 -1
  20. package/cli/commands/preview.ts +1 -1
  21. package/cli/commands/record.ts +118 -48
  22. package/cli/commands/screenshot.ts +23 -1
  23. package/cli/commands/serve.ts +7 -2
  24. package/cli/commands/setup.ts +19 -42
  25. package/cli/commands/swift.ts +14 -3
  26. package/cli/commands/upload.ts +93 -48
  27. package/cli/desktop-companion.ts +102 -17
  28. package/cli/drivers/desktop.ts +14 -1
  29. package/cli/drivers/playwright-sim-host.ts +103 -45
  30. package/cli/drivers/playwright.ts +9 -8
  31. package/cli/drivers/types.ts +5 -0
  32. package/cli/maestro-accessibility.ts +1 -1
  33. package/cli/maestro-compare.ts +84 -12
  34. package/cli/main.ts +3 -2
  35. package/cli/outbound-endpoints.ts +20 -6
  36. package/cli/pause-aware-timeout.ts +106 -0
  37. package/cli/scene-video.ts +89 -0
  38. package/cli/ws-bridge.ts +37 -19
  39. package/detox/attempt-events.cjs +66 -5
  40. package/detox/attempt-events.d.cts +7 -0
  41. package/detox/expectations.ts +7 -3
  42. package/detox/index.ts +269 -170
  43. package/detox/motion-change.cjs +206 -21
  44. package/detox/motion-change.d.cts +39 -2
  45. package/detox/navigation-lifecycle.ts +35 -3
  46. package/dist-lib/agent-daemon-client.cjs +1 -1
  47. package/dist-lib/agent-events.cjs +1 -1
  48. package/dist-lib/attached-projects.cjs +1 -1
  49. package/dist-lib/auth/shared-session.cjs +1 -1
  50. package/dist-lib/backend-origin.cjs +8 -7
  51. package/dist-lib/beta.cjs +1 -1
  52. package/dist-lib/beta.mjs +1 -1
  53. package/dist-lib/bridge-constants.cjs +13 -1
  54. package/dist-lib/bridge-contract-input.cjs +1 -1
  55. package/dist-lib/bridge-contract-input.mjs +1 -1
  56. package/dist-lib/bridge-contract.cjs +14 -8
  57. package/dist-lib/bridge-contract.mjs +13 -7
  58. package/dist-lib/bundle-channel.cjs +11887 -7900
  59. package/dist-lib/capture-contract.cjs +1 -1
  60. package/dist-lib/capture-contract.mjs +1 -1
  61. package/dist-lib/cloud-contract.cjs +1 -1
  62. package/dist-lib/cloud-contract.mjs +1 -1
  63. package/dist-lib/cloud-test-args.cjs +1 -1
  64. package/dist-lib/cloud-test-args.mjs +1 -1
  65. package/dist-lib/cloud.cjs +1 -1
  66. package/dist-lib/cloud.mjs +1 -1
  67. package/dist-lib/config.cjs +6 -3
  68. package/dist-lib/config.mjs +6 -3
  69. package/dist-lib/detox/index.cjs +1379 -725
  70. package/dist-lib/dev-bundle-resolution.cjs +14 -2
  71. package/dist-lib/expo-swift-bundle.cjs +9341 -5462
  72. package/dist-lib/expo-swift-metadata.cjs +11 -7
  73. package/dist-lib/expo-swift-metadata.mjs +11 -7
  74. package/dist-lib/home-paths.cjs +32 -3
  75. package/dist-lib/host/bridge-host.cjs +50204 -7258
  76. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  77. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  78. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  79. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  80. package/dist-lib/host/websocket-proxy.cjs +1 -1
  81. package/dist-lib/index.cjs +3541 -448
  82. package/dist-lib/jump-to-source-babel.cjs +1 -1
  83. package/dist-lib/jump-to-source-native.cjs +1 -1
  84. package/dist-lib/kotlin-host.cjs +1 -1
  85. package/dist-lib/menu.cjs +1 -1
  86. package/dist-lib/menu.mjs +1 -1
  87. package/dist-lib/metro-fingerprint-registry.cjs +1 -1
  88. package/dist-lib/metro-fingerprint-registry.mjs +1 -1
  89. package/dist-lib/metro-production-bundle.cjs +1 -1
  90. package/dist-lib/metro-production-bundle.mjs +1 -1
  91. package/dist-lib/metro.cjs +2931 -104
  92. package/dist-lib/native-app-identity-project.cjs +289 -49
  93. package/dist-lib/native-app-identity-project.mjs +289 -49
  94. package/dist-lib/native-app-identity.cjs +77 -26
  95. package/dist-lib/native-app-identity.mjs +76 -26
  96. package/dist-lib/native-firebase-metadata.cjs +1 -1
  97. package/dist-lib/native-firebase-metadata.mjs +1 -1
  98. package/dist-lib/plist.cjs +1 -1
  99. package/dist-lib/plist.mjs +1 -1
  100. package/dist-lib/profiles.cjs +1 -1
  101. package/dist-lib/public-brand.cjs +1 -1
  102. package/dist-lib/react-native-host-modules.cjs +6 -2
  103. package/dist-lib/react-native-host-modules.mjs +6 -2
  104. package/dist-lib/scripts/dev-server-scanner.cjs +22 -8
  105. package/dist-lib/sdk.cjs +27 -11
  106. package/dist-lib/sdk.mjs +27 -10
  107. package/dist-lib/skills.cjs +72201 -26208
  108. package/dist-lib/swift-compile.cjs +1007 -140
  109. package/dist-lib/swift-compile.mjs +1049 -174
  110. package/dist-lib/swift-package.cjs +12 -3
  111. package/dist-lib/swift-package.mjs +12 -3
  112. package/dist-lib/swift-submit.cjs +13 -5
  113. package/dist-lib/swift-submit.mjs +11 -5
  114. package/dist-lib/swift-toolchain.cjs +423 -33
  115. package/dist-lib/swift.cjs +1 -1
  116. package/dist-lib/vite-swift.cjs +8628 -5268
  117. package/dist-lib/vite.cjs +2859 -12
  118. package/dist-lib/worklet-executable.cjs +14 -2
  119. package/dist-lib/worklet-executable.mjs +14 -2
  120. package/kotlin/AppSources/dev/peach/app/PeachDrawable.kt +21 -14
  121. package/kotlin/Sources/androidx/annotation/DrawableRes.kt +14 -0
  122. package/package.json +1 -1
  123. package/scripts/dev-server-scanner.ts +2 -1
  124. package/skills/peach-perf/SKILL.md +11 -5
  125. package/skills/peach-setup/SKILL.md +16 -19
  126. package/src/backend-origin.ts +13 -6
  127. package/src/bridge-constants.ts +11 -0
  128. package/src/bridge-contract.ts +22 -34
  129. package/src/config.ts +15 -0
  130. package/src/desktop-host-delivery.ts +5 -1
  131. package/src/dev-bundle-resolution.ts +2 -1
  132. package/src/expo-manifest-body.ts +13 -0
  133. package/src/expo-swift-host.ts +196 -49
  134. package/src/expo-swift-ready.ts +78 -0
  135. package/src/expoKotlinContract.ts +4 -7
  136. package/src/expoSwiftContract.ts +17 -6
  137. package/src/home-paths.ts +48 -2
  138. package/src/host/bridge-host.ts +5 -2
  139. package/src/host/staged-host-files.ts +9 -0
  140. package/src/native-app-identity-project.ts +27 -6
  141. package/src/native-app-identity.ts +91 -4
  142. package/src/native-firebase-config.ts +209 -13
  143. package/src/nativeAppIconContract.ts +1 -4
  144. package/src/output-lock-stdio.ts +36 -0
  145. package/src/process-group.ts +25 -2
  146. package/src/react-native-bridge-modules.ts +431 -0
  147. package/src/react-native-host-modules.ts +8 -1
  148. package/src/settings-bundle.ts +1 -4
  149. package/src/swift-binary-modules.ts +2 -2
  150. package/src/swift-compile.ts +918 -109
  151. package/src/swift-compiler-digest.ts +14 -0
  152. package/src/swift-distribution.lock.json +24 -12
  153. package/src/swift-distribution.ts +103 -4
  154. package/src/swift-host.ts +180 -55
  155. package/src/swift-icu.ts +27 -13
  156. package/src/swift-objc-compile.ts +355 -0
  157. package/src/swift-objc-sdk.ts +821 -27
  158. package/src/swift-objc-standin.ts +148 -14
  159. package/src/swift-package-manifest.ts +60 -7
  160. package/src/swift-package.ts +15 -1
  161. package/src/swift-packages.ts +154 -81
  162. package/src/swift-standin-emit.ts +96 -15
  163. package/src/swift-standins.ts +530 -116
  164. package/src/swift-submit.ts +13 -5
  165. package/src/swift-toolchain.ts +500 -42
  166. package/src/vite-plugin.ts +12 -1
  167. package/src/worker-system-chunks.ts +11 -12
  168. package/src/worklet-executable.ts +19 -1
  169. package/src/xcode-project.ts +270 -30
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.1625 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1640 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -2086,7 +2086,7 @@ function collectConfiguredFileModules(config) {
2086
2086
  }
2087
2087
  function isPeachConfig(value) {
2088
2088
  if (!isRecord(value)) return false;
2089
- return (value.nativeRenderer === void 0 || value.nativeRenderer === "paper" || value.nativeRenderer === "fabric") && (value.runtimeVersion === void 0 || typeof value.runtimeVersion === "string" && value.runtimeVersion === value.runtimeVersion.trim() && isValidRuntimeVersion(value.runtimeVersion)) && [
2089
+ return (value.nativeRenderer === void 0 || value.nativeRenderer === "paper" || value.nativeRenderer === "fabric") && (value.mapKit === void 0 || isRecord(value.mapKit) && typeof value.mapKit.token === "string" && value.mapKit.token.length > 0 && value.mapKit.token === value.mapKit.token.trim()) && (value.runtimeVersion === void 0 || typeof value.runtimeVersion === "string" && value.runtimeVersion === value.runtimeVersion.trim() && isValidRuntimeVersion(value.runtimeVersion)) && [
2090
2090
  "modules",
2091
2091
  "packages",
2092
2092
  "turboModules",
@@ -2095,6 +2095,7 @@ function isPeachConfig(value) {
2095
2095
  "env",
2096
2096
  "network",
2097
2097
  "settings",
2098
+ "initialProps",
2098
2099
  "initialState"
2099
2100
  ].every((key) => value[key] === void 0 || isRecord(value[key])) && (value.packages === void 0 || isRecord(value.packages) && Object.values(value.packages).every(isPackageStubs)) && (value.nativeViews === void 0 || isRecord(value.nativeViews) && Object.values(value.nativeViews).every(
2100
2101
  (entry) => entry === "noop" || isNativeViewSource(entry) || isRecord(entry) && typeof entry.file === "string" && entry.file.length > 0
@@ -2141,7 +2142,7 @@ function hasOwnKeys(value) {
2141
2142
  }
2142
2143
  function hasPeachConfig(config) {
2143
2144
  if (!config) return false;
2144
- return config.nativeRenderer !== void 0 || typeof config.runtimeVersion === "string" && config.runtimeVersion.length > 0 || hasOwnKeys(config.modules) || hasOwnKeys(config.turboModules) || hasOwnKeys(config.nativeModules) || hasOwnKeys(config.nativeViews) || hasOwnKeys(config.env) || hasOwnKeys(config.network?.remap) || hasOwnKeys(config.settings) || hasOwnKeys(config.initialState);
2145
+ return config.nativeRenderer !== void 0 || config.mapKit !== void 0 || typeof config.runtimeVersion === "string" && config.runtimeVersion.length > 0 || hasOwnKeys(config.modules) || hasOwnKeys(config.turboModules) || hasOwnKeys(config.nativeModules) || hasOwnKeys(config.nativeViews) || hasOwnKeys(config.env) || hasOwnKeys(config.network?.remap) || hasOwnKeys(config.settings) || hasOwnKeys(config.initialProps) || hasOwnKeys(config.initialState);
2145
2146
  }
2146
2147
  function mergePeachConfig(base, override) {
2147
2148
  if (!hasPeachConfig(base) && !hasPeachConfig(override)) return void 0;
@@ -2150,6 +2151,7 @@ function mergePeachConfig(base, override) {
2150
2151
  return {
2151
2152
  runtimeVersion: override.runtimeVersion ?? base.runtimeVersion,
2152
2153
  nativeRenderer: override.nativeRenderer ?? base.nativeRenderer,
2154
+ mapKit: override.mapKit ?? base.mapKit,
2153
2155
  modules: { ...base.modules || {}, ...override.modules || {} },
2154
2156
  turboModules: { ...base.turboModules || {}, ...override.turboModules || {} },
2155
2157
  nativeModules: {
@@ -2165,6 +2167,7 @@ function mergePeachConfig(base, override) {
2165
2167
  ...base.settings || {},
2166
2168
  ...override.settings || {}
2167
2169
  },
2170
+ initialProps: { ...base.initialProps || {}, ...override.initialProps || {} },
2168
2171
  initialState: { ...base.initialState || {}, ...override.initialState || {} }
2169
2172
  };
2170
2173
  }
@@ -5323,7 +5326,25 @@ function resolveAppStubs(appDir, config, configDir) {
5323
5326
  baseDir: dir
5324
5327
  });
5325
5328
  }
5326
- for (const [target, stubs2] of Object.entries(config?.packages ?? {})) {
5329
+ const configuredPackages = Object.entries(config?.packages ?? {});
5330
+ const packageNames = /* @__PURE__ */ new Set();
5331
+ if (typeof manifest?.name === "string") packageNames.add(manifest.name);
5332
+ for (const [target] of configuredPackages) {
5333
+ const dir = installedPackageDir(appDir, target);
5334
+ if (dir && readPackageJson(dir)?.name === target) packageNames.add(target);
5335
+ }
5336
+ if (manifest && configuredPackages.some(([target]) => !packageNames.has(target))) {
5337
+ for (const root of [appDir, ...workspacePackageDirs(appDir, manifest)])
5338
+ for (const dir of scanRepository(root).directories) {
5339
+ const name2 = readPackageJson(dir)?.name;
5340
+ if (typeof name2 === "string") packageNames.add(name2);
5341
+ }
5342
+ }
5343
+ for (const [target, stubs2] of configuredPackages) {
5344
+ if (manifest && !packageNames.has(target))
5345
+ throw new Error(
5346
+ `packages[${JSON.stringify(target)}]: no installed or local package has this name; use the name from the package's package.json`
5347
+ );
5327
5348
  sources.push({
5328
5349
  target,
5329
5350
  origin: "config",
@@ -5477,25 +5498,48 @@ function packageNativeRequests(dir) {
5477
5498
  (a, b) => a.kind.localeCompare(b.kind) || a.name.localeCompare(b.name)
5478
5499
  );
5479
5500
  }
5480
- function wireSlotMigration(appDir, wire) {
5501
+ function dependencyNativeOwners(appDir, manifest) {
5481
5502
  const owners = /* @__PURE__ */ new Map();
5482
- const manifest = readProjectManifest(appDir);
5483
5503
  for (const name2 of Object.keys({
5484
5504
  ...manifest?.devDependencies,
5485
5505
  ...manifest?.dependencies
5486
5506
  })) {
5487
5507
  const dir = installedPackageDir(appDir, name2);
5488
- if (!dir) continue;
5508
+ if (!dir || !dir.split("/").includes("node_modules")) continue;
5489
5509
  for (const request of packageNativeRequests(dir))
5490
5510
  if (!owners.has(`${request.kind}:${request.name}`))
5491
5511
  owners.set(`${request.kind}:${request.name}`, name2);
5492
5512
  }
5493
- if (typeof manifest?.name === "string") {
5494
- for (const request of packageNativeRequests(appDir))
5513
+ return owners;
5514
+ }
5515
+ function configModule(configPath, packages) {
5516
+ const body = [" packages: {", ...packages, " },"];
5517
+ if (configPath && (configPath.endsWith(".cjs") || configPath.endsWith(".js") && /\bmodule\.exports\b/.test(readSmallFile(configPath) ?? "")))
5518
+ return ["module.exports = {", ...body, "}"].join("\n");
5519
+ return [
5520
+ `import { defineConfig } from '${rnxPublicBrand.packageName}/config'`,
5521
+ "",
5522
+ "export default defineConfig({",
5523
+ ...body,
5524
+ "})"
5525
+ ].join("\n");
5526
+ }
5527
+ function wireSlotMigration(appDir, configPath, wire, kept = []) {
5528
+ const manifest = readProjectManifest(appDir);
5529
+ const owners = dependencyNativeOwners(appDir, manifest);
5530
+ if (manifest) {
5531
+ for (const request of scanLocalNative(
5532
+ appDir,
5533
+ manifest,
5534
+ { module: /* @__PURE__ */ new Set(), view: /* @__PURE__ */ new Set() },
5535
+ void 0,
5536
+ /* @__PURE__ */ new Set(),
5537
+ true,
5538
+ owners
5539
+ ))
5495
5540
  if (!owners.has(`${request.kind}:${request.name}`))
5496
- owners.set(`${request.kind}:${request.name}`, manifest.name);
5541
+ owners.set(`${request.kind}:${request.name}`, request.package);
5497
5542
  }
5498
- const unknownOwner = "<package that asks for it>";
5499
5543
  const blocks = /* @__PURE__ */ new Map();
5500
5544
  const manual = [];
5501
5545
  for (const [kind, entries] of [
@@ -5510,7 +5554,13 @@ function wireSlotMigration(appDir, wire) {
5510
5554
  );
5511
5555
  continue;
5512
5556
  }
5513
- const owner = owners.get(`${kind}:${name2}`) ?? unknownOwner;
5557
+ const owner = owners.get(`${kind}:${name2}`);
5558
+ if (!owner) {
5559
+ manual.push(
5560
+ `${name2}: no requesting package was found; find the package that requests this ${kind} before adding its packages entry`
5561
+ );
5562
+ continue;
5563
+ }
5514
5564
  const block = blocks.get(owner) ?? { modules: [], views: [] };
5515
5565
  block[kind === "module" ? "modules" : "views"].push(
5516
5566
  `[${JSON.stringify(name2)}]: ${stub}`
@@ -5525,9 +5575,17 @@ function wireSlotMigration(appDir, wire) {
5525
5575
  ].filter(Boolean);
5526
5576
  return ` [${JSON.stringify(owner)}]: { ${parts.join(", ")} },`;
5527
5577
  });
5578
+ if (lines.length && kept.length)
5579
+ return [
5580
+ ...manual.map((line) => `// ${line}`),
5581
+ `// keep ${kept.join(", ")}; merge these into packages`,
5582
+ " packages: {",
5583
+ ...lines,
5584
+ " },"
5585
+ ].join("\n");
5528
5586
  return [
5529
- ...lines.length ? [" packages: {", ...lines, " },"] : [],
5530
- ...manual.map((line) => ` // ${line}`)
5587
+ ...manual.map((line) => `// ${line}`),
5588
+ ...lines.length ? [configModule(configPath, lines)] : []
5531
5589
  ].join("\n");
5532
5590
  }
5533
5591
  function listDir(dir) {
@@ -5544,7 +5602,124 @@ function readSmallFile(file) {
5544
5602
  return null;
5545
5603
  }
5546
5604
  }
5547
- var import_node_fs11, import_node_path10, import_version_range, import_oxc_parser2, import_sucrase, SOURCE_FILE, NATIVE_LOOKUP, NATIVE_SOURCE_DIRS, PACKAGE_SKIP_DIRS;
5605
+ function hasNativeCode(dir, platform) {
5606
+ const expoConfig = (0, import_node_path10.join)(dir, "expo-module.config.json");
5607
+ const platforms = metadataValue(readProjectJson(expoConfig), "platforms");
5608
+ if (Array.isArray(platforms))
5609
+ return platforms.includes(platform) || platform === "ios" && platforms.includes("apple");
5610
+ if ([platform, "expo-module.config.json"].some((entry) => (0, import_node_fs11.existsSync)((0, import_node_path10.join)(dir, entry))))
5611
+ return true;
5612
+ if (listDir(dir).some((name2) => name2.endsWith(".podspec"))) return true;
5613
+ const manifest = readSmallFile((0, import_node_path10.join)(dir, "package.json"));
5614
+ return manifest !== null && manifest.includes('"codegenConfig"');
5615
+ }
5616
+ function scanLocalNative(appDir, pkg, answered, platform, knownPackages = /* @__PURE__ */ new Set(), includeLegacy = false, providers) {
5617
+ const expoModuleDirs = [];
5618
+ const excludedModuleDirs = [];
5619
+ const sourceFiles = [];
5620
+ for (const root of [appDir, ...workspacePackageDirs(appDir, pkg)]) {
5621
+ for (const dir of scanRepository(root).directories) {
5622
+ if (excludedModuleDirs.some(
5623
+ (excluded) => dir === excluded || dir.startsWith(`${excluded}/`)
5624
+ ))
5625
+ continue;
5626
+ if ((0, import_node_fs11.existsSync)((0, import_node_path10.join)(dir, "expo-module.config.json"))) {
5627
+ if (platform && !hasNativeCode(dir, platform)) {
5628
+ excludedModuleDirs.push(dir);
5629
+ continue;
5630
+ }
5631
+ expoModuleDirs.push(dir);
5632
+ }
5633
+ for (const name2 of listDir(dir)) {
5634
+ if (SOURCE_FILE.test(name2) && !name2.endsWith(".d.ts"))
5635
+ sourceFiles.push((0, import_node_path10.join)(dir, name2));
5636
+ }
5637
+ }
5638
+ }
5639
+ const nativeFilesByModule = new Map(
5640
+ expoModuleDirs.map((dir) => [
5641
+ dir,
5642
+ scanRepository(dir).directories.flatMap(
5643
+ (sub) => listDir(sub).filter((name2) => NATIVE_SOURCE_FILE.test(name2)).map((name2) => (0, import_node_path10.join)(sub, name2))
5644
+ )
5645
+ ])
5646
+ );
5647
+ const owners = /* @__PURE__ */ new Map();
5648
+ const owner = (dir) => {
5649
+ const known = owners.get(dir);
5650
+ if (known) return known;
5651
+ const name2 = readPackageJson(dir)?.name;
5652
+ const parent = (0, import_node_path10.dirname)(dir);
5653
+ const result = typeof name2 === "string" ? name2 : parent === dir ? pkg.name ?? "app" : owner(parent);
5654
+ owners.set(dir, result);
5655
+ return result;
5656
+ };
5657
+ const found = /* @__PURE__ */ new Map();
5658
+ const add = (kind, name2, file, line) => {
5659
+ const key = `${kind}:${name2}`;
5660
+ if (found.has(key)) return;
5661
+ providers ??= dependencyNativeOwners(appDir, pkg);
5662
+ const packageName = providers.get(key) ?? owner((0, import_node_path10.dirname)(file));
5663
+ if (knownPackages.has(packageName)) return;
5664
+ const moduleDir = expoModuleDirs.find((dir) => file.startsWith(`${dir}/`)) ?? null;
5665
+ found.set(key, {
5666
+ kind,
5667
+ name: name2,
5668
+ package: packageName,
5669
+ path: `${(0, import_node_path10.relative)(appDir, file)}:${line}`,
5670
+ expoModule: moduleDir ? (0, import_node_path10.relative)(appDir, moduleDir) || "." : null,
5671
+ swift: moduleDir ? (nativeFilesByModule.get(moduleDir) ?? []).some(
5672
+ (path14) => path14.endsWith(".swift")
5673
+ ) : false,
5674
+ answered: answered[kind].has(name2)
5675
+ });
5676
+ };
5677
+ for (const file of sourceFiles) {
5678
+ const text2 = readSmallFile(file);
5679
+ if (!text2) continue;
5680
+ for (const { kind, name: name2, line } of sourceNativeRequests(file, text2, includeLegacy))
5681
+ add(kind, name2, file, line);
5682
+ }
5683
+ for (const [, files] of nativeFilesByModule) {
5684
+ const swiftFirst = [...files].sort(
5685
+ (a, b) => Number(b.endsWith(".swift")) - Number(a.endsWith(".swift"))
5686
+ );
5687
+ for (const file of swiftFirst) {
5688
+ const text2 = readSmallFile(file);
5689
+ if (!text2) continue;
5690
+ for (const match of text2.matchAll(/\bName\(\s*"(\w+)"\s*\)/g)) {
5691
+ if (match[1])
5692
+ add("module", match[1], file, text2.slice(0, match.index).split("\n").length);
5693
+ }
5694
+ }
5695
+ }
5696
+ return [...found.values()].sort(
5697
+ (a, b) => a.kind.localeCompare(b.kind) || a.name.localeCompare(b.name)
5698
+ );
5699
+ }
5700
+ function workspacePackageDirs(appDir, pkg) {
5701
+ const dirs = /* @__PURE__ */ new Set();
5702
+ for (const name2 of Object.keys({ ...pkg.dependencies, ...pkg.devDependencies })) {
5703
+ let current = appDir;
5704
+ while (true) {
5705
+ const link = (0, import_node_path10.join)(current, "node_modules", name2);
5706
+ if ((0, import_node_fs11.existsSync)(link)) {
5707
+ if ((0, import_node_fs11.lstatSync)(link).isSymbolicLink()) {
5708
+ const target = (0, import_node_fs11.realpathSync)(link);
5709
+ if (!target.split("/").includes("node_modules") && !target.startsWith(`${appDir}/`)) {
5710
+ dirs.add(target);
5711
+ }
5712
+ }
5713
+ break;
5714
+ }
5715
+ const parent = (0, import_node_path10.dirname)(current);
5716
+ if (parent === current) break;
5717
+ current = parent;
5718
+ }
5719
+ }
5720
+ return [...dirs];
5721
+ }
5722
+ var import_node_fs11, import_node_path10, import_version_range, import_oxc_parser2, import_sucrase, SOURCE_FILE, NATIVE_LOOKUP, NATIVE_SOURCE_DIRS, PACKAGE_SKIP_DIRS, NATIVE_SOURCE_FILE;
5548
5723
  var init_app_stubs = __esm({
5549
5724
  "cli/app-stubs.ts"() {
5550
5725
  "use strict";
@@ -5555,6 +5730,7 @@ var init_app_stubs = __esm({
5555
5730
  import_sucrase = require("sucrase");
5556
5731
  init_config();
5557
5732
  init_is_record();
5733
+ init_public_brand();
5558
5734
  init_visit_parsed_program();
5559
5735
  init_detect();
5560
5736
  SOURCE_FILE = /\.[cm]?[jt]sx?$/;
@@ -5567,6 +5743,7 @@ var init_app_stubs = __esm({
5567
5743
  "__mocks__",
5568
5744
  "docs"
5569
5745
  ]);
5746
+ NATIVE_SOURCE_FILE = /\.(?:swift|kt)$/;
5570
5747
  }
5571
5748
  });
5572
5749
 
@@ -5622,18 +5799,25 @@ async function loadConfigFile(project) {
5622
5799
  [`${rnxPublicBrand.packageName}/config`]: config_exports
5623
5800
  }
5624
5801
  });
5625
- const loaded2 = await jiti.import(project.configPath, { default: true });
5802
+ const loaded2 = project.configPath.endsWith(".json") ? JSON.parse((0, import_node_fs12.readFileSync)(project.configPath, "utf8")) : await jiti.import(project.configPath, { default: true });
5626
5803
  if (!isPeachConfig(loaded2)) {
5627
5804
  throw new Error("the default export must be a peach config object");
5628
5805
  }
5629
5806
  const wire = WIRE_SLOTS.filter((slot) => loaded2[slot] !== void 0);
5630
5807
  if (wire.length > 0) {
5631
- const migration = wireSlotMigration(project.appDir, {
5632
- modules: { ...loaded2.turboModules, ...loaded2.nativeModules },
5633
- views: { ...loaded2.nativeViews }
5634
- });
5808
+ const slots = WIRE_SLOTS;
5809
+ const kept = Object.entries(loaded2).filter(([key, value]) => !slots.includes(key) && value !== void 0).map(([key]) => key);
5810
+ const migration = wireSlotMigration(
5811
+ project.appDir,
5812
+ project.configPath,
5813
+ {
5814
+ modules: { ...loaded2.turboModules, ...loaded2.nativeModules },
5815
+ views: { ...loaded2.nativeViews }
5816
+ },
5817
+ kept
5818
+ );
5635
5819
  throw new Error(
5636
- `${wire.join(", ")} moved under packages, keyed by the package whose native side they answer. replace them with:
5820
+ `${wire.join(", ")} moved under packages, keyed by the package whose native side they answer. ${kept.length ? "remove them and add" : "replace the config with"}:
5637
5821
  ${migration}`
5638
5822
  );
5639
5823
  }
@@ -5647,10 +5831,11 @@ async function resolveRNXAppConfig(startDir = process.cwd()) {
5647
5831
  const project = resolveAppProject(startDir);
5648
5832
  return { project, ...await loadRNXAppStubs(project) };
5649
5833
  }
5650
- var import_node_path11, import_jiti, WIRE_SLOTS;
5834
+ var import_node_fs12, import_node_path11, import_jiti, WIRE_SLOTS;
5651
5835
  var init_app_config = __esm({
5652
5836
  "cli/app-config.ts"() {
5653
5837
  "use strict";
5838
+ import_node_fs12 = require("node:fs");
5654
5839
  import_node_path11 = __toESM(require("node:path"), 1);
5655
5840
  import_jiti = require("jiti");
5656
5841
  init_config();
@@ -5747,14 +5932,14 @@ async function produceConfiguredBundle(source, config, runtimePackages) {
5747
5932
  const neededPackages = /* @__PURE__ */ new Set();
5748
5933
  const factories = [];
5749
5934
  const visit3 = (filePath) => {
5750
- const real = import_node_fs12.default.realpathSync(filePath);
5935
+ const real = import_node_fs13.default.realpathSync(filePath);
5751
5936
  const previous = files.get(real);
5752
5937
  if (previous !== void 0) return previous;
5753
5938
  const id = "peach-config-file:" + files.size;
5754
5939
  files.set(real, id);
5755
5940
  const compiled = compileReplacementModule({
5756
5941
  filePath: real,
5757
- source: import_node_fs12.default.readFileSync(real, "utf8"),
5942
+ source: import_node_fs13.default.readFileSync(real, "utf8"),
5758
5943
  runtimePackages,
5759
5944
  localModuleUrl: (specifier) => visit3(resolveReplacementModuleFile(real, specifier))
5760
5945
  });
@@ -5796,11 +5981,11 @@ async function produceConfiguredBundle(source, config, runtimePackages) {
5796
5981
  const identityStart = findBundleFooter(source, "globalThis.__sootsimModulePaths=");
5797
5982
  return prefix2 + (identityStart < 0 ? source + footer : source.slice(0, identityStart) + footer + source.slice(identityStart));
5798
5983
  }
5799
- var import_node_fs12, import_node_path12, import_sucrase2, import_terser;
5984
+ var import_node_fs13, import_node_path12, import_sucrase2, import_terser;
5800
5985
  var init_configured_bundle_producer = __esm({
5801
5986
  "src/configured-bundle-producer.ts"() {
5802
5987
  "use strict";
5803
- import_node_fs12 = __toESM(require("node:fs"), 1);
5988
+ import_node_fs13 = __toESM(require("node:fs"), 1);
5804
5989
  import_node_path12 = __toESM(require("node:path"), 1);
5805
5990
  import_sucrase2 = require("sucrase");
5806
5991
  import_terser = require("terser");
@@ -5823,7 +6008,7 @@ __export(metro_plugin_exports, {
5823
6008
  module.exports = __toCommonJS(metro_plugin_exports);
5824
6009
  var import_fs3 = __toESM(require("fs"), 1);
5825
6010
  var import_module = require("module");
5826
- var import_node_crypto2 = require("node:crypto");
6011
+ var import_node_crypto3 = require("node:crypto");
5827
6012
  var import_path3 = __toESM(require("path"), 1);
5828
6013
 
5829
6014
  // ../peach-engine/src/platform/adapter.ts
@@ -5956,9 +6141,2250 @@ init_replacement_module_handler();
5956
6141
  // src/installed-package-versions.ts
5957
6142
  var import_fs = __toESM(require("fs"), 1);
5958
6143
  var import_path = __toESM(require("path"), 1);
5959
- var import_lazy_stub_patterns = require("@peach/compat/lazy-stub-patterns");
5960
- var import_native_package_names = require("@peach/compat/native-package-names");
5961
- var import_stub_manifest = require("@peach/compat/stub-manifest");
6144
+
6145
+ // ../peach-compat/src/generated/light-native-package-names.ts
6146
+ var LIGHT_NATIVE_PACKAGE_NAMES = [
6147
+ "@100mslive/react-native-hms",
6148
+ "@account-kit/react-native-signer",
6149
+ "@adobe/react-native-aepassurance",
6150
+ "@adobe/react-native-aepcampaignclassic",
6151
+ "@adobe/react-native-aepedge",
6152
+ "@adobe/react-native-aepedgebridge",
6153
+ "@adobe/react-native-aepedgeconsent",
6154
+ "@adobe/react-native-aepedgeidentity",
6155
+ "@adobe/react-native-aepmessaging",
6156
+ "@adobe/react-native-aepoptimize",
6157
+ "@adobe/react-native-aepplaces",
6158
+ "@adobe/react-native-aeptarget",
6159
+ "@adobe/react-native-aepuserprofile",
6160
+ "@adrekic/expo-meta-wearables-dat",
6161
+ "@adrianso/react-native-device-brightness",
6162
+ "@alexzunik/react-native-money-input",
6163
+ "@algocare/react-native-code-push",
6164
+ "@allboatsrise/expo-marketingcloudsdk",
6165
+ "@ammarahmed/react-native-eventsource",
6166
+ "@ammarahmed/react-native-share-extension",
6167
+ "@ammarahmed/react-native-sodium",
6168
+ "@ammarahmed/react-native-upload",
6169
+ "@amplitude/analytics-react-native",
6170
+ "@amplitude/experiment-react-native-client",
6171
+ "@amplitude/plugin-engagement-react-native",
6172
+ "@amplitude/plugin-session-replay-react-native",
6173
+ "@amplitude/react-native",
6174
+ "@amplitude/session-replay-react-native",
6175
+ "@animo-id/expo-secure-environment",
6176
+ "@ansight/react-native",
6177
+ "@anythingai/launcher",
6178
+ "@appcues/react-native",
6179
+ "@appdynamics/react-native-agent",
6180
+ "@appier/react-native-sdk",
6181
+ "@appmetrica/react-native-analytics",
6182
+ "@ascendtis/react-native-voice-to-text",
6183
+ "@bam.tech/react-native-app-security",
6184
+ "@bam.tech/react-native-config",
6185
+ "@bennyblader/ddk-rn",
6186
+ "@bishaldahal/react-native-khalti-checkout",
6187
+ "@blazejkustra/react-native-alert",
6188
+ "@boterop/react-native-background-timer",
6189
+ "@bounceapp/react-native-paypal",
6190
+ "@brandingbrand/react-native-app-restart",
6191
+ "@breeztech/breez-sdk-spark-react-native",
6192
+ "@brigad/react-native-adservices",
6193
+ "@bsky.app/expo-dynamic-app-icon",
6194
+ "@bsky.app/expo-translate-text",
6195
+ "@bufgix/react-native-secure-window",
6196
+ "@burnt-labs/expo-satya-attest",
6197
+ "@callstack/repack",
6198
+ "@castleio/react-native-castle",
6199
+ "@chargebee/react-native-chargebee",
6200
+ "@checkout.com/checkout-react-native-components",
6201
+ "@clear.sale/behavior-analytics-react-native-sdk",
6202
+ "@cloudflare/react-native-webrtc",
6203
+ "@cloudflare/realtimekit-react-native",
6204
+ "@cloudflare/realtimekit-react-native-ui",
6205
+ "@code-push-next/react-native-code-push",
6206
+ "@coinbase/mobile-wallet-protocol-host",
6207
+ "@coinbase/wallet-mobile-sdk",
6208
+ "@companycam/vibe-check",
6209
+ "@compdfkit_pdf_sdk/react_native",
6210
+ "@consento/sync-randombytes",
6211
+ "@contentsquare/react-native-bridge",
6212
+ "@coralogix/react-native-plugin",
6213
+ "@cordialinc/react-native-sdk",
6214
+ "@curity/identityserver-haapi-react-native-sdk",
6215
+ "@d11/dota",
6216
+ "@d11/marco",
6217
+ "@daily-co/react-native-webrtc",
6218
+ "@dariyd/react-native-text-recognition",
6219
+ "@dashdoc/react-native-system-sounds",
6220
+ "@datadog/mobile-react-native-session-replay",
6221
+ "@datadome/datadome-axios",
6222
+ "@datadome/react-native-datadome",
6223
+ "@datalyr/react-native",
6224
+ "@descope/react-native-sdk",
6225
+ "@deuna/react-native-sdk",
6226
+ "@dev-amirzubair/react-native-voice",
6227
+ "@devikai/react-native",
6228
+ "@devrev/sdk-react-native",
6229
+ "@didit-protocol/sdk-react-native",
6230
+ "@digia-engage/core",
6231
+ "@dub/react-native",
6232
+ "@dynatrace/react-native-plugin",
6233
+ "@edkimmel/expo-audio-stream",
6234
+ "@embrace-io/react-native",
6235
+ "@embrace-io/react-native-tracer-provider",
6236
+ "@empower-nokta/react-native-mobile-ads",
6237
+ "@entria/rn-face-detector",
6238
+ "@entrust.corporation/idvsdk-reactnative",
6239
+ "@evervault/evervault-react-native",
6240
+ "@evrotrust/et-react-native-wl-sdk",
6241
+ "@exodus/react-native-async-storage",
6242
+ "@exodus/react-native-biometrics",
6243
+ "@exodus/react-native-bundle-loader",
6244
+ "@exodus/react-native-fs",
6245
+ "@exodus/react-native-keychain",
6246
+ "@exodus/react-native-nft-viewer",
6247
+ "@exodus/react-native-notifications",
6248
+ "@exodus/react-native-payments",
6249
+ "@exodus/react-native-prompt-android",
6250
+ "@exodus/react-native-reanimated",
6251
+ "@exodus/react-native-screenshot-detector",
6252
+ "@exodus/react-native-wallet",
6253
+ "@exodus/rive-react-native",
6254
+ "@extole/react-native-sdk",
6255
+ "@fedimint/react-native",
6256
+ "@freddixx/react-native-ad-manager",
6257
+ "@freshpaint/freshpaint-react-native",
6258
+ "@frontegg/react-native",
6259
+ "@gainsight-px/react-native-gainsight-px",
6260
+ "@getalby/expo-shared-preferences",
6261
+ "@getcello/cello-react-native",
6262
+ "@getstoryteller/react-native-storyteller-sdk",
6263
+ "@getvouch/react-native-sdk",
6264
+ "@glance-networks/reactnative-bridge",
6265
+ "@google-cloud/recaptcha-enterprise-react-native",
6266
+ "@grafana/faro-react-native",
6267
+ "@granite-js/image",
6268
+ "@granite-js/video",
6269
+ "@hackler/react-native-sdk",
6270
+ "@haroldtran/react-native-thermal-printer",
6271
+ "@heap/react-native-heap",
6272
+ "@heartbot/expo-google-authentication",
6273
+ "@heasy/react-native-sunmi-printer",
6274
+ "@hero-design/react-native-month-year-picker",
6275
+ "@hexigames/react-native-apple-ads-attribution",
6276
+ "@hmscore/react-native-hms-ads",
6277
+ "@hmscore/react-native-hms-availability",
6278
+ "@hmscore/react-native-hms-location",
6279
+ "@hmscore/react-native-hms-map",
6280
+ "@hmscore/react-native-hms-push",
6281
+ "@honeycombio/opentelemetry-react-native",
6282
+ "@hotta/react-native-imagepicker",
6283
+ "@howincodes/expo-dynamic-app-icon",
6284
+ "@ht-sdks/sovran-react-native",
6285
+ "@humansecurity/expo-mobile-sdk",
6286
+ "@humansecurity/react-native-sdk",
6287
+ "@ihealth/ihealthlibrary-react-native",
6288
+ "@imgly/editor-react-native",
6289
+ "@infinitered/react-native-mlkit-face-detection",
6290
+ "@infinitered/react-native-mlkit-object-detection",
6291
+ "@infinitered/react-native-mlkit-text-recognition",
6292
+ "@instana/react-native-agent",
6293
+ "@inthepocket/react-native-service-discovery",
6294
+ "@ionic/portals-react-native",
6295
+ "@ivandigitalsolutions/react-native-camerax",
6296
+ "@jitsi/react-native-sdk",
6297
+ "@join-stories/react-native-widgets",
6298
+ "@json-eval-rs/react-native",
6299
+ "@ketch-com/ketch-react-native",
6300
+ "@klarna/platform-colors",
6301
+ "@launchhq/react-native-keyboard-composer",
6302
+ "@layers/expo-tiktok-business",
6303
+ "@leonsilicon/react-native-list",
6304
+ "@livekit/react-native-krisp-noise-filter",
6305
+ "@lobehub/expo-better-auth-passkey",
6306
+ "@logbrew/react-native",
6307
+ "@mauron85/react-native-background-geolocation",
6308
+ "@mccsoft/react-native-matomo",
6309
+ "@mentra/bluetooth-sdk",
6310
+ "@metamask/react-native-acm",
6311
+ "@metamask/react-native-payments",
6312
+ "@microblink/blinkcard-react-native",
6313
+ "@microsoft/react-native-clarity",
6314
+ "@mitsuharu/react-native-sunmi-printer-library",
6315
+ "@mixpanel/react-native-session-replay",
6316
+ "@moneykit/connect-react-native",
6317
+ "@more-tech/react-native-libsodium",
6318
+ "@mux/mux-react-native-player",
6319
+ "@mykin-ai/expo-audio-stream",
6320
+ "@networkinternational/ni-card-management-sdk",
6321
+ "@nevis-security/nevis-mobile-authentication-sdk-react",
6322
+ "@nexigen/react-native-pre-text",
6323
+ "@nitro-perf-devtools/core",
6324
+ "@norcy/react-native-toolkit",
6325
+ "@npm_fluentco/adflow-react-native-sdk",
6326
+ "@nsure-ai/react-native-client-sdk",
6327
+ "@nuggetslife/vc-rn",
6328
+ "@obsidian_north/react-native-mediastore",
6329
+ "@offline-protocol/mesh-sdk",
6330
+ "@oguzhnatly/react-native-image-manipulator",
6331
+ "@olo/pay-react-native",
6332
+ "@onekeyfe/react-native-aes-crypto",
6333
+ "@onekeyfe/react-native-app-update",
6334
+ "@onekeyfe/react-native-async-storage",
6335
+ "@onekeyfe/react-native-background-thread",
6336
+ "@onekeyfe/react-native-ble-utils",
6337
+ "@onekeyfe/react-native-bundle-crypto",
6338
+ "@onekeyfe/react-native-bundle-update",
6339
+ "@onekeyfe/react-native-check-biometric-auth-changed",
6340
+ "@onekeyfe/react-native-cloud-fs",
6341
+ "@onekeyfe/react-native-cloud-kit-module",
6342
+ "@onekeyfe/react-native-device-utils",
6343
+ "@onekeyfe/react-native-dns-lookup",
6344
+ "@onekeyfe/react-native-get-random-values",
6345
+ "@onekeyfe/react-native-keychain-module",
6346
+ "@onekeyfe/react-native-lite-card",
6347
+ "@onekeyfe/react-native-native-logger",
6348
+ "@onekeyfe/react-native-network-info",
6349
+ "@onekeyfe/react-native-network-throttle",
6350
+ "@onekeyfe/react-native-pbkdf2",
6351
+ "@onekeyfe/react-native-perf-memory",
6352
+ "@onekeyfe/react-native-perf-stats",
6353
+ "@onekeyfe/react-native-ping",
6354
+ "@onekeyfe/react-native-range-downloader",
6355
+ "@onekeyfe/react-native-sni-connect",
6356
+ "@onekeyfe/react-native-splash-screen",
6357
+ "@onekeyfe/react-native-split-bundle-loader",
6358
+ "@onekeyfe/react-native-tab-view",
6359
+ "@onekeyfe/react-native-tcp-socket",
6360
+ "@onekeyfe/react-native-webview-cleaner",
6361
+ "@onekeyfe/react-native-zip-archive",
6362
+ "@onfido/react-native-sdk",
6363
+ "@onramp-sdk/react-native",
6364
+ "@opacity-labs/react-native-opacity",
6365
+ "@openobserve/mobile-react-native",
6366
+ "@openobserve/mobile-react-native-session-replay",
6367
+ "@openobserve/mobile-react-native-webview",
6368
+ "@openreplay/react-native",
6369
+ "@optimove-inc/react-native",
6370
+ "@oracle/react-native-pushiomanager",
6371
+ "@oscilar/react-native-oscilar-module",
6372
+ "@oxyhq/services",
6373
+ "@pagopa/io-react-native-cie",
6374
+ "@pagopa/io-react-native-cieid",
6375
+ "@pagopa/io-react-native-crypto",
6376
+ "@pagopa/io-react-native-http-client",
6377
+ "@pagopa/io-react-native-integrity",
6378
+ "@pagopa/io-react-native-iso18013",
6379
+ "@pagopa/io-react-native-jwt",
6380
+ "@pagopa/io-react-native-login-utils",
6381
+ "@pagopa/io-react-native-secure-storage",
6382
+ "@pagopa/io-react-native-zendesk",
6383
+ "@pagopa/react-native-cie",
6384
+ "@paul_sizon/expo-pdf-text-extract",
6385
+ "@payrails/react-native-sdk",
6386
+ "@paytabs/react-native-paytabs",
6387
+ "@pchmn/expo-material3-theme",
6388
+ "@pdftron/react-native-pdf",
6389
+ "@peacechen/react-native-otp-autocomplete",
6390
+ "@phantom/react-native-juicebox-sdk",
6391
+ "@picovoice/porcupine-react-native",
6392
+ "@picovoice/react-native-voice-processor",
6393
+ "@piwikpro/react-native-piwik-pro-sdk",
6394
+ "@pocketpalai/llama.rn",
6395
+ "@prelude.so/react-native-sdk",
6396
+ "@premieroctet/react-native-wallet",
6397
+ "@primer-io/react-native",
6398
+ "@privy-io/expo-native-extensions",
6399
+ "@psync/anti-jailbreak",
6400
+ "@qonversion/react-native-sdk",
6401
+ "@quidone/react-native-wheel-picker-feedback",
6402
+ "@radiusnetworks/react-native-flybuy-core",
6403
+ "@radiusnetworks/react-native-flybuy-pickup",
6404
+ "@react-native-agconnect/applinking",
6405
+ "@react-native-community/clipboard",
6406
+ "@react-native-community/cookies",
6407
+ "@react-native-community/voice",
6408
+ "@react-native-kakao/core",
6409
+ "@react-native-kakao/share",
6410
+ "@react-native-kakao/social",
6411
+ "@react-native-kakao/user",
6412
+ "@react-native-karte/core",
6413
+ "@react-native-karte/in-app-messaging",
6414
+ "@react-native-karte/notification",
6415
+ "@react-native-seoul/kakao-login",
6416
+ "@react-native-zohosalesiq/mobilisten",
6417
+ "@react-native-zohosalesiq/mobilisten-core",
6418
+ "@reclaimprotocol/inapp-rn-sdk",
6419
+ "@reeq/react-native-device-brightness",
6420
+ "@reeq/react-native-passkit",
6421
+ "@regulaforensics/document-reader",
6422
+ "@regulaforensics/face-sdk",
6423
+ "@regulaforensics/idv",
6424
+ "@regulaforensics/react-native-document-reader-api",
6425
+ "@revopush/react-native-code-push",
6426
+ "@riskified/react-native-riskified-sdk",
6427
+ "@rownd/react-native",
6428
+ "@ryftpay/react-native",
6429
+ "@sap_oss/gigya-react-native-plugin-for-sap-customer-data-cloud",
6430
+ "@sayem314/react-native-keep-awake",
6431
+ "@secondts/bark-react-native",
6432
+ "@segment/analytics-react-native-plugin-idfa",
6433
+ "@selligent-marketing-cloud/selligent-react-native",
6434
+ "@semisquircle/expo-dynamic-app-icon",
6435
+ "@seontechnologies/seon-react-native-mobile-wrapper",
6436
+ "@serserm/react-native-turbo-serialport",
6437
+ "@shadahmad7/react-native-calendar",
6438
+ "@shadahmad7/react-native-store-review",
6439
+ "@shenai/react-native-sdk",
6440
+ "@sherlo/react-native-storybook",
6441
+ "@simula/ads-react-native",
6442
+ "@siteed/sherpa-onnx.rn",
6443
+ "@six33/react-native-bg-removal",
6444
+ "@socure-inc/docv-react-native",
6445
+ "@socure-inc/react-native-device-risk",
6446
+ "@solidx/react-native-true-sheet",
6447
+ "@somesoap/react-native-image-palette",
6448
+ "@sourcepoint/react-native-cmp",
6449
+ "@sourcetoad/react-native-sketch-canvas",
6450
+ "@speechmatics/expo-two-way-audio",
6451
+ "@splitsoftware/splitio-react-native",
6452
+ "@splunk/otel-react-native",
6453
+ "@stream-io/noise-cancellation-react-native",
6454
+ "@stream-io/react-native-callingx",
6455
+ "@stream-io/react-native-webrtc",
6456
+ "@stream-io/video-filters-react-native",
6457
+ "@sumsub/react-native-mobilesdk-module",
6458
+ "@superfan-app/apple-music-auth",
6459
+ "@superwall/react-native-superwall",
6460
+ "@tap-payments/apple-pay-rn",
6461
+ "@tap-payments/google-pay-rn",
6462
+ "@taprails/tap-to-pay",
6463
+ "@telnyx/react-voice-commons-sdk",
6464
+ "@tencentcloud/react-native-push",
6465
+ "@terrylinla/react-native-sketch-canvas",
6466
+ "@thegrizzlylabs/react-native-genius-scan",
6467
+ "@theoplayer/react-native-analytics-adobe",
6468
+ "@theoplayer/react-native-analytics-adobe-edge",
6469
+ "@theoplayer/react-native-analytics-bitmovin",
6470
+ "@theoplayer/react-native-analytics-conviva",
6471
+ "@theoplayer/react-native-analytics-gemius",
6472
+ "@theoplayer/react-native-analytics-mux",
6473
+ "@theoplayer/react-native-analytics-nielsen",
6474
+ "@theoplayer/react-native-analytics-youbora",
6475
+ "@theoplayer/react-native-engage",
6476
+ "@tillpos/rn-receipt-printer-utils",
6477
+ "@timwangdev/react-native-geocoder",
6478
+ "@trycourier/courier-react-native",
6479
+ "@tryvital/vital-core-react-native",
6480
+ "@tryvital/vital-health-react-native",
6481
+ "@ttwrpz/react-native-brightness-setting",
6482
+ "@tursodatabase/sync-react-native",
6483
+ "@twilio/video-react-native-sdk",
6484
+ "@unifyapps/analytics-react-native",
6485
+ "@unomed/react-native-matrix-sdk",
6486
+ "@userpilot/react-native",
6487
+ "@veriff/react-native-sdk",
6488
+ "@verisoul_ai/react-native-verisoul",
6489
+ "@videosdk.live/react-native-webrtc",
6490
+ "@vonage/client-sdk-video-react-native",
6491
+ "@voximplant/react-native-foreground-service",
6492
+ "@wokcito/ffmpeg-kit-react-native",
6493
+ "@wootric/react-native-wootric",
6494
+ "@wscsports/blaze-rtn-sdk",
6495
+ "@wwimmo/react-native-sketch-canvas",
6496
+ "@zoom/meetingsdk-react-native",
6497
+ "@zoom/react-native-videosdk",
6498
+ "agora-react-native-rtm",
6499
+ "aliyun-react-native-push",
6500
+ "amazon-cognito-identity-js",
6501
+ "apple-pay-react-native-expo",
6502
+ "apptentive-react-native",
6503
+ "arlon-test-library",
6504
+ "bcrypt-react-native",
6505
+ "bitlabs",
6506
+ "brick-module",
6507
+ "bridgefy-react-native",
6508
+ "chartbeat-react-native-bridge-sdk",
6509
+ "cleverpush-react-native",
6510
+ "cloudx-react-native",
6511
+ "cm-sdk-react-native-v3-new-arch",
6512
+ "cobrowse-sdk-react-native",
6513
+ "cojson-core-rn",
6514
+ "contour-ai-sdk",
6515
+ "create-react-native-library",
6516
+ "crisp-sdk-react-native",
6517
+ "cui-llama.rn",
6518
+ "dynamsoft-capture-vision-react-native",
6519
+ "expo-activity-motion",
6520
+ "expo-ai-kit",
6521
+ "expo-app-blocker",
6522
+ "expo-audio-stream-pcm",
6523
+ "expo-barcode-scanner",
6524
+ "expo-brownfield",
6525
+ "expo-check-installed-apps",
6526
+ "expo-esim",
6527
+ "expo-face-check",
6528
+ "expo-face-detector",
6529
+ "expo-font-fallback",
6530
+ "expo-google-places",
6531
+ "expo-google-places-autocomplete",
6532
+ "expo-guided-access",
6533
+ "expo-http-server",
6534
+ "expo-image-and-video-compressor",
6535
+ "expo-in-app-purchases",
6536
+ "expo-kiosk-control",
6537
+ "expo-media-viewer",
6538
+ "expo-mlkit-ocr",
6539
+ "expo-native-launch-arguments",
6540
+ "expo-ocr-kit",
6541
+ "expo-onesignal-live-activities",
6542
+ "expo-otp-autofill",
6543
+ "expo-pdf-text-extract",
6544
+ "expo-react-native-adapter",
6545
+ "expo-realtime-audio",
6546
+ "expo-realtime-ivs-broadcast",
6547
+ "expo-reteno-sdk",
6548
+ "expo-samsung-pay",
6549
+ "expo-speech-transcriber",
6550
+ "expo-store-checker",
6551
+ "expo-text-extractor",
6552
+ "expo-tiktok-ads-events",
6553
+ "expo-tnk",
6554
+ "expo-torch",
6555
+ "expo-trim-video",
6556
+ "expo-ttp-edu",
6557
+ "expo-vpn-checker",
6558
+ "expo-widget",
6559
+ "expo-yandex-mapkit",
6560
+ "facepass-react-native-module",
6561
+ "fast-mlkit-translate-text",
6562
+ "framepayments-react-native",
6563
+ "getsocial-react-native-sdk",
6564
+ "helpshift-plugin-sdkx-react-native",
6565
+ "hyper-sdk-react",
6566
+ "hypertrack-sdk-react-native",
6567
+ "hypertrack-sdk-react-native-plugin-android-activity-service-google",
6568
+ "hypertrack-sdk-react-native-plugin-android-location-services-google",
6569
+ "hypertrack-sdk-react-native-plugin-android-push-service-firebase",
6570
+ "idwise-react-native-sdk",
6571
+ "infobip-mobile-messaging-react-native-plugin",
6572
+ "jcore-react-native",
6573
+ "jpush-react-native",
6574
+ "judokit-react-native",
6575
+ "localytics-react-native",
6576
+ "mappls-map-react-native",
6577
+ "mindbox-sdk",
6578
+ "mobile-payments-sdk-react-native",
6579
+ "mychips-react-sdk",
6580
+ "myfatoorah-reactnative",
6581
+ "neuroid-reactnative-sdk",
6582
+ "nodejs-mobile-react-native",
6583
+ "notifly-sdk",
6584
+ "onnxruntime-react-native",
6585
+ "opentok-react-native",
6586
+ "otpless-headless-rn-lite",
6587
+ "payme-mini-app",
6588
+ "payu-non-seam-less-react",
6589
+ "ping-openmls-sdk-react-native-macos",
6590
+ "plotline-engage",
6591
+ "pulse-updates",
6592
+ "ratex-react-native",
6593
+ "raygun4reactnative",
6594
+ "react-airplay",
6595
+ "react-native-accessibility-wrapper",
6596
+ "react-native-acoustic-connect-beta",
6597
+ "react-native-address-autocomplete",
6598
+ "react-native-adjust-oaid",
6599
+ "react-native-advertising-id",
6600
+ "react-native-agora-chat",
6601
+ "react-native-airplay-btn",
6602
+ "react-native-alarm-scheduler",
6603
+ "react-native-android-installed-apps-unblocking",
6604
+ "react-native-android-location-services-dialog-box",
6605
+ "react-native-android-log",
6606
+ "react-native-android-navbar-height",
6607
+ "react-native-android-notification-listener",
6608
+ "react-native-android-open-settings",
6609
+ "react-native-apay",
6610
+ "react-native-app-icon-changer",
6611
+ "react-native-appearance",
6612
+ "react-native-apple-payment",
6613
+ "react-native-appodeal",
6614
+ "react-native-appstore-version-checker",
6615
+ "react-native-apxor-rtm-plugin",
6616
+ "react-native-apxor-sdk",
6617
+ "react-native-argon2",
6618
+ "react-native-attribution-token",
6619
+ "react-native-audio",
6620
+ "react-native-audio-record",
6621
+ "react-native-background-color",
6622
+ "react-native-background-guardian",
6623
+ "react-native-background-remover",
6624
+ "react-native-battery-optimization-check",
6625
+ "react-native-beacon-radar",
6626
+ "react-native-bg-thread",
6627
+ "react-native-bildit-flybuy-core",
6628
+ "react-native-bildit-flybuy-pickup",
6629
+ "react-native-ble-advertiser",
6630
+ "react-native-blob-jsi-helper",
6631
+ "react-native-bluetooth-escpos-printer",
6632
+ "react-native-bottomsheet",
6633
+ "react-native-braintree-dropin-ui",
6634
+ "react-native-bspatch",
6635
+ "react-native-build-config",
6636
+ "react-native-bureauid-fraud-sdk",
6637
+ "react-native-caffe2",
6638
+ "react-native-call-detection",
6639
+ "react-native-call-log",
6640
+ "react-native-capture",
6641
+ "react-native-carrier-info",
6642
+ "react-native-channel-plugin",
6643
+ "react-native-check-biometric-auth-changed",
6644
+ "react-native-chottulink-sdk",
6645
+ "react-native-clarity",
6646
+ "react-native-clusterer",
6647
+ "react-native-code-push-diff",
6648
+ "react-native-connectivity-status",
6649
+ "react-native-convert-ph-asset",
6650
+ "react-native-converted-in-sdk",
6651
+ "react-native-cookies",
6652
+ "react-native-copy",
6653
+ "react-native-crash-tester",
6654
+ "react-native-crisp-chat-sdk",
6655
+ "react-native-cumquat",
6656
+ "react-native-customui",
6657
+ "react-native-daro-m",
6658
+ "react-native-datawedge-intents",
6659
+ "react-native-detect-frida",
6660
+ "react-native-device-activity",
6661
+ "react-native-device-crypto",
6662
+ "react-native-device-time-format",
6663
+ "react-native-device-uptime",
6664
+ "react-native-digitcamera",
6665
+ "react-native-doc-viewer",
6666
+ "react-native-easy-apple-pay",
6667
+ "react-native-encrypted-storage",
6668
+ "react-native-esc-pos-printer",
6669
+ "react-native-exif",
6670
+ "react-native-expo-metamap-sdk",
6671
+ "react-native-exponea-sdk",
6672
+ "react-native-fast-base64",
6673
+ "react-native-fast-crypto",
6674
+ "react-native-fast-encoder",
6675
+ "react-native-fast-openpgp",
6676
+ "react-native-fast-pbkdf2",
6677
+ "react-native-fast-rsa",
6678
+ "react-native-fatos-sdk",
6679
+ "react-native-fbsdk",
6680
+ "react-native-fetch-blob",
6681
+ "react-native-filament-buildcores",
6682
+ "react-native-firebaseui-auth",
6683
+ "react-native-firework-sdk",
6684
+ "react-native-flipper",
6685
+ "react-native-genuin-qa",
6686
+ "react-native-geocoder",
6687
+ "react-native-geocoder-reborn",
6688
+ "react-native-get-sms-android",
6689
+ "react-native-get-values",
6690
+ "react-native-gif",
6691
+ "react-native-gleapsdk",
6692
+ "react-native-global-exception-handler",
6693
+ "react-native-google-analytics-bridge",
6694
+ "react-native-google-pay",
6695
+ "react-native-google-play-integrity",
6696
+ "react-native-haptic",
6697
+ "react-native-haptic-patterns",
6698
+ "react-native-hash",
6699
+ "react-native-hce",
6700
+ "react-native-heic-converter",
6701
+ "react-native-helpscout-beacon",
6702
+ "react-native-hmac",
6703
+ "react-native-html-to-pdf-lite",
6704
+ "react-native-hud-hybrid",
6705
+ "react-native-hw-keyboard-event",
6706
+ "react-native-hyperkyc-sdk",
6707
+ "react-native-hyperpay-sdk",
6708
+ "react-native-hyperswitch-dev-sdk",
6709
+ "react-native-icloud-file-picker",
6710
+ "react-native-idfa",
6711
+ "react-native-idfa-aaid",
6712
+ "react-native-image-base64",
6713
+ "react-native-image-code-scanner",
6714
+ "react-native-image-filter-kit",
6715
+ "react-native-image-rotate",
6716
+ "react-native-image-to-pdf",
6717
+ "react-native-images-to-pdf",
6718
+ "react-native-immersive",
6719
+ "react-native-immersive-mode",
6720
+ "react-native-in-app-message",
6721
+ "react-native-incognia",
6722
+ "react-native-infy-camera",
6723
+ "react-native-insider",
6724
+ "react-native-install-referrer",
6725
+ "react-native-installed-app-checker",
6726
+ "react-native-is-detox",
6727
+ "react-native-is-keyboard-connected",
6728
+ "react-native-keyboard-input",
6729
+ "react-native-khipu",
6730
+ "react-native-klarna-inapp-sdk",
6731
+ "react-native-kochava-measurement",
6732
+ "react-native-kochava-measurement-apple-tracking",
6733
+ "react-native-kochava-measurement-google",
6734
+ "react-native-kochava-measurement-google-tracking",
6735
+ "react-native-kochava-tracker",
6736
+ "react-native-launch-navigator",
6737
+ "react-native-layout-guides",
6738
+ "react-native-local-resource",
6739
+ "react-native-marigold",
6740
+ "react-native-marketingcloudsdk",
6741
+ "react-native-mdm",
6742
+ "react-native-mediapipe",
6743
+ "react-native-mediapipe-posedetection",
6744
+ "react-native-metamap-sdk",
6745
+ "react-native-microphone-stream",
6746
+ "react-native-mlkit-ocr",
6747
+ "react-native-modpow",
6748
+ "react-native-moengage-cards",
6749
+ "react-native-moengage-geofence",
6750
+ "react-native-moengage-inbox",
6751
+ "react-native-mov-to-mp4",
6752
+ "react-native-mqtt-file-transfer",
6753
+ "react-native-msal",
6754
+ "react-native-music-control",
6755
+ "react-native-music-control-enhanced",
6756
+ "react-native-nami-sdk",
6757
+ "react-native-native-log",
6758
+ "react-native-netlog-fab",
6759
+ "react-native-netwatch",
6760
+ "react-native-nitro-bg-timer",
6761
+ "react-native-nitro-simple-toast",
6762
+ "react-native-nitro-thermal",
6763
+ "react-native-nitro-version-check",
6764
+ "react-native-notch-info",
6765
+ "react-native-notificare",
6766
+ "react-native-notificare-geo",
6767
+ "react-native-notificare-push",
6768
+ "react-native-notificare-push-ui",
6769
+ "react-native-notifications-utils",
6770
+ "react-native-onetrust-cmp",
6771
+ "react-native-open-notification",
6772
+ "react-native-otp-auto-verify",
6773
+ "react-native-passkeys",
6774
+ "react-native-passkit-wallet",
6775
+ "react-native-passport-reader",
6776
+ "react-native-paypal-web-payments",
6777
+ "react-native-pdf-lib",
6778
+ "react-native-pdf-page-image",
6779
+ "react-native-pdf-thumbnail",
6780
+ "react-native-pdf-to-image",
6781
+ "react-native-pencil-kit",
6782
+ "react-native-performance-stats",
6783
+ "react-native-performance-toolkit",
6784
+ "react-native-persona",
6785
+ "react-native-phonepe-pg",
6786
+ "react-native-play-install-referrer",
6787
+ "react-native-powerauth-mobile-sdk",
6788
+ "react-native-prevent-recent-screenshots",
6789
+ "react-native-qualtrics",
6790
+ "react-native-quantum-metric-library",
6791
+ "react-native-queue-it",
6792
+ "react-native-random-uuid",
6793
+ "react-native-random-values-jsi-helper",
6794
+ "react-native-release-profiler",
6795
+ "react-native-repro",
6796
+ "react-native-restart-android",
6797
+ "react-native-ringer-mode",
6798
+ "react-native-rook-sdk",
6799
+ "react-native-root-jail-detect",
6800
+ "react-native-safe-area",
6801
+ "react-native-scanbot-barcode-scanner-sdk",
6802
+ "react-native-schedule-exact-alarm-permission",
6803
+ "react-native-scoped-storage",
6804
+ "react-native-screenshot-detect",
6805
+ "react-native-session-timeout",
6806
+ "react-native-set-soft-input-mode",
6807
+ "react-native-sfh-library",
6808
+ "react-native-sha1",
6809
+ "react-native-sha256",
6810
+ "react-native-shared-preferences",
6811
+ "react-native-sherpa-onnx",
6812
+ "react-native-shield-fraud-plugin",
6813
+ "react-native-sim-cards-manager",
6814
+ "react-native-simple-crypto",
6815
+ "react-native-simple-heic2jpg",
6816
+ "react-native-skadnetwork",
6817
+ "react-native-smallcase-gateway",
6818
+ "react-native-smartlook-analytics",
6819
+ "react-native-smile-rn-lib",
6820
+ "react-native-smooth-clip-view",
6821
+ "react-native-sms",
6822
+ "react-native-sms-retriever",
6823
+ "react-native-sound-level",
6824
+ "react-native-sound-level-monitor",
6825
+ "react-native-sound-recorder",
6826
+ "react-native-spike-sdk",
6827
+ "react-native-square-in-app-payments",
6828
+ "react-native-ssl-pinning",
6829
+ "react-native-star-prnt-bitmap-fix",
6830
+ "react-native-startup-time",
6831
+ "react-native-static-safe-area-insets",
6832
+ "react-native-static-server",
6833
+ "react-native-store-front",
6834
+ "react-native-swrve-plugin",
6835
+ "react-native-syan-image-picker",
6836
+ "react-native-tappay",
6837
+ "react-native-tapresearch",
6838
+ "react-native-test-flight",
6839
+ "react-native-text-input-reset",
6840
+ "react-native-text-recognition",
6841
+ "react-native-themis",
6842
+ "react-native-thermal-printer",
6843
+ "react-native-thermal-receipt-printer-image-qr",
6844
+ "react-native-tiktok-business",
6845
+ "react-native-tooltips",
6846
+ "react-native-torch",
6847
+ "react-native-transfer-library",
6848
+ "react-native-ts-accountprotection",
6849
+ "react-native-ts-identity-orchestration",
6850
+ "react-native-ts-idv",
6851
+ "react-native-turbo-image-picker",
6852
+ "react-native-uaepass",
6853
+ "react-native-ultimate-config",
6854
+ "react-native-unit-components",
6855
+ "react-native-usb-serialport-for-android",
6856
+ "react-native-user-agent",
6857
+ "react-native-user-identity",
6858
+ "react-native-userleap",
6859
+ "react-native-video-cache-control",
6860
+ "react-native-video-helper",
6861
+ "react-native-virgil-crypto",
6862
+ "react-native-vision-camera-ocr-plus",
6863
+ "react-native-vizbee-homesso-sender-sdk",
6864
+ "react-native-vizbee-receiver-sdk",
6865
+ "react-native-vizbee-sender-sdk",
6866
+ "react-native-vpn-detector",
6867
+ "react-native-vpn-status",
6868
+ "react-native-walkme-sdk",
6869
+ "react-native-wallet",
6870
+ "react-native-wallet-passes",
6871
+ "react-native-webengage",
6872
+ "react-native-webrtc-kaleidoscope",
6873
+ "react-native-websocket-self-signed",
6874
+ "react-native-webview-ios-cache-clear",
6875
+ "react-native-wonderpush",
6876
+ "react-native-wonderpush-fcm",
6877
+ "react-native-wxwork",
6878
+ "react-native-yamap-plus",
6879
+ "react-native-zendesk-messaging",
6880
+ "react-native-zolozkit-tool",
6881
+ "readid-react-native",
6882
+ "rn-android-keyboard-adjust",
6883
+ "rn-audio-toolkit",
6884
+ "rn-encryption",
6885
+ "rn-linkrunner",
6886
+ "rn-mesh-gradient",
6887
+ "rn-pendo-sdk",
6888
+ "rn-star-prnt",
6889
+ "rn-url-resolver",
6890
+ "rxdx_player",
6891
+ "sahha-react-native",
6892
+ "securehybridapptesting",
6893
+ "shuftipro-onsite-mobilesdk",
6894
+ "smartech-push-react-native",
6895
+ "smartech-reactnative-nudges",
6896
+ "srs-heritage-chatbot",
6897
+ "storyly-placement-react-native",
6898
+ "surveysparrow-react-native-sdk",
6899
+ "tapjoy-react-native-sdk",
6900
+ "tealium-react-firebase",
6901
+ "tealium-react-native",
6902
+ "tealium-react-native-attribution",
6903
+ "terra-react",
6904
+ "theta-ble-client-react-native",
6905
+ "theta-client-react-native",
6906
+ "tiktok-opensdk-react-native",
6907
+ "tipsi-stripe",
6908
+ "tp-react-native-bluetooth-printer",
6909
+ "unified-ble-manager",
6910
+ "unity-levelplay-mediation",
6911
+ "usabilla-react-native",
6912
+ "vexo-analytics",
6913
+ "veyra-sdk-react-native",
6914
+ "vitest-mobile",
6915
+ "wix-react-native-text-size",
6916
+ "yandex-mobile-ads",
6917
+ "ymchat-react-native",
6918
+ "zego-express-engine-reactnative",
6919
+ "zego-zim-react-native",
6920
+ "zetakit_reactnative"
6921
+ ];
6922
+
6923
+ // ../peach-compat/src/generated/native-package-names.ts
6924
+ var NATIVE_STUB_PACKAGE_NAMES = [
6925
+ "@10play/tentap-editor",
6926
+ "@adobe/react-native-aepcore",
6927
+ "@alevy97/react-native-userdefaults",
6928
+ "@ankipro/react-native-file-open",
6929
+ "@appzung/react-native-code-push",
6930
+ "@aptabase/react-native",
6931
+ "@assembless/react-native-material-you",
6932
+ "@atomicfi/transact-react-native",
6933
+ "@atproto/oauth-client-expo",
6934
+ "@attarchi/react-native-lottie-splash-screen",
6935
+ "@avasapp/react-native-otp-autofill",
6936
+ "@aws-amplify/react-native",
6937
+ "@azesmway/react-native-unity",
6938
+ "@azzapp/react-native-skia-video",
6939
+ "@babylonjs/react-native",
6940
+ "@bacons/apple-targets",
6941
+ "@bam.tech/react-native-image-resizer",
6942
+ "@baronha/react-native-multiple-image-picker",
6943
+ "@baronha/react-native-photo-editor",
6944
+ "@baronha/ting",
6945
+ "@batch.com/react-native-plugin",
6946
+ "@bear-block/vision-camera-ocr",
6947
+ "@bhojaniasgar/react-native-otp-input",
6948
+ "@bitdrift/react-native",
6949
+ "@bittingz/expo-widgets",
6950
+ "@blackbox-vision/react-native-mercadopago-px",
6951
+ "@borndotcom/react-native-godot",
6952
+ "@bravemobile/react-native-code-push",
6953
+ "@braze/react-native-sdk",
6954
+ "@bsky.app/expo-guess-language",
6955
+ "@bsky.app/expo-image-crop-tool",
6956
+ "@bsky.app/expo-scroll-edge-effect",
6957
+ "@bsky.app/react-native-mmkv",
6958
+ "@bugfender/rn-bugfender",
6959
+ "@bugsnag/react-native",
6960
+ "@bugsnag/react-native-performance",
6961
+ "@callstack/liquid-glass",
6962
+ "@callstack/react-native-bottom-tabs",
6963
+ "@callstack/react-native-brownfield",
6964
+ "@callstack/react-native-local-notifications",
6965
+ "@callstack/react-native-sandbox",
6966
+ "@callstack/react-native-visionos",
6967
+ "@callstack/timezone-hermes-fix",
6968
+ "@candlefinance/faster-image",
6969
+ "@candlefinance/haptics",
6970
+ "@clerk/expo",
6971
+ "@clerk/expo-passkeys",
6972
+ "@cometchat/chat-uikit-react-native",
6973
+ "@computools/react-native-dynamic-app-icon",
6974
+ "@coolsoftwaretyler/cool-pdf",
6975
+ "@criipto/verify-expo",
6976
+ "@d11/react-native-fast-image",
6977
+ "@d11/react-native-mqtt",
6978
+ "@danielsaraldi/react-native-blur-view",
6979
+ "@dariyd/react-native-document-scanner",
6980
+ "@datadog/mobile-react-native",
6981
+ "@dbkable/react-native-speech-to-text",
6982
+ "@didomi/react-native",
6983
+ "@dimaportenko/react-native-shadow-view",
6984
+ "@domir/react-native-measure-text",
6985
+ "@dr.pogodin/react-native-audio",
6986
+ "@dr.pogodin/react-native-fs",
6987
+ "@dr.pogodin/react-native-static-server",
6988
+ "@dylankenneally/react-native-ssh-sftp",
6989
+ "@eabdullazyanov/react-native-sms-user-consent",
6990
+ "@expensify/react-native-background-task",
6991
+ "@expensify/react-native-hybrid-app",
6992
+ "@expensify/react-native-live-markdown",
6993
+ "@expensify/react-native-wallet",
6994
+ "@expo/app-integrity",
6995
+ "@expo/dom-webview",
6996
+ "@expo/ui",
6997
+ "@expo/ui/community/menu",
6998
+ "@extrieve_technologies/quickcapture_react_native",
6999
+ "@fingerprintjs/fingerprintjs-pro-react-native",
7000
+ "@fishjam-cloud/react-native-client",
7001
+ "@fishjam-cloud/react-native-webrtc",
7002
+ "@flitzinteractive/react-native-nitro-html-pdf",
7003
+ "@flyskywhy/react-native-gcanvas",
7004
+ "@fugood/react-native-audio-pcm-stream",
7005
+ "@fullstory/react-native",
7006
+ "@gabriel-sisjr/react-native-background-location",
7007
+ "@generac/react-native-local-network-permission",
7008
+ "@giphy/react-native-sdk",
7009
+ "@gmisoftware/react-native-pay",
7010
+ "@goliapkg/sentori-react-native",
7011
+ "@google/react-native-make-payment",
7012
+ "@googlemaps/react-native-navigation-sdk",
7013
+ "@haroldtran/react-native-pax",
7014
+ "@hot-updater/react-native",
7015
+ "@huymobile/react-native-sms-retriever-nitro-module",
7016
+ "@hyoper/rn-location",
7017
+ "@intercom/intercom-react-native",
7018
+ "@invertase/react-native-apple-authentication",
7019
+ "@iterable/expo-plugin",
7020
+ "@iterable/react-native-sdk",
7021
+ "@iternio/react-native-auto-play",
7022
+ "@joplin/react-native-alarm-notification",
7023
+ "@journeyapps/react-native-quick-sqlite",
7024
+ "@jwplayer/jwplayer-react-native",
7025
+ "@kesha-antonov/react-native-background-downloader",
7026
+ "@kilohealth/rn-fitness-tracker",
7027
+ "@kingstinct/react-native-healthkit",
7028
+ "@kishannareshpal/expo-pdf",
7029
+ "@livekit/react-native",
7030
+ "@livekit/react-native-webrtc",
7031
+ "@lodev09/react-native-exify",
7032
+ "@lodev09/react-native-true-sheet",
7033
+ "@logicwind/react-native-exit-app",
7034
+ "@logicwind/react-native-matomo-tracker",
7035
+ "@logicwind/react-native-status-bar-height",
7036
+ "@logicwind/react-native-tvos-keyboard",
7037
+ "@lomray/react-native-apple-music",
7038
+ "@loqalabs/loqa-expo-dsp",
7039
+ "@lottiefiles/dotlottie-react-native",
7040
+ "@luciq/react-native",
7041
+ "@lugg/maps",
7042
+ "@magrinj/expo-quick-look",
7043
+ "@mapbox/react-native-mapbox-gl",
7044
+ "@maplibre/maplibre-react-native",
7045
+ "@mattermost/react-native-emm",
7046
+ "@mattermost/react-native-network-client",
7047
+ "@mattermost/react-native-paste-input",
7048
+ "@mattermost/react-native-turbo-log",
7049
+ "@mattermost/rnutils",
7050
+ "@meedwire/react-native-image-rotate",
7051
+ "@metamask/native-utils",
7052
+ "@metamask/react-native-search-api",
7053
+ "@metamask/react-native-webview",
7054
+ "@mgcrea/react-native-jetpack-compose",
7055
+ "@mgcrea/vision-camera-barcode-scanner",
7056
+ "@mhpdev/react-native-haptics",
7057
+ "@mhpdev/react-native-speech",
7058
+ "@mj-studio/react-native-naver-map",
7059
+ "@mozzius/expo-dynamic-app-icon",
7060
+ "@nandorojo/galeria",
7061
+ "@notifee/react-native",
7062
+ "@novastera-oss/rn-google-signin",
7063
+ "@nozbe/watermelondb",
7064
+ "@okta/okta-react-native",
7065
+ "@oleg_svetlichnyi/expo-icloud-storage",
7066
+ "@op-engineering/op-sqlite",
7067
+ "@orbital-systems/react-native-esp-idf-provisioning",
7068
+ "@playerdata/react-native-mcu-manager",
7069
+ "@pnthach95/react-native-root-view-background",
7070
+ "@pocketpalai/react-native-speech",
7071
+ "@posthog/react-native-plugin",
7072
+ "@powersync/react-native",
7073
+ "@preeternal/react-native-cookie-manager",
7074
+ "@prisma/react-native",
7075
+ "@purchasely/react-native-purchasely-android-player",
7076
+ "@purchasely/react-native-purchasely-google",
7077
+ "@purchasely/react-native-purchasely-huawei",
7078
+ "@pusher/pusher-websocket-react-native",
7079
+ "@pushpendersingh/react-native-otp-verify",
7080
+ "@pushpendersingh/react-native-scanner",
7081
+ "@react-native-ai/apple",
7082
+ "@react-native-ai/mlc",
7083
+ "@react-native-async-storage/async-storage",
7084
+ "@react-native-camera-roll/camera-roll",
7085
+ "@react-native-clipboard/clipboard",
7086
+ "@react-native-community/audio-toolkit",
7087
+ "@react-native-community/blur",
7088
+ "@react-native-community/checkbox",
7089
+ "@react-native-community/datetimepicker",
7090
+ "@react-native-community/geolocation",
7091
+ "@react-native-community/image-editor",
7092
+ "@react-native-community/masked-view",
7093
+ "@react-native-community/netinfo",
7094
+ "@react-native-community/progress-bar-android",
7095
+ "@react-native-community/progress-view",
7096
+ "@react-native-community/push-notification-ios",
7097
+ "@react-native-community/slider",
7098
+ "@react-native-community/toolbar-android",
7099
+ "@react-native-cookies/cookies",
7100
+ "@react-native-documents/picker",
7101
+ "@react-native-documents/viewer",
7102
+ "@react-native-drivekit/core",
7103
+ "@react-native-drivekit/driver-data",
7104
+ "@react-native-firebase/analytics",
7105
+ "@react-native-firebase/app",
7106
+ "@react-native-firebase/app-check",
7107
+ "@react-native-firebase/app-distribution",
7108
+ "@react-native-firebase/auth",
7109
+ "@react-native-firebase/crashlytics",
7110
+ "@react-native-firebase/database",
7111
+ "@react-native-firebase/firestore",
7112
+ "@react-native-firebase/functions",
7113
+ "@react-native-firebase/in-app-messaging",
7114
+ "@react-native-firebase/installations",
7115
+ "@react-native-firebase/messaging",
7116
+ "@react-native-firebase/ml",
7117
+ "@react-native-firebase/perf",
7118
+ "@react-native-firebase/remote-config",
7119
+ "@react-native-firebase/storage",
7120
+ "@react-native-google-signin/google-signin",
7121
+ "@react-native-masked-view/masked-view",
7122
+ "@react-native-menu/menu",
7123
+ "@react-native-ml-kit/barcode-scanning",
7124
+ "@react-native-ml-kit/face-detection",
7125
+ "@react-native-ml-kit/identify-languages",
7126
+ "@react-native-ml-kit/image-labeling",
7127
+ "@react-native-ml-kit/text-recognition",
7128
+ "@react-native-ml-kit/translate-text",
7129
+ "@react-native-picker/picker",
7130
+ "@react-native-runtimes/core",
7131
+ "@react-native-runtimes/state",
7132
+ "@react-native-segmented-control/segmented-control",
7133
+ "@react-native-seoul/naver-login",
7134
+ "@reactvision/react-viro",
7135
+ "@remobile/react-native-toast",
7136
+ "@renegades/react-native-tickle",
7137
+ "@rive-app/react-native",
7138
+ "@rn-org/react-native-geofencing",
7139
+ "@rn-org/react-native-shortcuts",
7140
+ "@rnmapbox/maps",
7141
+ "@rnw-community/react-native-payments",
7142
+ "@rocket.chat/mobile-crypto",
7143
+ "@roman.sytnyk/blur-app-in-recents",
7144
+ "@rudderstack/rudder-integration-amplitude-react-native",
7145
+ "@rudderstack/rudder-integration-appcenter-react-native",
7146
+ "@rudderstack/rudder-integration-appsflyer-react-native",
7147
+ "@rudderstack/rudder-integration-braze-react-native",
7148
+ "@rudderstack/rudder-integration-clevertap-react-native",
7149
+ "@rudderstack/rudder-integration-facebook-react-native",
7150
+ "@rudderstack/rudder-integration-firebase-react-native",
7151
+ "@rudderstack/rudder-integration-singular-react-native",
7152
+ "@rudderstack/rudder-plugin-db-encryption-react-native",
7153
+ "@rudderstack/rudder-sdk-react-native",
7154
+ "@s77rt/react-native-date-picker",
7155
+ "@sbaiahmed1/react-native-biometrics",
7156
+ "@sbaiahmed1/react-native-blur",
7157
+ "@sdcx/nested-scroll",
7158
+ "@sdcx/pull-to-refresh",
7159
+ "@segment/analytics-react-native",
7160
+ "@segment/sovran-react-native",
7161
+ "@sendbird/calls-react-native",
7162
+ "@sentry/react-native",
7163
+ "@shakebugs/react-native-shake",
7164
+ "@shayrn/react-native-android-phone-number-hint",
7165
+ "@shopify/checkout-sheet-kit",
7166
+ "@shopify/react-native-performance",
7167
+ "@shopify/react-native-skia",
7168
+ "@simform_solutions/react-native-audio-waveform",
7169
+ "@siteed/audio-studio",
7170
+ "@situm/react-native",
7171
+ "@sparkfabrik/react-native-idfa-aaid",
7172
+ "@splicer97/react-native-android-keyboard-adjust",
7173
+ "@splicer97/react-native-mytracker",
7174
+ "@stefanmartin/expo-video-compress",
7175
+ "@stefanmartin/expo-video-watermark",
7176
+ "@stream-io/video-react-native-sdk",
7177
+ "@stripe/stripe-identity-react-native",
7178
+ "@stripe/stripe-react-native",
7179
+ "@stripe/stripe-terminal-react-native",
7180
+ "@superfan-app/spotify-auth",
7181
+ "@supersami/rn-foreground-service",
7182
+ "@survicate/react-native-survicate",
7183
+ "@swan-io/react-native-browser",
7184
+ "@swmansion/react-native-bottom-sheet",
7185
+ "@thehale/react-native-keep-awake",
7186
+ "@turbopush/react-native-code-push",
7187
+ "@twilio/voice-react-native-sdk",
7188
+ "@ua/react-native-airship",
7189
+ "@uiw/react-native-alipay",
7190
+ "@universe/hashcash-native",
7191
+ "@use-voltra/android-client",
7192
+ "@use-voltra/ios-client",
7193
+ "@vokhuyet/react-native-concurrent-sound",
7194
+ "@vonovak/react-native-theme-control",
7195
+ "@walletconnect/react-native-compat",
7196
+ "@wwdrew/expo-android-shared-preferences",
7197
+ "@wwdrew/expo-spotify-sdk",
7198
+ "@xmartlabs/react-native-line",
7199
+ "@xmtp/react-native-sdk",
7200
+ "@zoontek/react-native-navigation-bar",
7201
+ "amazon-ivs-react-native-player",
7202
+ "anyline-ocr-react-native-module",
7203
+ "appcenter",
7204
+ "appcenter-analytics",
7205
+ "appcenter-crashes",
7206
+ "apple-health",
7207
+ "bitmovin-player-react-native",
7208
+ "burnt",
7209
+ "clevertap-react-native",
7210
+ "customerio-reactnative",
7211
+ "expo",
7212
+ "expo-age-range",
7213
+ "expo-alikit",
7214
+ "expo-aliyun-push",
7215
+ "expo-alternate-app-icons",
7216
+ "expo-android-pedometer",
7217
+ "expo-android-shared-preferences",
7218
+ "expo-app-integrity",
7219
+ "expo-app-intents",
7220
+ "expo-app-metrics",
7221
+ "expo-apple-authentication",
7222
+ "expo-application",
7223
+ "expo-asset",
7224
+ "expo-assistant-functions",
7225
+ "expo-audio",
7226
+ "expo-av",
7227
+ "expo-background-fetch",
7228
+ "expo-background-task",
7229
+ "expo-barcode",
7230
+ "expo-barcode-scanner",
7231
+ "expo-battery",
7232
+ "expo-beacon",
7233
+ "expo-better-auth-passkey",
7234
+ "expo-blob",
7235
+ "expo-blur",
7236
+ "expo-brightness",
7237
+ "expo-calendar",
7238
+ "expo-callkit-telecom",
7239
+ "expo-camera",
7240
+ "expo-cellular",
7241
+ "expo-click-outside",
7242
+ "expo-clipboard",
7243
+ "expo-constants",
7244
+ "expo-contacts",
7245
+ "expo-core-spotlight",
7246
+ "expo-crypto",
7247
+ "expo-dev-client",
7248
+ "expo-device",
7249
+ "expo-document-picker",
7250
+ "expo-document-scanner",
7251
+ "expo-drag-drop-content-view",
7252
+ "expo-dynamic-app-icon",
7253
+ "expo-eas-client",
7254
+ "expo-emoji-picker",
7255
+ "expo-esim-utils",
7256
+ "expo-file-system",
7257
+ "expo-finance-kit",
7258
+ "expo-font",
7259
+ "expo-foreground-actions",
7260
+ "expo-gaode-map",
7261
+ "expo-gaode-map-search",
7262
+ "expo-gl",
7263
+ "expo-glass-effect",
7264
+ "expo-haptics",
7265
+ "expo-hardware-buttons",
7266
+ "expo-health-connect",
7267
+ "expo-helium",
7268
+ "expo-hinge",
7269
+ "expo-iap",
7270
+ "expo-ignore-battery-optimizations",
7271
+ "expo-image",
7272
+ "expo-image-manipulator",
7273
+ "expo-image-picker",
7274
+ "expo-in-app-updates",
7275
+ "expo-insights",
7276
+ "expo-intent-launcher",
7277
+ "expo-ios-visual-blur",
7278
+ "expo-keep-awake",
7279
+ "expo-key-event",
7280
+ "expo-libvlc-player",
7281
+ "expo-linear-gradient",
7282
+ "expo-linking",
7283
+ "expo-liquid-glass-native",
7284
+ "expo-liquid-glass-view",
7285
+ "expo-live-activity",
7286
+ "expo-live-photo",
7287
+ "expo-local-authentication",
7288
+ "expo-localization",
7289
+ "expo-location",
7290
+ "expo-mail-composer",
7291
+ "expo-maps",
7292
+ "expo-media-control",
7293
+ "expo-media-library",
7294
+ "expo-mesh-gradient",
7295
+ "expo-modules-core",
7296
+ "expo-music-picker",
7297
+ "expo-native-alipay",
7298
+ "expo-native-emojis-popup",
7299
+ "expo-native-sheet-emojis",
7300
+ "expo-native-wechat",
7301
+ "expo-navigation-bar",
7302
+ "expo-network",
7303
+ "expo-network-addons",
7304
+ "expo-notifications",
7305
+ "expo-observe",
7306
+ "expo-paperkit",
7307
+ "expo-passkey",
7308
+ "expo-paste-input",
7309
+ "expo-pencilkit-ui",
7310
+ "expo-phone-number-hint",
7311
+ "expo-pip",
7312
+ "expo-pretext",
7313
+ "expo-print",
7314
+ "expo-privacy-sensitive",
7315
+ "expo-quick-actions",
7316
+ "expo-rich-input",
7317
+ "expo-roomplan",
7318
+ "expo-screen-capture",
7319
+ "expo-screen-corner-radius",
7320
+ "expo-screen-orientation",
7321
+ "expo-secure-store",
7322
+ "expo-selectable-text",
7323
+ "expo-sensors",
7324
+ "expo-share-extension",
7325
+ "expo-share-intent",
7326
+ "expo-sharing",
7327
+ "expo-shazamkit",
7328
+ "expo-sms",
7329
+ "expo-speech",
7330
+ "expo-speech-recognition",
7331
+ "expo-splash-screen",
7332
+ "expo-sqlite",
7333
+ "expo-squircle-view",
7334
+ "expo-store-review",
7335
+ "expo-stream-audio",
7336
+ "expo-superwall",
7337
+ "expo-symbols",
7338
+ "expo-system-ui",
7339
+ "expo-targets",
7340
+ "expo-task-manager",
7341
+ "expo-testflight",
7342
+ "expo-tracking-transparency",
7343
+ "expo-translate-text",
7344
+ "expo-truecaller",
7345
+ "expo-tvos-search",
7346
+ "expo-updates",
7347
+ "expo-vector-search",
7348
+ "expo-video",
7349
+ "expo-video-metadata",
7350
+ "expo-video-thumbnails",
7351
+ "expo-web-browser",
7352
+ "expo-wechat",
7353
+ "expo-widgets",
7354
+ "expo-winter-fetch",
7355
+ "expo-winter-formdata",
7356
+ "freerasp-react-native",
7357
+ "group-ib-fp",
7358
+ "gt-react-native",
7359
+ "jail-monkey",
7360
+ "klaviyo-react-native-sdk",
7361
+ "llama.rn",
7362
+ "loro-react-native",
7363
+ "lottie-react-native",
7364
+ "mixpanel-react-native",
7365
+ "munim-bluetooth",
7366
+ "navigation-react-native",
7367
+ "newrelic-react-native-agent",
7368
+ "one",
7369
+ "ping-react-native",
7370
+ "posthog-react-native-session-replay",
7371
+ "pushy-react-native",
7372
+ "react-native",
7373
+ "react-native-a11y",
7374
+ "react-native-a11y-container",
7375
+ "react-native-a11y-order",
7376
+ "react-native-actions-shortcuts",
7377
+ "react-native-adapty",
7378
+ "react-native-add-calendar-event",
7379
+ "react-native-adjust",
7380
+ "react-native-admob-native-ads",
7381
+ "react-native-advanced-input-mask",
7382
+ "react-native-aes-crypto",
7383
+ "react-native-aes-gcm-crypto",
7384
+ "react-native-age-signals",
7385
+ "react-native-agora",
7386
+ "react-native-amap3d",
7387
+ "react-native-amplitude-analytics",
7388
+ "react-native-android-location-enabler",
7389
+ "react-native-android-widget",
7390
+ "react-native-animateable-text",
7391
+ "react-native-animated-observer",
7392
+ "react-native-app-attest",
7393
+ "react-native-app-auth",
7394
+ "react-native-app-clip",
7395
+ "react-native-app-logs",
7396
+ "react-native-app-review",
7397
+ "react-native-appearance-control",
7398
+ "react-native-apple-ads-attribution",
7399
+ "react-native-apple-llm",
7400
+ "react-native-appsflyer",
7401
+ "react-native-appstack-sdk",
7402
+ "react-native-ar-preview",
7403
+ "react-native-audio-api",
7404
+ "react-native-auth0",
7405
+ "react-native-authsignal",
7406
+ "react-native-auto-skeleton",
7407
+ "react-native-avoid-softinput",
7408
+ "react-native-awesome-card-io",
7409
+ "react-native-azure-auth",
7410
+ "react-native-background-actions",
7411
+ "react-native-background-fetch",
7412
+ "react-native-background-geolocation",
7413
+ "react-native-background-job",
7414
+ "react-native-background-task",
7415
+ "react-native-background-timer",
7416
+ "react-native-background-upload",
7417
+ "react-native-barcode-creator",
7418
+ "react-native-bare-kit",
7419
+ "react-native-beacon-kit",
7420
+ "react-native-better-clustering",
7421
+ "react-native-better-maps",
7422
+ "react-native-biometrics",
7423
+ "react-native-blasted-image",
7424
+ "react-native-ble-manager",
7425
+ "react-native-ble-nitro",
7426
+ "react-native-ble-plx",
7427
+ "react-native-blob-courier",
7428
+ "react-native-blob-util",
7429
+ "react-native-bluetooth-classic",
7430
+ "react-native-bluetooth-state-manager",
7431
+ "react-native-bluetooth-status",
7432
+ "react-native-blur-view",
7433
+ "react-native-blurhash",
7434
+ "react-native-bootsplash",
7435
+ "react-native-bottom-action-sheet",
7436
+ "react-native-bottom-sheet-behavior",
7437
+ "react-native-bottom-tabs",
7438
+ "react-native-branch",
7439
+ "react-native-calendar-events",
7440
+ "react-native-callkeep",
7441
+ "react-native-camera-kit",
7442
+ "react-native-capture-protection",
7443
+ "react-native-cardscan",
7444
+ "react-native-carplay",
7445
+ "react-native-cashfree-pg-sdk",
7446
+ "react-native-cesium",
7447
+ "react-native-change-icon",
7448
+ "react-native-charts-wrapper",
7449
+ "react-native-cloud-storage",
7450
+ "react-native-cloud-store",
7451
+ "react-native-code-push",
7452
+ "react-native-color-picker-ios",
7453
+ "react-native-compass-heading",
7454
+ "react-native-compressor",
7455
+ "react-native-config",
7456
+ "react-native-config-reader",
7457
+ "react-native-contacts",
7458
+ "react-native-context-menu-view",
7459
+ "react-native-cos-sdk",
7460
+ "react-native-create-thumbnail",
7461
+ "react-native-credentials-manager",
7462
+ "react-native-custom-splash",
7463
+ "react-native-customized-image-picker",
7464
+ "react-native-dark-mode",
7465
+ "react-native-date-picker",
7466
+ "react-native-deepgram",
7467
+ "react-native-default-preference",
7468
+ "react-native-detector",
7469
+ "react-native-device-attest",
7470
+ "react-native-device-country",
7471
+ "react-native-device-info",
7472
+ "react-native-dialogs",
7473
+ "react-native-document-picker",
7474
+ "react-native-document-picker-macos",
7475
+ "react-native-document-scanner",
7476
+ "react-native-document-scanner-plugin",
7477
+ "react-native-drop-shadow",
7478
+ "react-native-drum-picker",
7479
+ "react-native-dynamic-app-icon",
7480
+ "react-native-earl-thermal-printer",
7481
+ "react-native-ease",
7482
+ "react-native-edge-fade",
7483
+ "react-native-edge-to-edge",
7484
+ "react-native-emoji-popup",
7485
+ "react-native-enriched",
7486
+ "react-native-enriched-html",
7487
+ "react-native-enriched-markdown",
7488
+ "react-native-events",
7489
+ "react-native-exception-handler",
7490
+ "react-native-executorch",
7491
+ "react-native-exit-app",
7492
+ "react-native-expo-braintree",
7493
+ "react-native-external-display",
7494
+ "react-native-external-keyboard",
7495
+ "react-native-extra-dimensions-android",
7496
+ "react-native-fabric",
7497
+ "react-native-fast-image",
7498
+ "react-native-fast-io",
7499
+ "react-native-fast-opencv",
7500
+ "react-native-fast-secure-storage",
7501
+ "react-native-fast-shadow",
7502
+ "react-native-fast-squircle",
7503
+ "react-native-fast-tflite",
7504
+ "react-native-fast-trie",
7505
+ "react-native-fbads",
7506
+ "react-native-fbsdk-next",
7507
+ "react-native-fcm",
7508
+ "react-native-filament",
7509
+ "react-native-file-access",
7510
+ "react-native-file-logger",
7511
+ "react-native-file-selector",
7512
+ "react-native-file-viewer",
7513
+ "react-native-file-viewer-turbo",
7514
+ "react-native-fileupload",
7515
+ "react-native-find-local-devices",
7516
+ "react-native-fingerprint-scanner",
7517
+ "react-native-floating-label-input",
7518
+ "react-native-fs",
7519
+ "react-native-fs-turbo",
7520
+ "react-native-geo-fencing",
7521
+ "react-native-geolocation-service",
7522
+ "react-native-gesture-handler",
7523
+ "react-native-get-device-locale",
7524
+ "react-native-get-location",
7525
+ "react-native-get-random-values",
7526
+ "react-native-google-auth",
7527
+ "react-native-google-cast",
7528
+ "react-native-google-fit",
7529
+ "react-native-google-maps-plus",
7530
+ "react-native-google-mobile-ads",
7531
+ "react-native-google-places",
7532
+ "react-native-google-places-sdk",
7533
+ "react-native-google-play-install-referrer",
7534
+ "react-native-gzip",
7535
+ "react-native-haptic-feedback",
7536
+ "react-native-hapticlabs",
7537
+ "react-native-headphone-detection",
7538
+ "react-native-health",
7539
+ "react-native-health-connect",
7540
+ "react-native-here-explore",
7541
+ "react-native-hole-view",
7542
+ "react-native-home-indicator",
7543
+ "react-native-hotkeys",
7544
+ "react-native-html-to-pdf",
7545
+ "react-native-http-bridge-refurbished",
7546
+ "react-native-hyper-markdown",
7547
+ "react-native-i18n",
7548
+ "react-native-iap",
7549
+ "react-native-iaphub",
7550
+ "react-native-icloud-kit",
7551
+ "react-native-idle-timer",
7552
+ "react-native-image-colors",
7553
+ "react-native-image-compression-kit",
7554
+ "react-native-image-crop-picker",
7555
+ "react-native-image-marker",
7556
+ "react-native-image-picker",
7557
+ "react-native-image-size",
7558
+ "react-native-image-stitcher",
7559
+ "react-native-in-app-review",
7560
+ "react-native-in-app-utils",
7561
+ "react-native-inappbrowser-nitro",
7562
+ "react-native-inappbrowser-reborn",
7563
+ "react-native-incall-manager",
7564
+ "react-native-interception-webview",
7565
+ "react-native-intercom",
7566
+ "react-native-ios-context-menu",
7567
+ "react-native-ios-modal",
7568
+ "react-native-ios-translate-sheet",
7569
+ "react-native-ios-translate-tasks",
7570
+ "react-native-ios-utilities",
7571
+ "react-native-job-queue",
7572
+ "react-native-jw-media-player",
7573
+ "react-native-keep-awake",
7574
+ "react-native-key-command",
7575
+ "react-native-key-pair",
7576
+ "react-native-keyboard-controller",
7577
+ "react-native-keyboard-manager",
7578
+ "react-native-keychain",
7579
+ "react-native-keyevent",
7580
+ "react-native-keys",
7581
+ "react-native-launch-arguments",
7582
+ "react-native-leaflet-view",
7583
+ "react-native-legal",
7584
+ "react-native-libsodium",
7585
+ "react-native-linear-gradient",
7586
+ "react-native-linkedin-login",
7587
+ "react-native-liquid-glassmorphism",
7588
+ "react-native-litert-lm",
7589
+ "react-native-llm-mediapipe",
7590
+ "react-native-loader-kit",
7591
+ "react-native-localization",
7592
+ "react-native-localization-settings",
7593
+ "react-native-localize",
7594
+ "react-native-location",
7595
+ "react-native-location-enabler",
7596
+ "react-native-mail",
7597
+ "react-native-maps",
7598
+ "react-native-material-palette",
7599
+ "react-native-mdm-config",
7600
+ "react-native-measure-text",
7601
+ "react-native-mixpanel",
7602
+ "react-native-mmkv",
7603
+ "react-native-mmkv-storage",
7604
+ "react-native-moengage",
7605
+ "react-native-month-year-picker",
7606
+ "react-native-moyasar-apple-pay",
7607
+ "react-native-moyasar-sdk",
7608
+ "react-native-multiple-modals",
7609
+ "react-native-nano-icons",
7610
+ "react-native-navigation",
7611
+ "react-native-navigation-bar-color",
7612
+ "react-native-navigation-mode",
7613
+ "react-native-network-info",
7614
+ "react-native-nfc-manager",
7615
+ "react-native-nitro-ark",
7616
+ "react-native-nitro-audio-manager",
7617
+ "react-native-nitro-buffer",
7618
+ "react-native-nitro-cloud-uploader",
7619
+ "react-native-nitro-cookies",
7620
+ "react-native-nitro-crypto",
7621
+ "react-native-nitro-device-info",
7622
+ "react-native-nitro-dns",
7623
+ "react-native-nitro-fetch",
7624
+ "react-native-nitro-file-system",
7625
+ "react-native-nitro-fs",
7626
+ "react-native-nitro-geocoder",
7627
+ "react-native-nitro-geolocation",
7628
+ "react-native-nitro-google-signin",
7629
+ "react-native-nitro-haptics",
7630
+ "react-native-nitro-http-server",
7631
+ "react-native-nitro-image",
7632
+ "react-native-nitro-markdown",
7633
+ "react-native-nitro-modules",
7634
+ "react-native-nitro-net",
7635
+ "react-native-nitro-network-info",
7636
+ "react-native-nitro-ota",
7637
+ "react-native-nitro-player",
7638
+ "react-native-nitro-pose-exercises",
7639
+ "react-native-nitro-rtmp-publisher",
7640
+ "react-native-nitro-screen-recorder",
7641
+ "react-native-nitro-sensors-kit",
7642
+ "react-native-nitro-sfsymbols",
7643
+ "react-native-nitro-sound",
7644
+ "react-native-nitro-speech",
7645
+ "react-native-nitro-sqlite",
7646
+ "react-native-nitro-sse",
7647
+ "react-native-nitro-text-decoder",
7648
+ "react-native-nitro-toast",
7649
+ "react-native-nitro-tor",
7650
+ "react-native-nitro-totp",
7651
+ "react-native-nitro-vision-kit",
7652
+ "react-native-nitro-web-image",
7653
+ "react-native-nitro-websockets",
7654
+ "react-native-node-api",
7655
+ "react-native-notification-badge",
7656
+ "react-native-notification-sounds",
7657
+ "react-native-notifications",
7658
+ "react-native-notify-kit",
7659
+ "react-native-oauth",
7660
+ "react-native-ometria",
7661
+ "react-native-omni",
7662
+ "react-native-onesignal",
7663
+ "react-native-openai",
7664
+ "react-native-orientation-director",
7665
+ "react-native-orientation-locker",
7666
+ "react-native-orientation-manager",
7667
+ "react-native-orientation-turbo",
7668
+ "react-native-os",
7669
+ "react-native-ota-hot-update",
7670
+ "react-native-otp-verify",
7671
+ "react-native-package-checker",
7672
+ "react-native-pager-view",
7673
+ "react-native-palette-full",
7674
+ "react-native-passkey",
7675
+ "react-native-payments",
7676
+ "react-native-paypal",
7677
+ "react-native-pdf",
7678
+ "react-native-pdf-from-image",
7679
+ "react-native-pdf-jsi",
7680
+ "react-native-pdf-light",
7681
+ "react-native-pdf-renderer",
7682
+ "react-native-pdf-view",
7683
+ "react-native-performance",
7684
+ "react-native-performance-limiter",
7685
+ "react-native-permissions",
7686
+ "react-native-perspective-image-cropper",
7687
+ "react-native-photo-editor",
7688
+ "react-native-photo-manipulator",
7689
+ "react-native-photo-view",
7690
+ "react-native-photo-view-ex",
7691
+ "react-native-photoeditorsdk",
7692
+ "react-native-pinchable",
7693
+ "react-native-ping",
7694
+ "react-native-pkce-challenge",
7695
+ "react-native-plaid-link-sdk",
7696
+ "react-native-platform-components",
7697
+ "react-native-play-age-range-declaration",
7698
+ "react-native-pretty-toast",
7699
+ "react-native-print",
7700
+ "react-native-private-screen",
7701
+ "react-native-prompt-android",
7702
+ "react-native-pulsar",
7703
+ "react-native-purchasely",
7704
+ "react-native-purchases",
7705
+ "react-native-purchases-ui",
7706
+ "react-native-pure-jwt",
7707
+ "react-native-push-notification",
7708
+ "react-native-qr-decode-image-camera",
7709
+ "react-native-qr-kit",
7710
+ "react-native-quick-actions",
7711
+ "react-native-quick-base64",
7712
+ "react-native-quick-crypto",
7713
+ "react-native-quick-sqlite",
7714
+ "react-native-radial-gradient",
7715
+ "react-native-randombytes",
7716
+ "react-native-rate",
7717
+ "react-native-rate-app",
7718
+ "react-native-razorpay",
7719
+ "react-native-reanimated",
7720
+ "react-native-receive-sharing-intent",
7721
+ "react-native-record-screen",
7722
+ "react-native-restart",
7723
+ "react-native-restart-newarch",
7724
+ "react-native-rn-in-app-update",
7725
+ "react-native-rsa-native",
7726
+ "react-native-rsa-signer",
7727
+ "react-native-safari-view",
7728
+ "react-native-safe-area-context",
7729
+ "react-native-screen-choreography",
7730
+ "react-native-screen-corner-radius",
7731
+ "react-native-screenguard",
7732
+ "react-native-screens",
7733
+ "react-native-screenshot-aware",
7734
+ "react-native-screenshot-prevent",
7735
+ "react-native-search-bar",
7736
+ "react-native-secure-key-store",
7737
+ "react-native-securerandom",
7738
+ "react-native-select-contact",
7739
+ "react-native-send-intent",
7740
+ "react-native-sensitive-info",
7741
+ "react-native-sensors",
7742
+ "react-native-settings",
7743
+ "react-native-sfsymbols",
7744
+ "react-native-shake",
7745
+ "react-native-share",
7746
+ "react-native-share-menu",
7747
+ "react-native-shared-element",
7748
+ "react-native-shared-group-preferences",
7749
+ "react-native-shareplay",
7750
+ "react-native-shiki-engine",
7751
+ "react-native-showtime",
7752
+ "react-native-signature-capture",
7753
+ "react-native-simple-biometrics",
7754
+ "react-native-simple-toast",
7755
+ "react-native-siri-shortcut",
7756
+ "react-native-smart-splash-screen",
7757
+ "react-native-snackbar",
7758
+ "react-native-social-share",
7759
+ "react-native-sound",
7760
+ "react-native-sound-player",
7761
+ "react-native-speech-recognition-kit",
7762
+ "react-native-spinkit",
7763
+ "react-native-splash-screen",
7764
+ "react-native-splash-screen-newarch",
7765
+ "react-native-splash-view",
7766
+ "react-native-spotify-remote",
7767
+ "react-native-spotlight-search",
7768
+ "react-native-sqlite-2",
7769
+ "react-native-sqlite-storage",
7770
+ "react-native-ssl-manager",
7771
+ "react-native-ssl-public-key-pinning",
7772
+ "react-native-stallion",
7773
+ "react-native-star-io10",
7774
+ "react-native-store-age-signals-native-modules",
7775
+ "react-native-store-review",
7776
+ "react-native-svg",
7777
+ "react-native-system-bars",
7778
+ "react-native-system-navigation-bar",
7779
+ "react-native-system-setting",
7780
+ "react-native-tableview",
7781
+ "react-native-tcp",
7782
+ "react-native-tcp-socket",
7783
+ "react-native-teleport",
7784
+ "react-native-tenjin",
7785
+ "react-native-testfairy",
7786
+ "react-native-text-input-mask",
7787
+ "react-native-text-size",
7788
+ "react-native-theme-switch-animation",
7789
+ "react-native-theoplayer",
7790
+ "react-native-thermal-receipt-printer",
7791
+ "react-native-tiktok",
7792
+ "react-native-tiktok-business-sdk",
7793
+ "react-native-timezone",
7794
+ "react-native-tooltip",
7795
+ "react-native-tor",
7796
+ "react-native-touch-id",
7797
+ "react-native-track-player",
7798
+ "react-native-tracking-transparency",
7799
+ "react-native-transformer-text-input",
7800
+ "react-native-ttlock",
7801
+ "react-native-tts",
7802
+ "react-native-tuner-engine",
7803
+ "react-native-turbo-haptics",
7804
+ "react-native-turbo-image",
7805
+ "react-native-turbo-lnd",
7806
+ "react-native-turbo-mock-location-detector",
7807
+ "react-native-turbo-preferences",
7808
+ "react-native-twilio-video-webrtc",
7809
+ "react-native-udp",
7810
+ "react-native-ui-lib",
7811
+ "react-native-uitextview",
7812
+ "react-native-ulid-jsi",
7813
+ "react-native-unistyles",
7814
+ "react-native-update",
7815
+ "react-native-urovo",
7816
+ "react-native-ux-cam",
7817
+ "react-native-variable-blur",
7818
+ "react-native-vector-icons",
7819
+ "react-native-version-check",
7820
+ "react-native-version-info",
7821
+ "react-native-version-number",
7822
+ "react-native-video",
7823
+ "react-native-video-cache",
7824
+ "react-native-video-duration",
7825
+ "react-native-video-processing",
7826
+ "react-native-video-provider",
7827
+ "react-native-video-trim",
7828
+ "react-native-videoeditorsdk",
7829
+ "react-native-view-pdf",
7830
+ "react-native-view-recorder",
7831
+ "react-native-view-shot",
7832
+ "react-native-vision-camera",
7833
+ "react-native-vision-camera-barcode-scanner",
7834
+ "react-native-vision-camera-face-detector",
7835
+ "react-native-vision-camera-image-labeler",
7836
+ "react-native-vision-camera-location",
7837
+ "react-native-vision-camera-resizer",
7838
+ "react-native-vision-camera-text-recognition",
7839
+ "react-native-vision-camera-worklets",
7840
+ "react-native-vlc-media-player",
7841
+ "react-native-voip-push-notification",
7842
+ "react-native-volume-manager",
7843
+ "react-native-vosk",
7844
+ "react-native-wallet-manager",
7845
+ "react-native-wallet-pass",
7846
+ "react-native-watch-connectivity",
7847
+ "react-native-wear-connectivity",
7848
+ "react-native-web-serial-api",
7849
+ "react-native-webgpu",
7850
+ "react-native-webp-converter",
7851
+ "react-native-webp-format",
7852
+ "react-native-webrtc",
7853
+ "react-native-webview",
7854
+ "react-native-wechat-lib",
7855
+ "react-native-wheel-pick",
7856
+ "react-native-wheel-picker-android",
7857
+ "react-native-whip-whep",
7858
+ "react-native-widget-picker",
7859
+ "react-native-widgetkit",
7860
+ "react-native-wifi-p2p",
7861
+ "react-native-wifi-reborn",
7862
+ "react-native-window-view",
7863
+ "react-native-windows",
7864
+ "react-native-windows-hello",
7865
+ "react-native-wordpress-editor",
7866
+ "react-native-worklets",
7867
+ "react-native-worklets-core",
7868
+ "react-native-xaml",
7869
+ "react-native-xxhash",
7870
+ "react-native-youtube",
7871
+ "react-native-zeroconf",
7872
+ "react-native-zip-archive",
7873
+ "realm",
7874
+ "rive-react-native",
7875
+ "rn-apple-healthkit",
7876
+ "rn-card-scanner",
7877
+ "rn-date-format",
7878
+ "rn-fade-wrapper",
7879
+ "rn-fetch-blob",
7880
+ "rn-mlkit-ocr",
7881
+ "rn-qr-generator",
7882
+ "rn-secure-storage",
7883
+ "rn-watch-connect",
7884
+ "rn-zendesk",
7885
+ "rollbar-react-native",
7886
+ "scandit-react-native-datacapture-barcode",
7887
+ "scandit-react-native-datacapture-core",
7888
+ "scandit-react-native-datacapture-id",
7889
+ "scandit-react-native-datacapture-label",
7890
+ "scandit-react-native-datacapture-label-text",
7891
+ "scandit-react-native-datacapture-parser",
7892
+ "sift-react-native",
7893
+ "sp-react-native-in-app-updates",
7894
+ "stream-chat-expo",
7895
+ "stream-chat-react-native",
7896
+ "swiftui-react-native",
7897
+ "uws-react-native",
7898
+ "vision-camera-cropper",
7899
+ "vision-camera-dynamsoft-document-normalizer",
7900
+ "vision-camera-ocr-plugin",
7901
+ "vision-camera-zxing",
7902
+ "whisper.rn"
7903
+ ];
7904
+ var NATIVE_RUNTIME_PACKAGE_NAMES = [
7905
+ ...NATIVE_STUB_PACKAGE_NAMES,
7906
+ ...LIGHT_NATIVE_PACKAGE_NAMES,
7907
+ "@ammarahmed/react-native-background-fetch",
7908
+ "@bsky.app/react-native-uitextview",
7909
+ "@bsky.app/video",
7910
+ "@datadog/mobile-react-native-webview",
7911
+ "@haileyok/bluesky-video",
7912
+ "@react-native-vector-icons/get-image",
7913
+ "@react-navigation/native",
7914
+ "@tamagui/native-registry",
7915
+ "@uniswap/ethers-rs-mobile",
7916
+ "@valora/react-native-keychain",
7917
+ "expo-router",
7918
+ "react-native-app-control",
7919
+ "react-native-blue-crypto",
7920
+ "react-native-nitro-base64",
7921
+ "react-native-nitro-gzip",
7922
+ "react-native-sectioned-slider"
7923
+ ];
7924
+
7925
+ // ../peach-compat/src/wrapper-real-packages.ts
7926
+ var SOOTSIM_COMPAT_WRAPPER_REAL_PACKAGES = {
7927
+ expoUiConfirmationDialog: {
7928
+ specifier: "@peach-internal/expo-ui-confirmation-dialog",
7929
+ packageName: "@expo/ui/src/swift-ui/ConfirmationDialog/index.tsx"
7930
+ },
7931
+ expoUiShareLink: {
7932
+ specifier: "@peach-internal/expo-ui-share-link",
7933
+ packageName: "@expo/ui/src/swift-ui/ShareLink/index.tsx"
7934
+ },
7935
+ expoUiNamespace: {
7936
+ specifier: "@peach-internal/expo-ui-namespace",
7937
+ packageName: "@expo/ui/src/swift-ui/Namespace.tsx"
7938
+ },
7939
+ expoUiHost: {
7940
+ specifier: "@peach-internal/expo-ui-host",
7941
+ packageName: "@expo/ui/src/swift-ui/Host/index.tsx"
7942
+ },
7943
+ expoUiBottomSheet: {
7944
+ specifier: "@peach-internal/expo-ui-bottom-sheet",
7945
+ packageName: "@expo/ui/src/swift-ui/BottomSheet/index.tsx"
7946
+ },
7947
+ expoUiTabView: {
7948
+ specifier: "@peach-internal/expo-ui-tab-view",
7949
+ packageName: "@expo/ui/src/swift-ui/TabView/index.tsx"
7950
+ },
7951
+ expoUiForm: {
7952
+ specifier: "@peach-internal/expo-ui-form",
7953
+ packageName: "@expo/ui/src/swift-ui/Form/index.tsx"
7954
+ },
7955
+ expoUiSection: {
7956
+ specifier: "@peach-internal/expo-ui-section",
7957
+ packageName: "@expo/ui/src/swift-ui/Section/index.tsx"
7958
+ },
7959
+ expoUiAccessoryWidgetBackground: {
7960
+ specifier: "@peach-internal/expo-ui-accessory-widget-background",
7961
+ packageName: "@expo/ui/src/swift-ui/AccessoryWidgetBackground/index.tsx"
7962
+ },
7963
+ expoUiGlassEffectContainer: {
7964
+ specifier: "@peach-internal/expo-ui-glass-effect-container",
7965
+ packageName: "@expo/ui/src/swift-ui/GlassEffectContainer/index.tsx"
7966
+ },
7967
+ expoUiContentUnavailableView: {
7968
+ specifier: "@peach-internal/expo-ui-content-unavailable-view",
7969
+ packageName: "@expo/ui/src/swift-ui/ContentUnavailableView/index.tsx"
7970
+ },
7971
+ expoUiColorPicker: {
7972
+ specifier: "@peach-internal/expo-ui-color-picker",
7973
+ packageName: "@expo/ui/src/swift-ui/ColorPicker/index.tsx"
7974
+ },
7975
+ expoUiProgressView: {
7976
+ specifier: "@peach-internal/expo-ui-progress-view",
7977
+ packageName: "@expo/ui/src/swift-ui/ProgressView/index.tsx"
7978
+ },
7979
+ expoUiToggle: {
7980
+ specifier: "@peach-internal/expo-ui-toggle",
7981
+ packageName: "@expo/ui/src/swift-ui/Toggle/index.tsx"
7982
+ },
7983
+ expoUiPicker: {
7984
+ specifier: "@peach-internal/expo-ui-picker",
7985
+ packageName: "@expo/ui/src/swift-ui/Picker/index.tsx"
7986
+ },
7987
+ expoUiDivider: {
7988
+ specifier: "@peach-internal/expo-ui-divider",
7989
+ packageName: "@expo/ui/src/swift-ui/Divider/index.tsx"
7990
+ },
7991
+ expoUiText: {
7992
+ specifier: "@peach-internal/expo-ui-text",
7993
+ packageName: "@expo/ui/src/swift-ui/Text/index.tsx"
7994
+ },
7995
+ expoUiMenu: {
7996
+ specifier: "@peach-internal/expo-ui-menu",
7997
+ packageName: "@expo/ui/src/swift-ui/Menu/index.tsx"
7998
+ },
7999
+ expoUiImage: {
8000
+ specifier: "@peach-internal/expo-ui-image",
8001
+ packageName: "@expo/ui/src/swift-ui/Image/index.tsx"
8002
+ },
8003
+ expoUiAlert: {
8004
+ specifier: "@peach-internal/expo-ui-alert",
8005
+ packageName: "@expo/ui/src/swift-ui/Alert/index.tsx"
8006
+ },
8007
+ expoUiPopover: {
8008
+ specifier: "@peach-internal/expo-ui-popover",
8009
+ packageName: "@expo/ui/src/swift-ui/Popover/index.tsx"
8010
+ },
8011
+ expoUiRNHostView: {
8012
+ specifier: "@peach-internal/expo-ui-rnhost-view",
8013
+ packageName: "@expo/ui/src/swift-ui/RNHostView.tsx"
8014
+ },
8015
+ expoUiOverlay: {
8016
+ specifier: "@peach-internal/expo-ui-overlay",
8017
+ packageName: "@expo/ui/src/swift-ui/Overlay/index.tsx"
8018
+ },
8019
+ expoUiBackground: {
8020
+ specifier: "@peach-internal/expo-ui-background",
8021
+ packageName: "@expo/ui/src/swift-ui/Background/index.tsx"
8022
+ },
8023
+ expoUiMask: {
8024
+ specifier: "@peach-internal/expo-ui-mask",
8025
+ packageName: "@expo/ui/src/swift-ui/Mask/index.tsx"
8026
+ },
8027
+ expoUiShapes: {
8028
+ specifier: "@peach-internal/expo-ui-shapes",
8029
+ packageName: "@expo/ui/src/swift-ui/Shapes/index.tsx"
8030
+ },
8031
+ expoUiControlGroup: {
8032
+ specifier: "@peach-internal/expo-ui-control-group",
8033
+ packageName: "@expo/ui/src/swift-ui/ControlGroup/index.tsx"
8034
+ },
8035
+ expoUiScrollView: {
8036
+ specifier: "@peach-internal/expo-ui-scroll-view",
8037
+ packageName: "@expo/ui/src/swift-ui/ScrollView/index.tsx"
8038
+ },
8039
+ expoUiGrid: {
8040
+ specifier: "@peach-internal/expo-ui-grid",
8041
+ packageName: "@expo/ui/src/swift-ui/Grid/index.tsx"
8042
+ },
8043
+ expoUiGroup: {
8044
+ specifier: "@peach-internal/expo-ui-group",
8045
+ packageName: "@expo/ui/src/swift-ui/Group/index.tsx"
8046
+ },
8047
+ expoUiSpacer: {
8048
+ specifier: "@peach-internal/expo-ui-spacer",
8049
+ packageName: "@expo/ui/src/swift-ui/Spacer/index.tsx"
8050
+ },
8051
+ expoUiLazyHStack: {
8052
+ specifier: "@peach-internal/expo-ui-lazy-hstack",
8053
+ packageName: "@expo/ui/src/swift-ui/LazyHStack/index.tsx"
8054
+ },
8055
+ expoUiLazyVStack: {
8056
+ specifier: "@peach-internal/expo-ui-lazy-vstack",
8057
+ packageName: "@expo/ui/src/swift-ui/LazyVStack/index.tsx"
8058
+ },
8059
+ expoUiHStack: {
8060
+ specifier: "@peach-internal/expo-ui-hstack",
8061
+ packageName: "@expo/ui/src/swift-ui/HStack/index.tsx"
8062
+ },
8063
+ expoUiVStack: {
8064
+ specifier: "@peach-internal/expo-ui-vstack",
8065
+ packageName: "@expo/ui/src/swift-ui/VStack/index.tsx"
8066
+ },
8067
+ expoUiZStack: {
8068
+ specifier: "@peach-internal/expo-ui-zstack",
8069
+ packageName: "@expo/ui/src/swift-ui/ZStack/index.tsx"
8070
+ },
8071
+ expoUiButton: {
8072
+ specifier: "@peach-internal/expo-ui-button",
8073
+ packageName: "@expo/ui/src/swift-ui/Button/index.tsx"
8074
+ },
8075
+ expoUiDatePicker: {
8076
+ specifier: "@peach-internal/expo-ui-date-picker",
8077
+ packageName: "@expo/ui/src/swift-ui/DatePicker/index.tsx"
8078
+ },
8079
+ expoUiSlider: {
8080
+ specifier: "@peach-internal/expo-ui-slider",
8081
+ packageName: "@expo/ui/src/swift-ui/Slider/index.tsx"
8082
+ },
8083
+ expoUiStepper: {
8084
+ specifier: "@peach-internal/expo-ui-stepper",
8085
+ packageName: "@expo/ui/src/swift-ui/Stepper/index.tsx"
8086
+ },
8087
+ expoUiLink: {
8088
+ specifier: "@peach-internal/expo-ui-link",
8089
+ packageName: "@expo/ui/src/swift-ui/Link/index.tsx"
8090
+ },
8091
+ expoUiAnimationConstants: {
8092
+ specifier: "@peach-internal/expo-ui-animation-constants",
8093
+ packageName: "@expo/ui/build/swift-ui/modifiers/animation/constants.js"
8094
+ },
8095
+ expoUiWithAnimation: {
8096
+ specifier: "@peach-internal/expo-ui-with-animation",
8097
+ packageName: "@expo/ui/build/swift-ui/withAnimation.js"
8098
+ },
8099
+ expoUiNativeState: {
8100
+ specifier: "@peach-internal/expo-ui-native-state",
8101
+ packageName: "@expo/ui/build/State/index.js"
8102
+ },
8103
+ expoUiSyncToggle: {
8104
+ specifier: "@peach-internal/expo-ui-sync-toggle",
8105
+ packageName: "@expo/ui/build/swift-ui/SyncToggle/index.js"
8106
+ },
8107
+ expoUiTextField: {
8108
+ specifier: "@peach-internal/expo-ui-text-field",
8109
+ packageName: "@expo/ui/src/swift-ui/TextField/index.tsx"
8110
+ },
8111
+ expoUiSecureField: {
8112
+ specifier: "@peach-internal/expo-ui-secure-field",
8113
+ packageName: "@expo/ui/src/swift-ui/SecureField/index.tsx"
8114
+ },
8115
+ expoUiArrangementView: {
8116
+ specifier: "@peach-internal/expo-ui-arrangement-view",
8117
+ packageName: "@expo/ui/src/swift-ui/ArrangementView/index.tsx"
8118
+ },
8119
+ expoUiLazyHStackForEach: {
8120
+ specifier: "@peach-internal/expo-ui-lazy-hstack-for-each",
8121
+ packageName: "@expo/ui/src/swift-ui/LazyHStack/index.tsx"
8122
+ },
8123
+ expoUiLazyVStackForEach: {
8124
+ specifier: "@peach-internal/expo-ui-lazy-vstack-for-each",
8125
+ packageName: "@expo/ui/src/swift-ui/LazyVStack/index.tsx"
8126
+ },
8127
+ expoUiNavigationDestination: {
8128
+ specifier: "@peach-internal/expo-ui-navigation-destination",
8129
+ packageName: "@expo/ui/src/swift-ui/NavigationDestination/index.tsx"
8130
+ },
8131
+ expoUiNavigationLink: {
8132
+ specifier: "@peach-internal/expo-ui-navigation-link",
8133
+ packageName: "@expo/ui/src/swift-ui/NavigationLink/index.tsx"
8134
+ },
8135
+ expoUiNavigationStack: {
8136
+ specifier: "@peach-internal/expo-ui-navigation-stack",
8137
+ packageName: "@expo/ui/src/swift-ui/NavigationStack/index.tsx"
8138
+ },
8139
+ expoUiNavigationSplitView: {
8140
+ specifier: "@peach-internal/expo-ui-navigation-split-view",
8141
+ packageName: "@expo/ui/src/swift-ui/NavigationSplitView/index.tsx"
8142
+ },
8143
+ expoUiToolbar: {
8144
+ specifier: "@peach-internal/expo-ui-toolbar",
8145
+ packageName: "@expo/ui/src/swift-ui/Toolbar/index.tsx"
8146
+ },
8147
+ expoUiList: {
8148
+ specifier: "@peach-internal/expo-ui-list",
8149
+ packageName: "@expo/ui/src/swift-ui/List/index.tsx"
8150
+ },
8151
+ expoUiDisclosureGroup: {
8152
+ specifier: "@peach-internal/expo-ui-disclosure-group",
8153
+ packageName: "@expo/ui/src/swift-ui/DisclosureGroup/index.tsx"
8154
+ },
8155
+ expoUiGauge: {
8156
+ specifier: "@peach-internal/expo-ui-gauge",
8157
+ packageName: "@expo/ui/src/swift-ui/Gauge/index.tsx"
8158
+ },
8159
+ expoUiLabeledContent: {
8160
+ specifier: "@peach-internal/expo-ui-labeled-content",
8161
+ packageName: "@expo/ui/src/swift-ui/LabeledContent/index.tsx"
8162
+ },
8163
+ expoUiLabel: {
8164
+ specifier: "@peach-internal/expo-ui-label",
8165
+ packageName: "@expo/ui/src/swift-ui/Label/index.tsx"
8166
+ },
8167
+ expoCodedError: {
8168
+ specifier: "@peach-internal/expo-coded-error",
8169
+ packageName: "expo-modules-core/build/errors/CodedError.js"
8170
+ },
8171
+ expoUnavailabilityError: {
8172
+ specifier: "@peach-internal/expo-unavailability-error",
8173
+ packageName: "expo-modules-core/build/errors/UnavailabilityError.js"
8174
+ },
8175
+ expoPlatform: {
8176
+ specifier: "@peach-internal/expo-platform",
8177
+ packageName: "expo-modules-core/build/Platform.js"
8178
+ },
8179
+ expoSharedObjectHook: {
8180
+ specifier: "@peach-internal/expo-shared-object-hook",
8181
+ packageName: "expo-modules-core/build/hooks/useReleasingSharedObject.js"
8182
+ },
8183
+ expoSharedObjectLifecycleHook: {
8184
+ specifier: "@peach-internal/expo-shared-object-lifecycle-hook",
8185
+ packageName: "expo-modules-core/build/hooks/useReleasingSharedObjectWithLifecycle.js"
8186
+ },
8187
+ expoApplication: {
8188
+ specifier: "@sootsim-internal/expo-application-real",
8189
+ packageName: "expo-application"
8190
+ },
8191
+ expoBackgroundFetch: {
8192
+ specifier: "@sootsim-internal/expo-background-fetch-real",
8193
+ packageName: "expo-background-fetch"
8194
+ },
8195
+ expoBackgroundTask: {
8196
+ specifier: "@sootsim-internal/expo-background-task-real",
8197
+ packageName: "expo-background-task"
8198
+ },
8199
+ expoSensors: {
8200
+ specifier: "@sootsim-internal/expo-sensors-real",
8201
+ packageName: "expo-sensors"
8202
+ },
8203
+ expoBattery: {
8204
+ specifier: "@sootsim-internal/expo-battery-real",
8205
+ packageName: "expo-battery"
8206
+ },
8207
+ expoBrightness: {
8208
+ specifier: "@sootsim-internal/expo-brightness-real",
8209
+ packageName: "expo-brightness"
8210
+ },
8211
+ expoConstants: {
8212
+ specifier: "@sootsim-internal/expo-constants-real",
8213
+ packageName: "expo-constants"
8214
+ },
8215
+ expoCalendar: {
8216
+ specifier: "@sootsim-internal/expo-calendar-real",
8217
+ packageName: "expo-calendar"
8218
+ },
8219
+ expoCalendarLegacy: {
8220
+ specifier: "@sootsim-internal/expo-calendar-legacy-real",
8221
+ // the package's own `./legacy` export, not a hardcoded `src/legacy/...`
8222
+ // path — this follows wherever upstream points the subpath, in every
8223
+ // version that has one. versions without it never import the legacy
8224
+ // stub, so the alias just goes unused there.
8225
+ packageName: "expo-calendar/legacy"
8226
+ },
8227
+ expoCellular: {
8228
+ specifier: "@sootsim-internal/expo-cellular-real",
8229
+ packageName: "expo-cellular"
8230
+ },
8231
+ expoContactsContacts: {
8232
+ specifier: "@sootsim-internal/expo-contacts-contacts",
8233
+ // sdk 57 split Contacts.ts into src/index.ts + legacy/ + next/
8234
+ packageName: "expo-contacts/src/index.ts"
8235
+ },
8236
+ expoContactsContactAccessButton: {
8237
+ specifier: "@sootsim-internal/expo-contacts-contact-access-button",
8238
+ packageName: "expo-contacts/src/ContactAccessButton.tsx"
8239
+ },
8240
+ expoContactsLegacy: {
8241
+ specifier: "@sootsim-internal/expo-contacts-legacy-real",
8242
+ // same as expoCalendarLegacy: the public `./legacy` export, not a src path.
8243
+ packageName: "expo-contacts/legacy"
8244
+ },
8245
+ expoInsights: {
8246
+ specifier: "@sootsim-internal/expo-insights-real",
8247
+ packageName: "expo-insights"
8248
+ },
8249
+ expoIntentLauncher: {
8250
+ specifier: "@sootsim-internal/expo-intent-launcher-real",
8251
+ packageName: "expo-intent-launcher"
8252
+ },
8253
+ expoMailComposer: {
8254
+ specifier: "@sootsim-internal/expo-mail-composer-real",
8255
+ packageName: "expo-mail-composer"
8256
+ },
8257
+ expoNetwork: {
8258
+ specifier: "@sootsim-internal/expo-network-real",
8259
+ packageName: "expo-network"
8260
+ },
8261
+ expoPrint: {
8262
+ specifier: "@sootsim-internal/expo-print-real",
8263
+ packageName: "expo-print"
8264
+ },
8265
+ expoScreenCapture: {
8266
+ specifier: "@sootsim-internal/expo-screen-capture-real",
8267
+ packageName: "expo-screen-capture"
8268
+ },
8269
+ expoScreenOrientation: {
8270
+ specifier: "@sootsim-internal/expo-screen-orientation-real",
8271
+ packageName: "expo-screen-orientation"
8272
+ },
8273
+ expoQuickActions: {
8274
+ specifier: "@sootsim-internal/expo-quick-actions-real",
8275
+ packageName: "expo-quick-actions/build/index.js"
8276
+ },
8277
+ expoSecureStore: {
8278
+ specifier: "@sootsim-internal/expo-secure-store-real",
8279
+ packageName: "expo-secure-store"
8280
+ },
8281
+ expoSplashScreen: {
8282
+ specifier: "@sootsim-internal/expo-splash-screen-real",
8283
+ packageName: "expo-splash-screen"
8284
+ },
8285
+ expoSqlite: {
8286
+ specifier: "@sootsim-internal/expo-sqlite-real",
8287
+ packageName: "expo-sqlite"
8288
+ },
8289
+ expoLinearGradient: {
8290
+ specifier: "@sootsim-internal/expo-linear-gradient-real",
8291
+ packageName: "expo-linear-gradient"
8292
+ },
8293
+ expoBlur: {
8294
+ specifier: "@sootsim-internal/expo-blur-real",
8295
+ packageName: "expo-blur"
8296
+ },
8297
+ expoSymbols: {
8298
+ specifier: "@sootsim-internal/expo-symbols-real",
8299
+ packageName: "expo-symbols"
8300
+ },
8301
+ communityCheckbox: {
8302
+ specifier: "@sootsim-internal/react-native-community-checkbox-real",
8303
+ packageName: "@react-native-community/checkbox/dist/js/CheckBox.ios.js"
8304
+ },
8305
+ reactNativeMaskedView: {
8306
+ specifier: "@sootsim-internal/masked-view-real",
8307
+ packageName: "@react-native-masked-view/masked-view"
8308
+ },
8309
+ expoSharing: {
8310
+ specifier: "@sootsim-internal/expo-sharing-real",
8311
+ packageName: "expo-sharing"
8312
+ },
8313
+ expoSms: {
8314
+ specifier: "@sootsim-internal/expo-sms-real",
8315
+ packageName: "expo-sms"
8316
+ },
8317
+ expoSpeech: {
8318
+ specifier: "@sootsim-internal/expo-speech-real",
8319
+ packageName: "expo-speech"
8320
+ },
8321
+ expoStoreReview: {
8322
+ specifier: "@sootsim-internal/expo-store-review-real",
8323
+ packageName: "expo-store-review"
8324
+ },
8325
+ expoTaskManager: {
8326
+ specifier: "@sootsim-internal/expo-task-manager-real",
8327
+ packageName: "expo-task-manager"
8328
+ },
8329
+ expoTrackingTransparency: {
8330
+ specifier: "@sootsim-internal/expo-tracking-transparency-real",
8331
+ packageName: "expo-tracking-transparency"
8332
+ },
8333
+ expoVideoThumbnails: {
8334
+ specifier: "@sootsim-internal/expo-video-thumbnails-real",
8335
+ packageName: "expo-video-thumbnails"
8336
+ },
8337
+ googleSignin: {
8338
+ specifier: "@sootsim-internal/react-native-google-signin-real",
8339
+ packageName: "@react-native-google-signin/google-signin"
8340
+ },
8341
+ reactNativeHapticFeedback: {
8342
+ specifier: "@sootsim-internal/react-native-haptic-feedback-real",
8343
+ packageName: "react-native-haptic-feedback"
8344
+ },
8345
+ reactNativeSegmentedControl: {
8346
+ specifier: "@sootsim-internal/react-native-segmented-control-real",
8347
+ packageName: "@react-native-segmented-control/segmented-control/js/SegmentedControl.ios.js"
8348
+ },
8349
+ reactNativeUitextview: {
8350
+ specifier: "@sootsim-internal/react-native-uitextview-real",
8351
+ packageName: "react-native-uitextview"
8352
+ },
8353
+ reactNativeWorkletsBundleMode: {
8354
+ specifier: "@sootsim-internal/react-native-worklets-bundle-mode-real",
8355
+ packageName: "react-native-worklets/lib/module/debug/bundleMode.native.js"
8356
+ },
8357
+ reactNativeWorkletsFunction: {
8358
+ specifier: "@peach-internal/react-native-worklets-function-real",
8359
+ packageName: "react-native-worklets/lib/module/workletFunction.js"
8360
+ },
8361
+ reactNativeWorkletsRunLoop: {
8362
+ specifier: "@sootsim-internal/react-native-worklets-run-loop-real",
8363
+ packageName: "react-native-worklets/lib/module/runLoop/workletRuntime/index.js"
8364
+ }
8365
+ };
8366
+ var PEACH_REACT_NATIVE_UPSTREAM_MODULES = {
8367
+ reactNativeBatchedBridge: {
8368
+ specifier: "@peach-internal/react-native/BatchedBridge/BatchedBridge",
8369
+ packageName: "react-native/Libraries/BatchedBridge/BatchedBridge.js"
8370
+ },
8371
+ reactNativeStyleAttributes: {
8372
+ specifier: "@peach-internal/react-native/Components/View/ReactNativeStyleAttributes",
8373
+ packageName: "react-native/Libraries/Components/View/ReactNativeStyleAttributes.js"
8374
+ },
8375
+ reactNativeProcessColor: {
8376
+ specifier: "@peach-internal/react-native/StyleSheet/processColor",
8377
+ packageName: "react-native/Libraries/StyleSheet/processColor.js"
8378
+ },
8379
+ reactNativeFontVariationSettings: {
8380
+ specifier: "@peach-internal/react-native-font-variation-settings",
8381
+ packageName: "react-native/Libraries/StyleSheet/processFontVariationSettings.js"
8382
+ }
8383
+ };
8384
+ var PEACH_UPSTREAM_MODULES = {
8385
+ ...SOOTSIM_COMPAT_WRAPPER_REAL_PACKAGES,
8386
+ ...PEACH_REACT_NATIVE_UPSTREAM_MODULES
8387
+ };
5962
8388
 
5963
8389
  // ../peach-engine/src/stub-pattern-matcher.ts
5964
8390
  function extractPackageFromPath(modulePath) {
@@ -5969,12 +8395,16 @@ function extractPackageFromPath(modulePath) {
5969
8395
  nodeModulesIndex = 0;
5970
8396
  prefixLength = "node_modules/".length;
5971
8397
  }
5972
- const pathWithinNodeModules = modulePath.slice(nodeModulesIndex + prefixLength);
5973
- if (pathWithinNodeModules.startsWith("@")) {
5974
- const parts = pathWithinNodeModules.split("/");
5975
- return parts.length >= 2 ? `${parts[0]}/${parts[1]}` : null;
8398
+ return packageNameAt(modulePath, nodeModulesIndex + prefixLength) || null;
8399
+ }
8400
+ function packageNameAt(modulePath, start) {
8401
+ const firstSlash = modulePath.indexOf("/", start);
8402
+ if (modulePath.startsWith("@", start)) {
8403
+ if (firstSlash === -1) return null;
8404
+ const secondSlash = modulePath.indexOf("/", firstSlash + 1);
8405
+ return modulePath.slice(start, secondSlash === -1 ? void 0 : secondSlash);
5976
8406
  }
5977
- return pathWithinNodeModules.split("/")[0] || null;
8407
+ return modulePath.slice(start, firstSlash === -1 ? void 0 : firstSlash);
5978
8408
  }
5979
8409
 
5980
8410
  // src/installed-package-versions.ts
@@ -6239,21 +8669,20 @@ function androidMergedResourceValuesDirectory(manifestFile) {
6239
8669
 
6240
8670
  // src/native-app-identity.ts
6241
8671
  init_bundleGlobalFooter();
8672
+ init_is_record();
6242
8673
 
6243
8674
  // src/nativeAppIconContract.ts
6244
- function isRecord2(value) {
6245
- return typeof value === "object" && value !== null && !Array.isArray(value);
6246
- }
8675
+ init_is_record();
6247
8676
  function resolveNativeAppIconArtwork(resources, readText, resourceUri, icons, primaryName, alternateNames, resolveReference) {
6248
8677
  const members = new Set(resources);
6249
- const dictionary = isRecord2(icons) ? icons : {};
8678
+ const dictionary = isRecord(icons) ? icons : {};
6250
8679
  const alternates = Object.fromEntries(
6251
8680
  Object.entries(
6252
- isRecord2(dictionary.CFBundleAlternateIcons) ? dictionary.CFBundleAlternateIcons : {}
8681
+ isRecord(dictionary.CFBundleAlternateIcons) ? dictionary.CFBundleAlternateIcons : {}
6253
8682
  ).map(([name2, declaration]) => [resolveReference(name2), declaration])
6254
8683
  );
6255
8684
  const resolve3 = (declaration, defaultName) => {
6256
- const entry = isRecord2(declaration) ? declaration : {};
8685
+ const entry = isRecord(declaration) ? declaration : {};
6257
8686
  const name2 = typeof entry.CFBundleIconName === "string" ? resolveReference(entry.CFBundleIconName) : resolveReference(defaultName);
6258
8687
  const catalogs = resources.filter(
6259
8688
  (file) => file.endsWith(`/${name2}.appiconset/Contents.json`)
@@ -6263,9 +8692,9 @@ function resolveNativeAppIconArtwork(resources, readText, resourceUri, icons, pr
6263
8692
  const catalogCandidates = [];
6264
8693
  const text2 = readText(catalog);
6265
8694
  const contents = text2 === null ? null : JSON.parse(text2);
6266
- if (isRecord2(contents) && Array.isArray(contents.images)) {
8695
+ if (isRecord(contents) && Array.isArray(contents.images)) {
6267
8696
  for (const image of contents.images) {
6268
- if (!isRecord2(image) || typeof image.filename !== "string" || /[/\\]/.test(image.filename) || !/\.(png|jpe?g|webp)$/i.test(image.filename) || image.appearances !== void 0 || !["iphone", "universal", "ios-marketing"].includes(String(image.idiom)))
8697
+ if (!isRecord(image) || typeof image.filename !== "string" || /[/\\]/.test(image.filename) || !/\.(png|jpe?g|webp)$/i.test(image.filename) || image.appearances !== void 0 || !["iphone", "universal", "ios-marketing"].includes(String(image.idiom)))
6269
8698
  continue;
6270
8699
  const file = catalog.slice(0, -"Contents.json".length) + image.filename;
6271
8700
  const scale = image.scale === "2x" ? 2 : image.scale === "3x" ? 3 : 1;
@@ -6499,9 +8928,6 @@ function visitXcodeTargetMembers(objects, targetId, resolvePath, filesUnder, joi
6499
8928
  // src/native-app-identity.ts
6500
8929
  var NATIVE_APP_IDENTITY_PREFIX = "globalThis.__sootsimNativeAppIdentity=";
6501
8930
  var METRO_MODULE_PATHS_PREFIX = "globalThis.__sootsimModulePaths=";
6502
- function isRecord3(value) {
6503
- return typeof value === "object" && value !== null && !Array.isArray(value);
6504
- }
6505
8931
  function nonEmptyString(value) {
6506
8932
  return typeof value === "string" && value.length > 0 ? value : null;
6507
8933
  }
@@ -6524,6 +8950,27 @@ function insertNativeAppIdentityFooter(source, identity) {
6524
8950
  if (moduleFooter < 0) return withoutExisting + footer;
6525
8951
  return withoutExisting.slice(0, moduleFooter) + footer + withoutExisting.slice(moduleFooter);
6526
8952
  }
8953
+ function readGoogleSignInConfiguration(plist3, resources) {
8954
+ const clientIds = {};
8955
+ for (const [file, value] of Object.entries(resources)) {
8956
+ if (isRecord(value) && typeof value.CLIENT_ID === "string")
8957
+ clientIds[file.split("/").pop()?.replace(/\.plist$/, "") ?? file] = value.CLIENT_ID;
8958
+ }
8959
+ const urlSchemes = [];
8960
+ for (const entry of Array.isArray(plist3.CFBundleURLTypes) ? plist3.CFBundleURLTypes : []) {
8961
+ if (!isRecord(entry) || !Array.isArray(entry.CFBundleURLSchemes)) continue;
8962
+ for (const scheme of entry.CFBundleURLSchemes)
8963
+ if (typeof scheme === "string") urlSchemes.push(scheme);
8964
+ }
8965
+ return {
8966
+ clientId: plist3.GIDClientID,
8967
+ serverClientId: plist3.GIDServerClientID,
8968
+ hostedDomain: plist3.GIDHostedDomain,
8969
+ openIDRealm: plist3.GIDOpenIDRealm,
8970
+ urlSchemes,
8971
+ clientIds
8972
+ };
8973
+ }
6527
8974
  function plistString(plist3, key) {
6528
8975
  const match = plist3.match(new RegExp(`<key>${key}</key>\\s*<string>([^<]*)</string>`));
6529
8976
  return match ? match[1].trim() : null;
@@ -6619,14 +9066,14 @@ function nativeAppIdentityFromIos(files, parseInfoPlist, iosTarget, resourceUri)
6619
9066
  let objects = {};
6620
9067
  try {
6621
9068
  const parsed = parseOpenStepPlist(pbxproj);
6622
- if (isRecord3(parsed)) {
6623
- objects = isRecord3(parsed.objects) ? parsed.objects : parsed;
9069
+ if (isRecord(parsed)) {
9070
+ objects = isRecord(parsed.objects) ? parsed.objects : parsed;
6624
9071
  }
6625
9072
  } catch {
6626
9073
  }
6627
9074
  const targets = [];
6628
9075
  for (const [id, obj] of Object.entries(objects)) {
6629
- if (isRecord3(obj) && obj.isa === "PBXNativeTarget" && typeof obj.name === "string") {
9076
+ if (isRecord(obj) && obj.isa === "PBXNativeTarget" && typeof obj.name === "string") {
6630
9077
  targets.push({
6631
9078
  id,
6632
9079
  name: obj.name,
@@ -6672,13 +9119,13 @@ function nativeAppIdentityFromIos(files, parseInfoPlist, iosTarget, resourceUri)
6672
9119
  PRODUCT_NAME: targetName
6673
9120
  };
6674
9121
  for (const obj of Object.values(objects)) {
6675
- if (isRecord3(obj) && obj.isa === "PBXProject" && typeof obj.buildConfigurationList === "string") {
9122
+ if (isRecord(obj) && obj.isa === "PBXProject" && typeof obj.buildConfigurationList === "string") {
6676
9123
  const listObj = objects[obj.buildConfigurationList];
6677
- if (isRecord3(listObj) && Array.isArray(listObj.buildConfigurations)) {
9124
+ if (isRecord(listObj) && Array.isArray(listObj.buildConfigurations)) {
6678
9125
  for (const configId of listObj.buildConfigurations) {
6679
9126
  if (typeof configId === "string") {
6680
9127
  const configObj = objects[configId];
6681
- if (isRecord3(configObj) && configObj.name === "Release" && isRecord3(configObj.buildSettings)) {
9128
+ if (isRecord(configObj) && configObj.name === "Release" && isRecord(configObj.buildSettings)) {
6682
9129
  for (const [k, v] of Object.entries(configObj.buildSettings)) {
6683
9130
  if (typeof v === "string") settings[k] = v;
6684
9131
  }
@@ -6690,11 +9137,11 @@ function nativeAppIdentityFromIos(files, parseInfoPlist, iosTarget, resourceUri)
6690
9137
  }
6691
9138
  if (selectedTarget?.buildConfigurationList) {
6692
9139
  const listObj = objects[selectedTarget.buildConfigurationList];
6693
- if (isRecord3(listObj) && Array.isArray(listObj.buildConfigurations)) {
9140
+ if (isRecord(listObj) && Array.isArray(listObj.buildConfigurations)) {
6694
9141
  for (const configId of listObj.buildConfigurations) {
6695
9142
  if (typeof configId === "string") {
6696
9143
  const configObj = objects[configId];
6697
- if (isRecord3(configObj) && configObj.name === "Release" && isRecord3(configObj.buildSettings)) {
9144
+ if (isRecord(configObj) && configObj.name === "Release" && isRecord(configObj.buildSettings)) {
6698
9145
  for (const [k, v] of Object.entries(configObj.buildSettings)) {
6699
9146
  if (typeof v === "string") settings[k] = v;
6700
9147
  }
@@ -6745,7 +9192,7 @@ function nativeAppIdentityFromIos(files, parseInfoPlist, iosTarget, resourceUri)
6745
9192
  if (!bundleName) return null;
6746
9193
  const applicationName = identityFieldFrom(settings, plistString(plist3, "CFBundleDisplayName"), void 0) ?? bundleName;
6747
9194
  const dictionary = parseInfoPlist(plist3);
6748
- if (!isRecord3(dictionary)) throw new Error("native app Info.plist is not a dictionary");
9195
+ if (!isRecord(dictionary)) throw new Error("native app Info.plist is not a dictionary");
6749
9196
  const declaredDisplayName = dictionary.CFBundleDisplayName;
6750
9197
  const applicationDisplayName = typeof declaredDisplayName === "string" ? resolveBuildSetting(declaredDisplayName, settings) : void 0;
6751
9198
  if (applicationDisplayName === null)
@@ -6758,9 +9205,9 @@ function nativeAppIdentityFromIos(files, parseInfoPlist, iosTarget, resourceUri)
6758
9205
  if (dtPlatformVersion === null)
6759
9206
  throw new Error("native app Info.plist DTPlatformVersion is unresolved");
6760
9207
  const icons = dictionary.CFBundleIcons;
6761
- const alternates = isRecord3(icons) ? icons.CFBundleAlternateIcons : void 0;
9208
+ const alternates = isRecord(icons) ? icons.CFBundleAlternateIcons : void 0;
6762
9209
  const alternateIconNames = /* @__PURE__ */ new Set();
6763
- for (const name2 of isRecord3(alternates) ? Object.keys(alternates) : []) {
9210
+ for (const name2 of isRecord(alternates) ? Object.keys(alternates) : []) {
6764
9211
  const resolved = resolveBuildSetting(name2, settings);
6765
9212
  if (resolved === null) throw new Error("native alternate icon name is unresolved");
6766
9213
  alternateIconNames.add(resolved);
@@ -6833,6 +9280,12 @@ function nativeAppIdentityFromIos(files, parseInfoPlist, iosTarget, resourceUri)
6833
9280
  if (resolved === null) throw new Error(`native app Info.plist ${key} is unresolved`);
6834
9281
  permissionUsageDescriptions[key] = resolved;
6835
9282
  }
9283
+ const infoPlistStrings = {};
9284
+ for (const [key, value] of Object.entries(dictionary)) {
9285
+ if (typeof value !== "string") continue;
9286
+ const resolved = resolveBuildSetting(value, settings);
9287
+ if (resolved !== null) infoPlistStrings[key] = resolved;
9288
+ }
6836
9289
  if (settings.GENERATE_INFOPLIST_FILE === "YES") {
6837
9290
  for (const [setting, value] of Object.entries(settings)) {
6838
9291
  if (!/^INFOPLIST_KEY_NS.*UsageDescription$/.test(setting)) continue;
@@ -6858,11 +9311,11 @@ function nativeAppIdentityFromIos(files, parseInfoPlist, iosTarget, resourceUri)
6858
9311
  return `${base.startsWith("/") ? "/" : ""}${segments.join("/")}`;
6859
9312
  };
6860
9313
  const project = Object.values(objects).find(
6861
- (object) => isRecord3(object) && object.isa === "PBXProject"
9314
+ (object) => isRecord(object) && object.isa === "PBXProject"
6862
9315
  );
6863
9316
  const projectDir = join4(
6864
9317
  pbxprojPath.replace(/(?:^|\/)[^/]+\.xcodeproj\/project\.pbxproj$/, ""),
6865
- isRecord3(project) && typeof project.projectDirPath === "string" ? project.projectDirPath : ""
9318
+ isRecord(project) && typeof project.projectDirPath === "string" ? project.projectDirPath : ""
6866
9319
  );
6867
9320
  const paths = Object.keys(files);
6868
9321
  visitXcodeTargetMembers(
@@ -6893,12 +9346,22 @@ function nativeAppIdentityFromIos(files, parseInfoPlist, iosTarget, resourceUri)
6893
9346
  ...rootModuleName === void 0 ? {} : { rootModuleName },
6894
9347
  ...rootViewBackgroundColor === void 0 ? {} : { rootViewBackgroundColor },
6895
9348
  ...designRequiresCompatibility ? { designRequiresCompatibility } : {},
9349
+ ...typeof dictionary.UIStatusBarHidden === "boolean" ? { statusBarHidden: dictionary.UIStatusBarHidden } : {},
9350
+ ...typeof dictionary.UIViewControllerBasedStatusBarAppearance === "boolean" ? {
9351
+ viewControllerBasedStatusBarAppearance: dictionary.UIViewControllerBasedStatusBarAppearance
9352
+ } : {},
6896
9353
  ...dtPlatformVersion === void 0 ? {} : { dtPlatformVersion },
6897
9354
  bundleName,
6898
9355
  appVersion,
6899
9356
  buildVersion,
6900
9357
  bundleIdentifier,
6901
9358
  platform: "ios",
9359
+ googleSignIn: readGoogleSignInConfiguration(
9360
+ dictionary,
9361
+ Object.fromEntries(
9362
+ [...resources].filter((file) => file.endsWith(".plist") && files[file]).map((file) => [file, parseInfoPlist(files[file])])
9363
+ )
9364
+ ),
6902
9365
  supportedInterfaceOrientations,
6903
9366
  ipadSupportedInterfaceOrientations,
6904
9367
  ...defaultScreenOrientationMask === void 0 ? {} : { defaultScreenOrientationMask },
@@ -6920,6 +9383,7 @@ function nativeAppIdentityFromIos(files, parseInfoPlist, iosTarget, resourceUri)
6920
9383
  )
6921
9384
  } : {},
6922
9385
  permissionUsageDescriptions,
9386
+ infoPlistStrings,
6923
9387
  urlQuerySchemes,
6924
9388
  ...shareIntoAppGroupId === void 0 ? {} : { shareIntoAppGroupId },
6925
9389
  ...rtcAppGroupIdentifier === void 0 ? {} : { rtcAppGroupIdentifier },
@@ -6961,6 +9425,7 @@ function extractNativeAppIdentityFromFiles(files, platform, parseInfoPlist, iosT
6961
9425
  var import_node_fs6 = __toESM(require("node:fs"), 1);
6962
9426
  var import_node_module2 = require("node:module");
6963
9427
  var import_node_path6 = __toESM(require("node:path"), 1);
9428
+ init_is_record();
6964
9429
 
6965
9430
  // src/plist.ts
6966
9431
  var import_plist = __toESM(require_plist(), 1);
@@ -6969,6 +9434,8 @@ function parsePlistSource(source) {
6969
9434
  }
6970
9435
 
6971
9436
  // src/xcode-project.ts
9437
+ var import_node_child_process2 = require("node:child_process");
9438
+ var import_node_crypto2 = require("node:crypto");
6972
9439
  var import_node_fs5 = __toESM(require("node:fs"), 1);
6973
9440
  var import_node_path5 = __toESM(require("node:path"), 1);
6974
9441
  var import_plist2 = __toESM(require_plist(), 1);
@@ -7576,33 +10043,131 @@ function expand(value, lookup) {
7576
10043
  }
7577
10044
  );
7578
10045
  }
7579
- function targetMembers(ref, settings, options = {}) {
10046
+ var preparedSourcePhases = /* @__PURE__ */ new Map();
10047
+ function targetMembers(ref, settings, options, settingKeys, projectInputs) {
7580
10048
  const { project, target, id: targetId } = ref;
7581
10049
  const targetName = str(target.name) ?? targetId;
7582
10050
  const sources = /* @__PURE__ */ new Set();
7583
10051
  const allSources = /* @__PURE__ */ new Set();
7584
10052
  const resources = /* @__PURE__ */ new Set();
7585
10053
  const scriptForOutput = /* @__PURE__ */ new Map();
7586
- const noteScriptOutput = (raw, script) => {
7587
- const expanded = expand(raw, settings);
7588
- if (!expanded.endsWith(".swift")) return;
7589
- const absolute = import_node_path5.default.isAbsolute(expanded) ? import_node_path5.default.normalize(expanded) : import_node_path5.default.resolve(project.projectDir, expanded);
7590
- if (!scriptForOutput.has(absolute)) scriptForOutput.set(absolute, script);
7591
- };
7592
10054
  for (const phaseId of list(target.buildPhases)) {
7593
10055
  const phase = project.object(phaseId);
7594
10056
  if (phase?.isa !== "PBXShellScriptBuildPhase") continue;
7595
10057
  const script = str(phase.name) ?? phaseId;
7596
- for (const raw of list(phase.outputPaths)) noteScriptOutput(raw, script);
7597
- for (const listPath of list(phase.outputFileListPaths)) {
7598
- const expandedList = expand(listPath, settings);
7599
- const absoluteList = import_node_path5.default.isAbsolute(expandedList) ? expandedList : import_node_path5.default.resolve(project.projectDir, expandedList);
7600
- if (!import_node_fs5.default.existsSync(absoluteList)) continue;
7601
- for (const line of import_node_fs5.default.readFileSync(absoluteList, "utf8").split("\n")) {
7602
- const trimmed = line.trim();
7603
- if (trimmed === "" || trimmed.startsWith("#")) continue;
7604
- noteScriptOutput(trimmed, script);
10058
+ const absolute = (raw) => import_node_path5.default.resolve(project.projectDir, expand(raw, settings));
10059
+ const inputs = list(phase.inputPaths).map(absolute);
10060
+ const outputs = list(phase.outputPaths).map(absolute);
10061
+ const fileLists = /* @__PURE__ */ new Map();
10062
+ for (const kind of ["INPUT", "OUTPUT"]) {
10063
+ const lists = list(
10064
+ kind === "INPUT" ? phase.inputFileListPaths : phase.outputFileListPaths
10065
+ ).map((raw) => {
10066
+ const file = absolute(raw);
10067
+ if (!import_node_fs5.default.existsSync(file)) {
10068
+ return { file, entries: [] };
10069
+ }
10070
+ const entries = import_node_fs5.default.readFileSync(file, "utf8").split(/\r?\n/).map((line) => line.trim()).filter((line) => line !== "" && !line.startsWith("#")).map(absolute);
10071
+ return { file, entries };
10072
+ });
10073
+ fileLists.set(kind, lists);
10074
+ }
10075
+ const allOutputs = [
10076
+ ...outputs,
10077
+ ...fileLists.get("OUTPUT").flatMap((item) => item.entries)
10078
+ ];
10079
+ for (const output of allOutputs)
10080
+ if (output.endsWith(".swift") && !scriptForOutput.has(output))
10081
+ scriptForOutput.set(output, script);
10082
+ const inputFiles = [
10083
+ ...inputs,
10084
+ ...fileLists.get("INPUT").flatMap((item) => [item.file, ...item.entries]),
10085
+ ...fileLists.get("OUTPUT").map((item) => item.file)
10086
+ ];
10087
+ if (allOutputs.some((file) => file.endsWith(".swift"))) {
10088
+ for (const file of inputFiles) if (import_node_fs5.default.existsSync(file)) projectInputs.add(file);
10089
+ }
10090
+ if (options.prepareGeneratedSources && options.requireSources !== false && allOutputs.some((file) => file.endsWith(".swift"))) {
10091
+ const phaseDir = import_node_path5.default.join(settings("TARGET_TEMP_DIR"), `Script-${phaseId}`);
10092
+ for (const lists of fileLists.values())
10093
+ for (const { file } of lists)
10094
+ if (!import_node_fs5.default.existsSync(file))
10095
+ throw new Error(
10096
+ `${targetName}: Run Script "${script}" missing file list ${file}`
10097
+ );
10098
+ const env = {
10099
+ ...process.env,
10100
+ ...Object.fromEntries(
10101
+ [...settingKeys].filter((key2) => /^[A-Za-z_][A-Za-z0-9_]*$/.test(key2)).map((key2) => [key2, settings(key2)])
10102
+ )
10103
+ };
10104
+ const declared = { INPUT: inputs, OUTPUT: outputs };
10105
+ for (const kind of ["INPUT", "OUTPUT"]) {
10106
+ env[`SCRIPT_${kind}_FILE_COUNT`] = String(declared[kind].length);
10107
+ declared[kind].forEach((file, index) => {
10108
+ env[`SCRIPT_${kind}_FILE_${index}`] = file;
10109
+ });
10110
+ const lists = fileLists.get(kind);
10111
+ env[`SCRIPT_${kind}_FILE_LIST_COUNT`] = String(lists.length);
10112
+ lists.forEach((_item, index) => {
10113
+ env[`SCRIPT_${kind}_FILE_LIST_${index}`] = import_node_path5.default.join(
10114
+ phaseDir,
10115
+ `${kind}-${index}.xcfilelist`
10116
+ );
10117
+ });
7605
10118
  }
10119
+ const signature = (0, import_node_crypto2.createHash)("sha256").update(
10120
+ JSON.stringify([phase, [...settingKeys].map((key2) => [key2, settings(key2)])])
10121
+ );
10122
+ for (const file of inputFiles) {
10123
+ signature.update(file);
10124
+ if (import_node_fs5.default.existsSync(file)) {
10125
+ const stat = import_node_fs5.default.statSync(file);
10126
+ signature.update(`${stat.mtimeMs}:${stat.ctimeMs}:${stat.size}`);
10127
+ } else signature.update("missing");
10128
+ }
10129
+ const stamp = signature.digest("hex");
10130
+ const key = `${project.projectFile}:${targetId}:${phaseId}:${settings("CONFIGURATION")}`;
10131
+ if (preparedSourcePhases.get(key) === stamp && allOutputs.every((file) => import_node_fs5.default.existsSync(file)))
10132
+ continue;
10133
+ import_node_fs5.default.mkdirSync(phaseDir, { recursive: true });
10134
+ import_node_fs5.default.mkdirSync(settings("BUILT_PRODUCTS_DIR"), { recursive: true });
10135
+ import_node_fs5.default.mkdirSync(settings("DERIVED_FILE_DIR"), { recursive: true });
10136
+ for (const [kind, lists] of fileLists)
10137
+ lists.forEach((item, index) => {
10138
+ import_node_fs5.default.writeFileSync(
10139
+ env[`SCRIPT_${kind}_FILE_LIST_${index}`],
10140
+ `${item.entries.join("\n")}
10141
+ `
10142
+ );
10143
+ });
10144
+ try {
10145
+ (0, import_node_child_process2.execFileSync)(
10146
+ str(phase.shellPath) ?? "/bin/sh",
10147
+ ["-c", str(phase.shellScript) ?? ""],
10148
+ {
10149
+ cwd: project.projectDir,
10150
+ env,
10151
+ stdio: ["ignore", "pipe", "pipe"],
10152
+ timeout: 12e4
10153
+ }
10154
+ );
10155
+ } catch (error) {
10156
+ const output = error instanceof Error ? `${error.message}
10157
+ ${"stdout" in error ? String(error.stdout) : ""}${"stderr" in error ? String(error.stderr) : ""}` : String(error);
10158
+ throw new Error(
10159
+ `${targetName}: Run Script "${script}" failed preparing generated Swift sources:
10160
+ ${output}`
10161
+ );
10162
+ }
10163
+ const missing = allOutputs.filter(
10164
+ (file) => file.endsWith(".swift") && !import_node_fs5.default.existsSync(file)
10165
+ );
10166
+ if (missing.length > 0)
10167
+ throw new Error(
10168
+ `${targetName}: Run Script "${script}" did not produce ${missing.join(", ")}`
10169
+ );
10170
+ preparedSourcePhases.set(key, stamp);
7606
10171
  }
7607
10172
  }
7608
10173
  visitXcodeTargetMembers(
@@ -7792,22 +10357,95 @@ function readXcodeAppTarget(input, targetName, configurationName, options = {})
7792
10357
  SRCROOT: ref.project.projectDir,
7793
10358
  SOURCE_ROOT: ref.project.projectDir,
7794
10359
  PROJECT_DIR: ref.project.projectDir,
10360
+ SYMROOT: import_node_path5.default.join(ref.project.projectDir, ".build/peach-xcode/Build/Products"),
10361
+ BUILD_DIR: "$(SYMROOT)",
10362
+ OBJROOT: import_node_path5.default.join(
10363
+ ref.project.projectDir,
10364
+ ".build/peach-xcode/Build/Intermediates.noindex"
10365
+ ),
10366
+ CONFIGURATION_BUILD_DIR: "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)",
10367
+ BUILT_PRODUCTS_DIR: "$(CONFIGURATION_BUILD_DIR)",
10368
+ TARGET_BUILD_DIR: "$(CONFIGURATION_BUILD_DIR)",
10369
+ PROJECT_TEMP_DIR: "$(OBJROOT)/$(PROJECT_NAME).build",
10370
+ CONFIGURATION_TEMP_DIR: "$(PROJECT_TEMP_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)",
10371
+ TARGET_TEMP_DIR: "$(CONFIGURATION_TEMP_DIR)/$(TARGET_NAME).build",
10372
+ DERIVED_FILE_DIR: "$(TARGET_TEMP_DIR)/DerivedSources",
10373
+ DERIVED_FILES_DIR: "$(DERIVED_FILE_DIR)",
10374
+ PLATFORM_NAME: "iphonesimulator",
10375
+ EFFECTIVE_PLATFORM_NAME: "-iphonesimulator",
10376
+ CURRENT_ARCH: "arm64",
10377
+ ARCHS: "arm64",
10378
+ ACTION: "build",
7795
10379
  DEVELOPMENT_LANGUAGE: str(ref.project.project.developmentRegion) ?? "en"
7796
10380
  },
7797
10381
  options
7798
10382
  );
7799
10383
  for (const file of read) xcconfigs.add(file);
7800
10384
  const swiftVersion = Number.parseFloat(settings2("SWIFT_VERSION") || "5");
10385
+ const members = targetMembers(ref, settings2, options, keys, xcconfigs);
10386
+ const implementations = members.allSources.filter(
10387
+ (file) => /\.(c|cc|cpp|cxx|m|mm)$/.test(file)
10388
+ );
10389
+ const absolute = (file) => import_node_path5.default.resolve(ref.project.projectDir, file);
10390
+ const fileFlags = {};
10391
+ for (const phaseId of list(ref.target.buildPhases)) {
10392
+ const phase = ref.project.object(phaseId);
10393
+ if (phase?.isa !== "PBXSourcesBuildPhase") continue;
10394
+ for (const id of list(phase.files)) {
10395
+ const file = ref.project.object(id);
10396
+ const resolved = ref.project.resolvePath(str(file?.fileRef) ?? "");
10397
+ if (resolved && implementations.includes(resolved))
10398
+ fileFlags[resolved] = settingList(
10399
+ expand(
10400
+ str(isDict(file?.settings) ? file.settings.COMPILER_FLAGS : void 0) ?? "",
10401
+ settings2
10402
+ )
10403
+ );
10404
+ }
10405
+ }
7801
10406
  return {
7802
10407
  settings: settings2,
7803
10408
  keys,
7804
10409
  module: {
7805
10410
  name: name2,
7806
10411
  moduleName: applyOperator(settings2("PRODUCT_MODULE_NAME"), "c99extidentifier"),
7807
- ...targetMembers(ref, settings2, options),
10412
+ ...members,
7808
10413
  languageMode: swiftVersion >= 6 ? 6 : 5,
7809
10414
  mainActorIsolation: settings2("SWIFT_DEFAULT_ACTOR_ISOLATION") === "MainActor",
7810
- defines: compilationConditions(settings2)
10415
+ defines: compilationConditions(settings2),
10416
+ iosDeploymentTarget: settings2("IPHONEOS_DEPLOYMENT_TARGET") || null,
10417
+ ...implementations.some((file) => /\.mm?$/.test(file)) ? {
10418
+ objc: {
10419
+ headers: Object.keys(ref.project.objects).flatMap((id) => {
10420
+ const file = ref.project.resolvePath(id);
10421
+ return file && /\.(h|hh|hpp|hxx|pch)$/.test(file) && import_node_fs5.default.existsSync(file) ? [file] : [];
10422
+ }),
10423
+ prefixHeader: settings2("GCC_PREFIX_HEADER") ? absolute(settings2("GCC_PREFIX_HEADER")) : null,
10424
+ bridgingHeader: settings2("SWIFT_OBJC_BRIDGING_HEADER") ? absolute(settings2("SWIFT_OBJC_BRIDGING_HEADER")) : null,
10425
+ headerSearchPaths: [
10426
+ ...settingList(settings2("HEADER_SEARCH_PATHS")),
10427
+ ...settingList(settings2("USER_HEADER_SEARCH_PATHS"))
10428
+ ].map(absolute),
10429
+ frameworkSearchPaths: settingList(settings2("FRAMEWORK_SEARCH_PATHS")).map(
10430
+ absolute
10431
+ ),
10432
+ flags: [
10433
+ ...settings2("CLANG_ENABLE_OBJC_ARC") === "YES" ? ["-fobjc-arc"] : [],
10434
+ ...settings2("CLANG_ENABLE_OBJC_WEAK") === "YES" ? ["-fobjc-weak"] : [],
10435
+ ...settings2("CLANG_ENABLE_MODULES") === "YES" ? ["-fmodules"] : [],
10436
+ ...settings2("GCC_C_LANGUAGE_STANDARD") ? [`-std=${settings2("GCC_C_LANGUAGE_STANDARD")}`] : [],
10437
+ ...settingList(settings2("GCC_PREPROCESSOR_DEFINITIONS")).map(
10438
+ (value) => `-D${value}`
10439
+ ),
10440
+ ...settingList(settings2("OTHER_CFLAGS"))
10441
+ ],
10442
+ cxxFlags: [
10443
+ ...settings2("CLANG_CXX_LANGUAGE_STANDARD") ? [`-std=${settings2("CLANG_CXX_LANGUAGE_STANDARD")}`] : [],
10444
+ ...settingList(settings2("OTHER_CPLUSPLUSFLAGS"))
10445
+ ],
10446
+ fileFlags
10447
+ }
10448
+ } : {}
7811
10449
  }
7812
10450
  };
7813
10451
  };
@@ -7856,6 +10494,23 @@ function readXcodeAppTarget(input, targetName, configurationName, options = {})
7856
10494
  ...projects.flatMap(
7857
10495
  (project) => Object.entries(project.objects).flatMap(([id, entry]) => {
7858
10496
  if (!isDict(entry)) return [];
10497
+ if (entry.isa === "PBXFileSystemSynchronizedRootGroup") {
10498
+ const folder = project.resolvePath(id);
10499
+ const pending = folder ? [folder] : [];
10500
+ const packages = [];
10501
+ while (pending.length > 0) {
10502
+ const dir = pending.pop();
10503
+ if (import_node_fs5.default.existsSync(import_node_path5.default.join(dir, "Package.swift"))) {
10504
+ packages.push(dir);
10505
+ continue;
10506
+ }
10507
+ if (!isDirectory(dir)) continue;
10508
+ for (const child of import_node_fs5.default.readdirSync(dir, { withFileTypes: true }))
10509
+ if (child.isDirectory() && !child.name.startsWith("."))
10510
+ pending.push(import_node_path5.default.join(dir, child.name));
10511
+ }
10512
+ return packages;
10513
+ }
7859
10514
  const candidate = entry.isa === "XCLocalSwiftPackageReference" ? import_node_path5.default.resolve(project.projectDir, str(entry.relativePath) ?? "") : entry.isa === "PBXFileReference" ? project.resolvePath(id) : null;
7860
10515
  return candidate && import_node_fs5.default.existsSync(import_node_path5.default.join(candidate, "Package.swift")) ? [candidate] : [];
7861
10516
  })
@@ -7910,6 +10565,7 @@ function readXcodeAppTarget(input, targetName, configurationName, options = {})
7910
10565
  "swiftpm",
7911
10566
  "Package.resolved"
7912
10567
  );
10568
+ const packageResolved = import_node_fs5.default.existsSync(resolvedFile) ? [import_node_fs5.default.realpathSync(resolvedFile)] : [...new Set(localPackageDirs.map((dir) => import_node_path5.default.join(dir, "Package.resolved")))].filter((file) => import_node_fs5.default.existsSync(file)).map((file) => import_node_fs5.default.realpathSync(file)).sort();
7913
10569
  const used = order.map((ref) => ref.project);
7914
10570
  return {
7915
10571
  ...module2,
@@ -7935,7 +10591,7 @@ function readXcodeAppTarget(input, targetName, configurationName, options = {})
7935
10591
  ...new Set(localPackageDirs.map((dir) => import_node_fs5.default.realpathSync(dir)))
7936
10592
  ].sort(),
7937
10593
  binaryFrameworks: [...binaryFrameworks].map(([name2, file]) => ({ name: name2, path: file })).sort((left, right) => left.name.localeCompare(right.name)),
7938
- packageResolved: import_node_fs5.default.existsSync(resolvedFile) ? resolvedFile : null,
10594
+ packageResolved,
7939
10595
  appTargets: appTargetNames,
7940
10596
  configuration,
7941
10597
  settings
@@ -7943,15 +10599,12 @@ function readXcodeAppTarget(input, targetName, configurationName, options = {})
7943
10599
  }
7944
10600
 
7945
10601
  // src/native-app-identity-project.ts
7946
- function isRecord4(value) {
7947
- return typeof value === "object" && value !== null && !Array.isArray(value);
7948
- }
7949
10602
  function nonEmptyString2(value) {
7950
10603
  return typeof value === "string" && value.length > 0 ? value : void 0;
7951
10604
  }
7952
10605
  function readNativeAppIdentityFromXcodeTarget(app, parseInfoPlist = parsePlistSource) {
7953
10606
  const dictionary = parseInfoPlist(app.infoPlist);
7954
- if (!isRecord4(dictionary)) throw new Error("native app Info.plist is not a dictionary");
10607
+ if (!isRecord(dictionary)) throw new Error("native app Info.plist is not a dictionary");
7955
10608
  const settings = app.settings;
7956
10609
  const bundleIdentifier = nonEmptyString2(dictionary.CFBundleIdentifier) ?? nonEmptyString2(settings?.("PRODUCT_BUNDLE_IDENTIFIER"));
7957
10610
  if (!bundleIdentifier) throw new Error("native app has no bundle identifier");
@@ -7968,8 +10621,8 @@ function readNativeAppIdentityFromXcodeTarget(app, parseInfoPlist = parsePlistSo
7968
10621
  const designRequiresCompatibility = dictionary.UIDesignRequiresCompatibility === true;
7969
10622
  const alternateIconNames = /* @__PURE__ */ new Set();
7970
10623
  const icons = dictionary.CFBundleIcons;
7971
- const alternates = isRecord4(icons) ? icons.CFBundleAlternateIcons : void 0;
7972
- if (isRecord4(alternates)) {
10624
+ const alternates = isRecord(icons) ? icons.CFBundleAlternateIcons : void 0;
10625
+ if (isRecord(alternates)) {
7973
10626
  for (const name2 of Object.keys(alternates)) {
7974
10627
  if (name2) alternateIconNames.add(name2);
7975
10628
  }
@@ -7986,6 +10639,10 @@ function readNativeAppIdentityFromXcodeTarget(app, parseInfoPlist = parsePlistSo
7986
10639
  }
7987
10640
  permissionUsageDescriptions[key] = value;
7988
10641
  }
10642
+ const infoPlistStrings = {};
10643
+ for (const [key, value] of Object.entries(dictionary)) {
10644
+ if (typeof value === "string") infoPlistStrings[key] = value;
10645
+ }
7989
10646
  const querySchemes = dictionary.LSApplicationQueriesSchemes;
7990
10647
  const urlQuerySchemes = Array.isArray(querySchemes) ? querySchemes : [];
7991
10648
  const intentIds = dictionary.OneAppIntentIdentifiers;
@@ -8013,12 +10670,22 @@ function readNativeAppIdentityFromXcodeTarget(app, parseInfoPlist = parsePlistSo
8013
10670
  ...rootModuleName ? { rootModuleName } : {},
8014
10671
  ...rootViewBackgroundColor !== void 0 ? { rootViewBackgroundColor } : {},
8015
10672
  ...designRequiresCompatibility ? { designRequiresCompatibility } : {},
10673
+ ...typeof dictionary.UIStatusBarHidden === "boolean" ? { statusBarHidden: dictionary.UIStatusBarHidden } : {},
10674
+ ...typeof dictionary.UIViewControllerBasedStatusBarAppearance === "boolean" ? {
10675
+ viewControllerBasedStatusBarAppearance: dictionary.UIViewControllerBasedStatusBarAppearance
10676
+ } : {},
8016
10677
  ...typeof dictionary.DTPlatformVersion === "string" ? { dtPlatformVersion: dictionary.DTPlatformVersion } : {},
8017
10678
  bundleName,
8018
10679
  appVersion,
8019
10680
  buildVersion,
8020
10681
  bundleIdentifier,
8021
10682
  platform: "ios",
10683
+ googleSignIn: readGoogleSignInConfiguration(
10684
+ dictionary,
10685
+ Object.fromEntries(
10686
+ app.resources.filter((file) => file.endsWith(".plist")).map((file) => [file, parseInfoPlist(import_node_fs6.default.readFileSync(file, "utf8"))])
10687
+ )
10688
+ ),
8022
10689
  supportedInterfaceOrientations,
8023
10690
  ipadSupportedInterfaceOrientations,
8024
10691
  ...defaultScreenOrientationMask ? { defaultScreenOrientationMask } : {},
@@ -8037,6 +10704,7 @@ function readNativeAppIdentityFromXcodeTarget(app, parseInfoPlist = parsePlistSo
8037
10704
  (value) => value
8038
10705
  ),
8039
10706
  permissionUsageDescriptions,
10707
+ infoPlistStrings,
8040
10708
  urlQuerySchemes,
8041
10709
  ...shareIntoAppGroupId ? { shareIntoAppGroupId } : {},
8042
10710
  ...rtcAppGroupIdentifier ? { rtcAppGroupIdentifier } : {},
@@ -8186,9 +10854,9 @@ function readIosNativeAppIdentity(projectRoot, parseInfoPlist, iosTarget) {
8186
10854
  const installedManifest = JSON.parse(
8187
10855
  import_node_fs6.default.readFileSync(reanimatedManifestPath, "utf8")
8188
10856
  );
8189
- const installedVersion = isRecord4(installedManifest) ? nonEmptyString2(installedManifest.version) : void 0;
10857
+ const installedVersion = isRecord(installedManifest) ? nonEmptyString2(installedManifest.version) : void 0;
8190
10858
  if (!installedVersion) throw new Error("Reanimated package version is malformed");
8191
- if (installedVersion.startsWith("3.")) return identity;
10859
+ if (Number.parseInt(installedVersion, 10) < 4) return identity;
8192
10860
  const defaults = JSON.parse(
8193
10861
  import_node_fs6.default.readFileSync(
8194
10862
  import_node_path6.default.join(
@@ -8198,11 +10866,11 @@ function readIosNativeAppIdentity(projectRoot, parseInfoPlist, iosTarget) {
8198
10866
  "utf8"
8199
10867
  )
8200
10868
  );
8201
- if (!isRecord4(defaults)) throw new Error("Reanimated static flags are malformed");
10869
+ if (!isRecord(defaults)) throw new Error("Reanimated static flags are malformed");
8202
10870
  const manifest = JSON.parse(import_node_fs6.default.readFileSync(projectManifestPath, "utf8"));
8203
- const reanimated = isRecord4(manifest) ? manifest.reanimated : void 0;
8204
- const overrides = isRecord4(reanimated) ? reanimated.staticFeatureFlags : void 0;
8205
- if (overrides !== void 0 && !isRecord4(overrides)) {
10871
+ const reanimated = isRecord(manifest) ? manifest.reanimated : void 0;
10872
+ const overrides = isRecord(reanimated) ? reanimated.staticFeatureFlags : void 0;
10873
+ if (overrides !== void 0 && !isRecord(overrides)) {
8206
10874
  throw new Error("Reanimated static flag overrides are malformed");
8207
10875
  }
8208
10876
  const flags = {};
@@ -8223,7 +10891,7 @@ function readIosNativeAppIdentity(projectRoot, parseInfoPlist, iosTarget) {
8223
10891
  }
8224
10892
 
8225
10893
  // src/native-firebase-config.ts
8226
- var import_node_child_process2 = require("node:child_process");
10894
+ var import_node_child_process3 = require("node:child_process");
8227
10895
  var import_node_fs7 = __toESM(require("node:fs"), 1);
8228
10896
  var import_node_os = __toESM(require("node:os"), 1);
8229
10897
  var import_node_path7 = __toESM(require("node:path"), 1);
@@ -8268,7 +10936,7 @@ function readExpoConfig(projectRoot) {
8268
10936
  const directory = resultDirectory();
8269
10937
  const resultPath = import_node_path7.default.join(directory, "config.json");
8270
10938
  try {
8271
- const child = (0, import_node_child_process2.spawnSync)("node", expoConfigArgs(projectRoot, resultPath), {
10939
+ const child = (0, import_node_child_process3.spawnSync)("node", expoConfigArgs(projectRoot, resultPath), {
8272
10940
  cwd: projectRoot,
8273
10941
  encoding: "utf8",
8274
10942
  stdio: ["ignore", "ignore", "pipe"],
@@ -8281,6 +10949,139 @@ function readExpoConfig(projectRoot) {
8281
10949
  import_node_fs7.default.rmSync(directory, { recursive: true, force: true });
8282
10950
  }
8283
10951
  }
10952
+ function evaluateFirebaseGuard(header, resources) {
10953
+ const condition = header.replace(/^\s*if\b/, "").replace(/\{\s*$/, "");
10954
+ const clauses = [];
10955
+ let depth = 0;
10956
+ let start = 0;
10957
+ let quoted = false;
10958
+ for (let index = 0; index < condition.length; index++) {
10959
+ const char = condition[index];
10960
+ if (char === '"') quoted = !quoted;
10961
+ if (quoted) continue;
10962
+ if (char === "(" || char === "[") depth += 1;
10963
+ if (char === ")" || char === "]") depth -= 1;
10964
+ if (char === "," && depth === 0) {
10965
+ clauses.push(condition.slice(start, index).trim());
10966
+ start = index + 1;
10967
+ }
10968
+ }
10969
+ clauses.push(condition.slice(start).trim());
10970
+ const sources = resources.filter(
10971
+ (file) => import_node_path7.default.basename(file) === "GoogleService-Info.plist"
10972
+ );
10973
+ const bound = /* @__PURE__ */ new Map();
10974
+ for (const clause of clauses) {
10975
+ if (/^FirebaseApp\s*\.\s*app\s*\(\s*\)\s*==\s*nil$/.test(clause)) continue;
10976
+ const resource = /^let\s+(\w+)\s*=\s*Bundle\.main\.path\s*\(\s*forResource:\s*"GoogleService-Info"\s*,\s*ofType:\s*"plist"\s*\)$/.exec(
10977
+ clause
10978
+ );
10979
+ if (resource) {
10980
+ if (sources.length !== 1) return false;
10981
+ bound.set(resource[1], sources[0]);
10982
+ continue;
10983
+ }
10984
+ const dictionary = /^let\s+(\w+)\s*=\s*NSDictionary\s*\(\s*contentsOfFile:\s*(\w+)\s*\)$/.exec(clause);
10985
+ if (dictionary && typeof bound.get(dictionary[2]) === "string") {
10986
+ const parsed = parsePlistSource(
10987
+ import_node_fs7.default.readFileSync(String(bound.get(dictionary[2])), "utf8")
10988
+ );
10989
+ if (!isRecord(parsed)) return false;
10990
+ bound.set(dictionary[1], parsed);
10991
+ continue;
10992
+ }
10993
+ const entry = /^let\s+(\w+)\s*=\s*(\w+)\s*\[\s*"(\w+)"\s*\]\s+as\?\s+String$/.exec(
10994
+ clause
10995
+ );
10996
+ const dictionaryValue = entry ? bound.get(entry[2]) : void 0;
10997
+ if (entry && isRecord(dictionaryValue)) {
10998
+ const value = dictionaryValue[entry[3]];
10999
+ if (typeof value !== "string") return false;
11000
+ bound.set(entry[1], value);
11001
+ continue;
11002
+ }
11003
+ const prefix2 = /^(\w+)\.hasPrefix\s*\(\s*"([^"]*)"\s*\)$/.exec(clause);
11004
+ const subject = prefix2 ? bound.get(prefix2[1]) : void 0;
11005
+ if (prefix2 && typeof subject === "string") {
11006
+ if (!subject.startsWith(prefix2[2])) return false;
11007
+ continue;
11008
+ }
11009
+ return null;
11010
+ }
11011
+ return true;
11012
+ }
11013
+ function blankSwiftObjcLiterals(raw) {
11014
+ return raw.replace(
11015
+ /\/\*[\s\S]*?\*\/|\/\/[^\n]*|"(?:\\.|[^"\\])*"/g,
11016
+ (token) => token.startsWith('"') ? `"${" ".repeat(token.length - 2)}"` : token.replace(/[^\n]/g, " ")
11017
+ );
11018
+ }
11019
+ function braceBlock(source, open) {
11020
+ let depth = 0;
11021
+ for (let index = open; index < source.length; index += 1) {
11022
+ if (source[index] === "{") depth += 1;
11023
+ if (source[index] === "}") depth -= 1;
11024
+ if (depth === 0) return { body: source.slice(open + 1, index), end: index + 1 };
11025
+ }
11026
+ return null;
11027
+ }
11028
+ function configuresDefaultApp(code) {
11029
+ const configureCall = /\bFirebaseApp\s*\.\s*configure\s*\(/;
11030
+ let topLevel = "";
11031
+ let depth = 0;
11032
+ for (const char of code) {
11033
+ if (char === "{") depth += 1;
11034
+ if (depth === 0) topLevel += char;
11035
+ if (char === "}") depth -= 1;
11036
+ }
11037
+ if (configureCall.test(topLevel)) return true;
11038
+ for (const chain of code.matchAll(/\bif\b[^{]*\{/g)) {
11039
+ let open = chain.index + chain[0].length - 1;
11040
+ const blocks = [];
11041
+ let complete = false;
11042
+ for (; ; ) {
11043
+ const block = braceBlock(code, open);
11044
+ if (!block) break;
11045
+ blocks.push(block.body);
11046
+ const next = /^\s*else\s*(if\b[^{]*)?\{/.exec(code.slice(block.end));
11047
+ if (!next) break;
11048
+ open = block.end + next[0].length - 1;
11049
+ if (!next[1]) {
11050
+ const last = braceBlock(code, open);
11051
+ if (last) {
11052
+ blocks.push(last.body);
11053
+ complete = true;
11054
+ }
11055
+ break;
11056
+ }
11057
+ }
11058
+ if (complete && blocks.every(configuresDefaultApp)) return true;
11059
+ }
11060
+ return false;
11061
+ }
11062
+ function findDefaultConfigureCall(body, sources) {
11063
+ const direct = /^\s*(?:FirebaseApp\s*\.\s*configure\s*\(\s*\)|\[FIRApp\s+configure\])/m.exec(body);
11064
+ if (direct) return direct;
11065
+ for (const call of body.matchAll(/^\s*([A-Z]\w*)\s*\.\s*(\w+)\s*\(\s*\)/gm)) {
11066
+ const [, type, name2] = call;
11067
+ for (const file of sources) {
11068
+ if (!file.endsWith(".swift")) continue;
11069
+ const source = blankSwiftObjcLiterals(import_node_fs7.default.readFileSync(file, "utf8"));
11070
+ const declaration = new RegExp(
11071
+ `\\b(?:enum|struct|class)\\s+${type}\\b[^{]*\\{`
11072
+ ).exec(source);
11073
+ if (!declaration) continue;
11074
+ const owner = braceBlock(source, declaration.index + declaration[0].length - 1);
11075
+ const method = owner ? new RegExp(`\\bstatic\\s+func\\s+${name2}\\s*\\(\\s*\\)[^{]*\\{`).exec(
11076
+ owner.body
11077
+ ) : null;
11078
+ const helper = owner && method ? braceBlock(owner.body, method.index + method[0].length - 1) : null;
11079
+ if (helper && !/\b(?:return|throw)\b/.test(helper.body) && configuresDefaultApp(helper.body))
11080
+ return call;
11081
+ }
11082
+ }
11083
+ return null;
11084
+ }
8284
11085
  function readTargetGoogleServicesFile(projectRoot, xcodeproj, target) {
8285
11086
  const app = readXcodeAppTarget(xcodeproj, target, void 0, {
8286
11087
  requireSources: false
@@ -8289,24 +11090,42 @@ function readTargetGoogleServicesFile(projectRoot, xcodeproj, target) {
8289
11090
  (file) => /^AppDelegate\.(swift|mm|m)$/.test(import_node_path7.default.basename(file))
8290
11091
  );
8291
11092
  const defaultConfigured = delegates.some((file) => {
8292
- const source = import_node_fs7.default.readFileSync(file, "utf8").replace(
8293
- /\/\*[\s\S]*?\*\/|\/\/[^\n]*|"(?:\\.|[^"\\])*"/g,
8294
- (token) => token.startsWith('"') ? '""' : token.replace(/[^\n]/g, " ")
8295
- );
11093
+ const raw = import_node_fs7.default.readFileSync(file, "utf8");
11094
+ const source = blankSwiftObjcLiterals(raw);
8296
11095
  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(
8297
11096
  source
8298
11097
  );
8299
11098
  if (!launch) return false;
8300
- const body = source.slice(launch.index + launch[0].length);
8301
- const configure = /^\s*(?:FirebaseApp\s*\.\s*configure\s*\(\s*\)|\[FIRApp\s+configure\])/m.exec(body);
11099
+ const bodyStart = launch.index + launch[0].length;
11100
+ const body = source.slice(bodyStart);
11101
+ const configure = findDefaultConfigureCall(body, app.allSources);
8302
11102
  if (!configure) return false;
8303
- const before = body.slice(0, configure.index);
11103
+ let before = body.slice(0, configure.index);
8304
11104
  let depth = 1;
8305
- for (const token of before) {
8306
- if (token === "{") depth += 1;
11105
+ let guardOpen = -1;
11106
+ for (let index = 0; index < before.length; index++) {
11107
+ const token = before[index];
11108
+ if (token === "{") {
11109
+ depth += 1;
11110
+ if (depth === 2) guardOpen = index;
11111
+ }
8307
11112
  if (token === "}") depth -= 1;
8308
11113
  if (depth === 0) return false;
8309
11114
  }
11115
+ let guard = null;
11116
+ if (depth === 2) {
11117
+ const headers = [...before.slice(0, guardOpen).matchAll(/^[ \t]*if\b/gm)];
11118
+ const header = headers.at(-1);
11119
+ if (header) {
11120
+ guard = raw.slice(bodyStart + header.index, bodyStart + guardOpen + 1);
11121
+ before = before.slice(0, header.index);
11122
+ depth = 1;
11123
+ for (const token of before) {
11124
+ if (token === "{") depth += 1;
11125
+ if (token === "}") depth -= 1;
11126
+ }
11127
+ }
11128
+ }
8310
11129
  let conditionalDepth = 0;
8311
11130
  for (const directive of before.matchAll(
8312
11131
  /^\s*#\s*(if|ifdef|ifndef|elseif|elif|else|endif)\b/gm
@@ -8321,11 +11140,19 @@ function readTargetGoogleServicesFile(projectRoot, xcodeproj, target) {
8321
11140
  conditionalDepth -= 1;
8322
11141
  }
8323
11142
  }
8324
- if (depth !== 1 || conditionalDepth !== 0 || /\b(?:return|throw)\b/.test(before))
11143
+ let topLevelBefore = "";
11144
+ let nesting = 0;
11145
+ for (const token of before) {
11146
+ if (token === "{") nesting += 1;
11147
+ if (nesting === 0) topLevelBefore += token;
11148
+ if (token === "}") nesting -= 1;
11149
+ }
11150
+ const guarded = guard === null ? true : evaluateFirebaseGuard(guard, app.resources);
11151
+ if (guarded === null || depth !== 1 || conditionalDepth !== 0 || /\b(?:return|throw)\b/.test(topLevelBefore))
8325
11152
  throw new Error(
8326
11153
  "native Firebase initialization must be unconditional in the app launch method"
8327
11154
  );
8328
- return true;
11155
+ return guarded;
8329
11156
  });
8330
11157
  if (!defaultConfigured) return null;
8331
11158
  const resources = app.resources.filter(
@@ -8852,7 +11679,7 @@ function withPeach(config, options = {}) {
8852
11679
  const configuredBundleUrl = "/index.bundle?platform=ios&dev=true&hot=true&minify=false";
8853
11680
  const cfgServer = config.server;
8854
11681
  const port = resolveMetroPort(cfgServer);
8855
- const metroServerId = (0, import_node_crypto2.randomUUID)();
11682
+ const metroServerId = (0, import_node_crypto3.randomUUID)();
8856
11683
  const bundleUrl = tagRnxBundleForPlugin(
8857
11684
  configuredBundleUrl,
8858
11685
  `http://localhost:${port}`,