stim 1.18.0 → 1.19.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 (140) hide show
  1. package/README.md +1 -1
  2. package/dist/{activity-BxnkDZDi.mjs → activity-BSw0x84R.mjs} +3 -3
  3. package/dist/{agent-device-usage-output-CZ66YA4T.mjs → agent-device-usage-output-Bjxu_VmX.mjs} +5 -5
  4. package/dist/{android-BvwuMUJ9.mjs → android-BXc6BmEi.mjs} +507 -347
  5. package/dist/{android-DC3ZLuw0.mjs → android-BdQC6zs1.mjs} +6 -6
  6. package/dist/{android-BKA16DTf.mjs → android-BvV1gGdN.mjs} +3 -3
  7. package/dist/{android-CBwCNicO.mjs → android-DE5g_5gv.mjs} +2 -2
  8. package/dist/{android-cas-BBFyr9CA.mjs → android-cas-C87geAg-.mjs} +3 -3
  9. package/dist/android-cas-compiler.mjs +1 -1
  10. package/dist/{api-D0VtFhqk.mjs → api-DIf_s86s.mjs} +5 -7
  11. package/dist/api-run.mjs +8 -8
  12. package/dist/api.d.mts +8 -2
  13. package/dist/api.mjs +1 -1
  14. package/dist/{app-install-D-PUENug.mjs → app-install-CFI4ptUL.mjs} +33 -13
  15. package/dist/{web-DTU0uiWj.mjs → browser-web-CDhqQxhv.mjs} +134 -172
  16. package/dist/{budget-DIhL2BKx.mjs → budget-Dz-kyXLv.mjs} +15 -202
  17. package/dist/{build-facts-DcLv2HSd.d.mts → build-facts-B87vo-Im.d.mts} +32 -1
  18. package/dist/{cache-manifest-BI7ozfmH.mjs → cache-manifest-DiwKSyv9.mjs} +1 -1
  19. package/dist/cache-manifest.mjs +1 -1
  20. package/dist/{chrome-DJnmnS5q.mjs → chrome-BTUOo8p2.mjs} +1 -1
  21. package/dist/{cli-DNJMwADx.mjs → cli-C9Zvgbdc.mjs} +20 -20
  22. package/dist/cli.mjs +1 -1
  23. package/dist/{client-DzhapoMB.mjs → client-CuUo8Nvg.mjs} +248 -23
  24. package/dist/collector-run.d.mts +6 -0
  25. package/dist/collector-run.mjs +6 -6
  26. package/dist/{command-output-CBtzyIgF.mjs → command-output-Bt8ygHE7.mjs} +1 -1
  27. package/dist/{config-CgYMahz7.mjs → config-DC5jEtd1.mjs} +6 -2
  28. package/dist/{created-devices-DKbeWsiK.mjs → created-devices-D0s26Hx5.mjs} +2 -2
  29. package/dist/{dependency-state-xKoOypBm.mjs → dependency-state-DKaS1OM9.mjs} +2 -2
  30. package/dist/{detached-entry-BLfcgc4O.mjs → detached-entry-pB_IPfV4.mjs} +1 -1
  31. package/dist/{dev-client-CLnIH02x.mjs → dev-client-CDY_zAmD.mjs} +2 -2
  32. package/dist/{device-D7oCHGWi.mjs → device-BHw0WlHl.mjs} +8 -8
  33. package/dist/{device-capacity-EUOOYr8T.mjs → device-capacity-BoN1jQkO.mjs} +23 -12
  34. package/dist/device-host-worker.mjs +14 -14
  35. package/dist/{gradle-C6GKnunQ.mjs → device-ios-B2ruohE-.mjs} +659 -105
  36. package/dist/{device-lease-Co-EwifR.mjs → device-lease-Cu7PtQpZ.mjs} +5 -5
  37. package/dist/{device-lease-run-w1xhCqIW.mjs → device-lease-run-D38SnZtt.mjs} +4 -4
  38. package/dist/{device-pool-F5WvRPtD.mjs → device-pool-CP4rAsHx.mjs} +3 -3
  39. package/dist/{device-remote-tHbd1fKy.mjs → device-remote-B5GiUifk.mjs} +15 -16
  40. package/dist/{doctor-B9ckYUoU.mjs → doctor-PRJH94v6.mjs} +53 -29
  41. package/dist/doctor-watchman-wZhyTdp4.mjs +259 -0
  42. package/dist/{error-diagnostics-BRXOqDzG.mjs → error-diagnostics--v5HGOU0.mjs} +10 -10
  43. package/dist/{exec-DWhCZDGm.mjs → exec-i8GDPwq9.mjs} +32 -8
  44. package/dist/{gc-Dh6mXOKC.mjs → gc-CyHMcKcn.mjs} +19 -19
  45. package/dist/{guide-tm6igAaa.mjs → guide-dRaQJJk9.mjs} +409 -472
  46. package/dist/{hosted-android-Bv285t_t.mjs → hosted-android-Bs7fytj7.mjs} +3 -3
  47. package/dist/{hosted-client-C-rMtppF.mjs → hosted-client-C5G4h_OJ.mjs} +1 -1
  48. package/dist/{hosted-ios-D5mNmtj4.mjs → hosted-ios-Bik035eL.mjs} +1 -1
  49. package/dist/{hosted-logs-DN8Iz4mJ.mjs → hosted-logs-CI9Az9a4.mjs} +7 -7
  50. package/dist/{hosted-macos-B-wEjlwG.mjs → hosted-macos-DABm3ScO.mjs} +4 -4
  51. package/dist/{hosted-native-DeeOG8xZ.mjs → hosted-native-DbV2aUVw.mjs} +12 -8
  52. package/dist/{idle-shutdown-jjtxAn5C.mjs → idle-shutdown-DYiMBn34.mjs} +7 -7
  53. package/dist/{ios-B3SbOWdw.mjs → ios-BWbHFZVz.mjs} +5 -5
  54. package/dist/{ios-Bvbf0SGY.mjs → ios-DCrkgXEM.mjs} +1 -1
  55. package/dist/{ios-DNpdygiv.mjs → ios-DYUr9LGc.mjs} +7 -6
  56. package/dist/ios-ITYno9rO.mjs +2241 -0
  57. package/dist/{ios-device-vOaByMhw.mjs → ios-device-CJ_ZOGky.mjs} +3 -3
  58. package/dist/{ios-device-Bn7jWDB1.mjs → ios-device-CrW8aMb5.mjs} +1 -1
  59. package/dist/{ios-state-B2pES6Vs.mjs → ios-state-By0XuLTQ.mjs} +1 -1
  60. package/dist/{launch-verify-hskNcWkZ.mjs → launch-verify-DCveSE6d.mjs} +4 -4
  61. package/dist/{logs-1Ylc1Ri6.mjs → logs-Bao1HOMy.mjs} +10 -10
  62. package/dist/{macos-DF6C7wUU.mjs → macos-ciyBdTY5.mjs} +108 -130
  63. package/dist/macos-nIOATJmR.mjs +2 -0
  64. package/dist/macos-run.mjs +1 -1
  65. package/dist/maintenance-run.mjs +7 -7
  66. package/dist/manifest-CX0d1IkZ.mjs +148 -0
  67. package/dist/{metro-Dh8T4Ytd.mjs → metro-DI2AjPF_.mjs} +194 -41
  68. package/dist/{metro-gateway-CEUw9RMH.mjs → metro-gateway-BxpJLIwh.mjs} +2 -2
  69. package/dist/{plan-placement-CtxkCO54.mjs → miss-reason-CjQCOKqq.mjs} +180 -296
  70. package/dist/{named-ports-BFIz1Shz.mjs → named-ports-B4iWH4E-.mjs} +12 -5
  71. package/dist/{native-runtime-D_603JiC.mjs → native-runtime-BGxsbfny.mjs} +6 -6
  72. package/dist/offload-worker.d.mts +1 -29
  73. package/dist/offload-worker.mjs +9 -8
  74. package/dist/{ownership-D6Se7gg_.mjs → ownership-EB0ySdGK.mjs} +2 -2
  75. package/dist/{placement-log-BcPhRwR4.mjs → placement-log-Dxe34rJm.mjs} +7 -3
  76. package/dist/plan-placement-BVY59qa8.mjs +290 -0
  77. package/dist/{ports-BLTtfBq-.mjs → ports-ByPc0_97.mjs} +3 -3
  78. package/dist/{prebuild-juCyreaR.mjs → prebuild-BKJ3wJI1.mjs} +4 -4
  79. package/dist/{preview-D5V07Nrl.mjs → preview-BbSottmO.mjs} +16 -17
  80. package/dist/project-B5eQ1USs.mjs +612 -0
  81. package/dist/{pull-request-u4vp7zmK.mjs → pull-request-IHNdMnG8.mjs} +1 -1
  82. package/dist/pull-requests.mjs +1 -1
  83. package/dist/react-native-ios-BMh2i25I.mjs +2 -0
  84. package/dist/react-native-ios-CSpIxexZ.mjs +2083 -0
  85. package/dist/{recordings-BAWltsVt.mjs → recordings-Bv8McZN4.mjs} +1 -1
  86. package/dist/{reload-DvyWzVjJ.mjs → reload-rAPdqeRR.mjs} +13 -14
  87. package/dist/{remote-cache-BGg7aGIZ.mjs → remote-cache-N3hAEaAL.mjs} +4 -4
  88. package/dist/{run-vhtDgpHO.mjs → run-lAkle1-c.mjs} +2 -2
  89. package/dist/{server-bare-B9E7S1aR.mjs → server-bare-CkIjnegq.mjs} +3 -3
  90. package/dist/server-expo-DGsdUGX2.mjs +2 -0
  91. package/dist/{server-expo-DoBHhuzK.mjs → server-expo-n3tUi3Em.mjs} +3 -3
  92. package/dist/{settings-Byp2AQ_E.mjs → settings-2am7TSxp.mjs} +5 -6
  93. package/dist/{settings-CQyMElEP.mjs → settings-CxgngUZk.mjs} +767 -15
  94. package/dist/settings.schema.json +72 -6
  95. package/dist/{simslim-EHBQ2R4G.mjs → simslim-D9LkJxIO.mjs} +5 -5
  96. package/dist/{slot-launch-C1nqh4mu.mjs → slot-launch-HV_KtPIw.mjs} +6 -6
  97. package/dist/{stage-g_WqWeaE.mjs → stage-BgaZJVZY.mjs} +1 -1
  98. package/dist/{start-NTc1Ifqs.mjs → start-D8NbxNBb.mjs} +1 -1
  99. package/dist/{start-D-IeOyoK.mjs → start-DtxthMfI.mjs} +29 -22
  100. package/dist/{state-BG-aAk4k.mjs → state-D2KtnALG.mjs} +2 -2
  101. package/dist/{state-xnqpx3AD.mjs → state-Tp4uImDS.mjs} +4 -2
  102. package/dist/{stats-DY6ekz8F.mjs → stats-8EJ5ivFT.mjs} +6 -6
  103. package/dist/{status-DCjZeE-K.mjs → status-BOyp0CUl.mjs} +25 -27
  104. package/dist/{stim-desktop-Behws_fi.mjs → stim-desktop-C65jk_q2.mjs} +1 -1
  105. package/dist/{stim-installations-aR_WsNOA.mjs → stim-installations-DbmUjsLv.mjs} +1 -1
  106. package/dist/stop-D0UIpZuh.mjs +72 -0
  107. package/dist/{stop-DIJtD2GL.mjs → stop-DRipAg-e.mjs} +2 -2
  108. package/dist/{stop-BTjs3xbc.mjs → stop-zDlknFoz.mjs} +78 -31
  109. package/dist/supervisor-run.mjs +14 -14
  110. package/dist/{support-BaayeYCf.mjs → support-CNqYkV0y.mjs} +7 -7
  111. package/dist/{support-Bwvbrq5-.mjs → support-DsNaFg6D.mjs} +5 -5
  112. package/dist/swiftpm-macos-aJzPAj1t.mjs +119 -0
  113. package/dist/{toolchain-Bnyd_K3A.mjs → toolchain-C3xSoyUl.mjs} +27 -270
  114. package/dist/{trigger-CJMhwXe8.mjs → trigger-CAhmG-4s.mjs} +3 -3
  115. package/dist/trigger-CoalsMTV.mjs +2 -0
  116. package/dist/{warm-progress-CjB-MP6H.mjs → warm-progress-pFLB2e6P.mjs} +133 -36
  117. package/dist/{status-Dcr0Qexd.mjs → watchman-BL1IdOtq.mjs} +75 -7
  118. package/dist/web-DFpFeZu5.mjs +2 -0
  119. package/dist/web-DbbrPUn0.mjs +127 -0
  120. package/dist/web-run.mjs +7 -7
  121. package/dist/{workspace-state-C59dqG-Z.mjs → workspace-state-CR9X86xJ.mjs} +1 -1
  122. package/dist/{workspaces-xXItD8Dj.mjs → workspaces-Djb2gfi9.mjs} +102 -18
  123. package/dist/{worktree-BSYlofkq.mjs → worktree-BL4M1rhB.mjs} +45 -42
  124. package/dist/{worktree-BJfnU6r5.mjs → worktree-DV-A0LNL.mjs} +1 -1
  125. package/package.json +5 -5
  126. package/shim/bundle-response.cjs +2 -1
  127. package/shim/bundle-response.d.cts +1 -1
  128. package/shim/expo-metro-config.cjs +1 -1
  129. package/dist/device-ios-6MewKKnc.mjs +0 -412
  130. package/dist/guide-status-Bhf9SJXc.mjs +0 -125
  131. package/dist/ios-CPdkoKaa.mjs +0 -3953
  132. package/dist/macos-Ck7OBMNY.mjs +0 -2
  133. package/dist/native-run-B06FkmZx.mjs +0 -158
  134. package/dist/project-C3ChRLZy.mjs +0 -212
  135. package/dist/projects-DD7dBTCj.mjs +0 -92
  136. package/dist/server-expo-Db9HBUoa.mjs +0 -2
  137. package/dist/stop-BGhKMOuH.mjs +0 -48
  138. package/dist/trigger-DWAq9hkw.mjs +0 -2
  139. package/dist/web-B6_bFDn7.mjs +0 -2
  140. package/dist/worktree-CsKYexJM.mjs +0 -753
@@ -1,10 +1,10 @@
1
1
  import { n as ownership_claim_exports, t as process_identity_exports } from "./process-identity-Biv3arCO.mjs";
2
- import { t as getExecutor } from "./exec-DWhCZDGm.mjs";
3
- import { C as saveConfig, D as withConfigLock$1, H as projectDeviceSlots, I as assignSlotDevice, U as removeSlotDevice, _ as loadConfig$1, c as ensureConfig, d as getConfigDir, f as getConfigPath$1, z as deviceSlotPlatforms } from "./config-CgYMahz7.mjs";
4
- import { o as pidExists, u as signalProcessTree } from "./metro-Dh8T4Ytd.mjs";
5
- import { n as readCreatedDevices$1, r as recordCreatedDevice, t as forgetCreatedDevice } from "./created-devices-DKbeWsiK.mjs";
6
- import { n as settingDefault, r as stimDesktopInstalled, t as STIM_DESKTOP_OPEN_OPTIONS } from "./stim-desktop-Behws_fi.mjs";
7
- import { s as androidDataPartitionSizeBytes } from "./settings-CQyMElEP.mjs";
2
+ import { t as getExecutor } from "./exec-i8GDPwq9.mjs";
3
+ import { C as saveConfig, D as withConfigLock$1, H as projectDeviceSlots, I as assignSlotDevice, U as removeSlotDevice, _ as loadConfig$1, c as ensureConfig, d as getConfigDir, f as getConfigPath$1, z as deviceSlotPlatforms } from "./config-DC5jEtd1.mjs";
4
+ import { s as androidDataPartitionSizeBytes } from "./settings-CxgngUZk.mjs";
5
+ import { d as signalProcessTree, s as pidExists } from "./metro-DI2AjPF_.mjs";
6
+ import { n as readCreatedDevices$1, r as recordCreatedDevice, t as forgetCreatedDevice } from "./created-devices-D0s26Hx5.mjs";
7
+ import { n as settingDefault, r as stimDesktopInstalled, t as STIM_DESKTOP_OPEN_OPTIONS } from "./stim-desktop-C65jk_q2.mjs";
8
8
  import { join } from "node:path";
9
9
  import { dirname as dirname$1, isAbsolute as isAbsolute$1, join as join$1, resolve as resolve$1 } from "path";
10
10
  import { ANDROID_EMULATOR_APPS, getParkedMax, loadConfig, settingDefinition } from "@stim-cli/core/state";
@@ -1,4 +1,4 @@
1
- import { i as formatDuration, l as phaseLine, m as shortHash } from "./command-output-CBtzyIgF.mjs";
2
- import { a as collectorLogFile, c as androidFacts, i as runAndroidOperation, l as lastBuildRecord, n as registerAndroid, o as killPreviousCollector, r as runAndroid, s as startCollector, t as androidCommand } from "./android-BvwuMUJ9.mjs";
3
- import { C as resolveSystemImage, _ as isReleaseVariant, c as androidSystemImageSetting, d as apkPackage, h as findAapt, i as NO_FINGERPRINT, l as androidVariantSetting, m as dumpApkManifest, p as displayPath, r as NO_DEVICE, s as androidDevClientScheme, u as apkDevClientFacts, v as noDeviceDiagnostic, w as resolveVariant, y as parseXmltree } from "./support-Bwvbrq5-.mjs";
1
+ import { i as formatDuration, l as phaseLine, m as shortHash } from "./command-output-Bt8ygHE7.mjs";
2
+ import { a as collectorLogFile, c as androidFacts, i as runAndroidOperation, l as lastBuildRecord, n as registerAndroid, o as killPreviousCollector, r as runAndroid, s as startCollector, t as androidCommand } from "./android-BXc6BmEi.mjs";
3
+ import { C as resolveSystemImage, _ as isReleaseVariant, c as androidSystemImageSetting, d as apkPackage, h as findAapt, i as NO_FINGERPRINT, l as androidVariantSetting, m as dumpApkManifest, p as displayPath, r as NO_DEVICE, s as androidDevClientScheme, u as apkDevClientFacts, v as noDeviceDiagnostic, w as resolveVariant, y as parseXmltree } from "./support-DsNaFg6D.mjs";
4
4
  export { NO_DEVICE, NO_FINGERPRINT, androidDevClientScheme, androidFacts, androidSystemImageSetting, androidVariantSetting, apkDevClientFacts, apkPackage, collectorLogFile, androidCommand as default, displayPath, dumpApkManifest, findAapt, formatDuration, isReleaseVariant, killPreviousCollector, lastBuildRecord, noDeviceDiagnostic, parseXmltree, phaseLine, registerAndroid, resolveSystemImage, resolveVariant, runAndroid, runAndroidOperation, shortHash, startCollector };
@@ -1,5 +1,5 @@
1
- import { t as getExecutor } from "./exec-DWhCZDGm.mjs";
2
- import { u as androidToolCwd } from "./android-DC3ZLuw0.mjs";
1
+ import { t as getExecutor } from "./exec-i8GDPwq9.mjs";
2
+ import { u as androidToolCwd } from "./android-BdQC6zs1.mjs";
3
3
  //#region src/collector/android.ts
4
4
  const LEVEL_BY_LETTER = {
5
5
  V: "debug",
@@ -1,6 +1,6 @@
1
- import { d as getConfigDir } from "./config-CgYMahz7.mjs";
2
- import { u as ensureWorkspaceStorage, w as withDirLock$1 } from "./workspace-state-C59dqG-Z.mjs";
3
- import { r as register } from "./cache-manifest-BI7ozfmH.mjs";
1
+ import { d as getConfigDir } from "./config-DC5jEtd1.mjs";
2
+ import { u as ensureWorkspaceStorage, w as withDirLock$1 } from "./workspace-state-CR9X86xJ.mjs";
3
+ import { r as register } from "./cache-manifest-DiwKSyv9.mjs";
4
4
  import { accessSync, constants, existsSync, mkdirSync, readFileSync, realpathSync, renameSync, statSync, writeFileSync } from "node:fs";
5
5
  import { join } from "node:path";
6
6
  import { isJsonObject, readJsonFile } from "@stim-cli/core/state";
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { t as getExecutor } from "./exec-DWhCZDGm.mjs";
2
+ import { t as getExecutor } from "./exec-i8GDPwq9.mjs";
3
3
  import { appendFileSync, existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
4
4
  import { join } from "node:path";
5
5
  import { createHash, randomUUID } from "node:crypto";
@@ -1,4 +1,4 @@
1
- import { t as getExecutor } from "./exec-DWhCZDGm.mjs";
1
+ import { t as getExecutor } from "./exec-i8GDPwq9.mjs";
2
2
  import { t as spawnEntry } from "./spawn-entry-Dcb7sDUz.mjs";
3
3
  import { realpathSync } from "node:fs";
4
4
  import { isAbsolute } from "node:path";
@@ -46,12 +46,10 @@ function createStim(options) {
46
46
  };
47
47
  return {
48
48
  projectRoot,
49
- run({ signal, ...request }) {
50
- return invoke(context, {
51
- operation: "run",
52
- options: request
53
- }, signal);
54
- },
49
+ run: (({ signal, ...request }) => invoke(context, {
50
+ operation: "run",
51
+ options: request
52
+ }, signal)),
55
53
  stop({ signal, ...request } = {}) {
56
54
  return invoke(context, {
57
55
  operation: "stop",
package/dist/api-run.mjs CHANGED
@@ -1,11 +1,11 @@
1
- import { t as StimError } from "./api-D0VtFhqk.mjs";
2
- import { y as refuseRelativeStimPaths } from "./config-CgYMahz7.mjs";
3
- import { x as workspaceLogsDir$1 } from "./workspace-state-C59dqG-Z.mjs";
4
- import { i as runAndroidOperation } from "./android-BvwuMUJ9.mjs";
5
- import { r as runIosOperation } from "./ios-CPdkoKaa.mjs";
6
- import { n as runMacos } from "./macos-DF6C7wUU.mjs";
7
- import { c as stopWorkspaceNow } from "./stop-BTjs3xbc.mjs";
8
- import { n as runWeb } from "./web-DTU0uiWj.mjs";
1
+ import { t as StimError } from "./api-DIf_s86s.mjs";
2
+ import { y as refuseRelativeStimPaths } from "./config-DC5jEtd1.mjs";
3
+ import { x as workspaceLogsDir$1 } from "./workspace-state-CR9X86xJ.mjs";
4
+ import { i as runAndroidOperation } from "./android-BXc6BmEi.mjs";
5
+ import { r as runIosOperation } from "./ios-ITYno9rO.mjs";
6
+ import { n as runMacos } from "./macos-ciyBdTY5.mjs";
7
+ import { c as stopWorkspaceNow } from "./stop-zDlknFoz.mjs";
8
+ import { t as runWeb } from "./web-DbbrPUn0.mjs";
9
9
  import { queryJsonLogs } from "@stim-cli/core/state";
10
10
  //#region src/api-run.ts
11
11
  async function dispatch({ projectRoot: root, ...request }) {
package/dist/api.d.mts CHANGED
@@ -1,8 +1,9 @@
1
1
  import "./state-lKh8shBp.mjs";
2
- import { i as IosFacts, t as AndroidFacts } from "./build-facts-DcLv2HSd.mjs";
2
+ import { i as IosFacts, t as AndroidFacts } from "./build-facts-B87vo-Im.mjs";
3
3
  import "./ndjson-Du3j0AQ9.mjs";
4
- import { MacosBuild, NdjsonRecord, WebBrowserState } from "@stim-cli/core/state";
4
+ import { MacosBuild, NdjsonRecord, WebBrowserState, WebViewport } from "@stim-cli/core/state";
5
5
  import { Command } from "commander";
6
+ import "@stim-cli/cache";
6
7
  import { ChildProcess } from "node:child_process";
7
8
  //#region src/engine/device-lease.d.ts
8
9
  type LeasePlatform = "ios" | "android";
@@ -181,6 +182,11 @@ interface StimDiagnostics {
181
182
  }
182
183
  interface StimClient {
183
184
  readonly projectRoot: string;
185
+ run<P extends StimPlatform>(options: StimRunOptions & {
186
+ platform: P;
187
+ }): Promise<Extract<StimRunResult, {
188
+ platform: P;
189
+ }>>;
184
190
  run(options: StimRunOptions): Promise<StimRunResult>;
185
191
  /** Stops this workspace, including resources created before a failed run. Use a fresh signal for cleanup. */
186
192
  stop(options?: StimStopOptions): Promise<StimStopResult>;
package/dist/api.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import { n as createStim, t as StimError } from "./api-D0VtFhqk.mjs";
1
+ import { n as createStim, t as StimError } from "./api-DIf_s86s.mjs";
2
2
  export { StimError, createStim };
@@ -1,6 +1,6 @@
1
- import { t as getExecutor } from "./exec-DWhCZDGm.mjs";
2
- import { N as deviceHoldsApk, O as uninstallIosApp, P as deviceHoldsBundle, h as listUserApps, u as iosSimulatorFailureAdvice } from "./ios-B3SbOWdw.mjs";
3
- import { t as DEV_MENU_LAUNCH_ARGS } from "./ios-device-Bn7jWDB1.mjs";
1
+ import { n as debugLog, t as getExecutor } from "./exec-i8GDPwq9.mjs";
2
+ import { N as deviceHoldsApk, O as uninstallIosApp, P as deviceHoldsBundle, h as listUserApps, u as iosSimulatorFailureAdvice } from "./ios-BWbHFZVz.mjs";
3
+ import { t as DEV_MENU_LAUNCH_ARGS } from "./ios-device-CrW8aMb5.mjs";
4
4
  import { join } from "node:path";
5
5
  //#region src/engine/app-schemes.ts
6
6
  function schemesFromInfoPlist(plist) {
@@ -207,25 +207,45 @@ function parseLaunchedPid(text) {
207
207
  }
208
208
  function iosAppProcess(udid, bundleId, { exec = null } = {}) {
209
209
  const e = exec || getExecutor();
210
- let out = "";
210
+ const started = performance.now();
211
+ let pid;
212
+ let failure = {};
211
213
  try {
212
- out = e.runFile("xcrun", [
214
+ const out = e.runFile("xcrun", [
213
215
  "simctl",
214
216
  "spawn",
215
217
  udid,
216
218
  "launchctl",
217
219
  "list"
218
220
  ], { timeoutMs: 2e3 });
219
- } catch {
221
+ const label = `UIKitApplication:${bundleId}[`;
222
+ pid = null;
223
+ for (const line of out.split("\n")) {
224
+ if (!line.includes(label)) continue;
225
+ const candidate = Number(line.trim().split(/\s+/)[0]);
226
+ if (Number.isInteger(candidate) && candidate > 0) {
227
+ pid = candidate;
228
+ break;
229
+ }
230
+ }
231
+ return pid;
232
+ } catch (error) {
233
+ const { code, status } = error ?? {};
234
+ failure = {
235
+ ...typeof code === "string" ? { code } : {},
236
+ ...typeof status === "number" ? { exit: status } : {}
237
+ };
220
238
  return;
239
+ } finally {
240
+ debugLog.log("ios.app-process", {
241
+ deviceId: udid,
242
+ bundleId,
243
+ state: pid === void 0 ? "unknown" : pid === null ? "absent" : "running",
244
+ ...typeof pid === "number" ? { appPid: pid } : {},
245
+ ms: Math.round(performance.now() - started),
246
+ ...failure
247
+ });
221
248
  }
222
- const label = `UIKitApplication:${bundleId}[`;
223
- for (const line of out.split("\n")) {
224
- if (!line.includes(label)) continue;
225
- const pid = Number(line.trim().split(/\s+/)[0]);
226
- if (Number.isInteger(pid) && pid > 0) return pid;
227
- }
228
- return null;
229
249
  }
230
250
  function launchedIosAppAfterNoHandle(error, udid, bundleId, exec) {
231
251
  const stderr = String(error?.stderr ?? "");
@@ -1,27 +1,36 @@
1
- import { t as getExecutor } from "./exec-DWhCZDGm.mjs";
1
+ import { t as getExecutor } from "./exec-i8GDPwq9.mjs";
2
2
  import { t as spawnEntry } from "./spawn-entry-Dcb7sDUz.mjs";
3
- import { f as refuseNoProject, l as phaseLine } from "./command-output-CBtzyIgF.mjs";
4
- import { E as upsertProject, p as getProject } from "./config-CgYMahz7.mjs";
5
- import { s as gitCommonDir, y as repoRoot } from "./worktree-CsKYexJM.mjs";
6
- import { i as detectIsExpo, l as isPackageResolvable, o as findCommandWorkspace } from "./project-C3ChRLZy.mjs";
7
- import { l as resolveProjectMetro } from "./metro-Dh8T4Ytd.mjs";
8
- import { i as recordWorkspaceUse, r as readWorkspaceState, v as workspaceDir, x as workspaceLogsDir } from "./workspace-state-C59dqG-Z.mjs";
9
- import { d as webLogFile, o as readWebRecord, p as webSupervisorLogFile, r as cdpEndpoint, s as updateWebRecord } from "./state-BG-aAk4k.mjs";
10
- import { T as teardownBrowserHeld, m as resolveSupervisorTarget } from "./workspaces-xXItD8Dj.mjs";
11
- import { a as workspaceLinks, i as workspaceLinkLine } from "./stim-desktop-Behws_fi.mjs";
12
- import { F as resolveSettings, W as webSettings, i as SETTING_SHAPE_REMEDY, x as metroPortSetting, z as settingShapeErrors } from "./settings-CQyMElEP.mjs";
13
- import { a as withWorkspaceProcessLock, i as reserveBrowserPort, n as getNamedPort } from "./named-ports-BFIz1Shz.mjs";
3
+ import { l as phaseLine } from "./command-output-Bt8ygHE7.mjs";
4
+ import { p as getProject } from "./config-DC5jEtd1.mjs";
5
+ import { r as readWorkspaceState, v as workspaceDir, x as workspaceLogsDir } from "./workspace-state-CR9X86xJ.mjs";
6
+ import { h as isPackageResolvable, p as detectIsExpo } from "./project-B5eQ1USs.mjs";
7
+ import { G as webSettings, i as SETTING_SHAPE_REMEDY, x as metroPortSetting } from "./settings-CxgngUZk.mjs";
8
+ import { u as resolveProjectMetro } from "./metro-DI2AjPF_.mjs";
9
+ import { d as webLogFile, o as readWebRecord, p as webSupervisorLogFile, s as updateWebRecord } from "./state-D2KtnALG.mjs";
10
+ import { E as teardownBrowserHeld, m as resolveSupervisorTarget } from "./workspaces-Djb2gfi9.mjs";
11
+ import { a as withWorkspaceProcessLock, i as reserveBrowserPort, n as getNamedPort } from "./named-ports-B4iWH4E-.mjs";
14
12
  import { o as readNdjsonGenerations } from "./ndjson-LGZAMsqa.mjs";
15
- import { c as readMetroRecords } from "./launch-verify-hskNcWkZ.mjs";
16
- import { o as resolveWorkspaceMetroPort } from "./start-D-IeOyoK.mjs";
17
- import { n as windowsLauncherArgs } from "./detached-entry-BLfcgc4O.mjs";
18
- import { a as sleep, n as ensureWorkspaceStorageSafely } from "./native-runtime-D_603JiC.mjs";
19
- import { a as findChrome, t as CHROME_INSTALL_REMEDY } from "./chrome-DJnmnS5q.mjs";
13
+ import { c as readMetroRecords } from "./launch-verify-DCveSE6d.mjs";
14
+ import { o as resolveWorkspaceMetroPort } from "./start-DtxthMfI.mjs";
15
+ import { n as windowsLauncherArgs } from "./detached-entry-pB_IPfV4.mjs";
16
+ import { a as sleep } from "./native-runtime-BGxsbfny.mjs";
20
17
  import { n as sendToOwnedPage, t as liveWebRecord } from "./page-Bv9s2KwY.mjs";
18
+ import { a as findChrome, t as CHROME_INSTALL_REMEDY } from "./chrome-BTUOo8p2.mjs";
21
19
  import { mkdirSync, openSync } from "node:fs";
22
20
  import chalk from "chalk";
23
21
  import { randomUUID } from "node:crypto";
24
22
  //#region src/web/launch.ts
23
+ const PORT_PLACEHOLDER = /\{port:([^}]*)\}/g;
24
+ /** Replaces each `{port:<label>}` in a `web.url` template; `metro` is the workspace's Metro port. */
25
+ async function resolveWebUrl(template, { metroPort, namedPort }) {
26
+ let url = template;
27
+ for (const [placeholder, label] of template.matchAll(PORT_PLACEHOLDER)) {
28
+ const port = label === "metro" ? metroPort : await namedPort(label);
29
+ if (port === null) throw new Error(`${placeholder} needs a Metro port, and this workspace has none reserved.`);
30
+ url = url.replace(placeholder, String(port));
31
+ }
32
+ return url;
33
+ }
25
34
  const VERIFY_WAIT_MS = 2e4;
26
35
  const LOADING_WAIT_MS = 6e4;
27
36
  const METRO_WEB_BUNDLE = /\bWeb\s+Bundl(?:ing|ed)\b/i;
@@ -128,12 +137,10 @@ function webLaunchRemedy(verdict, { url, template, usesMetro, serve }) {
128
137
  return usesMetro ? METRO_BUILD(url) : nothingServed;
129
138
  }
130
139
  //#endregion
131
- //#region src/commands/web.ts
132
- const PORT_PLACEHOLDER = /\{port:([^}]*)\}/g;
140
+ //#region src/web/runtime.ts
133
141
  const REGISTER_WAIT_MS = 3e4;
134
- const POLL_MS = 250;
135
- const printNote = (line) => console.error(line);
136
- function failure(code, message, remedy) {
142
+ const POLL_MS$1 = 250;
143
+ function failure$1(code, message, remedy) {
137
144
  return {
138
145
  ok: false,
139
146
  error: {
@@ -143,16 +150,6 @@ function failure(code, message, remedy) {
143
150
  }
144
151
  };
145
152
  }
146
- /** Replaces each `{port:<label>}` in a `web.url` template; `metro` is the workspace's Metro port. */
147
- async function resolveWebUrl(template, { metroPort, namedPort }) {
148
- let url = template;
149
- for (const [placeholder, label] of template.matchAll(PORT_PLACEHOLDER)) {
150
- const port = label === "metro" ? metroPort : await namedPort(label);
151
- if (port === null) throw new Error(`${placeholder} needs a Metro port, and this workspace has none reserved.`);
152
- url = url.replace(placeholder, String(port));
153
- }
154
- return url;
155
- }
156
153
  function sameLaunch(record, config) {
157
154
  return record.chrome === config.chrome && record.headless === config.headless && record.viewport === config.viewport && record.ignoreCertificateErrors === config.ignoreCertificateErrors;
158
155
  }
@@ -216,77 +213,12 @@ async function waitForSupervisor(root, child, launchId) {
216
213
  const record = readWebRecord(root);
217
214
  if (record?.launchId === launchId && record.targetId) return record;
218
215
  if (exited) return null;
219
- await sleep(POLL_MS);
216
+ await sleep(POLL_MS$1);
220
217
  }
221
218
  return null;
222
219
  }
223
- async function verifyLaunch(root, since, expectBundle) {
224
- const startedAt = Date.now();
225
- for (;;) {
226
- const verdict = webLaunchVerdict({
227
- records: readNdjsonGenerations(webLogFile(root)),
228
- metroRecords: expectBundle ? readMetroRecords(workspaceLogsDir(root)) : [],
229
- since,
230
- expectBundle,
231
- elapsedMs: Date.now() - startedAt
232
- });
233
- if (verdict) return verdict;
234
- await sleep(POLL_MS);
235
- }
236
- }
237
- async function runWeb({ root, headed, note }) {
238
- const startedAt = Date.now();
239
- await ensureWorkspaceStorageSafely(root, { note });
240
- if (!getProject(root)) upsertProject(root, {});
241
- const settings = resolveSettings({
242
- projectPath: root,
243
- gitCommonDir: gitCommonDir(root),
244
- repoRoot: repoRoot(root)
245
- });
246
- const [shapeError] = settingShapeErrors(settings);
247
- if (shapeError) return failure("STIM_BAD_ARG", shapeError, SETTING_SHAPE_REMEDY);
248
- const web = webSettings(settings);
249
- const usesMetro = web.url === null || web.url.includes("{port:metro}");
250
- const pin = usesMetro ? metroPortSetting(root) : null;
251
- if (pin?.error) return failure("STIM_BAD_ARG", pin.error, SETTING_SHAPE_REMEDY);
252
- const chrome = findChrome();
253
- if (!chrome) return failure("STIM_WEB_NO_CHROME", "Google Chrome or Chromium is not installed.", CHROME_INSTALL_REMEDY);
254
- if (web.url === null && !detectIsExpo(root)) return failure("STIM_WEB_NO_URL", "This is not an Expo app, so Stim does not know which page to open.", "Start your web dev server on a named port, then set the page: `stim settings set web.url 'http://localhost:{port:web}/' --scope workspace`. See `stim guide web`.");
255
- if (web.url === null && !isPackageResolvable(root, "react-native-web")) return failure("STIM_WEB_DEPS_MISSING", "This Expo app cannot render on the web: react-native-web is not installed.", `Run \`${EXPO_WEB_DEPENDENCIES}\` and \`stim start\`, then run \`stim web\` again.`);
256
- let metroPort = getProject(root)?.metroPort ?? null;
257
- if (usesMetro && (pin?.port !== null || metroPort === null)) {
258
- const result = await resolveWorkspaceMetroPort(root, note, "web");
259
- if (typeof result !== "number") return failure(result.code, result.message, result.remedy);
260
- metroPort = result;
261
- }
262
- const metro = usesMetro && metroPort !== null ? await resolveProjectMetro(metroPort, root) : null;
263
- const supervisor = resolveSupervisorTarget({
264
- state: readWorkspaceState(root)?.supervisor,
265
- record: getProject(root)?.supervisor,
266
- reservedPort: metroPort
267
- });
268
- const { serve, foreign } = webServePlan({
269
- usesMetro,
270
- metro,
271
- supervisorHeld: supervisor.status !== "none" && supervisor.status !== "stale",
272
- missingWebPackages: usesMetro && detectIsExpo(root) ? EXPO_WEB_PACKAGES.filter((name) => !isPackageResolvable(root, name)) : []
273
- });
274
- let url;
275
- try {
276
- url = await resolveWebUrl(web.url ?? "http://localhost:{port:metro}/", {
277
- metroPort,
278
- namedPort: (label) => getNamedPort(root, label)
279
- });
280
- } catch (error) {
281
- return failure("STIM_BAD_ARG", `web.url: ${error.message}`, SETTING_SHAPE_REMEDY);
282
- }
283
- const config = {
284
- chrome,
285
- headless: !headed,
286
- viewport: web.viewport,
287
- ignoreCertificateErrors: web.ignoreCertificateErrors
288
- };
289
- const launch = await withWorkspaceProcessLock(workspaceDir(root), "web", async () => {
220
+ async function launchOwnedBrowser({ url, config }, { root, note }) {
221
+ return withWorkspaceProcessLock(workspaceDir(root), "web", async () => {
290
222
  const live = liveWebRecord(readWebRecord(root));
291
223
  if (live && sameLaunch(live, config)) {
292
224
  const since = Date.now();
@@ -308,7 +240,7 @@ async function runWeb({ root, headed, note }) {
308
240
  }
309
241
  }
310
242
  const stopped = await teardownBrowserHeld(root);
311
- if (stopped.status === "failed" || stopped.status === "skipped") return failure("STIM_WEB_BROWSER_HELD", `The previous owned Chrome could not be stopped: ${stopped.reason ?? "unknown reason"}.`, "Run `stim status` and `stim guide errors teardown`.");
243
+ if (stopped.status === "failed" || stopped.status === "skipped") return failure$1("STIM_WEB_BROWSER_HELD", `The previous owned Chrome could not be stopped: ${stopped.reason ?? "unknown reason"}.`, "Run `stim status` and `stim guide errors teardown`.");
312
244
  const port = await reserveBrowserPort(root);
313
245
  const since = Date.now();
314
246
  note(chalk.dim(phaseLine("device", `starting ${config.headless ? "headless " : ""}Chrome on DevTools port ${port}`)));
@@ -319,7 +251,7 @@ async function runWeb({ root, headed, note }) {
319
251
  config,
320
252
  launchId
321
253
  }), launchId);
322
- if (!record) return failure("STIM_WEB_LAUNCH_FAILED", "The owned Chrome did not start.", `Read ${webSupervisorLogFile(root)} and \`stim logs --errors\`, then run \`stim web\` again.`);
254
+ if (!record) return failure$1("STIM_WEB_LAUNCH_FAILED", "The owned Chrome did not start.", `Read ${webSupervisorLogFile(root)} and \`stim logs --errors\`, then run \`stim web\` again.`);
323
255
  return {
324
256
  ok: true,
325
257
  record,
@@ -330,80 +262,110 @@ async function runWeb({ root, headed, note }) {
330
262
  external: true,
331
263
  ownerPurpose: "stim web"
332
264
  });
333
- if (!launch.ok) return launch;
334
- const measured = await verifyLaunch(root, launch.since, usesMetro);
335
- const live = liveWebRecord(readWebRecord(root));
336
- const record = live ?? launch.record;
337
- const verdict = foreign ? {
338
- launched: "unverified",
339
- kind: "no-response",
340
- reason: foreign.reason
341
- } : measured;
342
- const remedy = foreign ? foreign.remedy : webLaunchRemedy(verdict, {
343
- url,
344
- template: web.url,
345
- usesMetro,
346
- serve
347
- });
265
+ }
266
+ //#endregion
267
+ //#region src/integrations/browser-web.ts
268
+ const POLL_MS = 250;
269
+ function failure(code, message, remedy) {
348
270
  return {
349
- ok: true,
350
- remedy: verdict.reason && remedy ? `${verdict.reason}. ${remedy}` : remedy,
351
- facts: {
352
- platform: "web",
353
- browser: "chrome",
354
- version: record.version ?? null,
355
- running: live !== null,
356
- pid: live?.chromeProcess?.pid ?? null,
357
- supervisorPid: live?.pid ?? null,
358
- url,
359
- headless: record.headless,
360
- viewport: record.viewport,
361
- profile: record.profile,
362
- cdpEndpoint: live ? cdpEndpoint(live.cdpPort) : null,
363
- targetId: live?.targetId ?? null,
364
- reused: launch.reused,
365
- launched: verdict.launched,
366
- metroPort: usesMetro ? metroPort : null,
367
- logs: { dir: workspaceLogsDir(root) },
368
- durationMs: Date.now() - startedAt
271
+ ok: false,
272
+ error: {
273
+ code,
274
+ message,
275
+ remedy
369
276
  }
370
277
  };
371
278
  }
372
- function webCommand(program) {
373
- program.command("web").description("Open this workspace's page in a Stim-owned headless Chrome and capture its console, errors and failed requests in stim logs").option("--headed", "Show the Chrome window instead of running headless").option("--json", "Print the result as one JSON object; progress goes to stderr").action(async (opts) => {
374
- const json = Boolean(opts.json);
375
- const root = findCommandWorkspace(process.cwd());
376
- if (!root) {
377
- refuseNoProject({ json });
378
- return;
379
- }
380
- recordWorkspaceUse(root);
381
- const result = await runWeb({
382
- root,
383
- headed: Boolean(opts.headed),
384
- note: printNote
385
- });
386
- if (!result.ok) {
387
- printNote(chalk.red(phaseLine("error", `${result.error.code}: ${result.error.message}`)));
388
- if (result.error.remedy) printNote(phaseLine("remedy", result.error.remedy));
389
- if (json) console.log(JSON.stringify(result.error));
390
- process.exitCode = 1;
391
- return;
392
- }
393
- const { facts, remedy } = result;
394
- if (remedy) printNote(chalk.yellow(phaseLine("launch", remedy)));
395
- const links = workspaceLinks(root, { platform: "web" });
396
- if (json) {
397
- console.log(JSON.stringify(links ? {
398
- ...facts,
399
- links
400
- } : facts));
401
- return;
279
+ function browserWebProject(root) {
280
+ return { runtime: ({ settings, headed, note }) => ({
281
+ async prepare() {
282
+ const web = webSettings(settings);
283
+ const usesMetro = web.url === null || web.url.includes("{port:metro}");
284
+ const pin = usesMetro ? metroPortSetting(root) : null;
285
+ if (pin?.error) return failure("STIM_BAD_ARG", pin.error, SETTING_SHAPE_REMEDY);
286
+ const chrome = findChrome();
287
+ if (!chrome) return failure("STIM_WEB_NO_CHROME", "Google Chrome or Chromium is not installed.", CHROME_INSTALL_REMEDY);
288
+ if (web.url === null && !detectIsExpo(root)) return failure("STIM_WEB_NO_URL", "This is not an Expo app, so Stim does not know which page to open.", "Start your web dev server on a named port, then set the page: `stim settings set web.url 'http://localhost:{port:web}/' --scope workspace`. See `stim guide web`.");
289
+ if (web.url === null && !isPackageResolvable(root, "react-native-web")) return failure("STIM_WEB_DEPS_MISSING", "This Expo app cannot render on the web: react-native-web is not installed.", `Run \`${EXPO_WEB_DEPENDENCIES}\` and \`stim start\`, then run \`stim web\` again.`);
290
+ let metroPort = getProject(root)?.metroPort ?? null;
291
+ if (usesMetro && (pin?.port !== null || metroPort === null)) {
292
+ const result = await resolveWorkspaceMetroPort(root, note, "web");
293
+ if (typeof result !== "number") return failure(result.code, result.message, result.remedy);
294
+ metroPort = result;
295
+ }
296
+ const metro = usesMetro && metroPort !== null ? await resolveProjectMetro(metroPort, root) : null;
297
+ const supervisor = resolveSupervisorTarget({
298
+ state: readWorkspaceState(root)?.supervisor,
299
+ record: getProject(root)?.supervisor,
300
+ reservedPort: metroPort
301
+ });
302
+ const { serve, foreign } = webServePlan({
303
+ usesMetro,
304
+ metro,
305
+ supervisorHeld: supervisor.status !== "none" && supervisor.status !== "stale",
306
+ missingWebPackages: usesMetro && detectIsExpo(root) ? EXPO_WEB_PACKAGES.filter((name) => !isPackageResolvable(root, name)) : []
307
+ });
308
+ let url;
309
+ try {
310
+ url = await resolveWebUrl(web.url ?? "http://localhost:{port:metro}/", {
311
+ metroPort,
312
+ namedPort: (label) => getNamedPort(root, label)
313
+ });
314
+ } catch (error) {
315
+ return failure("STIM_BAD_ARG", `web.url: ${error.message}`, SETTING_SHAPE_REMEDY);
316
+ }
317
+ return {
318
+ ok: true,
319
+ prepared: {
320
+ url,
321
+ config: {
322
+ chrome,
323
+ headless: !headed,
324
+ viewport: web.viewport,
325
+ ignoreCertificateErrors: web.ignoreCertificateErrors
326
+ },
327
+ metroPort: usesMetro ? metroPort : null,
328
+ verification: {
329
+ template: web.url,
330
+ expectBundle: usesMetro,
331
+ serve,
332
+ foreign
333
+ }
334
+ }
335
+ };
336
+ },
337
+ launch: launchOwnedBrowser,
338
+ async verify({ url, verification: { template, expectBundle, serve, foreign } }, { since }) {
339
+ const startedAt = Date.now();
340
+ let measured;
341
+ for (;;) {
342
+ measured = webLaunchVerdict({
343
+ records: readNdjsonGenerations(webLogFile(root)),
344
+ metroRecords: expectBundle ? readMetroRecords(workspaceLogsDir(root)) : [],
345
+ since,
346
+ expectBundle,
347
+ elapsedMs: Date.now() - startedAt
348
+ });
349
+ if (measured) break;
350
+ await sleep(POLL_MS);
351
+ }
352
+ const verdict = foreign ? {
353
+ launched: "unverified",
354
+ kind: "no-response",
355
+ reason: foreign.reason
356
+ } : measured;
357
+ const remedy = foreign ? foreign.remedy : webLaunchRemedy(verdict, {
358
+ url,
359
+ template,
360
+ usesMetro: expectBundle,
361
+ serve
362
+ });
363
+ return {
364
+ verdict,
365
+ remedy: verdict.reason && remedy ? `${verdict.reason}. ${remedy}` : remedy
366
+ };
402
367
  }
403
- const launched = facts.launched === true ? chalk.green("loaded") : chalk.yellow(facts.launched === "bundling" ? "bundling" : "unverified");
404
- console.log(facts.running ? `${facts.url} ${launched} in ${facts.version ?? "Chrome"} (pid ${facts.pid}, ${facts.headless ? "headless" : "headed"}, ${facts.viewport}). DevTools: ${facts.cdpEndpoint}. Logs: stim logs --errors.` : `${facts.url} ${launched}, and the owned Chrome is no longer running. Run stim logs --errors, then stim web again.`);
405
- if (links) console.error(chalk.dim(workspaceLinkLine(links)));
406
- });
368
+ }) };
407
369
  }
408
370
  //#endregion
409
- export { runWeb as n, webCommand as r, resolveWebUrl as t };
371
+ export { browserWebProject };