stim 1.18.0 → 1.20.0

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 (178) hide show
  1. package/README.md +21 -4
  2. package/dist/{activity-BxnkDZDi.mjs → activity-BrGh9EAI.mjs} +3 -3
  3. package/dist/{agent-device-usage-output-CZ66YA4T.mjs → agent-device-usage-output-DVyv_hWj.mjs} +7 -7
  4. package/dist/android-0vv-OruW.mjs +6 -0
  5. package/dist/android-Brx6EKvJ.mjs +1258 -0
  6. package/dist/{android-DC3ZLuw0.mjs → android-BsYNR81W.mjs} +103 -45
  7. package/dist/{android-CBwCNicO.mjs → android-CK3fpEyZ.mjs} +2 -2
  8. package/dist/{android-cas-BBFyr9CA.mjs → android-cas-DCAuXryb.mjs} +9 -5
  9. package/dist/android-cas-compiler.mjs +1 -1
  10. package/dist/api-run.mjs +159 -8
  11. package/dist/{api-D0VtFhqk.mjs → api-zuX3ynYN.mjs} +9 -7
  12. package/dist/api.d.mts +104 -4
  13. package/dist/api.mjs +1 -1
  14. package/dist/{app-install-D-PUENug.mjs → app-install-0LgaQRT7.mjs} +39 -18
  15. package/dist/artifact-CnC0mfov.mjs +807 -0
  16. package/dist/artifact-DClXJNWx.mjs +772 -0
  17. package/dist/artifact-lifecycle-DzPpBYvK.mjs +30 -0
  18. package/dist/{web-DTU0uiWj.mjs → browser-web-CzBmhmgs.mjs} +136 -174
  19. package/dist/{budget-DIhL2BKx.mjs → budget-BONq9vXY.mjs} +3096 -3244
  20. package/dist/build-BixRI6sB.mjs +462 -0
  21. package/dist/build-plan-CP0tckNU.mjs +553 -0
  22. package/dist/{cache-manifest-BI7ozfmH.mjs → cache-manifest-qA3dT2x2.mjs} +1 -1
  23. package/dist/cache-manifest.mjs +1 -1
  24. package/dist/ccache-CjHQ5F8g.mjs +142 -0
  25. package/dist/{chrome-DJnmnS5q.mjs → chrome-Dp2lMLBe.mjs} +1 -1
  26. package/dist/{cli-DNJMwADx.mjs → cli-B2R8wH1F.mjs} +20 -20
  27. package/dist/cli.mjs +1 -1
  28. package/dist/{client-DzhapoMB.mjs → client-BLy1Pw2V.mjs} +172 -165
  29. package/dist/collector-run.d.mts +10 -0
  30. package/dist/collector-run.mjs +7 -7
  31. package/dist/{command-output-CBtzyIgF.mjs → command-output-BjPN99ZB.mjs} +2 -2
  32. package/dist/{config-CgYMahz7.mjs → config-D0LhTY3S.mjs} +13 -13
  33. package/dist/{created-devices-DKbeWsiK.mjs → created-devices-HU_DAb_Q.mjs} +7 -6
  34. package/dist/{dependency-state-xKoOypBm.mjs → dependency-state-B2m8eqsS.mjs} +2 -2
  35. package/dist/{detached-entry-BLfcgc4O.mjs → detached-entry-BXq4fIl-.mjs} +1 -1
  36. package/dist/{dev-client-CLnIH02x.mjs → dev-client-ClATaJoH.mjs} +2 -2
  37. package/dist/{device-D7oCHGWi.mjs → device-B7lsC0K1.mjs} +8 -8
  38. package/dist/device-DVCwAFlX.mjs +727 -0
  39. package/dist/{device-capacity-EUOOYr8T.mjs → device-capacity-Ca_ke1LE.mjs} +25 -15
  40. package/dist/device-host-worker.mjs +38 -18
  41. package/dist/{device-ios-6MewKKnc.mjs → device-ios-CRUqPxKw.mjs} +12 -11
  42. package/dist/{device-lease-Co-EwifR.mjs → device-lease-DHOBXGgS.mjs} +135 -22
  43. package/dist/{device-lease-run-w1xhCqIW.mjs → device-lease-run-CvDeHTkG.mjs} +4 -4
  44. package/dist/{device-pool-F5WvRPtD.mjs → device-pool-L2-5GxMy.mjs} +3 -3
  45. package/dist/{device-remote-tHbd1fKy.mjs → device-remote-Bmg42063.mjs} +17 -69
  46. package/dist/doctor-C2MSuMMg.mjs +515 -0
  47. package/dist/{doctor-B9ckYUoU.mjs → doctor-DPAqhVCK.mjs} +334 -721
  48. package/dist/doctor-watchman-CB4NnVZm.mjs +260 -0
  49. package/dist/{simslim-EHBQ2R4G.mjs → eas-build-Dw_ec2Km.mjs} +6 -152
  50. package/dist/{stim-installations-aR_WsNOA.mjs → eas-session-ledger-DZlC-Fq3.mjs} +57 -4
  51. package/dist/{error-diagnostics-BRXOqDzG.mjs → error-diagnostics-Du7I_GuY.mjs} +17 -12
  52. package/dist/errors-DzkMYh8Q.mjs +205 -0
  53. package/dist/{exec-DWhCZDGm.mjs → exec-B81Qodjn.mjs} +69 -15
  54. package/dist/{gc-Dh6mXOKC.mjs → gc-PWp34zGb.mjs} +23 -22
  55. package/dist/{gradle-C6GKnunQ.mjs → gradle-C2OEKCCI.mjs} +50 -125
  56. package/dist/{guide-tm6igAaa.mjs → guide-Dai9lphv.mjs} +862 -538
  57. package/dist/{hosted-android-Bv285t_t.mjs → hosted-android-DQ-Agsd8.mjs} +5 -5
  58. package/dist/{hosted-client-C-rMtppF.mjs → hosted-client-Io01s5By.mjs} +9 -3
  59. package/dist/{hosted-ios-D5mNmtj4.mjs → hosted-ios-DIxFnYp-.mjs} +3 -3
  60. package/dist/{hosted-logs-DN8Iz4mJ.mjs → hosted-logs-DP-ABU_M.mjs} +8 -8
  61. package/dist/{hosted-macos-B-wEjlwG.mjs → hosted-macos-Aziw9T_9.mjs} +7 -6
  62. package/dist/{hosted-native-DeeOG8xZ.mjs → hosted-native-BdAQi21M.mjs} +23 -16
  63. package/dist/{idle-shutdown-jjtxAn5C.mjs → idle-shutdown-DdMqoSUB.mjs} +7 -7
  64. package/dist/ios-BZ9dg2Fr.mjs +9 -0
  65. package/dist/{ios-B3SbOWdw.mjs → ios-CXLIUxXJ.mjs} +180 -24
  66. package/dist/ios-CZuv6gRv.mjs +1112 -0
  67. package/dist/{ios-Bvbf0SGY.mjs → ios-VGvNdsv2.mjs} +1 -1
  68. package/dist/{ios-device-Bn7jWDB1.mjs → ios-device-B1B14xND.mjs} +1 -1
  69. package/dist/{ios-device-vOaByMhw.mjs → ios-device-BreZOpM0.mjs} +3 -3
  70. package/dist/ios-project-B9drt_aY.mjs +197 -0
  71. package/dist/{ios-state-B2pES6Vs.mjs → ios-state-CjrL2qv-.mjs} +1 -1
  72. package/dist/js-swap-C8icNYIY.mjs +432 -0
  73. package/dist/launch-DxH0THLP.mjs +745 -0
  74. package/dist/launch-YrbqaIFj.mjs +1530 -0
  75. package/dist/{launch-verify-hskNcWkZ.mjs → launch-verify-BzRdbuO1.mjs} +26 -7
  76. package/dist/{logs-1Ylc1Ri6.mjs → logs-DHaRNfg7.mjs} +11 -11
  77. package/dist/macos-C0iljhsN.mjs +2 -0
  78. package/dist/{macos-DF6C7wUU.mjs → macos-V_3Ui7g4.mjs} +125 -155
  79. package/dist/macos-run.mjs +1 -1
  80. package/dist/maintenance-run.mjs +13 -10
  81. package/dist/{metro-Dh8T4Ytd.mjs → metro-D_j9sN-B.mjs} +209 -43
  82. package/dist/{metro-gateway-CEUw9RMH.mjs → metro-gateway-BBJldOdi.mjs} +2 -2
  83. package/dist/miss-reason-BPAzZS0r.mjs +238 -0
  84. package/dist/{named-ports-BFIz1Shz.mjs → named-ports-C2lvoPsb.mjs} +12 -5
  85. package/dist/native-android-lHzaew7r.mjs +226 -0
  86. package/dist/native-gradle-inputs-BQnIdAlL.mjs +356 -0
  87. package/dist/{native-runtime-D_603JiC.mjs → native-runtime-BRmWL7ru.mjs} +9 -8
  88. package/dist/native-xcode-inputs-eutS19jU.mjs +307 -0
  89. package/dist/native-xcode-ios-DP3cHLwu.mjs +434 -0
  90. package/dist/{ndjson-LGZAMsqa.mjs → ndjson-GOnbyvso.mjs} +6 -6
  91. package/dist/offload-worker.d.mts +12 -6
  92. package/dist/offload-worker.mjs +409 -73
  93. package/dist/{ownership-D6Se7gg_.mjs → ownership-DXzMMSx6.mjs} +2 -2
  94. package/dist/{placement-log-BcPhRwR4.mjs → placement-log-reFbjqEr.mjs} +7 -3
  95. package/dist/plan-BDk2AeY_.mjs +260 -0
  96. package/dist/plan-placement-D_YYlE6N.mjs +73 -0
  97. package/dist/{ports-BLTtfBq-.mjs → ports-jzvAJXXL.mjs} +3 -3
  98. package/dist/{prebuild-juCyreaR.mjs → prebuild-Bw44QxVh.mjs} +4 -4
  99. package/dist/{preview-D5V07Nrl.mjs → preview-BaBJ72Al.mjs} +51 -34
  100. package/dist/project-B8_duAzW.mjs +1067 -0
  101. package/dist/project-plan-BPwbLwQu.mjs +10 -0
  102. package/dist/{pull-request-u4vp7zmK.mjs → pull-request-vOhLNmIb.mjs} +1 -1
  103. package/dist/pull-requests.mjs +1 -1
  104. package/dist/react-native-android-chm1DMlA.mjs +921 -0
  105. package/dist/react-native-build-oAw6gQeW.mjs +239 -0
  106. package/dist/react-native-doctor-DYXoh-6I.mjs +78 -0
  107. package/dist/react-native-ios-SCTK_CT5.mjs +595 -0
  108. package/dist/{recordings-BAWltsVt.mjs → recordings-Bk-VivUV.mjs} +1 -1
  109. package/dist/{reload-DvyWzVjJ.mjs → reload-D34GkY78.mjs} +17 -14
  110. package/dist/remote-BU9UyhCJ.mjs +192 -0
  111. package/dist/{remote-cache-BGg7aGIZ.mjs → remote-cache-Bsts6f6Y.mjs} +5 -5
  112. package/dist/result-BDoRk1k3.mjs +186 -0
  113. package/dist/{run-vhtDgpHO.mjs → run-qvff78hv.mjs} +3 -3
  114. package/dist/{server-bare-B9E7S1aR.mjs → server-bare-dWjAarki.mjs} +6 -6
  115. package/dist/server-command-7XIKlWtO.mjs +69 -0
  116. package/dist/{server-expo-DoBHhuzK.mjs → server-expo-CsYu2aKL.mjs} +107 -82
  117. package/dist/server-expo-DV43vep4.mjs +2 -0
  118. package/dist/settings-Bbztm4oV.mjs +1503 -0
  119. package/dist/{settings-Byp2AQ_E.mjs → settings-CT3E71-i.mjs} +6 -7
  120. package/dist/{state-lKh8shBp.d.mts → settings-vk3mJGSm.d.mts} +4 -2
  121. package/dist/settings.schema.json +156 -6
  122. package/dist/simslim-ChMfe8rg.mjs +149 -0
  123. package/dist/{slot-launch-C1nqh4mu.mjs → slot-launch-B9hn96wd.mjs} +6 -6
  124. package/dist/{stage-g_WqWeaE.mjs → stage-BNKKdDNc.mjs} +6 -3
  125. package/dist/start-CbQCSnXQ.mjs +2 -0
  126. package/dist/{start-D-IeOyoK.mjs → start-CdvcTaXr.mjs} +113 -77
  127. package/dist/{state-xnqpx3AD.mjs → state-Boo0IMJq.mjs} +4 -2
  128. package/dist/{state-BG-aAk4k.mjs → state-DI84A-uu.mjs} +29 -10
  129. package/dist/{stats-DY6ekz8F.mjs → stats-BIIDrjA8.mjs} +6 -6
  130. package/dist/{status-BEeL6IKz.mjs → status-BDGHwkCs.mjs} +3 -1
  131. package/dist/{status-DCjZeE-K.mjs → status-DARMkc9q.mjs} +80 -294
  132. package/dist/status-watch-DvmI3SmN.mjs +296 -0
  133. package/dist/{stim-desktop-Behws_fi.mjs → stim-desktop-8GQX2OV8.mjs} +1 -1
  134. package/dist/{stop-DIJtD2GL.mjs → stop-CCZS-C9m.mjs} +2 -2
  135. package/dist/stop-WQPQHLuy.mjs +72 -0
  136. package/dist/{stop-BTjs3xbc.mjs → stop-iNemHsJC.mjs} +81 -33
  137. package/dist/supervisor-run.d.mts +7 -2
  138. package/dist/supervisor-run.mjs +32 -20
  139. package/dist/{support-Bwvbrq5-.mjs → support-CnE_SIjt.mjs} +17 -7
  140. package/dist/{support-BaayeYCf.mjs → support-DCco5fut.mjs} +61 -8
  141. package/dist/swiftpm-macos-afeNUExW.mjs +119 -0
  142. package/dist/{native-run-B06FkmZx.mjs → tailnet-CoJUb2tB.mjs} +113 -6
  143. package/dist/toolchain-BIupIro1.mjs +2 -0
  144. package/dist/{toolchain-Bnyd_K3A.mjs → toolchain-DqyDXs30.mjs} +225 -315
  145. package/dist/{trigger-CJMhwXe8.mjs → trigger-C0MWBi8O.mjs} +3 -3
  146. package/dist/trigger-SHLOWJ4O.mjs +2 -0
  147. package/dist/{warm-progress-CjB-MP6H.mjs → warm-progress-C3ASD6z5.mjs} +134 -37
  148. package/dist/{status-Dcr0Qexd.mjs → watchman-CQl51YZu.mjs} +75 -7
  149. package/dist/web-B3eldHFH.mjs +123 -0
  150. package/dist/web-BLXpOe6b.mjs +2 -0
  151. package/dist/web-run.mjs +10 -10
  152. package/dist/{workspace-state-C59dqG-Z.mjs → workspace-state-CSIFuuDa.mjs} +33 -33
  153. package/dist/{workspaces-xXItD8Dj.mjs → workspaces-D2xSHBDY.mjs} +1297 -1211
  154. package/dist/{worktree-BSYlofkq.mjs → worktree-BxDqaTev.mjs} +102 -63
  155. package/dist/worktree-q7_OZNY0.mjs +2 -0
  156. package/package.json +8 -6
  157. package/shim/bundle-response.cjs +2 -1
  158. package/shim/bundle-response.d.cts +1 -1
  159. package/shim/expo-metro-config.cjs +1 -1
  160. package/shim/native-android.gradle +101 -0
  161. package/dist/android-BKA16DTf.mjs +0 -4
  162. package/dist/android-BvwuMUJ9.mjs +0 -3572
  163. package/dist/guide-status-Bhf9SJXc.mjs +0 -125
  164. package/dist/ios-CPdkoKaa.mjs +0 -3953
  165. package/dist/ios-DNpdygiv.mjs +0 -7
  166. package/dist/macos-Ck7OBMNY.mjs +0 -2
  167. package/dist/metro-store-BAHFcJm6.mjs +0 -106
  168. package/dist/plan-placement-CtxkCO54.mjs +0 -1859
  169. package/dist/project-C3ChRLZy.mjs +0 -212
  170. package/dist/projects-DD7dBTCj.mjs +0 -92
  171. package/dist/server-expo-Db9HBUoa.mjs +0 -2
  172. package/dist/settings-CQyMElEP.mjs +0 -701
  173. package/dist/start-NTc1Ifqs.mjs +0 -2
  174. package/dist/stop-BGhKMOuH.mjs +0 -48
  175. package/dist/trigger-DWAq9hkw.mjs +0 -2
  176. package/dist/web-B6_bFDn7.mjs +0 -2
  177. package/dist/worktree-BJfnU6r5.mjs +0 -2
  178. package/dist/worktree-CsKYexJM.mjs +0 -753
@@ -1,19 +1,94 @@
1
- import { t as getExecutor } from "./exec-DWhCZDGm.mjs";
1
+ import { t as getExecutor } from "./exec-B81Qodjn.mjs";
2
+ import { K as resolveProjectSettings } from "./settings-Bbztm4oV.mjs";
2
3
  import { n as stripAnsi, t as createLineReader } from "./process-output-Fpl8PYi8.mjs";
3
- import { h as resolvePackageJson } from "./project-C3ChRLZy.mjs";
4
- import { O as projectMetroSharedCache } from "./settings-CQyMElEP.mjs";
5
- import { a as metroStoreRoot, c as supervisorError, i as metroStoreConfirmedRoot, n as expoMetroConfigPath, o as registerMetroStore, r as expoMetroStoreEnv } from "./metro-store-BAHFcJm6.mjs";
6
- import { r as createNdjsonWriter } from "./ndjson-LGZAMsqa.mjs";
4
+ import { S as resolvePackageJson } from "./project-B8_duAzW.mjs";
5
+ import { r as createNdjsonWriter } from "./ndjson-GOnbyvso.mjs";
6
+ import { a as expoMetroStoreEnv, c as registerMetroStore, f as resolveMetroSharedCache, i as expoMetroConfigPath, n as supervisorError, o as metroStoreConfirmedRoot, s as metroStoreRoot } from "./errors-DzkMYh8Q.mjs";
7
7
  import { accessSync, constants, existsSync, readFileSync } from "node:fs";
8
- import { dirname, join, parse } from "node:path";
8
+ import { dirname, join } from "node:path";
9
9
  import { LOG_ROTATE_BYTES } from "@stim-cli/core";
10
- //#region src/supervisor/server-expo.ts
10
+ //#region src/supervisor/child-server.ts
11
11
  function delay(ms) {
12
12
  return new Promise((resolve) => {
13
13
  const timer = setTimeout(resolve, ms);
14
14
  if (typeof timer.unref === "function") timer.unref();
15
15
  });
16
16
  }
17
+ function superviseChildServer({ mode, child, log, toRecord, signal, alive = null, killTimeoutMs, onRecord = null }) {
18
+ let lastMsg = null;
19
+ let lastAt = 0;
20
+ const emit = (stream) => (chunk) => {
21
+ const record = toRecord(chunk, stream);
22
+ if (!record) return;
23
+ if (typeof record.requestId === "string") {
24
+ log.write(record);
25
+ onRecord?.(record);
26
+ return;
27
+ }
28
+ const now = Date.now();
29
+ if (record.msg === lastMsg && now - lastAt < 1e3) return;
30
+ lastMsg = typeof record.msg === "string" ? record.msg : null;
31
+ lastAt = now;
32
+ log.write(record);
33
+ onRecord?.(record);
34
+ };
35
+ const outReader = createLineReader(emit("stdout"));
36
+ const errReader = createLineReader(emit("stderr"));
37
+ child.stdout?.setEncoding?.("utf-8");
38
+ child.stderr?.setEncoding?.("utf-8");
39
+ child.stdout?.on("data", (chunk) => outReader.push(chunk));
40
+ child.stderr?.on("data", (chunk) => errReader.push(chunk));
41
+ let exited = false;
42
+ let exitInfo = null;
43
+ const listeners = [];
44
+ child.on("exit", (code, sig) => {
45
+ exited = true;
46
+ exitInfo = {
47
+ code,
48
+ signal: sig
49
+ };
50
+ outReader.flush();
51
+ errReader.flush();
52
+ for (const cb of listeners) cb(exitInfo);
53
+ });
54
+ child.on("error", (err) => {
55
+ if (exited) return;
56
+ exited = true;
57
+ exitInfo = {
58
+ code: null,
59
+ signal: null,
60
+ error: err
61
+ };
62
+ for (const cb of listeners) cb(exitInfo);
63
+ });
64
+ return {
65
+ mode,
66
+ serverPid: child.pid ?? null,
67
+ child,
68
+ onExit(cb) {
69
+ if (exited) {
70
+ cb(exitInfo);
71
+ return;
72
+ }
73
+ listeners.push(cb);
74
+ },
75
+ async close() {
76
+ const running = () => alive ? alive() : !exited && Boolean(child.pid);
77
+ const gone = async () => {
78
+ const deadline = Date.now() + killTimeoutMs;
79
+ while (running() && Date.now() < deadline) await delay(25);
80
+ return !running();
81
+ };
82
+ if (!running() || !signal("SIGTERM")) return;
83
+ if (!await gone()) {
84
+ signal("SIGKILL");
85
+ await gone();
86
+ }
87
+ }
88
+ };
89
+ }
90
+ //#endregion
91
+ //#region src/supervisor/server-expo.ts
17
92
  function resolveExpoBin(root) {
18
93
  const fromPackage = expoBinFromPackage(resolvePackageJson(root, "expo"));
19
94
  if (fromPackage) return {
@@ -56,15 +131,19 @@ function expoBinFromPackage(packageJsonPath, binName = "expo") {
56
131
  return isExecutableFile(file) ? file : null;
57
132
  }
58
133
  function findBinUpward(startDir, name, { exists = existsSync } = {}) {
134
+ const stop = repositoryRoot(startDir, exists) ?? startDir;
59
135
  let dir = startDir;
60
- const stop = parse(startDir).root;
61
136
  while (true) {
62
137
  const candidate = join(dir, "node_modules", ".bin", name);
63
138
  if (exists(candidate)) return candidate;
64
139
  if (dir === stop) return null;
65
- const parent = dirname(dir);
66
- if (parent === dir) return null;
67
- dir = parent;
140
+ dir = dirname(dir);
141
+ }
142
+ }
143
+ function repositoryRoot(startDir, exists) {
144
+ for (let dir = startDir;; dir = dirname(dir)) {
145
+ if (exists(join(dir, ".git"))) return dir;
146
+ if (dirname(dir) === dir) return null;
68
147
  }
69
148
  }
70
149
  function isExecutableFile(file) {
@@ -114,7 +193,7 @@ function cleanLine(line) {
114
193
  const parts = stripAnsi(line).split("\r");
115
194
  return (parts[parts.length - 1] ?? "").trimEnd();
116
195
  }
117
- function recordFromLine(line, { stream = "stdout" } = {}) {
196
+ function recordFromLine(line, { stream = "stdout", source = "expo" } = {}) {
118
197
  const msg = cleanLine(line);
119
198
  if (!msg.trim()) return null;
120
199
  if (stream === "stderr" && msg.startsWith("stim-bundle-response: ")) try {
@@ -133,7 +212,7 @@ function recordFromLine(line, { stream = "stdout" } = {}) {
133
212
  level: inferLevel(msg),
134
213
  msg,
135
214
  raw: true,
136
- event: stream === "stderr" ? "expo_stderr" : "expo_stdout"
215
+ event: `${source}_${stream === "stderr" ? "stderr" : "stdout"}`
137
216
  };
138
217
  if (isBundleMarker(msg)) record.marker = true;
139
218
  return record;
@@ -153,8 +232,8 @@ function parseExpoWaitingOnUrl(line) {
153
232
  if (HTTP_SCHEME_RE.test(url)) return url;
154
233
  return URL_SCHEME_RE.test(url) ? url.replace(/^[^:]+:/, "https:") : url;
155
234
  }
156
- function resolveMetroStoreInjection(root, { log, env }) {
157
- const sharedCache = projectMetroSharedCache(root);
235
+ function resolveMetroStoreInjection(root, { log, env, settings }) {
236
+ const sharedCache = resolveMetroSharedCache(settings);
158
237
  if (!sharedCache) log.write({
159
238
  src: "metro",
160
239
  level: "debug",
@@ -198,7 +277,7 @@ function resolveMetroStoreInjection(root, { log, env }) {
198
277
  });
199
278
  return additions;
200
279
  }
201
- async function startExpoServer({ root, port, logsDir, writer = null, spawnFn = null, killTimeoutMs = 5e3, tunnel = false, resetCache = false, onTunnelUrl = null, platform = process.platform }) {
280
+ async function startExpoServer({ root, port, logsDir, writer = null, spawnFn = null, killTimeoutMs = 5e3, tunnel = false, resetCache = false, onTunnelUrl = null, platform = process.platform, settings }) {
202
281
  const resolved = resolveExpoBin(root);
203
282
  if (!resolved) {
204
283
  const refusal = expoBinRefusal(root);
@@ -216,7 +295,8 @@ async function startExpoServer({ root, port, logsDir, writer = null, spawnFn = n
216
295
  ];
217
296
  const storeEnv = resolveMetroStoreInjection(root, {
218
297
  log,
219
- env: process.env
298
+ env: process.env,
299
+ settings: settings ?? resolveProjectSettings(root).settings
220
300
  });
221
301
  const [command, commandArgs] = platform === "win32" && resolved.source === "package" ? [process.execPath, [bin, ...args]] : [bin, args];
222
302
  const child = spawn(command, commandArgs, {
@@ -235,78 +315,23 @@ async function startExpoServer({ root, port, logsDir, writer = null, spawnFn = n
235
315
  ...tunnel ? { EXPO_UNSTABLE_TUNNEL_V2: "1" } : {}
236
316
  }
237
317
  });
238
- let lastMsg = null;
239
- let lastAt = 0;
240
318
  let tunnelUrlSeen = false;
241
- const emit = (stream) => (chunk) => {
242
- const record = recordFromLine(chunk, { stream });
243
- if (!record) return;
244
- const now = Date.now();
245
- if (record.msg === lastMsg && now - lastAt < 1e3) return;
246
- lastMsg = typeof record.msg === "string" ? record.msg : null;
247
- lastAt = now;
248
- log.write(record);
249
- if (tunnel && !tunnelUrlSeen && onTunnelUrl && typeof record.msg === "string") {
319
+ return superviseChildServer({
320
+ mode: "expo-child",
321
+ child,
322
+ log,
323
+ toRecord: (chunk, stream) => recordFromLine(chunk, { stream }),
324
+ signal: (sig) => child.kill(sig),
325
+ killTimeoutMs,
326
+ onRecord: (record) => {
327
+ if (!tunnel || tunnelUrlSeen || !onTunnelUrl || typeof record.msg !== "string") return;
250
328
  const url = parseExpoWaitingOnUrl(record.msg);
251
329
  if (url) {
252
330
  tunnelUrlSeen = true;
253
331
  onTunnelUrl(url);
254
332
  }
255
333
  }
256
- };
257
- const outReader = createLineReader(emit("stdout"));
258
- const errReader = createLineReader(emit("stderr"));
259
- child.stdout?.setEncoding?.("utf-8");
260
- child.stderr?.setEncoding?.("utf-8");
261
- child.stdout?.on("data", (chunk) => outReader.push(chunk));
262
- child.stderr?.on("data", (chunk) => errReader.push(chunk));
263
- let exited = false;
264
- let exitInfo = null;
265
- const listeners = [];
266
- child.on("exit", (code, signal) => {
267
- exited = true;
268
- exitInfo = {
269
- code,
270
- signal
271
- };
272
- outReader.flush();
273
- errReader.flush();
274
- for (const cb of listeners) cb(exitInfo);
275
- });
276
- child.on("error", (err) => {
277
- if (exited) return;
278
- exited = true;
279
- exitInfo = {
280
- code: null,
281
- signal: null,
282
- error: err
283
- };
284
- for (const cb of listeners) cb(exitInfo);
285
334
  });
286
- return {
287
- mode: "expo-child",
288
- serverPid: child.pid ?? null,
289
- child,
290
- onExit(cb) {
291
- if (exited) {
292
- cb(exitInfo);
293
- return;
294
- }
295
- listeners.push(cb);
296
- },
297
- async close() {
298
- if (exited || !child.pid) return;
299
- const dead = new Promise((resolve) => {
300
- child.once("exit", () => resolve());
301
- });
302
- if (!child.kill("SIGTERM")) return;
303
- await Promise.race([dead, delay(killTimeoutMs)]);
304
- if (!exited) {
305
- child.kill("SIGKILL");
306
- await Promise.race([dead, delay(killTimeoutMs)]);
307
- }
308
- }
309
- };
310
335
  }
311
336
  //#endregion
312
- export { expoProxyEnv as a, inferLevel as c, parseExpoWaitingOnUrl as d, recordFromLine as f, expoBinRefusal as i, isBundleMarker as l, expoBinFromPackage as n, expoSdkMajor as o, startExpoServer as p, expoBinPath as r, findBinUpward as s, cleanLine as t, isDevClientNavigationNotice as u };
337
+ export { expoProxyEnv as a, inferLevel as c, parseExpoWaitingOnUrl as d, recordFromLine as f, expoBinRefusal as i, isBundleMarker as l, superviseChildServer as m, expoBinFromPackage as n, expoSdkMajor as o, startExpoServer as p, expoBinPath as r, findBinUpward as s, cleanLine as t, isDevClientNavigationNotice as u };
@@ -0,0 +1,2 @@
1
+ import { p as startExpoServer } from "./server-expo-CsYu2aKL.mjs";
2
+ export { startExpoServer };