rnxsim 0.1.363 → 0.1.365

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 (176) hide show
  1. package/cli/outbound-endpoints.ts +2 -6
  2. package/dist-cli/bin.js +5 -5
  3. package/dist-cli/chunks/{agent-EN7USQWO.js → agent-BVMNQFKF.js} +2 -2
  4. package/dist-cli/chunks/{agent-wrapper-4K2P2EBF.js → agent-wrapper-B6YFXGC3.js} +2 -2
  5. package/dist-cli/chunks/app-fonts-MEI6R6XR.js +4 -0
  6. package/dist-cli/chunks/{assert-WEQDRDJ2.js → assert-JGHI53HV.js} +2 -2
  7. package/dist-cli/chunks/{auth-U5GBY5SE.js → auth-STEOXUS7.js} +2 -2
  8. package/dist-cli/chunks/{beta-WOKLQLOJ.js → beta-HT3FLS5T.js} +2 -2
  9. package/dist-cli/chunks/{camera-GRMP2HT3.js → camera-ZCLFSLON.js} +2 -2
  10. package/dist-cli/chunks/{chunk-TIZP26F4.js → chunk-25BTVHK2.js} +2 -2
  11. package/dist-cli/chunks/{chunk-YFF6YFYJ.js → chunk-2CXHDTQ5.js} +1 -1
  12. package/dist-cli/chunks/{chunk-TK4ZQQAL.js → chunk-2JFZ5Z7Q.js} +1 -1
  13. package/dist-cli/chunks/{chunk-QVUS7OHN.js → chunk-2SFMW5K6.js} +1 -1
  14. package/dist-cli/chunks/{chunk-6BGR523F.js → chunk-4WFN4DFR.js} +2 -2
  15. package/dist-cli/chunks/{chunk-4QK74NWP.js → chunk-52ES4API.js} +2 -2
  16. package/dist-cli/chunks/{chunk-FFWDCXTD.js → chunk-5AS7S6HY.js} +2 -2
  17. package/dist-cli/chunks/{chunk-SIKPB3GL.js → chunk-5VHWQGGF.js} +1 -1
  18. package/dist-cli/chunks/{chunk-GLYEL265.js → chunk-622E4JET.js} +1 -1
  19. package/dist-cli/chunks/{chunk-DK764ET6.js → chunk-67ATAITF.js} +2 -2
  20. package/dist-cli/chunks/{chunk-2AELGO56.js → chunk-6BAF6GFS.js} +1 -1
  21. package/dist-cli/chunks/{chunk-ZSFETJZV.js → chunk-BGRGP3QR.js} +1 -1
  22. package/dist-cli/chunks/{chunk-7CT75XQF.js → chunk-CYIE65QN.js} +1 -1
  23. package/dist-cli/chunks/{chunk-PDGEVGHU.js → chunk-DBJZUCFP.js} +2 -2
  24. package/dist-cli/chunks/{chunk-KCHXGTYQ.js → chunk-DQFOHIRF.js} +1 -1
  25. package/dist-cli/chunks/{chunk-MOC4QX3B.js → chunk-EAFKG5R3.js} +2 -2
  26. package/dist-cli/chunks/{chunk-DFL5AISK.js → chunk-EFL2ASZO.js} +1 -1
  27. package/dist-cli/chunks/{chunk-GMW6T2K6.js → chunk-EFXNSJ55.js} +2 -2
  28. package/dist-cli/chunks/{chunk-NUU3SWLR.js → chunk-EVBQDQVY.js} +1 -1
  29. package/dist-cli/chunks/{chunk-X2ITJOHZ.js → chunk-FHWZPUGC.js} +1 -1
  30. package/dist-cli/chunks/{chunk-23MIH7SN.js → chunk-FIXRGPUT.js} +1 -1
  31. package/dist-cli/chunks/{chunk-EAXYIY5U.js → chunk-GK7PGYFH.js} +1 -1
  32. package/dist-cli/chunks/{chunk-BPYGMBOL.js → chunk-GZEUDDAW.js} +2 -2
  33. package/dist-cli/chunks/{chunk-WIV5YAQT.js → chunk-HIDS3PYC.js} +2 -2
  34. package/dist-cli/chunks/{chunk-WYD5DEEU.js → chunk-IWPS3EKJ.js} +2 -2
  35. package/dist-cli/chunks/{chunk-5N5BWVZK.js → chunk-J66US2OZ.js} +1 -1
  36. package/dist-cli/chunks/{chunk-MM2XAXTN.js → chunk-JAFF4RAU.js} +1 -1
  37. package/dist-cli/chunks/{chunk-GKKO7RE2.js → chunk-JRPU5TFI.js} +3 -3
  38. package/dist-cli/chunks/{chunk-ZSLOAO3P.js → chunk-M5KJCLUW.js} +3 -3
  39. package/dist-cli/chunks/{chunk-4ZGUXZ6U.js → chunk-MACI34ST.js} +3 -3
  40. package/dist-cli/chunks/chunk-MCHKBFUL.js +4 -0
  41. package/dist-cli/chunks/{chunk-42O6RKCS.js → chunk-MR3YPNUI.js} +2 -2
  42. package/dist-cli/chunks/{chunk-QXBFDUCQ.js → chunk-MRNW4GVL.js} +2 -2
  43. package/dist-cli/chunks/{chunk-VXN2HAHP.js → chunk-NEH4T67X.js} +2 -2
  44. package/dist-cli/chunks/{chunk-ZCHCE6WJ.js → chunk-O2ORLK6W.js} +2 -2
  45. package/dist-cli/chunks/{chunk-KWFRIVXW.js → chunk-O6P4N2JD.js} +2 -2
  46. package/dist-cli/chunks/{chunk-BWTDQWRB.js → chunk-OSZ5HZSI.js} +2 -2
  47. package/dist-cli/chunks/{chunk-HJN6LXR5.js → chunk-QIQL7Y5V.js} +2 -2
  48. package/dist-cli/chunks/{chunk-LV4BJLQU.js → chunk-R4FQZXJC.js} +2 -2
  49. package/dist-cli/chunks/{chunk-74RRQIWF.js → chunk-RI3NS77J.js} +1 -1
  50. package/dist-cli/chunks/{chunk-BAPVTWIM.js → chunk-TKCGP3DD.js} +2 -2
  51. package/dist-cli/chunks/{chunk-S6CNNXSR.js → chunk-TULWPOAY.js} +2 -2
  52. package/dist-cli/chunks/{chunk-FADHHMJU.js → chunk-UR345KM3.js} +2 -2
  53. package/dist-cli/chunks/{chunk-IY2WWLFH.js → chunk-W3UIDI3W.js} +2 -2
  54. package/dist-cli/chunks/{chunk-FNVWTY57.js → chunk-WGNDJARS.js} +1 -1
  55. package/dist-cli/chunks/{chunk-XYPCBRGY.js → chunk-X5ZOZVHC.js} +1 -1
  56. package/dist-cli/chunks/{chunk-HGPDQPIG.js → chunk-XKRUNS7A.js} +2 -2
  57. package/dist-cli/chunks/{chunk-FAWMDCMJ.js → chunk-XPOTXF5Q.js} +2 -2
  58. package/dist-cli/chunks/{chunk-WPXQ7CNQ.js → chunk-XR4KID25.js} +2 -2
  59. package/dist-cli/chunks/{chunk-AGUR7LE7.js → chunk-XRO5WQXP.js} +1 -1
  60. package/dist-cli/chunks/{chunk-YSLE3K2S.js → chunk-XXNPISER.js} +2 -2
  61. package/dist-cli/chunks/{chunk-PH4W36KI.js → chunk-YE3M3YD4.js} +3 -3
  62. package/dist-cli/chunks/{chunk-46BMZYP7.js → chunk-ZCP4CRP6.js} +2 -2
  63. package/dist-cli/chunks/{chunk-KJ5SZIXX.js → chunk-ZGD7GZRI.js} +2 -2
  64. package/dist-cli/chunks/{chunk-2IVWNQDE.js → chunk-ZGH5U4AJ.js} +2 -2
  65. package/dist-cli/chunks/{chunk-4CMRJ7UX.js → chunk-ZTWUNK45.js} +2 -2
  66. package/dist-cli/chunks/{cleanup-ZVQLJLTY.js → cleanup-G4TEYVKY.js} +2 -2
  67. package/dist-cli/chunks/cli-version-ZM3PVKQ5.js +4 -0
  68. package/dist-cli/chunks/{compat-7T2VZZDL.js → compat-EZ5NP32J.js} +2 -2
  69. package/dist-cli/chunks/{config-E7OULENQ.js → config-27M2DGCS.js} +2 -2
  70. package/dist-cli/chunks/{control-X5O5UXPP.js → control-4QR43FXV.js} +2 -2
  71. package/dist-cli/chunks/daemon-2U4CJ6AT.js +4 -0
  72. package/dist-cli/chunks/{debug-LK6GRYHR.js → debug-EXU3D7PC.js} +3 -3
  73. package/dist-cli/chunks/{desktop-2LAHHUP6.js → desktop-SHHPZAWQ.js} +3 -3
  74. package/dist-cli/chunks/{detox-7GF6V6E6.js → detox-RQ6FFSBS.js} +2 -2
  75. package/dist-cli/chunks/{device-G3IF4IRA.js → device-4NI26HG6.js} +2 -2
  76. package/dist-cli/chunks/{diagnose-6G2RJWVP.js → diagnose-P4SFXH6J.js} +2 -2
  77. package/dist-cli/chunks/{disk-cleanup-PRAJROKV.js → disk-cleanup-BUAKWYMY.js} +2 -2
  78. package/dist-cli/chunks/drivers-OVCUPQTM.js +4 -0
  79. package/dist-cli/chunks/{film-CGVAWXPR.js → film-Y2BAQINB.js} +3 -3
  80. package/dist-cli/chunks/flow-ELTLKKZ3.js +4 -0
  81. package/dist-cli/chunks/help-CDEZAG2L.js +4 -0
  82. package/dist-cli/chunks/{hidden-runtime-alias-FCDWZQM3.js → hidden-runtime-alias-U2MAY2XV.js} +2 -2
  83. package/dist-cli/chunks/{home-paths-JEUBFYPY.js → home-paths-PAJMZCOS.js} +2 -2
  84. package/dist-cli/chunks/inspect-VVQRPJLS.js +4 -0
  85. package/dist-cli/chunks/install-desktop-YXSRKR35.js +4 -0
  86. package/dist-cli/chunks/{login-HBPZL3QX.js → login-D53XKBEO.js} +2 -2
  87. package/dist-cli/chunks/{logout-SVBZGGEI.js → logout-HZQKLNUJ.js} +2 -2
  88. package/dist-cli/chunks/{maestro-445CMWSH.js → maestro-XSS2KX6L.js} +3 -3
  89. package/dist-cli/chunks/{maestro-generate-4JWKONR2.js → maestro-generate-DNDQX3JQ.js} +3 -3
  90. package/dist-cli/chunks/{mode-M6GVNTDZ.js → mode-LEVGOKI3.js} +2 -2
  91. package/dist-cli/chunks/{optional-demo-registry-Q5CATNHD.js → optional-demo-registry-2XZIJNDG.js} +2 -2
  92. package/dist-cli/chunks/{perf-MBNYDE6X.js → perf-OKMAXDLB.js} +2 -2
  93. package/dist-cli/chunks/{permissions-HNLQIZJD.js → permissions-VG5TBUTN.js} +2 -2
  94. package/dist-cli/chunks/privacy-MNRHREME.js +4 -0
  95. package/dist-cli/chunks/{record-MH3BLHON.js → record-BQYGZOMV.js} +3 -3
  96. package/dist-cli/chunks/{report-issue-6HQHCFBG.js → report-issue-HCPZESWE.js} +2 -2
  97. package/dist-cli/chunks/reset-R4E4W4YI.js +4 -0
  98. package/dist-cli/chunks/runtime-XRQZ7W34.js +4 -0
  99. package/dist-cli/chunks/{screenshot-command-D6VS6GDA.js → screenshot-command-DWEYPJE7.js} +3 -3
  100. package/dist-cli/chunks/{screenshot-layers-MC7JHOO2.js → screenshot-layers-5GMBXLO7.js} +2 -2
  101. package/dist-cli/chunks/{screenshots-capture-PUQTDG5I.js → screenshots-capture-5KCI7IZD.js} +2 -2
  102. package/dist-cli/chunks/serve-QNKTA2HR.js +56 -0
  103. package/dist-cli/chunks/setup-RNMM5GO5.js +4 -0
  104. package/dist-cli/chunks/{skills-IJDXM6IC.js → skills-DOEALD3X.js} +2 -2
  105. package/dist-cli/chunks/{state-KCBXBFZZ.js → state-3HH2IHIF.js} +2 -2
  106. package/dist-cli/chunks/{storage-RBYDWRJC.js → storage-E7WUWN3E.js} +2 -2
  107. package/dist-cli/chunks/store-HUPZUCFG.js +4 -0
  108. package/dist-cli/chunks/telemetry-IJ53XR2Y.js +4 -0
  109. package/dist-cli/chunks/{timeline-RPEEEB3A.js → timeline-IKNUGQ2A.js} +2 -2
  110. package/dist-cli/chunks/{upgrade-TFLWCW3P.js → upgrade-VS3OKXE2.js} +2 -2
  111. package/dist-cli/chunks/upload-A57NAAHF.js +4 -0
  112. package/dist-cli/chunks/{version-LHPE2VT4.js → version-F4XHNTBZ.js} +2 -2
  113. package/dist-cli/chunks/{web-QJ74GCNZ.js → web-F72724QL.js} +2 -2
  114. package/dist-cli/chunks/welcome-B72RRMBW.js +5 -0
  115. package/dist-cli/chunks/{what-happened-JXBBC5U7.js → what-happened-APK7YKOV.js} +2 -2
  116. package/dist-lib/agent-daemon-client.cjs +1 -1
  117. package/dist-lib/agent-events.cjs +1 -1
  118. package/dist-lib/agent-identity.cjs +1 -1
  119. package/dist-lib/agent-sessions.cjs +1 -1
  120. package/dist-lib/attached-projects.cjs +1 -1
  121. package/dist-lib/auth/shared-session.cjs +1 -1
  122. package/dist-lib/backend-origin.cjs +1 -1
  123. package/dist-lib/beta.cjs +1 -1
  124. package/dist-lib/beta.mjs +1 -1
  125. package/dist-lib/bridge-constants.cjs +1 -1
  126. package/dist-lib/bridge-contract.cjs +1 -1
  127. package/dist-lib/cli-constants.cjs +1 -1
  128. package/dist-lib/config.cjs +1 -1
  129. package/dist-lib/detox/index.cjs +1 -1
  130. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  131. package/dist-lib/home-paths.cjs +1 -1
  132. package/dist-lib/host/bridge-host.cjs +89 -154
  133. package/dist-lib/host/fetch-proxy-handler.cjs +36 -3
  134. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  135. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  136. package/dist-lib/host/replacement-module-handler.cjs +60 -107
  137. package/dist-lib/host/websocket-proxy.cjs +1 -1
  138. package/dist-lib/index.cjs +60 -105
  139. package/dist-lib/jump-to-source-babel.cjs +1 -1
  140. package/dist-lib/menu.cjs +1 -1
  141. package/dist-lib/menu.mjs +1 -1
  142. package/dist-lib/metro-production-bundle.cjs +1 -1
  143. package/dist-lib/metro-production-bundle.mjs +1 -1
  144. package/dist-lib/metro.cjs +60 -105
  145. package/dist-lib/profiles.cjs +1 -1
  146. package/dist-lib/public-brand.cjs +1 -1
  147. package/dist-lib/react-native-host-modules.cjs +1 -1
  148. package/dist-lib/react-native-host-modules.mjs +1 -1
  149. package/dist-lib/render-mode.cjs +1 -1
  150. package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
  151. package/dist-lib/sdk.cjs +1 -1
  152. package/dist-lib/sdk.mjs +1 -1
  153. package/dist-lib/skills.cjs +126 -189
  154. package/dist-lib/vite.cjs +59 -104
  155. package/package.json +1 -1
  156. package/src/host/bridge-host.ts +2 -50
  157. package/src/host/fetch-proxy-handler.ts +40 -3
  158. package/src/host/replacement-module-handler.ts +65 -117
  159. package/dist-cli/chunks/app-fonts-7B5E7UDM.js +0 -4
  160. package/dist-cli/chunks/chunk-FQGTATLA.js +0 -4
  161. package/dist-cli/chunks/cli-version-KAVMACHT.js +0 -4
  162. package/dist-cli/chunks/daemon-GEDFARBC.js +0 -4
  163. package/dist-cli/chunks/drivers-4WSF4T4I.js +0 -4
  164. package/dist-cli/chunks/flow-MEDCS46T.js +0 -4
  165. package/dist-cli/chunks/help-KOAHGOH4.js +0 -4
  166. package/dist-cli/chunks/inspect-IU5HFVKF.js +0 -4
  167. package/dist-cli/chunks/install-desktop-5Q2WB4QO.js +0 -4
  168. package/dist-cli/chunks/privacy-UL6QT67W.js +0 -4
  169. package/dist-cli/chunks/reset-GHLOGMF3.js +0 -4
  170. package/dist-cli/chunks/runtime-JK43NPS6.js +0 -4
  171. package/dist-cli/chunks/serve-4UDVILST.js +0 -118
  172. package/dist-cli/chunks/setup-5IHFDPBA.js +0 -4
  173. package/dist-cli/chunks/store-O2PYGAXL.js +0 -4
  174. package/dist-cli/chunks/telemetry-B2CPDQID.js +0 -4
  175. package/dist-cli/chunks/upload-2GJWZG6R.js +0 -4
  176. package/dist-cli/chunks/welcome-5XJPBRJD.js +0 -5
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.363 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.365 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1175,7 +1175,7 @@ var REACT_NATIVE_ROOT_EXPORT_WILL_IT_WORK_COVERAGE, REACT_NATIVE_ROOT_EXPORT_STR
1175
1175
  var init_react_native_root_export_coverage = __esm({
1176
1176
  "../compat/src/generated/react-native-root-export-coverage.ts"() {
1177
1177
  "use strict";
1178
- REACT_NATIVE_ROOT_EXPORT_WILL_IT_WORK_COVERAGE = 0.96;
1178
+ REACT_NATIVE_ROOT_EXPORT_WILL_IT_WORK_COVERAGE = 0.98;
1179
1179
  REACT_NATIVE_ROOT_EXPORT_STRICT_COVERAGE = 0.653;
1180
1180
  }
1181
1181
  });
@@ -1592,10 +1592,10 @@ var init_registry = __esm({
1592
1592
  versions: [
1593
1593
  {
1594
1594
  range: ">=1.0.0",
1595
- coverage: 0.85,
1596
- note: "sootsim-image element rendering with onLoad/onError event normalization",
1597
- working: "Image component, ImageBackground, useImage hook, ImageRef class, contentFit, tintColor, onLoad/onLoadStart/onLoadEnd/onError callbacks, source normalization (string/object/array), prefetch, clearMemoryCache, clearDiskCache, getCachePathAsync, configureCache, generateBlurhashAsync, generateThumbhashAsync, loadAsync",
1598
- missing: "transition/animation effects, placeholder rendering, blurRadius, contentPosition, sfEffect/SFSymbol, allowDownscaling, autoplay (GIF), responsivePolicy"
1595
+ coverage: 0.9,
1596
+ note: "the real expo-image wrapper renders through the shared sootsim-image host. Paired native and SootSim runtime proof covers source-less placeholder rendering and right-edge contentPosition alignment; a negative control observed centered red/blue content before the renderer implemented the position.",
1597
+ working: "Image component, ImageBackground, useImage hook, ImageRef class, contentFit, contentPosition right-edge alignment, source-less placeholder rendering and placeholderContentFit, tintColor, onLoad/onLoadStart/onLoadEnd/onError callbacks, source normalization (string/object/array), prefetch, clearMemoryCache, clearDiskCache, getCachePathAsync, configureCache, generateBlurhashAsync, generateThumbhashAsync, loadAsync",
1598
+ missing: "transition/animation effects, blurRadius, contentPosition variants beyond the paired right-edge proof, sfEffect/SFSymbol, allowDownscaling, autoplay (GIF), responsivePolicy"
1599
1599
  }
1600
1600
  ]
1601
1601
  },
@@ -1644,9 +1644,9 @@ var init_registry = __esm({
1644
1644
  {
1645
1645
  range: ">=15.0.0",
1646
1646
  coverage: 0.9,
1647
- note: "both APIs implemented over one shared synchronous localStorage VFS: the SDK-18+ class-based File/Directory/Paths API (the bare `expo-file-system` export on SDK 18+) and the legacy async API (`expo-file-system/legacy`), with real network ops via fetch + navigator.storage. legacy and new interoperate on the same filesystem.",
1648
- working: "SDK-18+ class API: Paths (document/cache/bundle, join/basename/extname/dirname), File (exists, size, md5, name, extension, parentDirectory, create, write text|bytes, text(Sync), base64(Sync), bytes(Sync), arrayBuffer, slice, stream, delete, info, copy, move/rename, open FileHandle, static downloadFileAsync/pickFileAsync), Directory (exists, create, createFile, createDirectory, list, info, delete, copy, move, static pickDirectoryAsync). Legacy API: documentDirectory, cacheDirectory, bundleDirectory, EncodingType, FileSystemSessionType, FileSystemUploadType, FileSystemAcceptedUploadHttpMethod, readAsStringAsync, writeAsStringAsync, deleteAsync, getInfoAsync, makeDirectoryAsync, readDirectoryAsync, copyAsync, moveAsync, downloadAsync, createDownloadResumable, uploadAsync (real fetch with binary or multipart body), createUploadTask, UploadTask class (uploadAsync, cancelAsync, fires completion callback), getFreeDiskStorageAsync (navigator.storage.estimate quota - usage), getTotalDiskCapacityAsync (navigator.storage.estimate quota), getContentUriAsync (returns uri unchanged \u2014 Android-only behavior), StorageAccessFramework namespace stub (Android-only methods throw with platform error). All upstream legacy types exported: FileSystemUploadOptions, FileSystemUploadResult, UploadProgressData, DownloadProgressData, FileSystemNetworkTaskProgressCallback.",
1649
- missing: "DownloadResumable as a real cancelable class (only object returned today), chunked upload progress events (browsers do not expose per-chunk upload progress on fetch)"
1647
+ note: "both APIs implemented over one shared synchronous localStorage VFS: the SDK-18+ class-based File/Directory/Paths API (the bare `expo-file-system` export on SDK 18+) and the legacy async API (`expo-file-system/legacy`), with real network ops via fetch + navigator.storage. legacy and new interoperate on the same filesystem. paired native and SootSim runtime conformance verifies the published DownloadResumable class identity, savable state, and cancel-before-start behavior; the score stays at 90% because active-transfer control remains unsupported.",
1648
+ working: "SDK-18+ class API: Paths (document/cache/bundle, join/basename/extname/dirname), File (exists, size, md5, name, extension, parentDirectory, create, write text|bytes, text(Sync), base64(Sync), bytes(Sync), arrayBuffer, slice, stream, delete, info, copy, move/rename, open FileHandle, static downloadFileAsync/pickFileAsync), Directory (exists, create, createFile, createDirectory, list, info, delete, copy, move, static pickDirectoryAsync). Legacy API: documentDirectory, cacheDirectory, bundleDirectory, EncodingType, FileSystemSessionType, FileSystemUploadType, FileSystemAcceptedUploadHttpMethod, readAsStringAsync, writeAsStringAsync, deleteAsync, getInfoAsync, makeDirectoryAsync, readDirectoryAsync, copyAsync, moveAsync, downloadAsync, createDownloadResumable (published DownloadResumable class with fileUri/savable state and cancel-before-start), uploadAsync (real fetch with binary or multipart body), createUploadTask, UploadTask class (uploadAsync, cancelAsync, fires completion callback), getFreeDiskStorageAsync (navigator.storage.estimate quota - usage), getTotalDiskCapacityAsync (navigator.storage.estimate quota), getContentUriAsync (returns uri unchanged \u2014 Android-only behavior), StorageAccessFramework namespace stub (Android-only methods throw with platform error). All upstream legacy types exported: FileSystemUploadOptions, FileSystemUploadResult, UploadProgressData, DownloadProgressData, FileSystemNetworkTaskProgressCallback.",
1649
+ missing: "in-flight DownloadResumable pause, resume, cancellation, and streamed download progress; chunked upload progress events (fetch does not expose upload progress)"
1650
1650
  }
1651
1651
  ]
1652
1652
  },
@@ -2721,10 +2721,10 @@ var init_registry = __esm({
2721
2721
  versions: [
2722
2722
  {
2723
2723
  range: ">=9.1.0 <10.0.0",
2724
- coverage: 0.82,
2725
- note: "the real upstream package JS runs from the guest bundle. the granular onValueChange prop starts in 9.1.0; its controlled iOS wrapper resolves codegenNativeComponent('RNDateTimePicker') to the engine UIDatePicker wheel.",
2726
- working: "real upstream DateTimePicker and exported constants, value, mode date/time/datetime, granular onValueChange event and Date, minimumDate, maximumDate, minuteInterval, locale, timeZoneOffsetInMinutes, textColor, themeVariant, disabled",
2727
- missing: "displayIOS 'default'/'compact'/'inline' calendar styles (all render as wheels), countdown mode renders the time wheel, timeZoneName (use timeZoneOffsetInMinutes), accentColor, public onDismiss; deprecated onChange is not covered by the retained native proof"
2724
+ coverage: 0.85,
2725
+ note: "the real upstream package JS runs from the guest bundle. the granular onValueChange prop starts in 9.1.0; its controlled iOS wrapper resolves codegenNativeComponent('RNDateTimePicker') to the engine UIDatePicker wheel. paired native and SootSim proof covers fixed-offset and IANA-named date calendars. the pinned Fabric emitter omits utcOffset, so its Int32 field is observed as 0 on native and intentionally matches that value here.",
2726
+ working: "real upstream DateTimePicker and exported constants, value, mode date/time/datetime, granular onValueChange event and Date, minimumDate, maximumDate, minuteInterval, locale, timeZoneOffsetInMinutes, timeZoneName for date-mode calendar selection, textColor, themeVariant, disabled",
2727
+ missing: "displayIOS 'default'/'compact'/'inline' calendar styles (all render as wheels), countdown mode renders the time wheel, named-zone time/datetime modes are not retained by paired proof, accentColor, public onDismiss; deprecated onChange is not covered by the retained native proof"
2728
2728
  }
2729
2729
  ]
2730
2730
  },
@@ -2873,14 +2873,14 @@ var init_registry = __esm({
2873
2873
  "expo-screen-orientation": {
2874
2874
  category: "Expo SDK",
2875
2875
  stubType: "native",
2876
- proofCoverage: 0.8,
2876
+ proofCoverage: 1,
2877
2877
  versions: [
2878
2878
  {
2879
2879
  range: ">=7.0.0",
2880
- coverage: 0.5,
2881
- note: "the lock state and events work, but the viewport never rotates while the reference iOS simulator applies the requested orientation",
2882
- working: "getOrientationAsync (returns the locked orientation), getOrientationLockAsync, getPlatformOrientationLockAsync, lockAsync (with upstream TypeError validation), lockPlatformAsync, unlockAsync, supportsOrientationLockAsync, addOrientationChangeListener/remove (events fire on lock), all enums; validated through real RN + sootsim for landscape/portrait/platform-mask/unlock",
2883
- missing: "the device frame does not visually re-lay-out on lock \u2014 faithful to the browser/fixed-sim-frame limitation (identical to react-native-orientation-locker, not a sootsim-specific gap); there is no physical rotation sensor on a fixed sim device so DeviceOrientationEvent-driven auto-rotation is intentionally absent (matches a locked iOS device)"
2880
+ coverage: 0.95,
2881
+ note: "scored against the browser-hosted simulator contract: the real package imports cleanly and its meaningful lock state, platform masks, reads, and portrait-to-landscape event behavior match iOS across eight paired runtime stages. The simulator device frame is intentionally fixed, so the score does not claim faithful UIKit rotation.",
2882
+ working: "getOrientationAsync, getOrientationLockAsync, getPlatformOrientationLockAsync, lockAsync (with upstream TypeError validation), lockPlatformAsync, unlockAsync, supportsOrientationLockAsync, addOrientationChangeListener/remove, all enums; paired native and SootSim runtime validates support queries, portrait locks and reads, iOS platform-mask read/write, portrait-to-landscape event payloads, and unlock",
2883
+ missing: "deprecated bulk listener removal and same-axis portrait-up/portrait-down event filtering lack paired runtime coverage; physical device-frame rotation and sensor-driven auto-rotation are intentionally unavailable in the fixed browser-hosted simulator and do not count as an implementation gap"
2884
2884
  }
2885
2885
  ]
2886
2886
  },
@@ -4804,9 +4804,9 @@ var init_registry = __esm({
4804
4804
  {
4805
4805
  range: ">=14.0.0",
4806
4806
  coverage: 0,
4807
- note: "the reference iOS simulator renders Google test ads and presents consent flows. SootSim reports no-fill for every ad and presents no consent UI, so import safety receives no behavior credit",
4808
- working: "initialize, setRequestConfiguration, setAppMuted, openAdInspector, openDebugMenu, AdsConsent: requestInfoUpdate / loadAndShowConsentFormIfRequired / getConsentInfo / reset / showPrivacyOptionsForm, InterstitialAd / RewardedAd / RewardedInterstitialAd / AppOpenAd / GAM* classes with load/show/destroy and addAdEventListener returning unsubscribe, BannerAd / GAMBannerAd / RewardedAdEventType / AdEventType / AdsConsentStatus / AdsConsentDebugGeography / BannerAdSize / MaxAdContentRating / TestIds constants",
4809
- missing: "no real ad delivery \u2014 same constraint as every ad-network SDK in iOS-simulator / browser preview"
4807
+ note: "the reference iOS simulator renders Google test ads and presents consent flows. the SootSim replacement only initializes to an empty adapter set and reports consent not required; it cannot create an ad through the current public factories. import safety and fabricated no-fill shapes receive no behavior credit",
4808
+ working: "default initialize returns an empty adapter set; AdsConsent returns a non-requesting placeholder state; RewardedAdEventType, AdEventType, AdsConsentStatus, AdsConsentDebugGeography, BannerAdSize, MaxAdContentRating, and TestIds constants are present",
4809
+ missing: "real ad delivery and consent UI; InterstitialAd / RewardedAd / RewardedInterstitialAd / AppOpenAd / GAM* createForAdRequest factories, BannerAd / GAMBannerAd, NativeAd / NativeAdView / NativeMediaView / NativeAsset, hooks, upstream validation, loaded state, and public event behavior"
4810
4810
  }
4811
4811
  ]
4812
4812
  },
@@ -4868,9 +4868,9 @@ var init_registry = __esm({
4868
4868
  {
4869
4869
  range: ">=8.0.0",
4870
4870
  coverage: 0,
4871
- note: "the reference iOS simulator renders configured RevenueCat paywalls. SootSim always returns NOT_PRESENTED and renders no paywall, so import safety receives no behavior credit",
4871
+ note: "the reference iOS simulator renders configured RevenueCat paywalls. SootSim's replacement returns NOT_PRESENTED, rejects customer center, and substitutes async no-ops for view components. the current 10.7 package ships its own visibly labeled Preview API components, but replacing the package prevents that upstream path from running. none of these shapes receive behavior credit",
4872
4872
  working: "RevenueCatUI singleton, presentPaywall (NOT_PRESENTED), presentPaywallIfNeeded (NOT_PRESENTED), presentCustomerCenter (rejects clearly), PAYWALL_RESULT enum (NOT_PRESENTED, ERROR, CANCELLED, PURCHASED, RESTORED)",
4873
- missing: "no native paywall \u2014 same constraint as iOS simulator without StoreKit. pair with react-native-purchases for the full IAP flow"
4873
+ missing: "configured paywall and customer-center UI, Paywall / OriginalTemplatePaywallFooterContainerView / CustomerCenterView components, dismiss and purchase/restore callbacks, purchase logic, custom variables, management events, and the package-owned Preview API path"
4874
4874
  }
4875
4875
  ]
4876
4876
  },
@@ -5407,10 +5407,11 @@ var init_registry = __esm({
5407
5407
  stubType: "native",
5408
5408
  versions: [
5409
5409
  {
5410
- range: ">=0.10.0",
5411
- coverage: 0,
5412
- note: "the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: AppleMaps / GoogleMaps namespaces with View / Marker / Polyline / Polygon / Circle components rendering null; PROVIDER_GOOGLE / PROVIDER_DEFAULT / MapType enums exposed. imports and API shape receive no behavior credit",
5413
- missing: "no MKMapView / GoogleMap host views. recommended swap on web: a real react-leaflet or Mapbox GL JS surface in a host iframe"
5410
+ range: ">=0.1.0",
5411
+ coverage: 0.58,
5412
+ note: "native-seam only \u2014 the published AppleMaps and GoogleMaps namespaces, enums, permission hook, event unwrapping, and view wrappers run unchanged over SootSim's shared MapLibre-backed map owner",
5413
+ working: "AppleMaps.View and GoogleMaps.View live map rendering, initial and imperative camera positions, pan/pinch/rotate/tilt gesture settings, default markers, camera-move events, map-loaded callback, marker camera selection, location permission checks and requests",
5414
+ missing: "map/marker/shape click callbacks, polylines, polygons, circles, annotations, custom marker icons, Google Street View, Apple Look Around, traffic/building/indoor layers, platform-specific map styling and POI filtering"
5414
5415
  }
5415
5416
  ]
5416
5417
  },
@@ -6803,9 +6804,10 @@ var init_registry = __esm({
6803
6804
  versions: [
6804
6805
  {
6805
6806
  range: ">=0.4.0",
6806
- coverage: 0,
6807
- note: "the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: SignatureCapture renders null. imports and API shape receive no behavior credit",
6808
- missing: "recommended swap: react-signature-canvas on web"
6807
+ coverage: 0.78,
6808
+ note: "native-seam only \u2014 the published SignatureCapture class, lifecycle, event adaptation, and imperative saveImage/resetImage methods run unchanged against a CanvasKit signature surface",
6809
+ working: "finger/stylus stroke capture and rendering, min/max stroke width, stroke and background colors, optional border/title/native Save and Reset controls, onDragEvent, imperative and button reset, PNG encoding, shared cache-VFS pathName, base64 encoded save result, onSaveEvent, style/testID/ref passthrough",
6810
+ missing: "rotateClockwise and square output transforms, velocity-sensitive variable stroke width, saveImageFileInExtStorage Android path choice, exact OpenGL/native Bezier smoothing and phone-specific rotated native control layout"
6809
6811
  }
6810
6812
  ]
6811
6813
  },
@@ -7372,10 +7374,11 @@ var init_registry = __esm({
7372
7374
  stubType: "native",
7373
7375
  versions: [
7374
7376
  {
7375
- range: ">=1.0.0",
7376
- coverage: 0,
7377
- note: "the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: Waveform renders null; PermissionStatus enum exposed. imports and API shape receive no behavior credit",
7378
- missing: "no native waveform rendering; recommended swap: WaveSurfer.js"
7377
+ range: ">=2.0.0",
7378
+ coverage: 0.78,
7379
+ note: "native-seam only \u2014 the published Waveform component, candle UI, hooks, scrub logic, events, and imperative facade run unchanged over SootSim's shared browser audio driver",
7380
+ working: "static waveform extraction from decoded browser audio, normalized multi-channel sample peaks, prepare/play/pause/stop/seek, current and total duration, volume, playback speed, loop/pause/stop finish modes, independent keyed players, playback progress and completion events, microphone permission, MediaRecorder start/pause/resume/stop, metering updates, recorded blob URL and duration",
7381
+ missing: "streaming onCurrentExtractedWaveformData progress events and extractor cancellation, reading audio URLs blocked by cross-origin fetch policy, native filesystem paths not exposed through the simulator fetch/VFS bridge, exact AVFoundation/MediaCodec decoder normalization, recording encoder/file-name options, native audio-session routing and background playback"
7379
7382
  }
7380
7383
  ]
7381
7384
  },
@@ -17693,7 +17696,7 @@ async function handleFetchProxyRequest(req, res) {
17693
17696
  const proxyRes = await new Promise((resolve7, reject) => {
17694
17697
  const proxyReq = transport.request(
17695
17698
  {
17696
- hostname: targetUrl2.hostname,
17699
+ hostname: normalizeHostname(targetUrl2.hostname),
17697
17700
  port: targetUrl2.port || (targetUrl2.protocol === "https:" ? 443 : 80),
17698
17701
  path: targetUrl2.pathname + targetUrl2.search,
17699
17702
  method,
@@ -17758,6 +17761,32 @@ async function handleFetchProxyRequest(req, res) {
17758
17761
  res.end(`fetch proxy error: ${formatFetchProxyError(upstreamUrl.href, err)}`);
17759
17762
  }
17760
17763
  }
17764
+ async function handleBundleProxyRequest(req, res) {
17765
+ const params = new URLSearchParams((req.url || "").split("?")[1] || "");
17766
+ const target = params.get("url");
17767
+ if (!target) {
17768
+ applyFetchProxyCors(res);
17769
+ res.writeHead(400, { "Content-Type": "text/plain" });
17770
+ res.end("bundle-proxy: missing url query param");
17771
+ return;
17772
+ }
17773
+ let targetUrl;
17774
+ try {
17775
+ targetUrl = new URL(target);
17776
+ } catch {
17777
+ applyFetchProxyCors(res);
17778
+ res.writeHead(400, { "Content-Type": "text/plain" });
17779
+ res.end("bundle-proxy: invalid url");
17780
+ return;
17781
+ }
17782
+ if (!isLoopbackHost(targetUrl.hostname)) {
17783
+ applyFetchProxyCors(res);
17784
+ res.writeHead(403, { "Content-Type": "text/plain" });
17785
+ res.end("bundle-proxy: only loopback targets allowed");
17786
+ return;
17787
+ }
17788
+ await handleFetchProxyRequest(req, res);
17789
+ }
17761
17790
  function handleAppApiRequest(req, res) {
17762
17791
  const reqUrl = req.url || "";
17763
17792
  let targetPath = "";
@@ -17799,7 +17828,7 @@ function handleAppApiRequest(req, res) {
17799
17828
  const fwdHeaders = buildAppApiProxyHeaders(req.headers, targetUrl);
17800
17829
  const proxyReq = transport.request(
17801
17830
  {
17802
- hostname: targetUrl.hostname,
17831
+ hostname: normalizeHostname(targetUrl.hostname),
17803
17832
  port: targetUrl.port || (targetUrl.protocol === "https:" ? 443 : 80),
17804
17833
  path: targetUrl.pathname + targetUrl.search,
17805
17834
  method: req.method,
@@ -17946,88 +17975,6 @@ function getReplacementLoader(filePath) {
17946
17975
  return null;
17947
17976
  }
17948
17977
  }
17949
- function reactRuntimeSource(reactBridgeUrl) {
17950
- if (reactBridgeUrl) {
17951
- return `export * from ${JSON.stringify(reactBridgeUrl)};
17952
- import React from ${JSON.stringify(reactBridgeUrl)};
17953
- export default React;
17954
- `;
17955
- }
17956
- return `const bridge = globalThis.__sootsim_react_bridge
17957
- if (!bridge) throw new Error('[rnx] replacement React bridge is not ready')
17958
- export default bridge.default
17959
- export const Activity = bridge.Activity
17960
- export const Children = bridge.Children
17961
- export const Component = bridge.Component
17962
- export const Fragment = bridge.Fragment
17963
- export const Profiler = bridge.Profiler
17964
- export const PureComponent = bridge.PureComponent
17965
- export const StrictMode = bridge.StrictMode
17966
- export const Suspense = bridge.Suspense
17967
- export const __CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE = bridge.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE
17968
- export const __COMPILER_RUNTIME = bridge.__COMPILER_RUNTIME
17969
- export const __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = bridge.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED
17970
- export const act = bridge.act
17971
- export const cache = bridge.cache
17972
- export const cacheSignal = bridge.cacheSignal
17973
- export const captureOwnerStack = bridge.captureOwnerStack
17974
- export const cloneElement = bridge.cloneElement
17975
- export const createContext = bridge.createContext
17976
- export const createElement = bridge.createElement
17977
- export const createRef = bridge.createRef
17978
- export const forwardRef = bridge.forwardRef
17979
- export const isValidElement = bridge.isValidElement
17980
- export const lazy = bridge.lazy
17981
- export const memo = bridge.memo
17982
- export const startTransition = bridge.startTransition
17983
- export const unstable_useCacheRefresh = bridge.unstable_useCacheRefresh
17984
- export const use = bridge.use
17985
- export const useActionState = bridge.useActionState
17986
- export const useCallback = bridge.useCallback
17987
- export const useContext = bridge.useContext
17988
- export const useDebugValue = bridge.useDebugValue
17989
- export const useDeferredValue = bridge.useDeferredValue
17990
- export const useEffect = bridge.useEffect
17991
- export const useEffectEvent = bridge.useEffectEvent
17992
- export const useId = bridge.useId
17993
- export const useImperativeHandle = bridge.useImperativeHandle
17994
- export const useInsertionEffect = bridge.useInsertionEffect
17995
- export const useLayoutEffect = bridge.useLayoutEffect
17996
- export const useMemo = bridge.useMemo
17997
- export const useOptimistic = bridge.useOptimistic
17998
- export const useReducer = bridge.useReducer
17999
- export const useRef = bridge.useRef
18000
- export const useState = bridge.useState
18001
- export const useSyncExternalStore = bridge.useSyncExternalStore
18002
- export const useTransition = bridge.useTransition
18003
- export const version = bridge.version
18004
- `;
18005
- }
18006
- function reactNativeRuntimeSource() {
18007
- return `const rn = globalThis.__sootsim_components__ || {}
18008
- export default rn
18009
- export const View = rn.View
18010
- export const Text = rn.Text
18011
- export const Image = rn.Image
18012
- export const ScrollView = rn.ScrollView
18013
- export const FlatList = rn.FlatList
18014
- export const Pressable = rn.Pressable
18015
- export const TouchableOpacity = rn.TouchableOpacity
18016
- export const TouchableWithoutFeedback = rn.TouchableWithoutFeedback
18017
- export const TouchableHighlight = rn.TouchableHighlight
18018
- export const TextInput = rn.TextInput
18019
- export const ActivityIndicator = rn.ActivityIndicator
18020
- export const KeyboardAvoidingView = rn.KeyboardAvoidingView
18021
- export const Button = rn.Button
18022
- export const Modal = rn.Modal
18023
- export const Switch = rn.Switch
18024
- export const StyleSheet = rn.StyleSheet
18025
- export const Platform = rn.Platform
18026
- export const Keyboard = rn.Keyboard
18027
- export const Dimensions = rn.Dimensions
18028
- export const Appearance = rn.Appearance
18029
- `;
18030
- }
18031
17978
  function sendJavaScript(req, res, source) {
18032
17979
  const origin = req.headers.origin;
18033
17980
  let allowedOrigin;
@@ -18048,7 +17995,7 @@ function isReplacementModuleRequestUrl(rawUrl) {
18048
17995
  if (!rawUrl) return false;
18049
17996
  try {
18050
17997
  const pathname = new URL(rawUrl, "http://rnx.local").pathname;
18051
- return pathname === REPLACEMENT_MODULE_ROUTE || pathname.startsWith(`${REPLACEMENT_RUNTIME_PREFIX}/`);
17998
+ return pathname === REPLACEMENT_MODULE_ROUTE;
18052
17999
  } catch {
18053
18000
  return false;
18054
18001
  }
@@ -18078,14 +18025,6 @@ async function handleReplacementModuleRequest(req, res, options = {}) {
18078
18025
  return true;
18079
18026
  }
18080
18027
  }
18081
- if (url.pathname === `${REPLACEMENT_RUNTIME_PREFIX}/react`) {
18082
- sendJavaScript(req, res, reactRuntimeSource(options.reactBridgeUrl));
18083
- return true;
18084
- }
18085
- if (url.pathname === `${REPLACEMENT_RUNTIME_PREFIX}/react-native`) {
18086
- sendJavaScript(req, res, reactNativeRuntimeSource());
18087
- return true;
18088
- }
18089
18028
  if (url.pathname !== REPLACEMENT_MODULE_ROUTE) return false;
18090
18029
  if (options.requestToken && url.searchParams.get("token") !== options.requestToken) {
18091
18030
  res.writeHead(403, { "Content-Type": "text/plain; charset=utf-8" });
@@ -18109,6 +18048,7 @@ async function handleReplacementModuleRequest(req, res, options = {}) {
18109
18048
  res.end("replacement file path must be absolute");
18110
18049
  return true;
18111
18050
  }
18051
+ const runtimePackages = new Set(url.searchParams.getAll("runtimePackage"));
18112
18052
  let resolvedProjectRoot;
18113
18053
  if (options.projectRoot) {
18114
18054
  const lexicalProjectRoot = import_node_path10.default.resolve(options.projectRoot);
@@ -18151,19 +18091,64 @@ async function handleReplacementModuleRequest(req, res, options = {}) {
18151
18091
  tsconfigRaw: { compilerOptions: { jsx: "react" } },
18152
18092
  sourcemap: "inline",
18153
18093
  logLevel: "silent",
18154
- external: ["react", "react-native"]
18094
+ plugins: [
18095
+ {
18096
+ name: "sootsim-replacement-runtime",
18097
+ setup(runtimeBuild) {
18098
+ runtimeBuild.onResolve(
18099
+ {
18100
+ filter: /^(react|react-native|react\/jsx-runtime|react\/jsx-dev-runtime)$/
18101
+ },
18102
+ (args) => ({ path: args.path, namespace: "sootsim-replacement-runtime" })
18103
+ );
18104
+ runtimeBuild.onResolve(
18105
+ { filter: /.*/ },
18106
+ (args) => runtimePackages.has(args.path) ? { path: args.path, namespace: "sootsim-replacement-runtime" } : void 0
18107
+ );
18108
+ runtimeBuild.onLoad(
18109
+ { filter: /.*/, namespace: "sootsim-replacement-runtime" },
18110
+ (args) => {
18111
+ if (args.path === "react-native") {
18112
+ return {
18113
+ contents: `const bridge = globalThis.__sootsim_components__
18114
+ if (!bridge) throw new Error('[rnx] replacement React Native bridge is not ready')
18115
+ module.exports = bridge`,
18116
+ loader: "js"
18117
+ };
18118
+ }
18119
+ if (args.path === "react") {
18120
+ return {
18121
+ contents: `const bridge = globalThis.__sootsim_react_bridge
18122
+ if (!bridge) throw new Error('[rnx] replacement React bridge is not ready')
18123
+ module.exports = bridge`,
18124
+ loader: "js"
18125
+ };
18126
+ }
18127
+ if (args.path !== "react/jsx-runtime" && args.path !== "react/jsx-dev-runtime") {
18128
+ return {
18129
+ contents: `const packages = globalThis.__sootsim_config_package_modules
18130
+ const bridge = packages?.[${JSON.stringify(args.path)}]
18131
+ if (!bridge) throw new Error(${JSON.stringify(`[rnx] replacement package bridge ${args.path} is not ready`)})
18132
+ module.exports = bridge`,
18133
+ loader: "js"
18134
+ };
18135
+ }
18136
+ return {
18137
+ contents: `const React = globalThis.__sootsim_react_bridge
18138
+ if (!React) throw new Error('[rnx] replacement React bridge is not ready')
18139
+ exports.Fragment = React.Fragment
18140
+ exports.jsx = (type, props, key) => React.createElement(type, key === undefined ? props : { ...props, key })
18141
+ exports.jsxs = exports.jsx
18142
+ exports.jsxDEV = exports.jsx`,
18143
+ loader: "js"
18144
+ };
18145
+ }
18146
+ );
18147
+ }
18148
+ }
18149
+ ]
18155
18150
  });
18156
- const bundledCode = result.outputFiles[0]?.text ?? "";
18157
- const hasReactBinding = /\bimport\s+(?:\*\s+as\s+React|React(?:\s*,|\s+from)|\{[^}]*\bdefault\s+as\s+React\b)/.test(
18158
- bundledCode
18159
- );
18160
- const reactImport = /\bReact\.(?:createElement|Fragment)\b/.test(bundledCode) && !hasReactBinding ? `import * as React from '${REPLACEMENT_RUNTIME_PREFIX}/react';
18161
- ` : "";
18162
- const runtimeCode = (reactImport + bundledCode).replace(
18163
- /from\s*["']react-native["']/g,
18164
- `from '${REPLACEMENT_RUNTIME_PREFIX}/react-native'`
18165
- ).replace(/from\s*["']react["']/g, `from '${REPLACEMENT_RUNTIME_PREFIX}/react'`);
18166
- sendJavaScript(req, res, runtimeCode);
18151
+ sendJavaScript(req, res, result.outputFiles[0]?.text ?? "");
18167
18152
  } catch (error) {
18168
18153
  const message = error instanceof Error ? error.message : String(error);
18169
18154
  res.writeHead(500, { "Content-Type": "text/plain; charset=utf-8" });
@@ -18171,7 +18156,7 @@ async function handleReplacementModuleRequest(req, res, options = {}) {
18171
18156
  }
18172
18157
  return true;
18173
18158
  }
18174
- var import_promises5, import_node_path10, import_esbuild, REPLACEMENT_MODULE_ROUTE, REPLACEMENT_RUNTIME_PREFIX;
18159
+ var import_promises5, import_node_path10, import_esbuild, REPLACEMENT_MODULE_ROUTE;
18175
18160
  var init_replacement_module_handler = __esm({
18176
18161
  "src/host/replacement-module-handler.ts"() {
18177
18162
  "use strict";
@@ -18180,7 +18165,6 @@ var init_replacement_module_handler = __esm({
18180
18165
  import_esbuild = require("esbuild");
18181
18166
  init_backend_origin();
18182
18167
  REPLACEMENT_MODULE_ROUTE = "/__sootsim-replacement-module";
18183
- REPLACEMENT_RUNTIME_PREFIX = "/__sootsim-replacement-runtime";
18184
18168
  }
18185
18169
  });
18186
18170
 
@@ -18416,7 +18400,6 @@ var init_bridge_host = __esm({
18416
18400
  import_path2 = __toESM(require("path"), 1);
18417
18401
  import_ws2 = require("ws");
18418
18402
  init_dev_server_scanner();
18419
- init_backend_origin();
18420
18403
  init_bridge_constants();
18421
18404
  init_cli_version();
18422
18405
  init_home_paths();
@@ -19549,53 +19532,7 @@ var init_bridge_host = __esm({
19549
19532
  return;
19550
19533
  }
19551
19534
  if (url.pathname === "/__bundle-proxy") {
19552
- const target = url.searchParams.get("url");
19553
- if (!target) {
19554
- res.writeHead(400, { "Content-Type": "text/plain" });
19555
- res.end("bundle-proxy: missing url query param");
19556
- return;
19557
- }
19558
- let parsedTarget;
19559
- try {
19560
- parsedTarget = new URL(target);
19561
- } catch {
19562
- res.writeHead(400, { "Content-Type": "text/plain" });
19563
- res.end("bundle-proxy: invalid url");
19564
- return;
19565
- }
19566
- if (!isLoopbackHost(parsedTarget.hostname)) {
19567
- res.writeHead(403, { "Content-Type": "text/plain" });
19568
- res.end("bundle-proxy: only loopback targets allowed");
19569
- return;
19570
- }
19571
- void (async () => {
19572
- try {
19573
- const upstream = await fetch(parsedTarget.toString(), {
19574
- redirect: "follow"
19575
- });
19576
- const headers = {};
19577
- const ct = upstream.headers.get("content-type");
19578
- if (ct) headers["Content-Type"] = ct;
19579
- headers["Cache-Control"] = "no-store";
19580
- res.writeHead(upstream.status, headers);
19581
- if (!upstream.body) {
19582
- res.end();
19583
- return;
19584
- }
19585
- const reader = upstream.body.getReader();
19586
- while (true) {
19587
- const { done, value } = await reader.read();
19588
- if (done) break;
19589
- res.write(Buffer.from(value));
19590
- }
19591
- res.end();
19592
- } catch (err) {
19593
- res.writeHead(502, { "Content-Type": "text/plain" });
19594
- res.end(
19595
- `bundle-proxy: upstream fetch failed: ${err instanceof Error ? err.message : String(err)}`
19596
- );
19597
- }
19598
- })();
19535
+ void handleBundleProxyRequest(req, res);
19599
19536
  return;
19600
19537
  }
19601
19538
  if (url.pathname === "/__server-scan") {