peachsim 0.1.527

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 (324) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +640 -0
  3. package/cli/app-config.ts +82 -0
  4. package/cli/app-fonts.ts +388 -0
  5. package/cli/app-project.ts +59 -0
  6. package/cli/app-splash.ts +171 -0
  7. package/cli/app-state-reset.ts +26 -0
  8. package/cli/auth.ts +184 -0
  9. package/cli/bin.ts +59 -0
  10. package/cli/bridge-diagnostics.ts +226 -0
  11. package/cli/bridge-flow-runner.ts +2806 -0
  12. package/cli/browser-backend.ts +44 -0
  13. package/cli/browser-evals.ts +96 -0
  14. package/cli/cli-update.ts +261 -0
  15. package/cli/cloud-client.ts +1530 -0
  16. package/cli/cloud-dispatch.ts +206 -0
  17. package/cli/cloud-session.ts +227 -0
  18. package/cli/command-contract.ts +221 -0
  19. package/cli/command-registry.ts +304 -0
  20. package/cli/commands/agent-wrapper.ts +1048 -0
  21. package/cli/commands/agent.ts +439 -0
  22. package/cli/commands/app-fonts.ts +99 -0
  23. package/cli/commands/assert.ts +542 -0
  24. package/cli/commands/auth.ts +71 -0
  25. package/cli/commands/box/bundle-plane.ts +71 -0
  26. package/cli/commands/box/checkout-plane.ts +256 -0
  27. package/cli/commands/box/plane-share.ts +208 -0
  28. package/cli/commands/box/rnx-command.ts +60 -0
  29. package/cli/commands/box/search-command.ts +157 -0
  30. package/cli/commands/box.ts +925 -0
  31. package/cli/commands/camera.ts +266 -0
  32. package/cli/commands/cleanup.ts +169 -0
  33. package/cli/commands/compat.ts +176 -0
  34. package/cli/commands/config.ts +34 -0
  35. package/cli/commands/control.ts +2154 -0
  36. package/cli/commands/cpu-profile.ts +941 -0
  37. package/cli/commands/daemon-mac-app.ts +165 -0
  38. package/cli/commands/daemon.ts +800 -0
  39. package/cli/commands/debug.ts +751 -0
  40. package/cli/commands/desktop.ts +39 -0
  41. package/cli/commands/detect.ts +201 -0
  42. package/cli/commands/detox.ts +481 -0
  43. package/cli/commands/device.ts +134 -0
  44. package/cli/commands/diagnose.ts +589 -0
  45. package/cli/commands/do-chain.ts +408 -0
  46. package/cli/commands/electron.ts +94 -0
  47. package/cli/commands/film.ts +379 -0
  48. package/cli/commands/flow.ts +1240 -0
  49. package/cli/commands/inspect/actions.ts +516 -0
  50. package/cli/commands/inspect/core.ts +2086 -0
  51. package/cli/commands/inspect/count.ts +17 -0
  52. package/cli/commands/inspect/describe.ts +119 -0
  53. package/cli/commands/inspect/env.ts +25 -0
  54. package/cli/commands/inspect/find.ts +169 -0
  55. package/cli/commands/inspect/get-layout.ts +53 -0
  56. package/cli/commands/inspect/keyboard.ts +54 -0
  57. package/cli/commands/inspect/list.ts +175 -0
  58. package/cli/commands/inspect/memory.ts +215 -0
  59. package/cli/commands/inspect/redaction.ts +39 -0
  60. package/cli/commands/inspect/resolve-target.ts +77 -0
  61. package/cli/commands/inspect/screens.ts +78 -0
  62. package/cli/commands/inspect/settle.ts +32 -0
  63. package/cli/commands/inspect/settling.ts +197 -0
  64. package/cli/commands/inspect/shared.ts +259 -0
  65. package/cli/commands/inspect/sleep.ts +15 -0
  66. package/cli/commands/inspect/tree.ts +23 -0
  67. package/cli/commands/inspect/url.ts +17 -0
  68. package/cli/commands/inspect/wait-event.ts +211 -0
  69. package/cli/commands/inspect/wait-idle.ts +25 -0
  70. package/cli/commands/inspect/wait-ready.ts +87 -0
  71. package/cli/commands/inspect/wait-selector.ts +59 -0
  72. package/cli/commands/inspect/wait.ts +32 -0
  73. package/cli/commands/inspect.ts +4738 -0
  74. package/cli/commands/install-cli.ts +275 -0
  75. package/cli/commands/install-desktop.ts +385 -0
  76. package/cli/commands/login.ts +357 -0
  77. package/cli/commands/logout.ts +24 -0
  78. package/cli/commands/maestro-generate.ts +375 -0
  79. package/cli/commands/maestro.ts +536 -0
  80. package/cli/commands/mode.ts +58 -0
  81. package/cli/commands/no-bridge-hint.ts +80 -0
  82. package/cli/commands/perf.ts +67 -0
  83. package/cli/commands/permissions.ts +203 -0
  84. package/cli/commands/platform.ts +410 -0
  85. package/cli/commands/preview.ts +103 -0
  86. package/cli/commands/profile.ts +106 -0
  87. package/cli/commands/react.ts +353 -0
  88. package/cli/commands/record.ts +1435 -0
  89. package/cli/commands/report-issue.ts +305 -0
  90. package/cli/commands/reset.ts +89 -0
  91. package/cli/commands/runtime.ts +348 -0
  92. package/cli/commands/screenshot-command.ts +106 -0
  93. package/cli/commands/screenshot-layers.ts +144 -0
  94. package/cli/commands/screenshot-mode.ts +38 -0
  95. package/cli/commands/screenshot.ts +492 -0
  96. package/cli/commands/screenshots-capture.ts +608 -0
  97. package/cli/commands/screenshots.ts +127 -0
  98. package/cli/commands/serve.ts +139 -0
  99. package/cli/commands/setup.ts +416 -0
  100. package/cli/commands/shell-boolean-mode.ts +82 -0
  101. package/cli/commands/skills.ts +468 -0
  102. package/cli/commands/slides.ts +357 -0
  103. package/cli/commands/state.ts +94 -0
  104. package/cli/commands/storage.ts +58 -0
  105. package/cli/commands/telemetry.ts +55 -0
  106. package/cli/commands/test.ts +535 -0
  107. package/cli/commands/three-mode.ts +771 -0
  108. package/cli/commands/timeline.ts +121 -0
  109. package/cli/commands/upgrade.ts +167 -0
  110. package/cli/commands/upload.ts +1203 -0
  111. package/cli/commands/version.ts +63 -0
  112. package/cli/commands/welcome.ts +17 -0
  113. package/cli/commands/what-happened.ts +328 -0
  114. package/cli/current-sim.ts +217 -0
  115. package/cli/desktop-companion.ts +315 -0
  116. package/cli/drivers/electron.ts +70 -0
  117. package/cli/drivers/index.ts +20 -0
  118. package/cli/drivers/playwright-provisioning.ts +184 -0
  119. package/cli/drivers/playwright-sim-host.ts +537 -0
  120. package/cli/drivers/playwright.ts +209 -0
  121. package/cli/drivers/registry.ts +65 -0
  122. package/cli/drivers/types.ts +102 -0
  123. package/cli/flow-export.ts +55 -0
  124. package/cli/flow-file.ts +142 -0
  125. package/cli/flow-live-status.ts +126 -0
  126. package/cli/flow-session.ts +140 -0
  127. package/cli/help-core.ts +143 -0
  128. package/cli/help.ts +44 -0
  129. package/cli/hidden-runtime-alias.ts +19 -0
  130. package/cli/hints.ts +214 -0
  131. package/cli/inspect-notice-state.ts +114 -0
  132. package/cli/internal-child.ts +176 -0
  133. package/cli/maestro-js.ts +323 -0
  134. package/cli/main.ts +704 -0
  135. package/cli/open-url.ts +8 -0
  136. package/cli/outbound-endpoints.ts +830 -0
  137. package/cli/parent-pid.ts +204 -0
  138. package/cli/parse-args.ts +189 -0
  139. package/cli/privacy.ts +53 -0
  140. package/cli/prompt.ts +56 -0
  141. package/cli/recording-access.ts +108 -0
  142. package/cli/registry.ts +2 -0
  143. package/cli/resolve-assets.ts +63 -0
  144. package/cli/rnx-in-process.ts +98 -0
  145. package/cli/run-registry.ts +226 -0
  146. package/cli/run-rnx-core.ts +148 -0
  147. package/cli/run-rnx.ts +137 -0
  148. package/cli/runtime-notes.ts +66 -0
  149. package/cli/runtime-summary.ts +25 -0
  150. package/cli/secure-file.ts +31 -0
  151. package/cli/self-invocation.ts +58 -0
  152. package/cli/send-to-box.ts +109 -0
  153. package/cli/setup-repository.ts +191 -0
  154. package/cli/shell-init.ts +98 -0
  155. package/cli/standalone.ts +4 -0
  156. package/cli/telemetry.ts +84 -0
  157. package/cli/ui.ts +68 -0
  158. package/cli/ws-bridge.ts +1020 -0
  159. package/detox/attempt-events.cjs +23 -0
  160. package/detox/colors.ts +54 -0
  161. package/detox/config-loader.ts +135 -0
  162. package/detox/element-types.ts +48 -0
  163. package/detox/expectations.ts +534 -0
  164. package/detox/gestures.ts +501 -0
  165. package/detox/index.ts +2694 -0
  166. package/detox/jest-preset.cjs +29 -0
  167. package/detox/jest-setup-after-env.cjs +22 -0
  168. package/detox/matchers.ts +30 -0
  169. package/detox/motion-change.cjs +109 -0
  170. package/detox/motion-change.d.cts +35 -0
  171. package/detox/navigation-lifecycle.ts +290 -0
  172. package/detox/navigation.ts +43 -0
  173. package/detox/proof-frame.cjs +114 -0
  174. package/detox/record-block-execution.cjs +78 -0
  175. package/detox/screenshots/animated-color-test-rest-norngh.png +0 -0
  176. package/detox/screenshots/color-test-after-drag-norngh.png +0 -0
  177. package/detox/screenshots/color-test-rest-norngh.png +0 -0
  178. package/detox/screenshots/theme-blue-toggle.png +0 -0
  179. package/detox/screenshots/theme-blue.png +0 -0
  180. package/detox/screenshots/theme-red-toggle.png +0 -0
  181. package/detox/screenshots/theme-red.png +0 -0
  182. package/dist-lib/agent-daemon-client.cjs +502 -0
  183. package/dist-lib/agent-events.cjs +48 -0
  184. package/dist-lib/agent-identity.cjs +53 -0
  185. package/dist-lib/agent-sessions.cjs +759 -0
  186. package/dist-lib/attached-projects.cjs +526 -0
  187. package/dist-lib/auth/shared-session.cjs +208 -0
  188. package/dist-lib/backend-origin.cjs +88 -0
  189. package/dist-lib/beta.cjs +41 -0
  190. package/dist-lib/beta.mjs +13 -0
  191. package/dist-lib/bridge-constants.cjs +161 -0
  192. package/dist-lib/bridge-contract-input.cjs +451 -0
  193. package/dist-lib/bridge-contract-input.mjs +414 -0
  194. package/dist-lib/bridge-contract.cjs +130 -0
  195. package/dist-lib/bridge-contract.mjs +94 -0
  196. package/dist-lib/capture-contract.cjs +220 -0
  197. package/dist-lib/capture-contract.mjs +190 -0
  198. package/dist-lib/cli-constants.cjs +32 -0
  199. package/dist-lib/cloud-contract.cjs +194 -0
  200. package/dist-lib/cloud-contract.mjs +145 -0
  201. package/dist-lib/cloud.cjs +670 -0
  202. package/dist-lib/cloud.mjs +639 -0
  203. package/dist-lib/config.cjs +96 -0
  204. package/dist-lib/detox/index.cjs +3789 -0
  205. package/dist-lib/detox/jest-preset.cjs +29 -0
  206. package/dist-lib/dev-bundle-resolution.cjs +290 -0
  207. package/dist-lib/home-paths.cjs +638 -0
  208. package/dist-lib/host/bridge-host.cjs +10903 -0
  209. package/dist-lib/host/fetch-proxy-handler.cjs +421 -0
  210. package/dist-lib/host/fetch-proxy-overrides.cjs +63 -0
  211. package/dist-lib/host/fetch-proxy-overrides.mjs +37 -0
  212. package/dist-lib/host/replacement-module-handler.cjs +469 -0
  213. package/dist-lib/host/websocket-proxy.cjs +298 -0
  214. package/dist-lib/index.cjs +4268 -0
  215. package/dist-lib/jump-to-source-babel.cjs +93 -0
  216. package/dist-lib/jump-to-source-native.cjs +112 -0
  217. package/dist-lib/menu.cjs +646 -0
  218. package/dist-lib/menu.mjs +604 -0
  219. package/dist-lib/metro-fingerprint-registry.cjs +186 -0
  220. package/dist-lib/metro-fingerprint-registry.mjs +156 -0
  221. package/dist-lib/metro-production-bundle.cjs +329 -0
  222. package/dist-lib/metro-production-bundle.mjs +295 -0
  223. package/dist-lib/metro.cjs +904 -0
  224. package/dist-lib/profiles.cjs +246 -0
  225. package/dist-lib/public-brand.cjs +39 -0
  226. package/dist-lib/react-native-host-modules.cjs +51 -0
  227. package/dist-lib/react-native-host-modules.mjs +25 -0
  228. package/dist-lib/render-mode.cjs +54 -0
  229. package/dist-lib/scripts/dev-server-scanner.cjs +1232 -0
  230. package/dist-lib/sdk.cjs +2433 -0
  231. package/dist-lib/sdk.mjs +2336 -0
  232. package/dist-lib/skills.cjs +39132 -0
  233. package/dist-lib/swift-submit.cjs +92 -0
  234. package/dist-lib/swift-submit.mjs +65 -0
  235. package/dist-lib/swift.cjs +1646 -0
  236. package/dist-lib/vite.cjs +1591 -0
  237. package/package.json +290 -0
  238. package/scripts/dev-server-scanner.ts +1291 -0
  239. package/scripts/optional-demo-registry.ts +113 -0
  240. package/skills/contrast/SKILL.md +165 -0
  241. package/skills/rnx-debug/SKILL.md +433 -0
  242. package/skills/rnx-perf/SKILL.md +399 -0
  243. package/skills/rnx-setup/SKILL.md +172 -0
  244. package/skills/rnx-test/SKILL.md +321 -0
  245. package/skills/rnx-visual/SKILL.md +126 -0
  246. package/src/agent-daemon-client.ts +410 -0
  247. package/src/agent-events.ts +71 -0
  248. package/src/agent-identity.ts +23 -0
  249. package/src/agent-prompt.ts +71 -0
  250. package/src/agent-sessions.ts +580 -0
  251. package/src/app-url.ts +39 -0
  252. package/src/attached-projects.ts +539 -0
  253. package/src/auth/shared-session.ts +235 -0
  254. package/src/backend-origin.ts +70 -0
  255. package/src/beta.ts +19 -0
  256. package/src/bridge-constants.ts +175 -0
  257. package/src/bridge-contract-input.ts +502 -0
  258. package/src/bridge-contract.ts +558 -0
  259. package/src/browser-cache.ts +16 -0
  260. package/src/capture-contract.ts +587 -0
  261. package/src/cli-constants.ts +1 -0
  262. package/src/cli-version.ts +40 -0
  263. package/src/cloud-contract.ts +274 -0
  264. package/src/cloud.ts +762 -0
  265. package/src/codex-client.ts +234 -0
  266. package/src/config.ts +132 -0
  267. package/src/connect.ts +101 -0
  268. package/src/dev-bundle-resolution.ts +346 -0
  269. package/src/dev-server-open.ts +198 -0
  270. package/src/disk-cleanup.ts +540 -0
  271. package/src/flow-timeout-scale.ts +15 -0
  272. package/src/home-paths.ts +806 -0
  273. package/src/host/agent-host.ts +666 -0
  274. package/src/host/bridge-host.ts +2788 -0
  275. package/src/host/fetch-proxy-handler.ts +449 -0
  276. package/src/host/fetch-proxy-overrides.ts +51 -0
  277. package/src/host/open-url.ts +89 -0
  278. package/src/host/plane-host.ts +203 -0
  279. package/src/host/replacement-module-handler.ts +158 -0
  280. package/src/host/websocket-proxy.ts +315 -0
  281. package/src/index.ts +71 -0
  282. package/src/jump-to-source-babel.ts +135 -0
  283. package/src/jump-to-source-native.ts +102 -0
  284. package/src/menu.ts +777 -0
  285. package/src/metro-fingerprint-registry.ts +302 -0
  286. package/src/metro-plugin.ts +341 -0
  287. package/src/metro-production-bundle.ts +471 -0
  288. package/src/native-dev-bundle-url.ts +118 -0
  289. package/src/native-seam-manifest.ts +341 -0
  290. package/src/playwright-host-log.ts +16 -0
  291. package/src/plist.ts +27 -0
  292. package/src/poll-until.ts +123 -0
  293. package/src/profiles.ts +179 -0
  294. package/src/public-brand.ts +9 -0
  295. package/src/react-native-host-modules.ts +26 -0
  296. package/src/render-mode.ts +27 -0
  297. package/src/rolldown-plugin-swift.ts +240 -0
  298. package/src/runtime-assets.ts +233 -0
  299. package/src/runtime-delivery.ts +54 -0
  300. package/src/screenshots/compose.ts +422 -0
  301. package/src/screenshots/frame-compose.ts +514 -0
  302. package/src/screenshots/orchestrate.ts +256 -0
  303. package/src/screenshots/org-deck.ts +91 -0
  304. package/src/screenshots/registry.ts +58 -0
  305. package/src/screenshots/schema.ts +364 -0
  306. package/src/sdk.ts +15 -0
  307. package/src/settings-bundle.ts +418 -0
  308. package/src/shell-bridge-identity.ts +15 -0
  309. package/src/sim-client.ts +697 -0
  310. package/src/skills/builtin/a11y-review.ts +132 -0
  311. package/src/skills/builtin/compat-check.ts +71 -0
  312. package/src/skills/builtin/maestro-test.ts +121 -0
  313. package/src/skills/builtin/perf-profile.ts +90 -0
  314. package/src/skills/builtin/screenshot-all.ts +52 -0
  315. package/src/skills/builtin/visual-diff.ts +100 -0
  316. package/src/skills/registry.ts +107 -0
  317. package/src/skills/types.ts +41 -0
  318. package/src/swift-submit.ts +185 -0
  319. package/src/swift.ts +7 -0
  320. package/src/team-machine-prompt.ts +73 -0
  321. package/src/vite-plugin-one.ts +264 -0
  322. package/src/vite-plugin-swift.ts +620 -0
  323. package/src/vite-plugin.ts +1946 -0
  324. package/src/worklets-babel.ts +250 -0
@@ -0,0 +1,29 @@
1
+ // jest preset for running existing detox suites against sootsim.
2
+ //
3
+ // users drop `preset: 'rnxsim/detox'` into their jest config
4
+ // (or `rnx-detox.config.cjs`) and their `import { by, device, element,
5
+ // expect, waitFor } from 'detox'` calls resolve to the sootsim driver.
6
+
7
+ const path = require('path')
8
+
9
+ // resolve the published driver entry so the mapping works from any cwd.
10
+ // `require.resolve('sootsim/detox')` honours the subpath export in the
11
+ // sootsim package.json.
12
+ const DRIVER_ENTRY = require.resolve('rnxsim/detox')
13
+ const PACKAGE_ROOT = path.dirname(require.resolve('rnxsim/package.json'))
14
+
15
+ /** @type {import('@jest/types').Config.InitialOptions} */
16
+ module.exports = {
17
+ testTimeout: 180000,
18
+ maxWorkers: 1,
19
+ watchman: false,
20
+ verbose: true,
21
+ testEnvironment: 'node',
22
+ setupFilesAfterEnv: [path.join(PACKAGE_ROOT, 'detox', 'jest-setup-after-env.cjs')],
23
+ transform: {
24
+ '^.+\\.[jt]sx?$': ['@sucrase/jest-plugin', { jsxRuntime: 'automatic' }],
25
+ },
26
+ moduleNameMapper: {
27
+ '^detox$': DRIVER_ENTRY,
28
+ },
29
+ }
@@ -0,0 +1,290 @@
1
+ /*! rnx v0.1.527 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
+ "use strict";
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
21
+
22
+ // src/dev-bundle-resolution.ts
23
+ var dev_bundle_resolution_exports = {};
24
+ __export(dev_bundle_resolution_exports, {
25
+ DEFAULT_TEST_DRIVE_PORT: () => DEFAULT_TEST_DRIVE_PORT,
26
+ inferManifestFramework: () => inferManifestFramework,
27
+ probePortBundle: () => probePortBundle,
28
+ resolveConnectionInput: () => resolveConnectionInput
29
+ });
30
+ module.exports = __toCommonJS(dev_bundle_resolution_exports);
31
+
32
+ // src/backend-origin.ts
33
+ var LOOPBACK_PROBE_HOSTNAMES = ["127.0.0.1", "::1"];
34
+ function normalizeHostname(hostname) {
35
+ return hostname.replace(/^\[|\]$/g, "").toLowerCase();
36
+ }
37
+ function buildLoopbackProbeBaseUrl(protocol, hostname, port) {
38
+ const normalizedHostname = normalizeHostname(hostname);
39
+ const urlHost = normalizedHostname.includes(":") ? `[${normalizedHostname}]` : normalizedHostname;
40
+ return `${protocol}//${urlHost}:${port}`;
41
+ }
42
+ function isLoopbackHost(hostname) {
43
+ const normalized = normalizeHostname(hostname);
44
+ return normalized === "localhost" || normalized.endsWith(".localhost") || normalized === "0.0.0.0" || normalized === "::1" || /^127(?:\.\d{1,3}){3}$/.test(normalized);
45
+ }
46
+
47
+ // src/native-dev-bundle-url.ts
48
+ var METRO_BUNDLE_PATH = "/index.bundle?platform=ios&dev=true&hot=true&minify=false";
49
+ function isAbsoluteHttpUrl(url) {
50
+ return /^https?:\/\//i.test(url);
51
+ }
52
+ function isNativeDevBundlePath(pathname) {
53
+ return pathname.endsWith(".bundle");
54
+ }
55
+ function alignLoopbackBundleUrlWithProbe(bundleUrl, probeBaseUrl) {
56
+ try {
57
+ const bundle = new URL(bundleUrl);
58
+ const probe = new URL(probeBaseUrl);
59
+ if (!isLoopbackHost(bundle.hostname) || !isLoopbackHost(probe.hostname)) {
60
+ return bundleUrl;
61
+ }
62
+ bundle.hostname = probe.hostname;
63
+ return bundle.toString();
64
+ } catch {
65
+ return bundleUrl;
66
+ }
67
+ }
68
+ function applyPreviewProdBundle(parsed) {
69
+ if (!process.env.SOOTSIM_PREVIEW_PROD_BUNDLE) return;
70
+ parsed.searchParams.set("dev", "false");
71
+ parsed.searchParams.set("minify", "true");
72
+ if (parsed.searchParams.has("hot")) parsed.searchParams.set("hot", "false");
73
+ }
74
+ function normalizeNativeDevBundleUrl(bundleUrl) {
75
+ try {
76
+ const isAbsolute = isAbsoluteHttpUrl(bundleUrl);
77
+ const parsed = new URL(bundleUrl, "http://sootsim.local");
78
+ parsed.pathname = parsed.pathname.replace(/\.\.bundle$/, ".bundle");
79
+ if (!isNativeDevBundlePath(parsed.pathname)) return bundleUrl;
80
+ parsed.searchParams.delete("transform.bytecode");
81
+ if (parsed.searchParams.get("lazy") === "true") {
82
+ parsed.searchParams.set("lazy", "false");
83
+ }
84
+ applyPreviewProdBundle(parsed);
85
+ if (isAbsolute) return parsed.toString();
86
+ return `${parsed.pathname}${parsed.search}${parsed.hash}`;
87
+ } catch {
88
+ return bundleUrl;
89
+ }
90
+ }
91
+
92
+ // src/dev-bundle-resolution.ts
93
+ var DEFAULT_TEST_DRIVE_PORT = 8081;
94
+ function buildUnresolvedTargetError(targetLabel) {
95
+ return new Error(
96
+ `could not resolve a native bundle for ${targetLabel}. pass an explicit bundle URL or open Connect and choose the app there.`
97
+ );
98
+ }
99
+ function inferManifestFramework(launchUrl, sdkVersion) {
100
+ if (launchUrl?.includes("/one/metro-entry.bundle")) return "one";
101
+ if (typeof sdkVersion === "string" && sdkVersion) return "expo";
102
+ return "unknown";
103
+ }
104
+ function buildBaseUrl(protocol, host, port) {
105
+ return `${protocol}//${host}:${port}`;
106
+ }
107
+ function shouldProxyLoopbackProbe(targetUrl) {
108
+ if (typeof window === "undefined") return false;
109
+ try {
110
+ const parsed = new URL(targetUrl);
111
+ return isLoopbackHost(parsed.hostname) && isLoopbackHost(window.location.hostname) && parsed.origin !== window.location.origin;
112
+ } catch {
113
+ return false;
114
+ }
115
+ }
116
+ async function fetchDevProbe(targetUrl, init) {
117
+ const requestInit = {
118
+ ...init,
119
+ cache: init?.cache ?? "no-store"
120
+ };
121
+ if (!shouldProxyLoopbackProbe(targetUrl)) {
122
+ return fetch(targetUrl, requestInit);
123
+ }
124
+ return fetch(`/__fetch-proxy?url=${encodeURIComponent(targetUrl)}`, requestInit);
125
+ }
126
+ function getDefaultPortForProtocol(protocol) {
127
+ return protocol === "https:" ? 443 : 80;
128
+ }
129
+ function isBaseServerUrl(url) {
130
+ const path = url.pathname || "/";
131
+ return (path === "/" || path === "") && !url.search && !url.hash;
132
+ }
133
+ async function resolvePortViaServerScan(port) {
134
+ try {
135
+ const res = await fetch("/__server-scan", { cache: "no-store" });
136
+ if (!res.ok) return null;
137
+ if (!(res.headers.get("content-type") || "").toLowerCase().includes("json"))
138
+ return null;
139
+ const servers = await res.json();
140
+ if (!Array.isArray(servers)) return null;
141
+ const match = servers.find(
142
+ (s) => !!s && typeof s === "object" && s.port === port && typeof s.bundleUrl === "string"
143
+ );
144
+ if (!match) return null;
145
+ if (match.bundleUrlProvisional) return null;
146
+ return {
147
+ // normalize exactly like the manifest-probe branch below — the scan
148
+ // returns metro's manifest launchAsset url (lazy=true for code-split
149
+ // one/vxrn apps), but sootsim loads ONE self-contained bundle into the tenant
150
+ // worker, so a deferred React.lazy chunk throws "Requiring unknown module
151
+ // <id>". normalizeNativeDevBundleUrl forces lazy=false + strips bytecode.
152
+ bundleUrl: normalizeNativeDevBundleUrl(match.bundleUrl),
153
+ port,
154
+ framework: typeof match.framework === "string" ? match.framework : "unknown",
155
+ projectName: typeof match.projectName === "string" ? match.projectName : void 0
156
+ };
157
+ } catch {
158
+ return null;
159
+ }
160
+ }
161
+ var MANIFEST_PROBE_TIMEOUT_MS = 5e3;
162
+ var MANIFEST_BOOT_BUDGET_MS = 3e4;
163
+ var MANIFEST_BOOT_RETRY_MS = 1e3;
164
+ async function probeExpoManifest(normalizedBaseUrl, port) {
165
+ let body;
166
+ const pending = fetchDevProbe(`${normalizedBaseUrl}/`, {
167
+ headers: { "expo-platform": "ios" }
168
+ }).then(
169
+ async (res) => res.ok ? { ok: true, body: await res.text() } : null,
170
+ () => void 0
171
+ );
172
+ let probeDeadline;
173
+ const answered = await Promise.race([
174
+ pending,
175
+ new Promise((resolve) => {
176
+ probeDeadline = setTimeout(() => resolve("timeout"), MANIFEST_PROBE_TIMEOUT_MS);
177
+ })
178
+ ]);
179
+ clearTimeout(probeDeadline);
180
+ if (answered === "timeout" || answered === void 0) return { state: "no-answer" };
181
+ if (answered === null) return { state: "no-manifest" };
182
+ body = answered.body;
183
+ if (!body.trim()) return { state: "no-answer" };
184
+ let manifest;
185
+ try {
186
+ manifest = JSON.parse(body);
187
+ } catch {
188
+ return { state: "no-manifest" };
189
+ }
190
+ const client = manifest?.extra?.expoClient || manifest?.extra || {};
191
+ const rawLaunchUrl = typeof manifest?.launchAsset?.url === "string" ? manifest.launchAsset.url : void 0;
192
+ const launchUrl = rawLaunchUrl ? alignLoopbackBundleUrlWithProbe(rawLaunchUrl, normalizedBaseUrl) : void 0;
193
+ if (!launchUrl && !client.name) return { state: "no-manifest" };
194
+ return {
195
+ state: "resolved",
196
+ bundle: {
197
+ bundleUrl: normalizeNativeDevBundleUrl(
198
+ launchUrl || `${normalizedBaseUrl}${METRO_BUNDLE_PATH}`
199
+ ),
200
+ port,
201
+ framework: inferManifestFramework(launchUrl, client.sdkVersion),
202
+ projectName: client.name
203
+ }
204
+ };
205
+ }
206
+ async function isPackagerRunning(normalizedBaseUrl) {
207
+ try {
208
+ const res = await fetchDevProbe(`${normalizedBaseUrl}/status`);
209
+ if (!res.ok) return false;
210
+ return (await res.text()).includes("packager-status:running");
211
+ } catch {
212
+ return false;
213
+ }
214
+ }
215
+ async function probeBaseUrlBundleDirect(baseUrl, port) {
216
+ const normalizedBaseUrl = baseUrl.replace(/\/+$/, "");
217
+ let manifest = await probeExpoManifest(normalizedBaseUrl, port);
218
+ let packagerConfirmed = false;
219
+ if (manifest.state === "no-answer") {
220
+ packagerConfirmed = await isPackagerRunning(normalizedBaseUrl);
221
+ if (!packagerConfirmed) return null;
222
+ const deadline = Date.now() + MANIFEST_BOOT_BUDGET_MS;
223
+ while (manifest.state === "no-answer" && Date.now() < deadline) {
224
+ await new Promise((resolve) => setTimeout(resolve, MANIFEST_BOOT_RETRY_MS));
225
+ manifest = await probeExpoManifest(normalizedBaseUrl, port);
226
+ }
227
+ }
228
+ if (manifest.state === "resolved") return manifest.bundle;
229
+ if (manifest.state === "no-answer") return null;
230
+ if (!packagerConfirmed && !await isPackagerRunning(normalizedBaseUrl)) return null;
231
+ return {
232
+ bundleUrl: `${normalizedBaseUrl}${METRO_BUNDLE_PATH}`,
233
+ port,
234
+ framework: "metro"
235
+ };
236
+ }
237
+ async function probeBaseUrlBundle(baseUrl, port) {
238
+ try {
239
+ if (isLoopbackHost(new URL(baseUrl).hostname)) {
240
+ const viaScan = await resolvePortViaServerScan(port);
241
+ if (viaScan) return viaScan;
242
+ }
243
+ } catch {
244
+ }
245
+ return probeBaseUrlBundleDirect(baseUrl, port);
246
+ }
247
+ async function probePortBundle(port) {
248
+ const viaScan = await resolvePortViaServerScan(port);
249
+ if (viaScan) return viaScan;
250
+ const candidates = await Promise.all(
251
+ LOOPBACK_PROBE_HOSTNAMES.map(
252
+ (hostname) => probeBaseUrlBundleDirect(buildLoopbackProbeBaseUrl("http:", hostname, port), port)
253
+ )
254
+ );
255
+ return candidates.find((candidate) => candidate !== null) ?? null;
256
+ }
257
+ async function resolveConnectionInput(input) {
258
+ const trimmed = input.trim();
259
+ if (/^\d+$/.test(trimmed)) {
260
+ const port2 = parseInt(trimmed, 10);
261
+ const resolved = await probePortBundle(port2);
262
+ if (resolved) return resolved;
263
+ throw buildUnresolvedTargetError(`localhost:${port2}`);
264
+ }
265
+ const bundleUrl = trimmed.startsWith("http") ? trimmed : `http://${trimmed}`;
266
+ let parsed;
267
+ try {
268
+ parsed = new URL(bundleUrl);
269
+ } catch {
270
+ throw new Error(
271
+ `could not parse "${input}". pass a dev-server port, a dev-server base URL, or a full bundle URL.`
272
+ );
273
+ }
274
+ const protocol = parsed.protocol || "http:";
275
+ const port = parsed.port ? parseInt(parsed.port, 10) : getDefaultPortForProtocol(protocol);
276
+ const baseUrl = buildBaseUrl(protocol, parsed.hostname, port);
277
+ if (isBaseServerUrl(parsed)) {
278
+ const resolved = await probeBaseUrlBundle(baseUrl, port);
279
+ if (resolved) return resolved;
280
+ throw buildUnresolvedTargetError(baseUrl);
281
+ }
282
+ return { bundleUrl: parsed.toString(), port, framework: "unknown" };
283
+ }
284
+ // Annotate the CommonJS export names for ESM import in node:
285
+ 0 && (module.exports = {
286
+ DEFAULT_TEST_DRIVE_PORT,
287
+ inferManifestFramework,
288
+ probePortBundle,
289
+ resolveConnectionInput
290
+ });