stim 1.14.0 → 1.16.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.
- package/README.md +2 -0
- package/dist/activity-BxwdD81S.mjs +609 -0
- package/dist/agent-device-usage-output-Dpih1Tfa.mjs +411 -0
- package/dist/{android-d6rGq1pA.mjs → android-B_NumVyQ.mjs} +169 -81
- package/dist/{android-LbPFRWVL.mjs → android-Ift4kVvt.mjs} +517 -413
- package/dist/android-cas-8U4DPqeR.mjs +167 -0
- package/dist/android-cas-compiler.mjs +2 -2
- package/dist/{android-XpvCrV7q.mjs → android-r2rBL8kV.mjs} +2 -2
- package/dist/{app-install-BpgSgkJj.mjs → app-install-CKWdbXIX.mjs} +128 -151
- package/dist/attempt-Bk2ouQVL.mjs +39 -0
- package/dist/budget-DjrURfQn.mjs +2700 -0
- package/dist/{build-plan-Dcr-3ie0.mjs → build-plan-DjeSb2Xl.mjs} +192 -653
- package/dist/build-slots-rUk77xqh.mjs +132 -0
- package/dist/{cache-manifest-C68QQ0ua.mjs → cache-manifest-DnUHBJaU.mjs} +2 -2
- package/dist/cache-manifest.mjs +1 -1
- package/dist/{chrome-BPCiC3ZX.mjs → chrome-BrcVWQyD.mjs} +1 -1
- package/dist/cli-BkYZ_6hy.mjs +51 -0
- package/dist/cli.mjs +6 -42
- package/dist/client-BTY686R6.mjs +1368 -0
- package/dist/collector-run.mjs +9 -195
- package/dist/{command-output-DVcpw6eE.mjs → command-output-DnJMdEY-.mjs} +1 -1
- package/dist/{config-lvc7d3C2.mjs → config-D0DbpZtM.mjs} +28 -29
- package/dist/{created-devices-CllH_8eb.mjs → created-devices-D5owjN4C.mjs} +2 -2
- package/dist/{dependency-state-DsT7aKeo.mjs → dependency-state-B6cMXZab.mjs} +2 -2
- package/dist/{deps-D9IcKqXS.mjs → deps-urbmfXig.mjs} +3 -3
- package/dist/{detached-entry-DJHoca49.mjs → detached-entry-CiTEgMR1.mjs} +1 -1
- package/dist/dev-client-CroAIjjj.mjs +43 -0
- package/dist/{device-CjuuAJjQ.mjs → device-DZQjF7H5.mjs} +8 -7
- package/dist/device-capacity-BHwxNBlu.mjs +136 -0
- package/dist/device-host-worker.d.mts +1 -0
- package/dist/device-host-worker.mjs +964 -0
- package/dist/device-ios-BadmeL2V.mjs +381 -0
- package/dist/{device-lease-5c3WrVRm.mjs → device-lease-D-hLqx1b.mjs} +43 -36
- package/dist/{device-pool-BiyDyPP-.mjs → device-lease-run-CqjShqWW.mjs} +6 -126
- package/dist/device-pool-CUaEWMMm.mjs +125 -0
- package/dist/{device-remote-D87zEzaq.mjs → device-remote-D5WVWqOq.mjs} +69 -163
- package/dist/{doctor-x9pnU9fq.mjs → doctor-Cimf-gGB.mjs} +241 -103
- package/dist/{error-diagnostics-C5HzcwCW.mjs → error-diagnostics-B9L4Ae0x.mjs} +15 -18
- package/dist/{exec-DK8KaVHK.mjs → exec-CaErVv7t.mjs} +5 -1
- package/dist/{gc-ko6mUAYD.mjs → gc-Bqy4bjEu.mjs} +599 -108
- package/dist/{android-cas-iZK3DOCr.mjs → gradle-BsO1MdsH.mjs} +8 -294
- package/dist/{guide-6R0VNFqI.mjs → guide-B_uyKTxW.mjs} +2511 -239
- package/dist/{guide-status-BZrFPIA_.mjs → guide-status-CjEZMAD4.mjs} +3 -3
- package/dist/hosted-client-a-WmqE2L.mjs +197 -0
- package/dist/hosted-ios-CIWelIqf.mjs +220 -0
- package/dist/hosted-logs-D5g041Q3.mjs +187 -0
- package/dist/hosted-macos-BSZyIb3y.mjs +135 -0
- package/dist/idle-DYVymG92.mjs +1099 -0
- package/dist/idle-shutdown-CTsDnAde.mjs +122 -0
- package/dist/in-use-DvBw0Kxo.mjs +130 -0
- package/dist/{ios-BwDPrnYQ.mjs → ios-BaInn3sW.mjs} +201 -10
- package/dist/ios-Cr1h5gnO.mjs +189 -0
- package/dist/{ios-P1f5nm2n.mjs → ios-aq3QoGI3.mjs} +1159 -633
- package/dist/{ios-device-BiOsSVzd.mjs → ios-device-Ee7sDXfp.mjs} +1 -1
- package/dist/{ios-device-DGglU3E_.mjs → ios-device-FfCN_C8p.mjs} +12 -7
- package/dist/ios-state-DS5UpYTH.mjs +48 -0
- package/dist/{launch-verify-Deg4tB3Z.mjs → launch-verify-2DBRizjo.mjs} +5 -5
- package/dist/logs-CHEVK8zD.mjs +371 -0
- package/dist/machines-BIBUdhpj.mjs +265 -0
- package/dist/macos-CSYEAFmF.mjs +473 -0
- package/dist/macos-run.d.mts +5 -0
- package/dist/macos-run.mjs +2 -0
- package/dist/maintenance-run.d.mts +4 -0
- package/dist/maintenance-run.mjs +254 -0
- package/dist/{metro-CcEo8Fl8.mjs → metro-BeK1ZPz1.mjs} +20 -120
- package/dist/metro-gateway-BJ-rxQAB.mjs +84 -0
- package/dist/{named-ports-Blg8IxOh.mjs → named-ports-Bk_YXEmE.mjs} +6 -59
- package/dist/native-run-NaBrRFtQ.mjs +147 -0
- package/dist/{native-runtime-DjBHRg5m.mjs → native-runtime-DBzRnEKS.mjs} +9 -5
- package/dist/{ndjson-CDY9IkVC.mjs → ndjson-PclOIwVY.mjs} +2 -2
- package/dist/offload-worker.d.mts +122 -0
- package/dist/offload-worker.mjs +606 -0
- package/dist/{ownership-DyYDF5ww.mjs → ownership-DiA16AsN.mjs} +3 -2
- package/dist/ownership-hCkPzGmr.mjs +571 -0
- package/dist/{page-BHUzTDFt.mjs → page-QF_Ke10s.mjs} +7 -2
- package/dist/{ports-BguS83ex.mjs → ports-R2k4Knz3.mjs} +3 -3
- package/dist/prebuild-D2fsca_Z.mjs +213 -0
- package/dist/preview-DhVbvPAZ.mjs +318 -0
- package/dist/process-identity-BmRm1qV0.mjs +12 -0
- package/dist/{project-CWlvEaeN.mjs → project-Du91Ilvc.mjs} +74 -19
- package/dist/pull-request-pxnDCQzn.mjs +322 -0
- package/dist/pull-requests.d.mts +120 -0
- package/dist/pull-requests.mjs +2 -0
- package/dist/recordings-BIXOzVnr.mjs +37 -0
- package/dist/{reload-BiniwsSZ.mjs → reload-rM9jV1fz.mjs} +109 -24
- package/dist/{remote-cache-CcR6o6lI.mjs → remote-cache-C8-V13XN.mjs} +5 -5
- package/dist/run-f4vI6EnK.mjs +119 -0
- package/dist/{server-bare-DGfgyJ5J.mjs → server-bare-CpPGmnmO.mjs} +33 -15
- package/dist/server-expo-CVqO2c35.mjs +2 -0
- package/dist/{server-expo-BVuwQ65v.mjs → server-expo-MC0rHlOC.mjs} +8 -12
- package/dist/settings-BBpMcDbD.mjs +25 -0
- package/dist/{settings-B-fsC-Om.mjs → settings-ZkDzkzvB.mjs} +22 -10
- package/dist/settings-oTSkkNrM.mjs +1439 -0
- package/dist/settings.schema.json +845 -97
- package/dist/{simslim-DrDN4WuV.mjs → simslim-B8-7AoTI.mjs} +8 -132
- package/dist/{slot-launch-D5t8EiMf.mjs → slot-launch-B8VrHxn1.mjs} +11 -8
- package/dist/{spawn-claims-Drw_o-Fb.mjs → spawn-claims-D0XfSe8u.mjs} +1 -1
- package/dist/spawn-entry-jw19m8Nl.mjs +17 -0
- package/dist/stage-CzaiwFsI.mjs +143 -0
- package/dist/start-CX8Ig-U2.mjs +2 -0
- package/dist/{start-s4RXp1wy.mjs → start-ClDfwXa4.mjs} +116 -65
- package/dist/state-3DwSQIBK.mjs +41 -0
- package/dist/state-B4PQFXMW.d.mts +12 -0
- package/dist/{state-Dk9RVXI7.mjs → state-C1jB7Q8q.mjs} +70 -8
- package/dist/{state-DHqvsbqC.mjs → state-DcW6vOd_.mjs} +7 -4
- package/dist/stats-CEZ_i5je.mjs +77 -0
- package/dist/{status-BgAuxESg.mjs → status-BuvBFeII.mjs} +118 -20
- package/dist/{status-BsPAnfOI.mjs → status-Cs7VLg9D.mjs} +542 -283
- package/dist/status-DlKvVJBE.mjs +49 -0
- package/dist/stdout-reader-C8yjre1x.mjs +23 -0
- package/dist/stim-desktop-Cnz8CPnl.mjs +63 -0
- package/dist/stim-footprint.swift +32 -0
- package/dist/{stim-installations-CINXy_su.mjs → stim-installations-QMEI32v1.mjs} +1 -1
- package/dist/stop-B0Yxtmiy.mjs +48 -0
- package/dist/{stop-BzreOWJp.mjs → stop-Bffozsac.mjs} +83 -16
- package/dist/{stop-BWIF_6BK.mjs → stop-Dt_dM16A.mjs} +2 -2
- package/dist/stop-cause-CidxIqup.mjs +97 -0
- package/dist/supervisor-run.d.mts +43 -11
- package/dist/supervisor-run.mjs +363 -24
- package/dist/support-CAP8qDUF.mjs +316 -0
- package/dist/support-D4aYJniO.mjs +201 -0
- package/dist/teardown-CL6vDs2Y.mjs +727 -0
- package/dist/{xcode-Cp5KvK9x.mjs → toolchain-DkUflduf.mjs} +364 -14
- package/dist/trigger-Bemu8ytw.mjs +65 -0
- package/dist/trigger-CXts6qt1.mjs +2 -0
- package/dist/warm-progress-CpGv3Wb6.mjs +732 -0
- package/dist/{web-BsQs1WlO.mjs → web-DWUaMp8P.mjs} +37 -21
- package/dist/web-run.mjs +310 -13
- package/dist/workspace-process-lock-BL7Q0HCO.mjs +57 -0
- package/dist/workspace-state-B8-aJ1_5.mjs +371 -0
- package/dist/workspaces-BV4pdHFz.mjs +306 -0
- package/dist/{worktree-UrQWXSeb.mjs → worktree-K-xj9Db0.mjs} +625 -256
- package/dist/worktree-jnG8Iph5.mjs +2 -0
- package/package.json +10 -5
- package/shim/bundle-response.cjs +28 -12
- package/dist/activity-CYVDcrt3.mjs +0 -356
- package/dist/budget-CGDkhvv_.mjs +0 -1745
- package/dist/build-progress-DxKpwnaS.mjs +0 -247
- package/dist/idle-DXtx3RbX.mjs +0 -191
- package/dist/in-use-DlqBDKqY.mjs +0 -249
- package/dist/logs-Civ4gbBH.mjs +0 -486
- package/dist/merge-state-ytFQCeh4.mjs +0 -262
- package/dist/server-expo-DIHDhvGg.mjs +0 -2
- package/dist/settings-D61iNOsB.mjs +0 -629
- package/dist/start-Cetfvy8l.mjs +0 -2
- package/dist/stats-CFpFGlJV.mjs +0 -62
- package/dist/stats-CX1Z8Tca.mjs +0 -368
- package/dist/stim-desktop-CXt8-Z3J.mjs +0 -40
- package/dist/stop-cause-hjGBOZTG.mjs +0 -1231
- package/dist/worktree-BVrHsYZG.mjs +0 -752
- package/dist/worktree-CHWWvm5v.mjs +0 -2
- package/dist/{metro-store-DzeWkfqW.mjs → metro-store-CDDZHtPl.mjs} +1 -1
package/dist/collector-run.mjs
CHANGED
|
@@ -1,202 +1,16 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { t as
|
|
3
|
-
import { r as createNdjsonWriter } from "./ndjson-CDY9IkVC.mjs";
|
|
4
|
-
import { M as workspaceLogsDir } from "./metro-CcEo8Fl8.mjs";
|
|
1
|
+
import { R as deviceSlotKey, W as validateDeviceSlot } from "./config-D0DbpZtM.mjs";
|
|
2
|
+
import { t as process_identity_exports } from "./process-identity-BmRm1qV0.mjs";
|
|
5
3
|
import { t as createLineReader } from "./process-output-Fpl8PYi8.mjs";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import { a as
|
|
4
|
+
import { x as workspaceLogsDir } from "./workspace-state-B8-aJ1_5.mjs";
|
|
5
|
+
import { r as createNdjsonWriter } from "./ndjson-PclOIwVY.mjs";
|
|
6
|
+
import { a as startIosDeviceConsole, i as parseDeviceConsoleLine } from "./ios-device-Ee7sDXfp.mjs";
|
|
7
|
+
import { n as parseLogStreamLine, r as startIosLogStream, t as appNameFromBundleId } from "./ios-Cr1h5gnO.mjs";
|
|
8
|
+
import { a as unregisterCollector, i as registerCollector, r as readCollectors, t as collectorProcessTitle } from "./ownership-DiA16AsN.mjs";
|
|
9
|
+
import { a as watchAppPid, i as waitForAppPid, n as parseLogcatLine, r as startAndroidLogcat, t as androidClockOffset } from "./android-r2rBL8kV.mjs";
|
|
9
10
|
import { existsSync } from "node:fs";
|
|
10
|
-
import { LOG_ROTATE_BYTES } from "@stim-cli/core";
|
|
11
11
|
import { isAbsolute, join, resolve } from "node:path";
|
|
12
|
+
import { LOG_ROTATE_BYTES } from "@stim-cli/core";
|
|
12
13
|
import { fileURLToPath } from "node:url";
|
|
13
|
-
//#region src/collector/ios.ts
|
|
14
|
-
const MESSAGE_TYPE_LEVEL = {
|
|
15
|
-
Debug: "debug",
|
|
16
|
-
Info: "info",
|
|
17
|
-
Default: "info",
|
|
18
|
-
Error: "error",
|
|
19
|
-
Fault: "fatal"
|
|
20
|
-
};
|
|
21
|
-
function levelFromMessageType(messageType) {
|
|
22
|
-
return MESSAGE_TYPE_LEVEL[messageType] ?? "info";
|
|
23
|
-
}
|
|
24
|
-
const NOISE_RULES = [
|
|
25
|
-
{
|
|
26
|
-
id: "network",
|
|
27
|
-
subsystem: "com.apple.network"
|
|
28
|
-
},
|
|
29
|
-
{
|
|
30
|
-
id: "network-default-subsystem",
|
|
31
|
-
messagePrefix: [
|
|
32
|
-
"nw_socket",
|
|
33
|
-
"nw_connection",
|
|
34
|
-
"nw_protocol",
|
|
35
|
-
"nw_endpoint",
|
|
36
|
-
"nw_path",
|
|
37
|
-
"nw_resolver",
|
|
38
|
-
"nw_flow",
|
|
39
|
-
"nw_read_request",
|
|
40
|
-
"nw_write_request",
|
|
41
|
-
"tcp_input"
|
|
42
|
-
]
|
|
43
|
-
},
|
|
44
|
-
{
|
|
45
|
-
id: "sectrust",
|
|
46
|
-
subsystem: "com.apple.securityd"
|
|
47
|
-
},
|
|
48
|
-
{
|
|
49
|
-
id: "sectrust-default-subsystem",
|
|
50
|
-
messagePrefix: [
|
|
51
|
-
"SecTrust",
|
|
52
|
-
"SecOSStatus",
|
|
53
|
-
"TrustResultType"
|
|
54
|
-
]
|
|
55
|
-
},
|
|
56
|
-
{
|
|
57
|
-
id: "webkit",
|
|
58
|
-
subsystem: "com.apple.WebKit"
|
|
59
|
-
},
|
|
60
|
-
{
|
|
61
|
-
id: "webkit-default-subsystem",
|
|
62
|
-
messagePrefix: [
|
|
63
|
-
"WebPrivacy",
|
|
64
|
-
"GPUProcessProxy",
|
|
65
|
-
"WebProcessProxy"
|
|
66
|
-
]
|
|
67
|
-
},
|
|
68
|
-
{
|
|
69
|
-
id: "audio-factory",
|
|
70
|
-
messageIncludes: ["AddInstanceForFactory"]
|
|
71
|
-
},
|
|
72
|
-
{
|
|
73
|
-
id: "coreui",
|
|
74
|
-
subsystem: "com.apple.coreui"
|
|
75
|
-
},
|
|
76
|
-
{
|
|
77
|
-
id: "coreui-default-subsystem",
|
|
78
|
-
messagePrefix: [
|
|
79
|
-
"CUICatalog:",
|
|
80
|
-
"CoreUI:",
|
|
81
|
-
"CoreThemeDefinition"
|
|
82
|
-
]
|
|
83
|
-
},
|
|
84
|
-
{
|
|
85
|
-
id: "uiscene-deprecation",
|
|
86
|
-
messageIncludes: [
|
|
87
|
-
"UIScene lifecycle will soon be required",
|
|
88
|
-
"`UIScene` lifecycle will soon be required",
|
|
89
|
-
"must migrate to UIScene",
|
|
90
|
-
"migrate to UIScene lifecycle"
|
|
91
|
-
]
|
|
92
|
-
},
|
|
93
|
-
{
|
|
94
|
-
id: "react-native-focus-cache",
|
|
95
|
-
exactSubsystem: "com.apple.UIKit",
|
|
96
|
-
category: "UIFocus",
|
|
97
|
-
messageEquals: "RCTScrollViewComponentView implements focusItemsInRect: - caching for linear focus movement is limited as long as this view is on screen."
|
|
98
|
-
},
|
|
99
|
-
{
|
|
100
|
-
id: "cfnetwork-performance-diagnostic",
|
|
101
|
-
exactSubsystem: "com.apple.runtime-issues",
|
|
102
|
-
category: "CFNetwork Performance Diagnostic",
|
|
103
|
-
level: "warn"
|
|
104
|
-
}
|
|
105
|
-
];
|
|
106
|
-
function ruleMatches(rule, { subsystem, category, message }) {
|
|
107
|
-
if (rule.subsystem && subsystem !== rule.subsystem && !subsystem.startsWith(`${rule.subsystem}.`)) return false;
|
|
108
|
-
if (rule.exactSubsystem && subsystem !== rule.exactSubsystem) return false;
|
|
109
|
-
if (rule.category && category !== rule.category) return false;
|
|
110
|
-
if (rule.messageEquals && message !== rule.messageEquals) return false;
|
|
111
|
-
if (rule.messagePrefix && !rule.messagePrefix.some((p) => message.startsWith(p))) return false;
|
|
112
|
-
if (rule.messageIncludes && !rule.messageIncludes.some((p) => message.includes(p))) return false;
|
|
113
|
-
return true;
|
|
114
|
-
}
|
|
115
|
-
function matchingNoiseRule(event) {
|
|
116
|
-
const subsystem = typeof event?.subsystem === "string" ? event.subsystem : "";
|
|
117
|
-
const category = typeof event?.category === "string" ? event.category : "";
|
|
118
|
-
const message = typeof event?.eventMessage === "string" ? event.eventMessage : "";
|
|
119
|
-
return NOISE_RULES.find((rule) => ruleMatches(rule, {
|
|
120
|
-
subsystem,
|
|
121
|
-
category,
|
|
122
|
-
message
|
|
123
|
-
}));
|
|
124
|
-
}
|
|
125
|
-
function levelForEvent(event) {
|
|
126
|
-
const level = levelFromMessageType(event?.messageType);
|
|
127
|
-
if (level !== "error" && level !== "fatal") return level;
|
|
128
|
-
const rule = matchingNoiseRule(event);
|
|
129
|
-
return rule ? rule.level ?? "info" : level;
|
|
130
|
-
}
|
|
131
|
-
function procFromImagePath(path) {
|
|
132
|
-
if (typeof path !== "string" || !path) return null;
|
|
133
|
-
const parts = path.split("/");
|
|
134
|
-
return parts[parts.length - 1] || null;
|
|
135
|
-
}
|
|
136
|
-
function tsFromEvent(event, now = Date.now) {
|
|
137
|
-
const parsed = Date.parse(event?.timestamp);
|
|
138
|
-
return Number.isFinite(parsed) ? parsed : now();
|
|
139
|
-
}
|
|
140
|
-
function recordFromLogEvent(event, { now = Date.now } = {}) {
|
|
141
|
-
if (!event || typeof event !== "object") return null;
|
|
142
|
-
const eventType = event.eventType;
|
|
143
|
-
if (eventType && eventType !== "logEvent") return null;
|
|
144
|
-
const msg = typeof event.eventMessage === "string" ? event.eventMessage : "";
|
|
145
|
-
if (!msg.trim()) return null;
|
|
146
|
-
const record = {
|
|
147
|
-
ts: tsFromEvent(event, now),
|
|
148
|
-
src: "device",
|
|
149
|
-
level: levelForEvent(event),
|
|
150
|
-
msg
|
|
151
|
-
};
|
|
152
|
-
const proc = procFromImagePath(event.processImagePath);
|
|
153
|
-
if (proc) record.proc = proc;
|
|
154
|
-
if (typeof event.subsystem === "string") record.subsystem = event.subsystem;
|
|
155
|
-
if (typeof event.category === "string") record.category = event.category;
|
|
156
|
-
return record;
|
|
157
|
-
}
|
|
158
|
-
function parseLogStreamLine(line, { now = Date.now } = {}) {
|
|
159
|
-
if (typeof line !== "string") return null;
|
|
160
|
-
const trimmed = line.trim();
|
|
161
|
-
if (!trimmed || trimmed[0] !== "{") return null;
|
|
162
|
-
let event;
|
|
163
|
-
try {
|
|
164
|
-
event = JSON.parse(trimmed);
|
|
165
|
-
} catch {
|
|
166
|
-
return null;
|
|
167
|
-
}
|
|
168
|
-
return recordFromLogEvent(event, { now });
|
|
169
|
-
}
|
|
170
|
-
function logStreamArgs(udid, appName, executableName) {
|
|
171
|
-
return [
|
|
172
|
-
"simctl",
|
|
173
|
-
"spawn",
|
|
174
|
-
udid,
|
|
175
|
-
"log",
|
|
176
|
-
"stream",
|
|
177
|
-
"--style",
|
|
178
|
-
"ndjson",
|
|
179
|
-
"--predicate",
|
|
180
|
-
`processImagePath ENDSWITH "/${appName}.app/${executableName && executableName.trim() !== "" ? executableName.trim() : appName}"`,
|
|
181
|
-
"--level",
|
|
182
|
-
"info"
|
|
183
|
-
];
|
|
184
|
-
}
|
|
185
|
-
function appNameFromBundleId(bundleId) {
|
|
186
|
-
const parts = String(bundleId || "").split(".");
|
|
187
|
-
return parts[parts.length - 1] || String(bundleId || "");
|
|
188
|
-
}
|
|
189
|
-
function startIosLogStream({ udid, appName, executableName = null, spawnFn = null }) {
|
|
190
|
-
return (spawnFn || ((cmd, args, opts) => getExecutor().spawn(cmd, args, opts)))("xcrun", logStreamArgs(udid, appName, executableName), {
|
|
191
|
-
stdio: [
|
|
192
|
-
"ignore",
|
|
193
|
-
"pipe",
|
|
194
|
-
"pipe"
|
|
195
|
-
],
|
|
196
|
-
detached: false
|
|
197
|
-
});
|
|
198
|
-
}
|
|
199
|
-
//#endregion
|
|
200
14
|
//#region src/collector/run.ts
|
|
201
15
|
const PLATFORMS = ["ios", "android"];
|
|
202
16
|
function parseArgs(argv) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { t as NO_PROJECT_REFUSAL } from "./project-CWlvEaeN.mjs";
|
|
2
1
|
import { n as stripAnsi } from "./process-output-Fpl8PYi8.mjs";
|
|
2
|
+
import { t as NO_PROJECT_REFUSAL } from "./project-Du91Ilvc.mjs";
|
|
3
3
|
import { quotedPath } from "@stim-cli/core";
|
|
4
4
|
import chalk from "chalk";
|
|
5
5
|
//#region src/diagnostics/launch-error-preview.ts
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { t as
|
|
3
|
-
import {
|
|
1
|
+
import { t as getExecutor } from "./exec-CaErVv7t.mjs";
|
|
2
|
+
import { n as ownership_claim_exports, t as process_identity_exports } from "./process-identity-BmRm1qV0.mjs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
4
|
import { existsSync, lstatSync, mkdirSync, readdirSync, readlinkSync, renameSync, statSync, unlinkSync, writeFileSync } from "fs";
|
|
5
|
-
import { dirname, isAbsolute, join, normalize, parse, sep } from "path";
|
|
5
|
+
import { dirname as dirname$1, isAbsolute as isAbsolute$1, join as join$1, normalize, parse as parse$1, sep as sep$1 } from "path";
|
|
6
6
|
import { configDir } from "@stim-cli/core";
|
|
7
|
+
import { InvalidArgumentError } from "commander";
|
|
7
8
|
import { allMetroPorts, configCorruptRepair, findEnclosingWorktreeRoot, getConcurrencyLimits, getConfigPath, getConfigPath as getConfigPath$1, getProject, getProjectSettings, getRepoSettings, isPathPrefix, loadConfig, loadConfig as loadConfig$1, withConfigLock, withConfigLock as withConfigLock$1 } from "@stim-cli/core/state";
|
|
8
|
-
import { join as join$1 } from "node:path";
|
|
9
9
|
//#region src/devices/device-slots.ts
|
|
10
10
|
const DEFAULT_DEVICE_SLOT = "default";
|
|
11
11
|
const DEVICE_SLOT_RULE = "A device slot must be 1-64 letters, digits, underscores or hyphens, starting with a letter or digit.";
|
|
@@ -108,23 +108,23 @@ const WINDOWS = process.platform === "win32";
|
|
|
108
108
|
const DRIVE_LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
|
109
109
|
function volumeRootFor(path) {
|
|
110
110
|
const normalized = normalize(String(path));
|
|
111
|
-
if (WINDOWS) return parse(normalized).root.replace(/^[a-z]:/, (drive) => drive.toUpperCase());
|
|
111
|
+
if (WINDOWS) return parse$1(normalized).root.replace(/^[a-z]:/, (drive) => drive.toUpperCase());
|
|
112
112
|
const m = normalized.match(/^\/volumes\/([^/]+)/i);
|
|
113
113
|
return m ? `/Volumes/${m[1]}` : "/";
|
|
114
114
|
}
|
|
115
115
|
function resolveWorkspaceRealish(workspacePath) {
|
|
116
116
|
const raw = String(workspacePath);
|
|
117
|
-
if (!isAbsolute(raw)) return null;
|
|
117
|
+
if (!isAbsolute$1(raw)) return null;
|
|
118
118
|
let current = raw;
|
|
119
119
|
const MAX_HOPS = 40;
|
|
120
120
|
for (let hops = 0; hops < MAX_HOPS; hops++) {
|
|
121
121
|
const normalized = normalize(current);
|
|
122
|
-
const root = parse(normalized).root;
|
|
123
|
-
const segments = normalized.slice(root.length).split(sep).filter(Boolean);
|
|
124
|
-
let prefix = root.endsWith(sep) ? root.slice(0, -sep.length) : root;
|
|
122
|
+
const root = parse$1(normalized).root;
|
|
123
|
+
const segments = normalized.slice(root.length).split(sep$1).filter(Boolean);
|
|
124
|
+
let prefix = root.endsWith(sep$1) ? root.slice(0, -sep$1.length) : root;
|
|
125
125
|
let followedSymlink = false;
|
|
126
126
|
for (const segment of segments) {
|
|
127
|
-
prefix += `${sep}${segment}`;
|
|
127
|
+
prefix += `${sep$1}${segment}`;
|
|
128
128
|
let st;
|
|
129
129
|
try {
|
|
130
130
|
st = lstatSync(prefix);
|
|
@@ -139,7 +139,7 @@ function resolveWorkspaceRealish(workspacePath) {
|
|
|
139
139
|
} catch {
|
|
140
140
|
return null;
|
|
141
141
|
}
|
|
142
|
-
current = `${isAbsolute(target) ? target : normalize(join(dirname(prefix), target))}${normalized.slice(prefix.length)}`;
|
|
142
|
+
current = `${isAbsolute$1(target) ? target : normalize(join$1(dirname$1(prefix), target))}${normalized.slice(prefix.length)}`;
|
|
143
143
|
followedSymlink = true;
|
|
144
144
|
break;
|
|
145
145
|
}
|
|
@@ -154,7 +154,7 @@ function isRealMount(entryDev, rootDev) {
|
|
|
154
154
|
function listWindowsVolumeRoots(statFn) {
|
|
155
155
|
const roots = [];
|
|
156
156
|
for (const letter of DRIVE_LETTERS) {
|
|
157
|
-
const root = `${letter}:${sep}`;
|
|
157
|
+
const root = `${letter}:${sep$1}`;
|
|
158
158
|
try {
|
|
159
159
|
statFn(root);
|
|
160
160
|
} catch {
|
|
@@ -175,7 +175,7 @@ function listMountedVolumes({ statFn = statSync } = {}) {
|
|
|
175
175
|
}
|
|
176
176
|
try {
|
|
177
177
|
for (const name of readdirSync("/Volumes")) {
|
|
178
|
-
const path = join("/Volumes", name);
|
|
178
|
+
const path = join$1("/Volumes", name);
|
|
179
179
|
let entryDev;
|
|
180
180
|
try {
|
|
181
181
|
entryDev = statFn(path).dev;
|
|
@@ -192,7 +192,7 @@ function resolveVolumeRoot(path) {
|
|
|
192
192
|
return realish === null ? null : volumeRootFor(realish);
|
|
193
193
|
}
|
|
194
194
|
function uncShareIsReachable(volume, statFn) {
|
|
195
|
-
if (!WINDOWS || !volume.startsWith(`${sep}${sep}`)) return false;
|
|
195
|
+
if (!WINDOWS || !volume.startsWith(`${sep$1}${sep$1}`)) return false;
|
|
196
196
|
try {
|
|
197
197
|
return statFn(volume).isDirectory();
|
|
198
198
|
} catch {
|
|
@@ -225,14 +225,9 @@ function formatBytes(bytes) {
|
|
|
225
225
|
return `${Math.round(bytes / 1024)}K`;
|
|
226
226
|
}
|
|
227
227
|
//#endregion
|
|
228
|
-
//#region src/ownership-claim.ts
|
|
229
|
-
var ownership_claim_exports = /* @__PURE__ */ __exportAll({});
|
|
230
|
-
import * as import__stim_cli_core_ownership_claim from "@stim-cli/core/ownership-claim";
|
|
231
|
-
__reExport(ownership_claim_exports, import__stim_cli_core_ownership_claim);
|
|
232
|
-
//#endregion
|
|
233
228
|
//#region src/devices/avd-claim.ts
|
|
234
229
|
function acquireAvdClaim(avdName) {
|
|
235
|
-
const root = join
|
|
230
|
+
const root = join(configDir(), "avd-locks", `${encodeURIComponent(avdName.toLowerCase())}.lock`);
|
|
236
231
|
const label = `AVD ${avdName}`;
|
|
237
232
|
const attempt = (0, ownership_claim_exports.tryAcquireClaim)({
|
|
238
233
|
root,
|
|
@@ -249,11 +244,6 @@ function acquireAvdClaim(avdName) {
|
|
|
249
244
|
});
|
|
250
245
|
}
|
|
251
246
|
//#endregion
|
|
252
|
-
//#region src/process-identity.ts
|
|
253
|
-
var process_identity_exports = /* @__PURE__ */ __exportAll({});
|
|
254
|
-
import * as import__stim_cli_core_process_identity from "@stim-cli/core/process-identity";
|
|
255
|
-
__reExport(process_identity_exports, import__stim_cli_core_process_identity);
|
|
256
|
-
//#endregion
|
|
257
247
|
//#region src/workspace/config.ts
|
|
258
248
|
function getConfigDir() {
|
|
259
249
|
return configDir();
|
|
@@ -265,7 +255,7 @@ function refuseRelativeStimPaths(env = process.env) {
|
|
|
265
255
|
"STIM_METRO_CACHE"
|
|
266
256
|
]) {
|
|
267
257
|
const value = env[name];
|
|
268
|
-
if (!value || isAbsolute(value)) continue;
|
|
258
|
+
if (!value || isAbsolute$1(value)) continue;
|
|
269
259
|
const error = /* @__PURE__ */ new Error(`${name}=${value} is not an absolute path. Set it to an absolute path, or unset it to use the default.`);
|
|
270
260
|
error.code = "STIM_RELATIVE_PATH";
|
|
271
261
|
throw error;
|
|
@@ -310,7 +300,7 @@ function ensureConfig() {
|
|
|
310
300
|
});
|
|
311
301
|
}
|
|
312
302
|
function requireAbsoluteProjectPath(projectPath) {
|
|
313
|
-
if (isAbsolute(projectPath)) return;
|
|
303
|
+
if (isAbsolute$1(projectPath)) return;
|
|
314
304
|
throw new Error(`Project key "${projectPath}" is not an absolute path. The registry is keyed by the realpath of a workspace root, so a relative key can never resolve.`);
|
|
315
305
|
}
|
|
316
306
|
function upsertProject(projectPath, fields) {
|
|
@@ -380,6 +370,15 @@ function releaseAndroidConsolePort(projectPath, consolePort, slot = "default") {
|
|
|
380
370
|
return true;
|
|
381
371
|
});
|
|
382
372
|
}
|
|
373
|
+
function recordIosSchemeApprovals(projectPath, deviceUdid, schemeApprovals, slot = "default") {
|
|
374
|
+
withConfigLock(() => {
|
|
375
|
+
const cfg = loadConfig();
|
|
376
|
+
const ios = deviceSlotPlatforms(cfg?.projects?.[projectPath], slot)?.ios;
|
|
377
|
+
if (!cfg || !ios?.owned || ios.deviceUdid !== deviceUdid) return;
|
|
378
|
+
ios.schemeApprovals = schemeApprovals;
|
|
379
|
+
saveConfig(cfg);
|
|
380
|
+
});
|
|
381
|
+
}
|
|
383
382
|
function clearAndroidBootPending(projectPath, avdName, slot = "default") {
|
|
384
383
|
withConfigLock(() => {
|
|
385
384
|
const cfg = loadConfig();
|
|
@@ -522,4 +521,4 @@ function allConsolePortsAndSerials({ isMounted = isOnMountedVolume } = {}) {
|
|
|
522
521
|
return result;
|
|
523
522
|
}
|
|
524
523
|
//#endregion
|
|
525
|
-
export {
|
|
524
|
+
export { directorySize as A, parseDeviceSlotKey as B, saveConfig as C, withConfigLock$1 as D, upsertProject as E, volumeRootFor as F, projectDeviceSlots as H, assignSlotDevice as I, deviceSlotFileKey as L, isOnMountedVolume as M, listMountedVolumes as N, writeConfigSetting as O, measuredDirectorySize as P, deviceSlotKey as R, removeProject as S, setSupervisor as T, removeSlotDevice as U, parseDeviceSlotOption as V, validateDeviceSlot as W, loadConfig$1 as _, clearDevice as a, releaseAndroidConsolePort as b, ensureConfig as c, getConfigDir as d, getConfigPath$1 as f, isPathPrefix as g, getRepoSettings as h, clearAndroidBootPending as i, formatBytes as j, acquireAvdClaim as k, findEnclosingWorktreeRoot as l, getProjectSettings as m, allMetroPorts as n, clearSupervisor as o, getProject as p, claimMetroPort as r, configCorruptRepair as s, allConsolePortsAndSerials as t, getConcurrencyLimits as u, recordIosSchemeApprovals as v, setDevice as w, releaseMetroPort as x, refuseRelativeStimPaths as y, deviceSlotPlatforms as z };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { d as getConfigDir } from "./config-
|
|
2
|
-
import {
|
|
1
|
+
import { d as getConfigDir } from "./config-D0DbpZtM.mjs";
|
|
2
|
+
import { w as withDirLock } from "./workspace-state-B8-aJ1_5.mjs";
|
|
3
3
|
import { mkdirSync, renameSync, rmSync, writeFileSync } from "node:fs";
|
|
4
4
|
import { createdDevicesFile, createdDevicesLock, readCreatedDevices, readCreatedDevices as readCreatedDevices$1 } from "@stim-cli/core/state";
|
|
5
5
|
//#region src/devices/created-devices.ts
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { t as getExecutor } from "./exec-
|
|
2
|
-
import {
|
|
1
|
+
import { t as getExecutor } from "./exec-CaErVv7t.mjs";
|
|
2
|
+
import { gt as repoRoot } from "./settings-oTSkkNrM.mjs";
|
|
3
3
|
import { existsSync } from "node:fs";
|
|
4
4
|
import { dirname, join, relative } from "node:path";
|
|
5
5
|
//#region src/dependency-state.ts
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { t as getExecutor } from "./exec-
|
|
2
|
-
import { a as spawnDeclared } from "./spawn-claims-Drw_o-Fb.mjs";
|
|
1
|
+
import { t as getExecutor } from "./exec-CaErVv7t.mjs";
|
|
3
2
|
import { n as stripAnsi, r as waitForChild, t as createLineReader } from "./process-output-Fpl8PYi8.mjs";
|
|
4
|
-
import {
|
|
3
|
+
import { a as spawnDeclared } from "./spawn-claims-D0XfSe8u.mjs";
|
|
4
|
+
import { S as bundlerPin, u as HEARTBEAT_INTERVAL_MS, y as startBuildHeartbeat } from "./toolchain-DkUflduf.mjs";
|
|
5
5
|
import { existsSync, readFileSync } from "node:fs";
|
|
6
6
|
import { delimiter, dirname, join, relative, resolve, sep } from "node:path";
|
|
7
7
|
import { homedir } from "node:os";
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { c as isPackageResolvable, p as resolvePackageJson } from "./project-Du91Ilvc.mjs";
|
|
2
|
+
import { C as pickDevClientScheme, w as readBundleSchemes } from "./app-install-CKWdbXIX.mjs";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import { isJsonObject, readJsonObject } from "@stim-cli/core/state";
|
|
5
|
+
//#region src/commands/dev-client.ts
|
|
6
|
+
function devClientScheme(root, appPath = null, { exec = null } = {}) {
|
|
7
|
+
if (!hasDevClient(root)) return void 0;
|
|
8
|
+
const fromBundle = pickDevClientScheme(readBundleSchemes(appPath, { exec }));
|
|
9
|
+
if (fromBundle) return fromBundle;
|
|
10
|
+
const app = readJsonObject(join(root, "app.json"));
|
|
11
|
+
const expo = app?.expo;
|
|
12
|
+
const raw = (isJsonObject(expo) ? expo.scheme : void 0) ?? app?.scheme ?? null;
|
|
13
|
+
const scheme = Array.isArray(raw) ? raw.find((s) => typeof s === "string" && s.trim() !== "") : raw;
|
|
14
|
+
if (typeof scheme !== "string" || scheme.trim() === "") return void 0;
|
|
15
|
+
return scheme.trim();
|
|
16
|
+
}
|
|
17
|
+
function hasDevClient(root) {
|
|
18
|
+
const pkg = readJsonObject(join(root, "package.json"));
|
|
19
|
+
if ([pkg?.dependencies, pkg?.devDependencies].some((deps) => isJsonObject(deps) && "expo-dev-client" in deps)) return true;
|
|
20
|
+
return isPackageResolvable(root, "expo-dev-client");
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Whether `version` of expo-dev-launcher reads the `disableFab=1` and `disableAutoLaunch=1` launch
|
|
24
|
+
* URL params (expo/expo#49651, first published in 58.0.0; no 58.0.0 prerelease carries it).
|
|
25
|
+
*/
|
|
26
|
+
function devLauncherReadsDevMenuParams(version) {
|
|
27
|
+
const match = /^(\d+)\.(\d+)\.(\d+)(-.+)?$/.exec(version?.trim() ?? "");
|
|
28
|
+
if (!match) return false;
|
|
29
|
+
const [major, minor, patch] = match.slice(1, 4).map(Number);
|
|
30
|
+
if (major !== 58) return major > 58;
|
|
31
|
+
return minor > 0 || patch > 0 || match[4] === void 0;
|
|
32
|
+
}
|
|
33
|
+
function devClientTakesDevMenuParams(root) {
|
|
34
|
+
return devLauncherReadsDevMenuParams(installedDevLauncherVersion(root));
|
|
35
|
+
}
|
|
36
|
+
function installedDevLauncherVersion(root) {
|
|
37
|
+
const devClient = resolvePackageJson(root, "expo-dev-client");
|
|
38
|
+
const launcher = resolvePackageJson(devClient ? dirname(devClient) : root, "expo-dev-launcher");
|
|
39
|
+
const version = launcher ? readJsonObject(launcher)?.version : null;
|
|
40
|
+
return typeof version === "string" ? version : null;
|
|
41
|
+
}
|
|
42
|
+
//#endregion
|
|
43
|
+
export { devClientTakesDevMenuParams as n, devClientScheme as t };
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import { H as
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { n as fileLeaseIo, o as parseLeaseDuration, p as takeLease, u as releaseWorkspaceLeases } from "./device-lease-
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
1
|
+
import { H as projectDeviceSlots, R as deviceSlotKey, V as parseDeviceSlotOption, p as getProject } from "./config-D0DbpZtM.mjs";
|
|
2
|
+
import { r as clockTime } from "./command-output-DnJMdEY-.mjs";
|
|
3
|
+
import { o as findProjectRoot, t as NO_PROJECT_REFUSAL } from "./project-Du91Ilvc.mjs";
|
|
4
|
+
import { n as fileLeaseIo, o as parseLeaseDuration, p as takeLease, u as releaseWorkspaceLeases } from "./device-lease-D-hLqx1b.mjs";
|
|
5
|
+
import { E as getAvdNameForSerial, G as probeEmulatorSerial, N as memoizeEmulatorProbe, O as listAdbDevices, U as physicalDeviceModel, Y as resolvePhysicalDevice, c as androidPoolNoCandidatesRefusal, s as androidPoolCandidates } from "./android-B_NumVyQ.mjs";
|
|
6
|
+
import { l as parseDeviceWait, p as waitForDevice } from "./device-lease-run-CqjShqWW.mjs";
|
|
7
|
+
import { t as selectFromPool } from "./device-pool-CUaEWMMm.mjs";
|
|
8
|
+
import { a as iosPoolCandidates, c as isWirelessIosDevice, f as resolveIosPhysicalDevice, l as listIosDevices, o as iosPoolNoCandidatesRefusal } from "./ios-device-FfCN_C8p.mjs";
|
|
8
9
|
import chalk from "chalk";
|
|
9
10
|
//#region src/commands/device.ts
|
|
10
11
|
const DEFAULT_FOR = "5m";
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { H as projectDeviceSlots, _ as loadConfig, z as deviceSlotPlatforms } from "./config-D0DbpZtM.mjs";
|
|
2
|
+
import { O as listAdbDevices } from "./android-B_NumVyQ.mjs";
|
|
3
|
+
import { _ as parseRuntimeVersion, c as iosRuntimeMatches, u as listAllIosSims } from "./ios-BaInn3sW.mjs";
|
|
4
|
+
//#region src/engine/device-capacity.ts
|
|
5
|
+
function liveOwnedDeviceCount({ sims = [], adbEmulators = [], config = null } = {}) {
|
|
6
|
+
let count = 0;
|
|
7
|
+
for (const sim of sims) if (sim?.state === "Booted" && sim.name?.startsWith("stim-")) count++;
|
|
8
|
+
const livePorts = new Set(adbEmulators.map((e) => e.consolePort));
|
|
9
|
+
for (const proj of Object.values(config?.projects || {})) for (const { platforms } of projectDeviceSlots(proj)) {
|
|
10
|
+
const android = platforms.android;
|
|
11
|
+
if (android?.owned && android.avdName && typeof android.consolePort === "number" && livePorts.has(android.consolePort)) count++;
|
|
12
|
+
}
|
|
13
|
+
return count;
|
|
14
|
+
}
|
|
15
|
+
function workspaceHasLiveDevice({ platform, project, slot = "default", sims = [], adbEmulators = [] } = {}) {
|
|
16
|
+
if (!platform) return false;
|
|
17
|
+
const record = deviceSlotPlatforms(project, slot)?.[platform];
|
|
18
|
+
if (!record) return false;
|
|
19
|
+
if (platform === "ios") return sims.some((s) => s.udid === record.deviceUdid && s.state === "Booted");
|
|
20
|
+
return typeof record.consolePort === "number" && adbEmulators.some((e) => e.consolePort === record.consolePort);
|
|
21
|
+
}
|
|
22
|
+
function deviceCapacityRefusal({ platform, project, slot = "default", max, sims = [], adb = null, config = null } = {}) {
|
|
23
|
+
if (!max || max <= 0) return null;
|
|
24
|
+
const adbEmulators = adb?.emulators || [];
|
|
25
|
+
if (workspaceHasLiveDevice({
|
|
26
|
+
platform,
|
|
27
|
+
project,
|
|
28
|
+
slot,
|
|
29
|
+
sims,
|
|
30
|
+
adbEmulators
|
|
31
|
+
})) return null;
|
|
32
|
+
const count = liveOwnedDeviceCount({
|
|
33
|
+
sims,
|
|
34
|
+
adbEmulators,
|
|
35
|
+
config
|
|
36
|
+
});
|
|
37
|
+
if (count < max) return null;
|
|
38
|
+
return {
|
|
39
|
+
code: "STIM_AT_CAPACITY",
|
|
40
|
+
message: `${count} Stim device(s) are already booted and concurrency.maxDevices is ${max}, so booting another would exceed the cap.`,
|
|
41
|
+
remedy: "stop an environment (stim stop) or raise concurrency.maxDevices"
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function checkDeviceCapacity({ platform, project, slot = "default", max, sims = listAllIosSims, adb = listAdbDevices, config = loadConfig } = {}) {
|
|
45
|
+
if (!max || max <= 0) return null;
|
|
46
|
+
let simList = [];
|
|
47
|
+
let adbRes = {
|
|
48
|
+
emulators: [],
|
|
49
|
+
physical: [],
|
|
50
|
+
unhealthy: []
|
|
51
|
+
};
|
|
52
|
+
try {
|
|
53
|
+
simList = typeof sims === "function" ? sims() || [] : sims || [];
|
|
54
|
+
} catch {}
|
|
55
|
+
try {
|
|
56
|
+
adbRes = typeof adb === "function" ? adb() || adbRes : adb || adbRes;
|
|
57
|
+
} catch {}
|
|
58
|
+
let cfg = null;
|
|
59
|
+
try {
|
|
60
|
+
cfg = typeof config === "function" ? config() : config ?? null;
|
|
61
|
+
} catch {}
|
|
62
|
+
return deviceCapacityRefusal({
|
|
63
|
+
platform,
|
|
64
|
+
project,
|
|
65
|
+
slot,
|
|
66
|
+
max,
|
|
67
|
+
sims: simList,
|
|
68
|
+
adb: adbRes,
|
|
69
|
+
config: cfg
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
function deviceTypeMismatch(recordedTypeId, requestedName, deviceTypes) {
|
|
73
|
+
if (!requestedName || !recordedTypeId) return null;
|
|
74
|
+
const wanted = (deviceTypes || []).find((d) => d.name === requestedName);
|
|
75
|
+
if (!wanted) return null;
|
|
76
|
+
if (wanted.identifier === recordedTypeId) return null;
|
|
77
|
+
const recorded = (deviceTypes || []).find((d) => d.identifier === recordedTypeId);
|
|
78
|
+
return `this project's sim is ${recorded ? recorded.name : recordedTypeId}, but --device-type asked for ${requestedName}`;
|
|
79
|
+
}
|
|
80
|
+
function runtimeMismatch(recordedRuntimeId, requested, runtimes) {
|
|
81
|
+
if (!requested || !recordedRuntimeId) return null;
|
|
82
|
+
const wanted = runtimes.find((r) => iosRuntimeMatches(r, requested));
|
|
83
|
+
if (!wanted || wanted.identifier === recordedRuntimeId) return null;
|
|
84
|
+
return `this project's sim runs iOS ${parseRuntimeVersion(recordedRuntimeId)}, but --runtime asked for ${requested}`;
|
|
85
|
+
}
|
|
86
|
+
function installedNames(names) {
|
|
87
|
+
const unique = [...new Set(names.filter((n) => typeof n === "string" && n !== ""))];
|
|
88
|
+
return unique.length > 0 ? unique.join(", ") : "none";
|
|
89
|
+
}
|
|
90
|
+
/** Appends which settings layer supplied an unresolved device selector, so the user knows where to fix it. */
|
|
91
|
+
function layerNote(refusal, key, flag, origin) {
|
|
92
|
+
if (flag !== void 0 && flag !== null) return refusal;
|
|
93
|
+
if (!origin) return refusal;
|
|
94
|
+
return {
|
|
95
|
+
message: `${refusal.message} ${key} is set at the ${origin} layer.`,
|
|
96
|
+
remedy: `${refusal.remedy} Fix it with \`stim settings set ${key} <value> --scope ${origin}\` or \`stim settings unset ${key} --scope ${origin}\`.`
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
function unknownIosRuntimeRefusal(requested, runtimes) {
|
|
100
|
+
if (!requested) return null;
|
|
101
|
+
if ((runtimes || []).some((r) => iosRuntimeMatches(r, requested))) return null;
|
|
102
|
+
return {
|
|
103
|
+
message: `No installed simulator runtime matches "${requested}". Installed runtimes: ${installedNames((runtimes || []).map((r) => r.version))}.`,
|
|
104
|
+
remedy: "Pass `--runtime` (or set ios.runtime) a version printed above (\"26.5\") or a runtime's full name (\"iOS 26.5\"); nothing else matches. Install more runtimes through Xcode."
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
function creatableIosDeviceTypeNames(runtimes, runtime) {
|
|
108
|
+
return (runtime ? (runtimes || []).filter((r) => iosRuntimeMatches(r, runtime)) : runtimes || []).flatMap((r) => (r.supportedDeviceTypes || []).map((d) => d.name));
|
|
109
|
+
}
|
|
110
|
+
function unknownIosDeviceTypeRefusal(requested, runtimes, runtime) {
|
|
111
|
+
if (!requested) return null;
|
|
112
|
+
const creatable = creatableIosDeviceTypeNames(runtimes, runtime);
|
|
113
|
+
if (creatable.includes(requested)) return null;
|
|
114
|
+
return {
|
|
115
|
+
message: `No device type named "${requested}" can be created on ${runtime ? `runtime ${runtime}` : "any installed simulator runtime"}. ${runtime ? `Device types runtime ${runtime} supports` : "Device types the installed runtimes support"}: ${installedNames(creatable)}.`,
|
|
116
|
+
remedy: "Pass `--device-type` (or set ios.deviceType) one of the names printed above, exactly as `xcrun simctl list devicetypes` spells it. `xcrun simctl list devicetypes` also lists watchOS, tvOS and visionOS models, which no iOS runtime can create. Install more models through Xcode."
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
function unknownAndroidSystemImageRefusal(requested, images) {
|
|
120
|
+
if (!requested) return null;
|
|
121
|
+
if ((images || []).some((i) => i.pkg === requested)) return null;
|
|
122
|
+
return {
|
|
123
|
+
message: `No installed Android system image is named "${requested}". Installed system images: ${installedNames((images || []).map((i) => i.pkg))}.`,
|
|
124
|
+
remedy: "Pass `--system-image` (or set android.systemImage) to one of the package ids printed above. Install more with `sdkmanager \"system-images;android-36;google_apis;arm64-v8a\"`."
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
function unknownAndroidDeviceProfileRefusal(requested, profiles) {
|
|
128
|
+
if (!requested) return null;
|
|
129
|
+
if (profiles.includes(requested)) return null;
|
|
130
|
+
return {
|
|
131
|
+
message: `No Android hardware profile is named "${requested}". Profiles avdmanager offers: ${installedNames(profiles)}.`,
|
|
132
|
+
remedy: "Pass `--device-profile` (or set android.deviceProfile) to one of the ids printed above, exactly as `avdmanager list device -c` spells it, e.g. \"pixel_fold\" or \"pixel_tablet\"."
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
//#endregion
|
|
136
|
+
export { runtimeMismatch as a, unknownIosDeviceTypeRefusal as c, liveOwnedDeviceCount as i, unknownIosRuntimeRefusal as l, deviceTypeMismatch as n, unknownAndroidDeviceProfileRefusal as o, layerNote as r, unknownAndroidSystemImageRefusal as s, checkDeviceCapacity as t };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {}
|