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;
@@ -33,7 +33,6 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
33
33
  var replacement_module_handler_exports = {};
34
34
  __export(replacement_module_handler_exports, {
35
35
  REPLACEMENT_MODULE_ROUTE: () => REPLACEMENT_MODULE_ROUTE,
36
- REPLACEMENT_RUNTIME_PREFIX: () => REPLACEMENT_RUNTIME_PREFIX,
37
36
  handleReplacementModuleRequest: () => handleReplacementModuleRequest,
38
37
  isReplacementModuleRequestUrl: () => isReplacementModuleRequestUrl
39
38
  });
@@ -53,7 +52,6 @@ function isLoopbackHost(hostname) {
53
52
 
54
53
  // src/host/replacement-module-handler.ts
55
54
  var REPLACEMENT_MODULE_ROUTE = "/__sootsim-replacement-module";
56
- var REPLACEMENT_RUNTIME_PREFIX = "/__sootsim-replacement-runtime";
57
55
  function getReplacementLoader(filePath) {
58
56
  const ext = import_node_path.default.extname(filePath).toLowerCase();
59
57
  switch (ext) {
@@ -69,88 +67,6 @@ function getReplacementLoader(filePath) {
69
67
  return null;
70
68
  }
71
69
  }
72
- function reactRuntimeSource(reactBridgeUrl) {
73
- if (reactBridgeUrl) {
74
- return `export * from ${JSON.stringify(reactBridgeUrl)};
75
- import React from ${JSON.stringify(reactBridgeUrl)};
76
- export default React;
77
- `;
78
- }
79
- return `const bridge = globalThis.__sootsim_react_bridge
80
- if (!bridge) throw new Error('[rnx] replacement React bridge is not ready')
81
- export default bridge.default
82
- export const Activity = bridge.Activity
83
- export const Children = bridge.Children
84
- export const Component = bridge.Component
85
- export const Fragment = bridge.Fragment
86
- export const Profiler = bridge.Profiler
87
- export const PureComponent = bridge.PureComponent
88
- export const StrictMode = bridge.StrictMode
89
- export const Suspense = bridge.Suspense
90
- 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
91
- export const __COMPILER_RUNTIME = bridge.__COMPILER_RUNTIME
92
- export const __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = bridge.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED
93
- export const act = bridge.act
94
- export const cache = bridge.cache
95
- export const cacheSignal = bridge.cacheSignal
96
- export const captureOwnerStack = bridge.captureOwnerStack
97
- export const cloneElement = bridge.cloneElement
98
- export const createContext = bridge.createContext
99
- export const createElement = bridge.createElement
100
- export const createRef = bridge.createRef
101
- export const forwardRef = bridge.forwardRef
102
- export const isValidElement = bridge.isValidElement
103
- export const lazy = bridge.lazy
104
- export const memo = bridge.memo
105
- export const startTransition = bridge.startTransition
106
- export const unstable_useCacheRefresh = bridge.unstable_useCacheRefresh
107
- export const use = bridge.use
108
- export const useActionState = bridge.useActionState
109
- export const useCallback = bridge.useCallback
110
- export const useContext = bridge.useContext
111
- export const useDebugValue = bridge.useDebugValue
112
- export const useDeferredValue = bridge.useDeferredValue
113
- export const useEffect = bridge.useEffect
114
- export const useEffectEvent = bridge.useEffectEvent
115
- export const useId = bridge.useId
116
- export const useImperativeHandle = bridge.useImperativeHandle
117
- export const useInsertionEffect = bridge.useInsertionEffect
118
- export const useLayoutEffect = bridge.useLayoutEffect
119
- export const useMemo = bridge.useMemo
120
- export const useOptimistic = bridge.useOptimistic
121
- export const useReducer = bridge.useReducer
122
- export const useRef = bridge.useRef
123
- export const useState = bridge.useState
124
- export const useSyncExternalStore = bridge.useSyncExternalStore
125
- export const useTransition = bridge.useTransition
126
- export const version = bridge.version
127
- `;
128
- }
129
- function reactNativeRuntimeSource() {
130
- return `const rn = globalThis.__sootsim_components__ || {}
131
- export default rn
132
- export const View = rn.View
133
- export const Text = rn.Text
134
- export const Image = rn.Image
135
- export const ScrollView = rn.ScrollView
136
- export const FlatList = rn.FlatList
137
- export const Pressable = rn.Pressable
138
- export const TouchableOpacity = rn.TouchableOpacity
139
- export const TouchableWithoutFeedback = rn.TouchableWithoutFeedback
140
- export const TouchableHighlight = rn.TouchableHighlight
141
- export const TextInput = rn.TextInput
142
- export const ActivityIndicator = rn.ActivityIndicator
143
- export const KeyboardAvoidingView = rn.KeyboardAvoidingView
144
- export const Button = rn.Button
145
- export const Modal = rn.Modal
146
- export const Switch = rn.Switch
147
- export const StyleSheet = rn.StyleSheet
148
- export const Platform = rn.Platform
149
- export const Keyboard = rn.Keyboard
150
- export const Dimensions = rn.Dimensions
151
- export const Appearance = rn.Appearance
152
- `;
153
- }
154
70
  function sendJavaScript(req, res, source) {
155
71
  const origin = req.headers.origin;
156
72
  let allowedOrigin;
@@ -171,7 +87,7 @@ function isReplacementModuleRequestUrl(rawUrl) {
171
87
  if (!rawUrl) return false;
172
88
  try {
173
89
  const pathname = new URL(rawUrl, "http://rnx.local").pathname;
174
- return pathname === REPLACEMENT_MODULE_ROUTE || pathname.startsWith(`${REPLACEMENT_RUNTIME_PREFIX}/`);
90
+ return pathname === REPLACEMENT_MODULE_ROUTE;
175
91
  } catch {
176
92
  return false;
177
93
  }
@@ -201,14 +117,6 @@ async function handleReplacementModuleRequest(req, res, options = {}) {
201
117
  return true;
202
118
  }
203
119
  }
204
- if (url.pathname === `${REPLACEMENT_RUNTIME_PREFIX}/react`) {
205
- sendJavaScript(req, res, reactRuntimeSource(options.reactBridgeUrl));
206
- return true;
207
- }
208
- if (url.pathname === `${REPLACEMENT_RUNTIME_PREFIX}/react-native`) {
209
- sendJavaScript(req, res, reactNativeRuntimeSource());
210
- return true;
211
- }
212
120
  if (url.pathname !== REPLACEMENT_MODULE_ROUTE) return false;
213
121
  if (options.requestToken && url.searchParams.get("token") !== options.requestToken) {
214
122
  res.writeHead(403, { "Content-Type": "text/plain; charset=utf-8" });
@@ -232,6 +140,7 @@ async function handleReplacementModuleRequest(req, res, options = {}) {
232
140
  res.end("replacement file path must be absolute");
233
141
  return true;
234
142
  }
143
+ const runtimePackages = new Set(url.searchParams.getAll("runtimePackage"));
235
144
  let resolvedProjectRoot;
236
145
  if (options.projectRoot) {
237
146
  const lexicalProjectRoot = import_node_path.default.resolve(options.projectRoot);
@@ -274,19 +183,64 @@ async function handleReplacementModuleRequest(req, res, options = {}) {
274
183
  tsconfigRaw: { compilerOptions: { jsx: "react" } },
275
184
  sourcemap: "inline",
276
185
  logLevel: "silent",
277
- external: ["react", "react-native"]
186
+ plugins: [
187
+ {
188
+ name: "sootsim-replacement-runtime",
189
+ setup(runtimeBuild) {
190
+ runtimeBuild.onResolve(
191
+ {
192
+ filter: /^(react|react-native|react\/jsx-runtime|react\/jsx-dev-runtime)$/
193
+ },
194
+ (args) => ({ path: args.path, namespace: "sootsim-replacement-runtime" })
195
+ );
196
+ runtimeBuild.onResolve(
197
+ { filter: /.*/ },
198
+ (args) => runtimePackages.has(args.path) ? { path: args.path, namespace: "sootsim-replacement-runtime" } : void 0
199
+ );
200
+ runtimeBuild.onLoad(
201
+ { filter: /.*/, namespace: "sootsim-replacement-runtime" },
202
+ (args) => {
203
+ if (args.path === "react-native") {
204
+ return {
205
+ contents: `const bridge = globalThis.__sootsim_components__
206
+ if (!bridge) throw new Error('[rnx] replacement React Native bridge is not ready')
207
+ module.exports = bridge`,
208
+ loader: "js"
209
+ };
210
+ }
211
+ if (args.path === "react") {
212
+ return {
213
+ contents: `const bridge = globalThis.__sootsim_react_bridge
214
+ if (!bridge) throw new Error('[rnx] replacement React bridge is not ready')
215
+ module.exports = bridge`,
216
+ loader: "js"
217
+ };
218
+ }
219
+ if (args.path !== "react/jsx-runtime" && args.path !== "react/jsx-dev-runtime") {
220
+ return {
221
+ contents: `const packages = globalThis.__sootsim_config_package_modules
222
+ const bridge = packages?.[${JSON.stringify(args.path)}]
223
+ if (!bridge) throw new Error(${JSON.stringify(`[rnx] replacement package bridge ${args.path} is not ready`)})
224
+ module.exports = bridge`,
225
+ loader: "js"
226
+ };
227
+ }
228
+ return {
229
+ contents: `const React = globalThis.__sootsim_react_bridge
230
+ if (!React) throw new Error('[rnx] replacement React bridge is not ready')
231
+ exports.Fragment = React.Fragment
232
+ exports.jsx = (type, props, key) => React.createElement(type, key === undefined ? props : { ...props, key })
233
+ exports.jsxs = exports.jsx
234
+ exports.jsxDEV = exports.jsx`,
235
+ loader: "js"
236
+ };
237
+ }
238
+ );
239
+ }
240
+ }
241
+ ]
278
242
  });
279
- const bundledCode = result.outputFiles[0]?.text ?? "";
280
- const hasReactBinding = /\bimport\s+(?:\*\s+as\s+React|React(?:\s*,|\s+from)|\{[^}]*\bdefault\s+as\s+React\b)/.test(
281
- bundledCode
282
- );
283
- const reactImport = /\bReact\.(?:createElement|Fragment)\b/.test(bundledCode) && !hasReactBinding ? `import * as React from '${REPLACEMENT_RUNTIME_PREFIX}/react';
284
- ` : "";
285
- const runtimeCode = (reactImport + bundledCode).replace(
286
- /from\s*["']react-native["']/g,
287
- `from '${REPLACEMENT_RUNTIME_PREFIX}/react-native'`
288
- ).replace(/from\s*["']react["']/g, `from '${REPLACEMENT_RUNTIME_PREFIX}/react'`);
289
- sendJavaScript(req, res, runtimeCode);
243
+ sendJavaScript(req, res, result.outputFiles[0]?.text ?? "");
290
244
  } catch (error) {
291
245
  const message = error instanceof Error ? error.message : String(error);
292
246
  res.writeHead(500, { "Content-Type": "text/plain; charset=utf-8" });
@@ -297,7 +251,6 @@ async function handleReplacementModuleRequest(req, res, options = {}) {
297
251
  // Annotate the CommonJS export names for ESM import in node:
298
252
  0 && (module.exports = {
299
253
  REPLACEMENT_MODULE_ROUTE,
300
- REPLACEMENT_RUNTIME_PREFIX,
301
254
  handleReplacementModuleRequest,
302
255
  isReplacementModuleRequestUrl
303
256
  });
@@ -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 __defProp = Object.defineProperty;
@@ -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;
@@ -3060,7 +3060,6 @@ function isLoopbackHost(hostname) {
3060
3060
 
3061
3061
  // src/host/replacement-module-handler.ts
3062
3062
  var REPLACEMENT_MODULE_ROUTE = "/__sootsim-replacement-module";
3063
- var REPLACEMENT_RUNTIME_PREFIX = "/__sootsim-replacement-runtime";
3064
3063
  function getReplacementLoader(filePath) {
3065
3064
  const ext = import_node_path4.default.extname(filePath).toLowerCase();
3066
3065
  switch (ext) {
@@ -3076,88 +3075,6 @@ function getReplacementLoader(filePath) {
3076
3075
  return null;
3077
3076
  }
3078
3077
  }
3079
- function reactRuntimeSource(reactBridgeUrl) {
3080
- if (reactBridgeUrl) {
3081
- return `export * from ${JSON.stringify(reactBridgeUrl)};
3082
- import React from ${JSON.stringify(reactBridgeUrl)};
3083
- export default React;
3084
- `;
3085
- }
3086
- return `const bridge = globalThis.__sootsim_react_bridge
3087
- if (!bridge) throw new Error('[rnx] replacement React bridge is not ready')
3088
- export default bridge.default
3089
- export const Activity = bridge.Activity
3090
- export const Children = bridge.Children
3091
- export const Component = bridge.Component
3092
- export const Fragment = bridge.Fragment
3093
- export const Profiler = bridge.Profiler
3094
- export const PureComponent = bridge.PureComponent
3095
- export const StrictMode = bridge.StrictMode
3096
- export const Suspense = bridge.Suspense
3097
- 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
3098
- export const __COMPILER_RUNTIME = bridge.__COMPILER_RUNTIME
3099
- export const __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = bridge.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED
3100
- export const act = bridge.act
3101
- export const cache = bridge.cache
3102
- export const cacheSignal = bridge.cacheSignal
3103
- export const captureOwnerStack = bridge.captureOwnerStack
3104
- export const cloneElement = bridge.cloneElement
3105
- export const createContext = bridge.createContext
3106
- export const createElement = bridge.createElement
3107
- export const createRef = bridge.createRef
3108
- export const forwardRef = bridge.forwardRef
3109
- export const isValidElement = bridge.isValidElement
3110
- export const lazy = bridge.lazy
3111
- export const memo = bridge.memo
3112
- export const startTransition = bridge.startTransition
3113
- export const unstable_useCacheRefresh = bridge.unstable_useCacheRefresh
3114
- export const use = bridge.use
3115
- export const useActionState = bridge.useActionState
3116
- export const useCallback = bridge.useCallback
3117
- export const useContext = bridge.useContext
3118
- export const useDebugValue = bridge.useDebugValue
3119
- export const useDeferredValue = bridge.useDeferredValue
3120
- export const useEffect = bridge.useEffect
3121
- export const useEffectEvent = bridge.useEffectEvent
3122
- export const useId = bridge.useId
3123
- export const useImperativeHandle = bridge.useImperativeHandle
3124
- export const useInsertionEffect = bridge.useInsertionEffect
3125
- export const useLayoutEffect = bridge.useLayoutEffect
3126
- export const useMemo = bridge.useMemo
3127
- export const useOptimistic = bridge.useOptimistic
3128
- export const useReducer = bridge.useReducer
3129
- export const useRef = bridge.useRef
3130
- export const useState = bridge.useState
3131
- export const useSyncExternalStore = bridge.useSyncExternalStore
3132
- export const useTransition = bridge.useTransition
3133
- export const version = bridge.version
3134
- `;
3135
- }
3136
- function reactNativeRuntimeSource() {
3137
- return `const rn = globalThis.__sootsim_components__ || {}
3138
- export default rn
3139
- export const View = rn.View
3140
- export const Text = rn.Text
3141
- export const Image = rn.Image
3142
- export const ScrollView = rn.ScrollView
3143
- export const FlatList = rn.FlatList
3144
- export const Pressable = rn.Pressable
3145
- export const TouchableOpacity = rn.TouchableOpacity
3146
- export const TouchableWithoutFeedback = rn.TouchableWithoutFeedback
3147
- export const TouchableHighlight = rn.TouchableHighlight
3148
- export const TextInput = rn.TextInput
3149
- export const ActivityIndicator = rn.ActivityIndicator
3150
- export const KeyboardAvoidingView = rn.KeyboardAvoidingView
3151
- export const Button = rn.Button
3152
- export const Modal = rn.Modal
3153
- export const Switch = rn.Switch
3154
- export const StyleSheet = rn.StyleSheet
3155
- export const Platform = rn.Platform
3156
- export const Keyboard = rn.Keyboard
3157
- export const Dimensions = rn.Dimensions
3158
- export const Appearance = rn.Appearance
3159
- `;
3160
- }
3161
3078
  function sendJavaScript(req, res, source) {
3162
3079
  const origin = req.headers.origin;
3163
3080
  let allowedOrigin;
@@ -3178,7 +3095,7 @@ function isReplacementModuleRequestUrl(rawUrl) {
3178
3095
  if (!rawUrl) return false;
3179
3096
  try {
3180
3097
  const pathname = new URL(rawUrl, "http://rnx.local").pathname;
3181
- return pathname === REPLACEMENT_MODULE_ROUTE || pathname.startsWith(`${REPLACEMENT_RUNTIME_PREFIX}/`);
3098
+ return pathname === REPLACEMENT_MODULE_ROUTE;
3182
3099
  } catch {
3183
3100
  return false;
3184
3101
  }
@@ -3208,14 +3125,6 @@ async function handleReplacementModuleRequest(req, res, options = {}) {
3208
3125
  return true;
3209
3126
  }
3210
3127
  }
3211
- if (url.pathname === `${REPLACEMENT_RUNTIME_PREFIX}/react`) {
3212
- sendJavaScript(req, res, reactRuntimeSource(options.reactBridgeUrl));
3213
- return true;
3214
- }
3215
- if (url.pathname === `${REPLACEMENT_RUNTIME_PREFIX}/react-native`) {
3216
- sendJavaScript(req, res, reactNativeRuntimeSource());
3217
- return true;
3218
- }
3219
3128
  if (url.pathname !== REPLACEMENT_MODULE_ROUTE) return false;
3220
3129
  if (options.requestToken && url.searchParams.get("token") !== options.requestToken) {
3221
3130
  res.writeHead(403, { "Content-Type": "text/plain; charset=utf-8" });
@@ -3239,6 +3148,7 @@ async function handleReplacementModuleRequest(req, res, options = {}) {
3239
3148
  res.end("replacement file path must be absolute");
3240
3149
  return true;
3241
3150
  }
3151
+ const runtimePackages = new Set(url.searchParams.getAll("runtimePackage"));
3242
3152
  let resolvedProjectRoot;
3243
3153
  if (options.projectRoot) {
3244
3154
  const lexicalProjectRoot = import_node_path4.default.resolve(options.projectRoot);
@@ -3281,19 +3191,64 @@ async function handleReplacementModuleRequest(req, res, options = {}) {
3281
3191
  tsconfigRaw: { compilerOptions: { jsx: "react" } },
3282
3192
  sourcemap: "inline",
3283
3193
  logLevel: "silent",
3284
- external: ["react", "react-native"]
3194
+ plugins: [
3195
+ {
3196
+ name: "sootsim-replacement-runtime",
3197
+ setup(runtimeBuild) {
3198
+ runtimeBuild.onResolve(
3199
+ {
3200
+ filter: /^(react|react-native|react\/jsx-runtime|react\/jsx-dev-runtime)$/
3201
+ },
3202
+ (args) => ({ path: args.path, namespace: "sootsim-replacement-runtime" })
3203
+ );
3204
+ runtimeBuild.onResolve(
3205
+ { filter: /.*/ },
3206
+ (args) => runtimePackages.has(args.path) ? { path: args.path, namespace: "sootsim-replacement-runtime" } : void 0
3207
+ );
3208
+ runtimeBuild.onLoad(
3209
+ { filter: /.*/, namespace: "sootsim-replacement-runtime" },
3210
+ (args) => {
3211
+ if (args.path === "react-native") {
3212
+ return {
3213
+ contents: `const bridge = globalThis.__sootsim_components__
3214
+ if (!bridge) throw new Error('[rnx] replacement React Native bridge is not ready')
3215
+ module.exports = bridge`,
3216
+ loader: "js"
3217
+ };
3218
+ }
3219
+ if (args.path === "react") {
3220
+ return {
3221
+ contents: `const bridge = globalThis.__sootsim_react_bridge
3222
+ if (!bridge) throw new Error('[rnx] replacement React bridge is not ready')
3223
+ module.exports = bridge`,
3224
+ loader: "js"
3225
+ };
3226
+ }
3227
+ if (args.path !== "react/jsx-runtime" && args.path !== "react/jsx-dev-runtime") {
3228
+ return {
3229
+ contents: `const packages = globalThis.__sootsim_config_package_modules
3230
+ const bridge = packages?.[${JSON.stringify(args.path)}]
3231
+ if (!bridge) throw new Error(${JSON.stringify(`[rnx] replacement package bridge ${args.path} is not ready`)})
3232
+ module.exports = bridge`,
3233
+ loader: "js"
3234
+ };
3235
+ }
3236
+ return {
3237
+ contents: `const React = globalThis.__sootsim_react_bridge
3238
+ if (!React) throw new Error('[rnx] replacement React bridge is not ready')
3239
+ exports.Fragment = React.Fragment
3240
+ exports.jsx = (type, props, key) => React.createElement(type, key === undefined ? props : { ...props, key })
3241
+ exports.jsxs = exports.jsx
3242
+ exports.jsxDEV = exports.jsx`,
3243
+ loader: "js"
3244
+ };
3245
+ }
3246
+ );
3247
+ }
3248
+ }
3249
+ ]
3285
3250
  });
3286
- const bundledCode = result.outputFiles[0]?.text ?? "";
3287
- const hasReactBinding = /\bimport\s+(?:\*\s+as\s+React|React(?:\s*,|\s+from)|\{[^}]*\bdefault\s+as\s+React\b)/.test(
3288
- bundledCode
3289
- );
3290
- const reactImport = /\bReact\.(?:createElement|Fragment)\b/.test(bundledCode) && !hasReactBinding ? `import * as React from '${REPLACEMENT_RUNTIME_PREFIX}/react';
3291
- ` : "";
3292
- const runtimeCode = (reactImport + bundledCode).replace(
3293
- /from\s*["']react-native["']/g,
3294
- `from '${REPLACEMENT_RUNTIME_PREFIX}/react-native'`
3295
- ).replace(/from\s*["']react["']/g, `from '${REPLACEMENT_RUNTIME_PREFIX}/react'`);
3296
- sendJavaScript(req, res, runtimeCode);
3251
+ sendJavaScript(req, res, result.outputFiles[0]?.text ?? "");
3297
3252
  } catch (error) {
3298
3253
  const message = error instanceof Error ? error.message : String(error);
3299
3254
  res.writeHead(500, { "Content-Type": "text/plain; charset=utf-8" });
@@ -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 __defProp = Object.defineProperty;
package/dist-lib/menu.cjs CHANGED
@@ -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 __defProp = Object.defineProperty;
package/dist-lib/menu.mjs CHANGED
@@ -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
 
3
3
  // src/public-brand.ts
4
4
  var name = "rnx";
@@ -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 __defProp = Object.defineProperty;
@@ -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
 
3
3
  // src/metro-production-bundle.ts
4
4
  var RNXSIM_METRO_PRODUCTION_BUNDLE_OPTION = "rnxsim";