stim 1.24.0 → 1.26.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 +1 -1
- package/dist/{acquire-artifact-CEs02U2o.mjs → acquire-artifact-DVsvSwf7.mjs} +1 -1
- package/dist/{act-Cyvm8xYc.mjs → act-C-BqJEpu.mjs} +158 -36
- package/dist/{activity-Dq3ZcdD8.mjs → activity-Lnb_EoRY.mjs} +4 -5
- package/dist/{agent-device-usage-output-CccomeE0.mjs → agent-device-usage-output-DbXy5tg8.mjs} +4 -4
- package/dist/{android-CX5IcRuf.mjs → android-B5P81yI-.mjs} +1 -1
- package/dist/{android-DcztblCT.mjs → android-CSbLRD53.mjs} +5 -5
- package/dist/{android-BZppyPe_.mjs → android-CiNQw3kq.mjs} +81 -52
- package/dist/{android-882m4hxX.mjs → android-DTAcRwBC.mjs} +81 -34
- package/dist/{android-cas-BtCOrNqb.mjs → android-cas-BTVhZ0Qs.mjs} +4 -4
- package/dist/{android-project-DVWyCbWU.d.mts → android-project-DUGMbq28.d.mts} +61 -3
- package/dist/api.d.mts +8 -5
- package/dist/api.mjs +27 -27
- package/dist/apk-signed-tail-B46U9hXc.mjs +142 -0
- package/dist/{artifact-BR5VNArK.mjs → artifact-BxREhAaV.mjs} +25 -19
- package/dist/{artifact-Bdt_n9Jc.mjs → artifact-CsAP6AGK.mjs} +36 -21
- package/dist/{attempt-DW-mQqM7.mjs → attempt-ClyJlZPT.mjs} +4 -2
- package/dist/{browser-web-ycg9qWB8.mjs → browser-web-rYPyqhTf.mjs} +11 -12
- package/dist/{budget-dPGuhNai.mjs → budget-k2mZGvvk.mjs} +242 -38
- package/dist/{build-CaF574eS.mjs → build-DPhApsjV.mjs} +28 -24
- package/dist/{build-cache-HFUQ9eLz.mjs → build-cache-DrXNCy3T.mjs} +123 -23
- package/dist/{build-plan-JsDUq4w1.mjs → build-plan-DrMMdayj.mjs} +5 -5
- package/dist/{cache-manifest-BPXRONJz.mjs → cache-manifest-BEZ9Bpl1.mjs} +1 -1
- package/dist/cache-manifest.mjs +1 -1
- package/dist/{ccache-CCn1S6qG.mjs → ccache-Bx5TbxwG.mjs} +6 -6
- package/dist/{cli-xqAidP7O.mjs → cli-BBKFGOFl.mjs} +19 -19
- package/dist/cli.mjs +1 -1
- package/dist/{client-18-ZowoT.mjs → client-D9CaRks-.mjs} +55 -71
- package/dist/collector-run.mjs +4 -4
- package/dist/{command-output-DxC0k2rk.mjs → command-output-BF5AR2dL.mjs} +1 -1
- package/dist/{config-BZhXY15H.mjs → config-BktkY_zC.mjs} +321 -15
- package/dist/{launch-BVlyQw3T.mjs → dependencies-Dw6wfQdv.mjs} +259 -256
- package/dist/{dependency-state-C56ll9hY.mjs → dependency-state-DFB41vfr.mjs} +1 -1
- package/dist/{dev-client-w_fok0Ek.mjs → dev-client-DXR_tPVY.mjs} +2 -2
- package/dist/{device-BktRGdjS.mjs → device-BK-zwyd_.mjs} +64 -33
- package/dist/{device-4RUugw5X.mjs → device-BcYeHSFu.mjs} +14 -14
- package/dist/{device-capacity-Ic-kdmEV.mjs → device-capacity-DCSvUF0l.mjs} +10 -17
- package/dist/device-host-worker.mjs +11 -13
- package/dist/{device-ios-DzpSlZyd.mjs → device-ios-BLGfXQeK.mjs} +68 -25
- package/dist/{device-lease-run-DUtkbqBQ.mjs → device-lease-run-BmvIl7bI.mjs} +5 -5
- package/dist/{device-pool-CgBHk401.mjs → device-pool-Dluix4H3.mjs} +3 -3
- package/dist/{doctor-DZgpqR6J.mjs → doctor-Bhg1ii70.mjs} +14 -14
- package/dist/{doctor-BZ6oxNum.mjs → doctor-Cp-BhzTS.mjs} +1 -1
- package/dist/{doctor-C33AzVfR.mjs → doctor-OnwP94ne.mjs} +81 -26
- package/dist/{doctor-fingerprint-zlujA1Gs.mjs → doctor-fingerprint-D3a04Mhu.mjs} +8 -2
- package/dist/doctor-fingerprint.mjs +1 -1
- package/dist/{doctor-watchman-B453A231.mjs → doctor-watchman-BStK05nt.mjs} +4 -4
- package/dist/{eas-build-CxKUNHsb.mjs → eas-build-Dsj93iM9.mjs} +2 -2
- package/dist/{eas-fallback-LMxk9Kw0.mjs → eas-fallback-FwkeqqGi.mjs} +13 -12
- package/dist/{eas-session-ledger-Ck6YXPAO.mjs → eas-session-ledger-B5vygTiD.mjs} +5 -5
- package/dist/{error-diagnostics-BkKCZq4P.mjs → error-diagnostics-BOOm9Db7.mjs} +8 -8
- package/dist/{errors-ccaPc4ox.mjs → errors-DHm_U5gv.mjs} +2 -1
- package/dist/{gc-DDWEAj0w.mjs → gc-C_79zvz4.mjs} +2 -2
- package/dist/{gc-yVKpAOKM.mjs → gc-ldgr-hXU.mjs} +74 -43
- package/dist/{guide-Bggftwc5.mjs → guide-D7K0X6KG.mjs} +374 -78
- package/dist/{hosted-android-D4dweBof.mjs → hosted-android-Bk54ej6n.mjs} +3 -3
- package/dist/{hosted-client-BBTVe3X6.mjs → hosted-client-fHO8yqzc.mjs} +5 -5
- package/dist/{hosted-ios-Sn0djzg8.mjs → hosted-ios-D55QhYaD.mjs} +1 -1
- package/dist/{hosted-logs-CYIZ5ubJ.mjs → hosted-logs-BfbmDM4M.mjs} +17 -11
- package/dist/hosted-logs-sync-B0pvmOk-.mjs +195 -0
- package/dist/{hosted-macos-CXjsUNBR.mjs → hosted-macos-CPl0OZ9h.mjs} +5 -5
- package/dist/{hosted-native-Doxbfzem.mjs → hosted-native-CpDB3-PO.mjs} +6 -7
- package/dist/{idle-shutdown-BInjLKqm.mjs → idle-shutdown-FfxL1KdG.mjs} +22 -9
- package/dist/{ios-BItP6lkn.mjs → ios-B7-lToDu.mjs} +8 -8
- package/dist/{ios-CVUFFZ6C.mjs → ios-WxpDJ5T1.mjs} +129 -14
- package/dist/{ios-device-BI38NFFH.mjs → ios-device-CsyryvpT.mjs} +1 -1
- package/dist/{ios-B1FXRCMX.mjs → ios-ftxdQbJS.mjs} +84 -51
- package/dist/{ios-project-KYqeJURj.mjs → ios-project-Ty5pHl9O.mjs} +6 -6
- package/dist/{ios-state-DlElquYD.mjs → ios-state-Cw7-WQf2.mjs} +1 -1
- package/dist/{js-swap-BvrQvXHY.mjs → js-swap-BMhXYVDS.mjs} +4 -4
- package/dist/{launch-SfzGH_s9.mjs → launch-DOp8RjDz.mjs} +32 -27
- package/dist/{logs-DXE32kyb.mjs → logs-dQDki6Tt.mjs} +9 -173
- package/dist/{logs-ovlU7m7N.mjs → logs-s1dRIG1E.mjs} +85 -36
- package/dist/{macos-B3BveDrU.mjs → macos-B0VEV3Gf.mjs} +1 -1
- package/dist/{macos-CCfhb-jT.mjs → macos-DBBPNnIA.mjs} +18 -19
- package/dist/macos-run.mjs +1 -1
- package/dist/maintenance-run.mjs +28 -11
- package/dist/{metro-Bu8LBfzS.mjs → metro-CjC10t6E.mjs} +2 -2
- package/dist/{metro-gateway-DtsOy-0P.mjs → metro-gateway-B6_PgD0L.mjs} +2 -3
- package/dist/{named-ports-BWDuU5oQ.mjs → named-ports-BG0j1X4g.mjs} +2 -2
- package/dist/{native-android-96BBizbq.mjs → native-android-CL2NGiik.mjs} +17 -17
- package/dist/{native-gradle-artifact-inputs-BcLYBZil.mjs → native-gradle-artifact-inputs-btSUulme.mjs} +3 -3
- package/dist/{native-run-BmH7U8pr.mjs → native-run-BfIDFKLH.mjs} +2 -3
- package/dist/{native-runtime-DgtJkzIa.mjs → native-runtime-Dq3RBcON.mjs} +6 -7
- package/dist/{native-xcode-inputs-irplbQb0.mjs → native-xcode-inputs-BW7H8JGu.mjs} +2 -2
- package/dist/{native-xcode-ios-BY-6hh6M.mjs → native-xcode-ios-CBXJAxfC.mjs} +18 -18
- package/dist/offload-worker.d.mts +7 -2
- package/dist/offload-worker.mjs +34 -23
- package/dist/{ownership-DxlZGDcV.mjs → ownership-BjYvMNX_.mjs} +2 -2
- package/dist/{phone-reverses-BdsdesVF.mjs → phone-reverses-lmj6kcPm.mjs} +3 -3
- package/dist/{placement-log-DUvqqsB-.mjs → placement-log-DIFPQAXp.mjs} +1 -1
- package/dist/{plan-placement-4axc0Hs7.mjs → plan-placement-IiiSQhtz.mjs} +3 -3
- package/dist/{ports-D-E_OiAO.mjs → ports-C2_w1Z0Z.mjs} +3 -3
- package/dist/prebuild-gmouvmJZ.mjs +1247 -0
- package/dist/{project-Dz-hWkb-.mjs → project-BUu6Is4k.mjs} +15 -16
- package/dist/{react-native-android-DOinxgwB.mjs → react-native-android-Cgg99REN.mjs} +48 -33
- package/dist/{react-native-build-AuCu-aAP.mjs → react-native-build-oNwqF5Wb.mjs} +8 -8
- package/dist/{react-native-doctor-2ivJUmwZ.mjs → react-native-doctor-BhA3KUte.mjs} +49 -8
- package/dist/{react-native-ios-D5zTIuH8.mjs → react-native-ios-B-nf4rjN.mjs} +40 -25
- package/dist/{recordings-CdPwYwvs.mjs → recordings-BldzVKq0.mjs} +1 -1
- package/dist/{reload-Ck9RJeSq.mjs → reload-C9OduiNc.mjs} +1 -1
- package/dist/{reload-C1TTVesC.mjs → reload-CCR7KC_l.mjs} +14 -14
- package/dist/{remote-DEZ7AOVq.mjs → remote-C8S7FlPF.mjs} +16 -7
- package/dist/{result-DqBrb12U.mjs → result-7F5hEwQJ.mjs} +17 -17
- package/dist/{run-BIwoU44q.mjs → run-BqB0v3pt.mjs} +1 -1
- package/dist/{selection-BLtvaqxc.mjs → selection-BNPBZ6T5.mjs} +157 -44
- package/dist/{server-bare-Z1ToVLPn.mjs → server-bare-A75rDIdD.mjs} +55 -3
- package/dist/{server-command-C0pmjNdG.mjs → server-command-CssKFOD7.mjs} +4 -4
- package/dist/{server-expo-Tt_hLRpy.mjs → server-expo-eQfOdydb.mjs} +8 -6
- package/dist/server-expo-wvcj5tiZ.mjs +2 -0
- package/dist/{settings-RKwY33wv.mjs → settings-CosW5X-S.mjs} +59 -61
- package/dist/{settings-kkt0vP4w.mjs → settings-OaGQF-ri.mjs} +1 -1
- package/dist/{settings-write--gj6MACV.mjs → settings-write-QjYfSrjF.mjs} +5 -5
- package/dist/settings.schema.json +71 -6
- package/dist/{simslim-CdWKT3vA.mjs → simslim-Bax1qcxu.mjs} +22 -6
- package/dist/{slot-launch-A1BgotaM.mjs → slot-launch-CYCEhfBY.mjs} +6 -6
- package/dist/{stage-ERTMh88n.mjs → stage-jKQ7CP_B.mjs} +1 -1
- package/dist/{start-Bmg_qmHi.mjs → start-C_wefNKB.mjs} +1 -1
- package/dist/{start-BKGrEhzG.mjs → start-_BdJ32cZ.mjs} +9 -10
- package/dist/{state-B1ig0Kqy.mjs → state-C1i2nMOP.mjs} +2 -3
- package/dist/{state-BfAltYJP.mjs → state-C4OdpOTF.mjs} +1 -2
- package/dist/{stats-B-ckuiUg.mjs → stats-tEpEEH-u.mjs} +4 -4
- package/dist/{status-Pw-807f0.mjs → status-B9M7x4CZ.mjs} +1 -1
- package/dist/{status-Fect2w9R.mjs → status-CRXz-Gtj.mjs} +1 -1
- package/dist/{status-DfFp6a76.mjs → status-DQrqodLj.mjs} +22 -23
- package/dist/{status-watch-XC7F-AMf.mjs → status-watch-B5wDIH_o.mjs} +4 -4
- package/dist/status-worker.mjs +1 -1
- package/dist/{stim-desktop-DS0mzR8U.mjs → stim-desktop-6Dqp-gjX.mjs} +1 -1
- package/dist/{stop-BFu7X_Do.mjs → stop-CmdNhGlC.mjs} +2 -2
- package/dist/{stop-CL1kDHds.mjs → stop-DRqQVqDJ.mjs} +74 -53
- package/dist/{stop-DhclRwOO.mjs → stop-ySNQHXMG.mjs} +4 -5
- package/dist/supervisor-run.d.mts +1 -0
- package/dist/supervisor-run.mjs +15 -16
- package/dist/{support-B3tzVhKn.mjs → support-BGSCBoib.mjs} +4 -4
- package/dist/{support-B1W-hmC2.mjs → support-CVOCp0Ft.mjs} +15 -12
- package/dist/{swiftpm-artifact-inputs-BWYPj9Sn.mjs → swiftpm-artifact-inputs-CfUzt_0Z.mjs} +1 -1
- package/dist/{swiftpm-macos-BVCP5mO4.mjs → swiftpm-macos-x6HPpl_2.mjs} +10 -10
- package/dist/toolchain-DoavrvIA.mjs +2 -0
- package/dist/toolchain-J4J8MrAr.mjs +2107 -0
- package/dist/trigger-DzJu208Q.mjs +2 -0
- package/dist/{trigger-CBMe2YLH.mjs → trigger-KVaWWNyn.mjs} +1 -1
- package/dist/{warm-progress-ol0ZypEu.mjs → warm-progress-DvhTX_eu.mjs} +3 -4
- package/dist/web-BFLueSh-.mjs +2 -0
- package/dist/{web-BH7peScT.mjs → web-Bihbf7-u.mjs} +8 -9
- package/dist/web-run.mjs +4 -4
- package/dist/{workspace-state-CeBpIZgr.mjs → workspace-state-pUg3_RRA.mjs} +45 -7
- package/dist/{workspaces-CSV2Orf4.mjs → workspaces-g2lhdBXF.mjs} +17 -17
- package/dist/{worktree-Dw8kfacb.mjs → worktree-BKuklFh_.mjs} +34 -31
- package/dist/{worktree-DEDUzO_L.mjs → worktree-Bm4cb-nU.mjs} +1 -1
- package/package.json +8 -8
- package/shim/bundle-response.cjs +53 -1
- package/shim/bundle-response.d.cts +1 -1
- package/shim/expo-metro-config.cjs +23 -1
- package/dist/created-devices-D2Aca-xu.mjs +0 -52
- package/dist/paths-DQtTgsBf.mjs +0 -42
- package/dist/prebuild-DmVCf5xb.mjs +0 -501
- package/dist/server-expo-CEntXzRw.mjs +0 -2
- package/dist/toolchain-BjgKdoEf.mjs +0 -2
- package/dist/toolchain-D3bmRMia.mjs +0 -897
- package/dist/trigger-BLsHgAGR.mjs +0 -2
- package/dist/web-BdOFlTJr.mjs +0 -2
- package/dist/xcode-DHu41qQ4.mjs +0 -910
|
@@ -1,40 +1,41 @@
|
|
|
1
1
|
import { D as ownership_claim_exports, t as getExecutor } from "./exec-VFRpu1iA.mjs";
|
|
2
|
-
import {
|
|
3
|
-
import { B as deviceSlotFileKey, E as upsertProject, H as deviceSlotPlatforms, O as withConfigLockAsync$1, W as parseDeviceSlotOption, p as getProject, q as validateDeviceSlot, u as getConcurrencyLimits } from "./config-
|
|
4
|
-
import { _ as stepTimer, f as refuseNoProject, g as stepClock, i as formatDuration, l as phaseLine } from "./command-output-
|
|
5
|
-
import { a as
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import { c as pidExists, d as resolveProjectMetro } from "./metro-Bu8LBfzS.mjs";
|
|
2
|
+
import { a as recordWorkspaceUseAsync, f as writeWorkspaceStateAsync, g as emulatorLogFile, k as workspaceLogsDir$1, r as readWorkspaceState$1 } from "./workspace-state-pUg3_RRA.mjs";
|
|
3
|
+
import { B as deviceSlotFileKey, E as upsertProject, H as deviceSlotPlatforms, O as withConfigLockAsync$1, W as parseDeviceSlotOption, p as getProject, q as validateDeviceSlot, u as getConcurrencyLimits } from "./config-BktkY_zC.mjs";
|
|
4
|
+
import { _ as stepTimer, f as refuseNoProject, g as stepClock, i as formatDuration, l as phaseLine } from "./command-output-BF5AR2dL.mjs";
|
|
5
|
+
import { K as resolveCacheProviderConfig, M as metroPortSetting, P as metroWarmupUrlSetting, R as projectSettingsContextAsync, U as remoteEasFallbackSetting, X as resolveSettings, Y as resolveProjectSettingsAsync, a as SETTING_SHAPE_REMEDY, g as deviceReclaimIdleMinutesSetting, it as tunnelModeSetting, lt as detectProviders, z as publicUrlSetting } from "./settings-CosW5X-S.mjs";
|
|
6
|
+
import { f as projectRegistry, i as findProjectRoot$1, l as projectShortcut, t as NO_PROJECT_REFUSAL, z as writeWorkspaceLaunchAsync } from "./project-BUu6Is4k.mjs";
|
|
7
|
+
import { A as listAdbDevices, Dt as configuredAndroidEmulatorApp, I as listInstalledSystemImages, Y as physicalDeviceModel, Z as probeEmulatorSerial, a as androidDeviceAbi, ct as waitForBoot, nt as resolveOwnedAvdSerialAsync, rt as resolvePhysicalDevice } from "./android-DTAcRwBC.mjs";
|
|
8
|
+
import { c as pidExists, d as resolveProjectMetro } from "./metro-CjC10t6E.mjs";
|
|
10
9
|
import { r as createNdjsonWriter } from "./ndjson-CgE_o3Dl.mjs";
|
|
11
|
-
import { En as
|
|
12
|
-
import { d as runCancellationSignal, f as withNativeBuildRun, r as cancelledFailure, u as runCancellation } from "./native-run-
|
|
13
|
-
import { L as acquireBuildSlot, z as releaseBuildSlot } from "./workspaces-
|
|
14
|
-
import { F as waitForBuild, M as acquireBuildLock, P as releaseBuildLock } from "./activity-
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
21
|
-
import { n as
|
|
22
|
-
import {
|
|
23
|
-
import { c as startDevServer } from "./start-
|
|
24
|
-
import { a as acquireRunLease, d as runLease, f as waitFlagConflict, o as leaseExpiryText, u as releaseLeaseOnAbort } from "./device-lease-run-
|
|
25
|
-
import { n as DeviceAdmissionRefusal, r as checkDeviceCapacity } from "./device-capacity-
|
|
26
|
-
import { a as resolveEasDevelopmentBuild, r as isEasBuildFailure } from "./eas-build-
|
|
27
|
-
import {
|
|
28
|
-
import {
|
|
29
|
-
import {
|
|
30
|
-
import {
|
|
31
|
-
import { a as
|
|
32
|
-
import {
|
|
33
|
-
import { a as
|
|
34
|
-
import { t as
|
|
35
|
-
import { r as finishAndroidRun } from "./launch-
|
|
10
|
+
import { An as launchAndroidApp, En as installAndroidApp, G as runFailureRecord, I as NO_BUILD_PROGRESS, J as thrownRunFailureRecord, K as startBuildProgress, Kt as ensureMetroReachable, Q as recordCapacityRefusal, Un as runProcessOperation, Ut as binOnPath, Vn as exitAfterFlush, X as readRunEstimates, Y as createRunRecorder, Yt as remoteAndroidDeps, Zt as resolveRemoteContext, dn as verifyLaunch, er as resolveEasCliBin, et as recordRunStats, hn as DEFAULT_METRO_PORT, jn as launchAndroidReleaseApp, mn as ADB_INSTALL_TIMEOUT_MS, nr as uploadRemote, q as tapBuildLog, qn as checkEasAuth, qt as ensureRemoteBootOwned, t as budgetGate, tr as resolveRemote, tt as statsProjectKey$1, un as verifyAndroidReleaseLaunch, ur as ownedSessionName } from "./budget-k2mZGvvk.mjs";
|
|
11
|
+
import { d as runCancellationSignal, f as withNativeBuildRun, r as cancelledFailure, u as runCancellation } from "./native-run-BfIDFKLH.mjs";
|
|
12
|
+
import { L as acquireBuildSlot, z as releaseBuildSlot } from "./workspaces-g2lhdBXF.mjs";
|
|
13
|
+
import { F as waitForBuild, M as acquireBuildLock, P as releaseBuildLock } from "./activity-Lnb_EoRY.mjs";
|
|
14
|
+
import { w as storedAppId } from "./build-cache-DrXNCy3T.mjs";
|
|
15
|
+
import { t as CCACHE_NOT_RUN } from "./ccache-Bx5TbxwG.mjs";
|
|
16
|
+
import { S as setRemoteLogSink } from "./client-D9CaRks-.mjs";
|
|
17
|
+
import { a as parseBuildMachineOption, l as resolveBuildPlacement } from "./selection-BNPBZ6T5.mjs";
|
|
18
|
+
import { r as hostedMetroSettings } from "./metro-gateway-B6_PgD0L.mjs";
|
|
19
|
+
import { a as writeHostedAndroidAsync, i as writeDevicePlacementAsync, t as readHostedAndroid } from "./ios-state-Cw7-WQf2.mjs";
|
|
20
|
+
import { n as prepareHostedAndroid, t as placeHostedAndroid } from "./hosted-android-Bk54ej6n.mjs";
|
|
21
|
+
import { n as verifyCollectorOwnership } from "./ownership-BjYvMNX_.mjs";
|
|
22
|
+
import { c as startDevServer } from "./start-_BdJ32cZ.mjs";
|
|
23
|
+
import { a as acquireRunLease, d as runLease, f as waitFlagConflict, o as leaseExpiryText, u as releaseLeaseOnAbort } from "./device-lease-run-BmvIl7bI.mjs";
|
|
24
|
+
import { n as DeviceAdmissionRefusal, r as checkDeviceCapacity } from "./device-capacity-DCSvUF0l.mjs";
|
|
25
|
+
import { a as resolveEasDevelopmentBuild, r as isEasBuildFailure } from "./eas-build-Dsj93iM9.mjs";
|
|
26
|
+
import { t as followHostedLaunchLogs } from "./hosted-logs-sync-B0pvmOk-.mjs";
|
|
27
|
+
import { f as settleFingerprintCheck } from "./prebuild-gmouvmJZ.mjs";
|
|
28
|
+
import { n as ensureWorkspaceStorageSafely, r as isPhysicalDeviceRequest, t as ensureDevServer } from "./native-runtime-Dq3RBcON.mjs";
|
|
29
|
+
import { n as devicePlacementRecord } from "./placement-log-DIFPQAXp.mjs";
|
|
30
|
+
import { S as pooledAndroidDevice, a as PLATFORM, b as noDeviceDiagnostic, g as dumpApkManifest, h as displayPath, o as androidBuildOptions, p as apkPackage, r as NO_DEVICE, s as androidDevClientScheme } from "./support-BGSCBoib.mjs";
|
|
31
|
+
import { t as acquireAndroidArtifact } from "./artifact-BxREhAaV.mjs";
|
|
32
|
+
import { a as persistLastBuild, c as androidDeviceSelectorRefusal, i as logPostBuildFailure, n as finishAndroidUpload, o as persistThrownBuild, s as reportAndroidResult, u as resolveAndroidRunPlan } from "./result-7F5hEwQJ.mjs";
|
|
33
|
+
import { n as automaticDevicePlacement, r as devicePlacementLine, t as checkEasFallback } from "./eas-fallback-FwkeqqGi.mjs";
|
|
34
|
+
import { i as verifyAndroidMetroRun, r as finishAndroidRun } from "./launch-DOp8RjDz.mjs";
|
|
35
|
+
import { a as AvdRecoveryError, i as AvdBootError, n as ensureBooted, o as warmMetro, r as ensureOwnedDevice, t as didSetUpDevice } from "./device-BK-zwyd_.mjs";
|
|
36
|
+
import { t as selectFromPool } from "./device-pool-Dluix4H3.mjs";
|
|
36
37
|
import { t as unsupportedPlan } from "./project-plan-BPwbLwQu.mjs";
|
|
37
|
-
import { a as refusePlan, i as printPlan, n as planFlagRefusal } from "./build-plan-
|
|
38
|
+
import { a as refusePlan, i as printPlan, n as planFlagRefusal } from "./build-plan-DrMMdayj.mjs";
|
|
38
39
|
import { basename, join } from "node:path";
|
|
39
40
|
import { workspaceId } from "@stim-cli/core";
|
|
40
41
|
import { hostedAndroidStatus, parseMachine } from "@stim-cli/core/state";
|
|
@@ -181,9 +182,10 @@ async function selectAndroidPlacement({ target: selected, automatic = automaticD
|
|
|
181
182
|
}
|
|
182
183
|
//#endregion
|
|
183
184
|
//#region src/commands/android/hosted.ts
|
|
184
|
-
async function finishHostedAndroidRun({ target, artifact, root, slot = "default", release, appMode = release ? "release" : "development", isExpo, metroPort, logsDir, selectors, place, writePlacement, verifyLaunch: verify, writeLaunch, readApkPackage, resolveDevClientScheme, now, started, startedAt, fail, phase, enterPhase, out, recordBuild, ...report }) {
|
|
185
|
+
async function finishHostedAndroidRun({ target, artifact, root, slot = "default", release, appMode = release ? "release" : "development", isExpo, metroPort, logsDir, selectors, place, writePlacement, verifyLaunch: verify, followLogs, writeLaunch, readApkPackage, resolveDevClientScheme, now, started, startedAt, fail, phase, enterPhase, enterActivity, out, recordBuild, ...report }) {
|
|
185
186
|
const packageName = artifact.androidPackage ?? await readApkPackage(artifact.apkPath);
|
|
186
187
|
if (!artifact.apkPath || !packageName) return fail("STIM_INSTALL_FAILED", "The built APK has no package identity.");
|
|
188
|
+
const devClientScheme = appMode === "development" && isExpo ? await resolveDevClientScheme(root, artifact.apkPath) ?? void 0 : void 0;
|
|
187
189
|
const launchedAt = now();
|
|
188
190
|
try {
|
|
189
191
|
const run = await place(target, {
|
|
@@ -196,7 +198,7 @@ async function finishHostedAndroidRun({ target, artifact, root, slot = "default"
|
|
|
196
198
|
...appMode === "process" ? { mode: appMode } : {},
|
|
197
199
|
metroPort,
|
|
198
200
|
selectors,
|
|
199
|
-
...appMode === "development" && isExpo ? { devClientScheme
|
|
201
|
+
...appMode === "development" && isExpo ? { devClientScheme } : {},
|
|
200
202
|
reserved: (placement) => writePlacement(root, slot, placement),
|
|
201
203
|
note: out,
|
|
202
204
|
enterPhase
|
|
@@ -211,19 +213,37 @@ async function finishHostedAndroidRun({ target, artifact, root, slot = "default"
|
|
|
211
213
|
launchedAt: new Date(launchedAt).toISOString()
|
|
212
214
|
}, slot);
|
|
213
215
|
let launched = run.launched;
|
|
216
|
+
let launchWarning;
|
|
214
217
|
if (appMode === "development") {
|
|
215
|
-
const
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
218
|
+
const hostedLogs = followLogs(root, slot, "android", launchedAt);
|
|
219
|
+
let verification;
|
|
220
|
+
try {
|
|
221
|
+
verification = await verifyAndroidMetroRun({
|
|
222
|
+
root,
|
|
223
|
+
slot,
|
|
224
|
+
remoteDevice: false,
|
|
225
|
+
verifyLaunched: verify,
|
|
226
|
+
serial: run.placement.device?.serial ?? "",
|
|
227
|
+
androidPackage: packageName,
|
|
228
|
+
metroCheck: report.metroCheck,
|
|
229
|
+
logsDir: logsDir ?? "",
|
|
230
|
+
launchedAt,
|
|
231
|
+
metroPort,
|
|
232
|
+
isExpo,
|
|
233
|
+
physical: false,
|
|
234
|
+
device: {},
|
|
235
|
+
scheme: devClientScheme,
|
|
236
|
+
phase,
|
|
237
|
+
enterActivity,
|
|
238
|
+
hostedLogs,
|
|
239
|
+
hostedRunCommand: `stim android --remote ${run.placement.selected}${slot === "default" ? "" : ` --slot ${slot}`}`
|
|
240
|
+
});
|
|
241
|
+
} finally {
|
|
242
|
+
hostedLogs.stop();
|
|
243
|
+
}
|
|
244
|
+
if (verification.state === "fatal") return fail("STIM_LAUNCH_FAILED", "The app failed its launch readiness check.", `Read the launch error above or run \`stim logs --errors\`. The full timeline is in ${logsDir}.`, { lastBuildStatus: true });
|
|
245
|
+
launched = verification.state === true ? true : verification.state === "bundling" ? "bundling" : "unverified";
|
|
246
|
+
launchWarning = verification.warning;
|
|
227
247
|
}
|
|
228
248
|
if (launched === "unverified") out(`Launch on ${target.host.machine} is unverified; check the hosted app, then retry stim android --remote ${target.host.machine}.`);
|
|
229
249
|
const host = hostedAndroidStatus(run.placement);
|
|
@@ -240,6 +260,7 @@ async function finishHostedAndroidRun({ target, artifact, root, slot = "default"
|
|
|
240
260
|
});
|
|
241
261
|
await finishAndroidUpload(artifact.uploadPending, artifact.remote, phase);
|
|
242
262
|
await artifact.providerUpload;
|
|
263
|
+
await settleFingerprintCheck(artifact.fingerprintCheck, "android", (line) => phase("fingerprint", chalk.yellow(line)), (entry) => report.writer.write(entry));
|
|
243
264
|
return {
|
|
244
265
|
ok: true,
|
|
245
266
|
facts: reportAndroidResult({
|
|
@@ -260,6 +281,7 @@ async function finishHostedAndroidRun({ target, artifact, root, slot = "default"
|
|
|
260
281
|
remote: artifact.remote,
|
|
261
282
|
providerName: artifact.providerName,
|
|
262
283
|
launchState: launched,
|
|
284
|
+
launchWarning,
|
|
263
285
|
launched: {},
|
|
264
286
|
ccache: artifact.ccache,
|
|
265
287
|
durationMs: now() - started
|
|
@@ -371,7 +393,7 @@ function runAndroidOperation(context, root, opts = {}) {
|
|
|
371
393
|
}
|
|
372
394
|
}, { write: (line) => context.output("stderr", `${chalk.dim(phaseLine("lock", line))}\n`) });
|
|
373
395
|
}
|
|
374
|
-
function resolveRunAndroidOptions({ context, root, json = false, remoteDevice: commandRemoteBackend = null, resolveSettingsFor = resolveSettings, resolveRemoteDeviceContext = resolveRemoteContext, remoteDeviceDeps: makeRemoteDeviceDeps = remoteAndroidDeps, resolveEasBin = resolveEasCliBin, ensureMetroReachable: ensureRemoteMetro = ensureMetroReachable, ensureRemoteBootOwned: ensureRemoteOwned = ensureRemoteBootOwned, detectRemoteProviders = detectProviders, metroCheck = true, useBuildCache = true, easProfile, resolveEasDevelopmentBuild: resolveEasBuild = resolveEasDevelopmentBuild, variant: variantFlag = null, systemImage: systemImageFlag = null, deviceProfile: deviceProfileFlag, device: deviceFlag = null, wait: waitFlag = void 0, waitConflict = false, acquireLease = acquireRunLease, makeRunLease = runLease, selectPool = selectFromPool, onLeaseSignal = releaseLeaseOnAbort, listDevices = listAdbDevices, deviceModel = physicalDeviceModel, deviceAbi = androidDeviceAbi, isEmulatorDevice = probeEmulatorSerial, readApkPackage = async (apkPath) => apkPackage(await dumpApkManifest(apkPath, { context })), getLimits = getConcurrencyLimits, checkCapacity = checkDeviceCapacity, acquireSlot = acquireBuildSlot, releaseSlot = releaseBuildSlot, ensureDevice = ensureOwnedDevice, listSystemImages = listInstalledSystemImages, listDeviceProfiles, ensureDeviceBooted = ensureBooted, resolveAvdSerial = resolveOwnedAvdSerialAsync, waitForDeviceBoot = waitForBoot, dataFreeBytes, trimCaches, wipeDevice, resolveMetro = resolveProjectMetro, warmMetro: prewarmMetro = warmMetro, startServer = startDevServer, readState = readWorkspaceState$1, pidAlive = pidExists, verifyCollector = verifyCollectorOwnership, verifyLaunched = verifyLaunch, ensureStorage = ensureWorkspaceStorageSafely, acquireLock = acquireBuildLock, releaseLock = releaseBuildLock, waitForBuild: waitForBuild$1 = waitForBuild, easAuth = checkEasAuth, resolveRemoteBuild = resolveRemote, uploadRemoteBuild = uploadRemote, resolveCacheProvider = resolveCacheProviderConfig, loadCacheProviderModule = loadCacheProvider, install = installAndroidApp, launch = launchAndroidApp, launchRelease = launchAndroidReleaseApp, verifyReleaseLaunched = verifyAndroidReleaseLaunch, resolveDevClientScheme = (projectRoot, apkPath, options) => androidDevClientScheme(projectRoot, apkPath, {
|
|
396
|
+
function resolveRunAndroidOptions({ context, root, json = false, remoteDevice: commandRemoteBackend = null, resolveSettingsFor = resolveSettings, resolveRemoteDeviceContext = resolveRemoteContext, remoteDeviceDeps: makeRemoteDeviceDeps = remoteAndroidDeps, resolveEasBin = resolveEasCliBin, ensureMetroReachable: ensureRemoteMetro = ensureMetroReachable, ensureRemoteBootOwned: ensureRemoteOwned = ensureRemoteBootOwned, detectRemoteProviders = detectProviders, metroCheck = true, useBuildCache = true, easProfile, resolveEasDevelopmentBuild: resolveEasBuild = resolveEasDevelopmentBuild, variant: variantFlag = null, systemImage: systemImageFlag = null, deviceProfile: deviceProfileFlag, device: deviceFlag = null, wait: waitFlag = void 0, waitConflict = false, acquireLease = acquireRunLease, makeRunLease = runLease, selectPool = selectFromPool, onLeaseSignal = releaseLeaseOnAbort, listDevices = listAdbDevices, deviceModel = physicalDeviceModel, deviceAbi = androidDeviceAbi, isEmulatorDevice = probeEmulatorSerial, readApkPackage = async (apkPath) => apkPackage(await dumpApkManifest(apkPath, { context })), getLimits = getConcurrencyLimits, checkCapacity = checkDeviceCapacity, acquireSlot = acquireBuildSlot, releaseSlot = releaseBuildSlot, ensureDevice = ensureOwnedDevice, listSystemImages = listInstalledSystemImages, listDeviceProfiles, ensureDeviceBooted = ensureBooted, resolveAvdSerial = resolveOwnedAvdSerialAsync, waitForDeviceBoot = waitForBoot, dataFreeBytes, trimCaches, wipeDevice, resolveMetro = resolveProjectMetro, warmMetro: prewarmMetro = warmMetro, startServer = startDevServer, readState = readWorkspaceState$1, pidAlive = pidExists, verifyCollector = verifyCollectorOwnership, verifyLaunched = verifyLaunch, ensureStorage = ensureWorkspaceStorageSafely, acquireLock = acquireBuildLock, releaseLock = releaseBuildLock, waitForBuild: waitForBuild$1 = waitForBuild, easAuth = checkEasAuth, resolveRemoteBuild = resolveRemote, uploadRemoteBuild = uploadRemote, resolveCacheProvider = resolveCacheProviderConfig, loadCacheProviderModule = loadCacheProvider, storedAppId: storedAppId$1 = storedAppId, install = installAndroidApp, launch = launchAndroidApp, launchRelease = launchAndroidReleaseApp, verifyReleaseLaunched = verifyAndroidReleaseLaunch, resolveDevClientScheme = (projectRoot, apkPath, options) => androidDevClientScheme(projectRoot, apkPath, {
|
|
375
397
|
...options,
|
|
376
398
|
context
|
|
377
399
|
}), spawn = (cmd, args, opts) => getExecutor().spawn(cmd, args, opts), kill = (pid, signal) => process.kill(pid, signal), createWriter = createNdjsonWriter, writeLaunch = writeWorkspaceLaunchAsync, writeState = writeWorkspaceStateAsync, recordBuild, recordStats = recordRunStats, recordCapacityRefusal: recordRefusal, readEstimates = readRunEstimates, now = Date.now, out = (line) => context ? context.output("stderr", `${line}\n`) : console.error(line), emit = (line) => context ? context.output("stdout", `${line}\n`) : console.log(line) } = {}) {
|
|
@@ -434,6 +456,7 @@ function resolveRunAndroidOptions({ context, root, json = false, remoteDevice: c
|
|
|
434
456
|
uploadRemoteBuild,
|
|
435
457
|
resolveCacheProvider,
|
|
436
458
|
loadCacheProviderModule,
|
|
459
|
+
storedAppId: storedAppId$1,
|
|
437
460
|
install,
|
|
438
461
|
launch,
|
|
439
462
|
launchRelease,
|
|
@@ -512,7 +535,7 @@ function avdSetupFailure(error, root, logFile) {
|
|
|
512
535
|
}
|
|
513
536
|
async function runAndroid(options = {}) {
|
|
514
537
|
const { context } = options;
|
|
515
|
-
let { root, json, commandRemoteBackend, resolveSettingsFor, resolveRemoteDeviceContext, makeRemoteDeviceDeps, resolveEasBin, ensureRemoteMetro, ensureRemoteOwned, detectRemoteProviders, metroCheck, useBuildCache: requestedBuildCache, easProfile, resolveEasBuild, variantFlag, systemImageFlag, deviceProfileFlag, deviceFlag, waitFlag, waitConflict, acquireLease, makeRunLease, selectPool, onLeaseSignal, listDevices, deviceModel, deviceAbi, isEmulatorDevice, readApkPackage, getLimits, checkCapacity, acquireSlot, releaseSlot, ensureDevice, listSystemImages, listDeviceProfiles, ensureDeviceBooted, resolveAvdSerial, waitForDeviceBoot, dataFreeBytes, trimCaches, wipeDevice, resolveMetro, prewarmMetro, startServer, readState, pidAlive, verifyCollector, verifyLaunched, ensureStorage, acquireLock, releaseLock, waitForBuild, easAuth, resolveRemoteBuild, uploadRemoteBuild, resolveCacheProvider, loadCacheProviderModule, install, launch, launchRelease, verifyReleaseLaunched, resolveDevClientScheme, spawn, kill, createWriter, writeLaunch, writeState, recordBuild, recordStats, recordCapacityRefusal: recordRefusal = recordCapacityRefusal, readEstimates, now, out, emit } = androidSlotOptions(options);
|
|
538
|
+
let { root, json, commandRemoteBackend, resolveSettingsFor, resolveRemoteDeviceContext, makeRemoteDeviceDeps, resolveEasBin, ensureRemoteMetro, ensureRemoteOwned, detectRemoteProviders, metroCheck, useBuildCache: requestedBuildCache, easProfile, resolveEasBuild, variantFlag, systemImageFlag, deviceProfileFlag, deviceFlag, waitFlag, waitConflict, acquireLease, makeRunLease, selectPool, onLeaseSignal, listDevices, deviceModel, deviceAbi, isEmulatorDevice, readApkPackage, getLimits, checkCapacity, acquireSlot, releaseSlot, ensureDevice, listSystemImages, listDeviceProfiles, ensureDeviceBooted, resolveAvdSerial, waitForDeviceBoot, dataFreeBytes, trimCaches, wipeDevice, resolveMetro, prewarmMetro, startServer, readState, pidAlive, verifyCollector, verifyLaunched, ensureStorage, acquireLock, releaseLock, waitForBuild, easAuth, resolveRemoteBuild, uploadRemoteBuild, resolveCacheProvider, loadCacheProviderModule, storedAppId, install, launch, launchRelease, verifyReleaseLaunched, resolveDevClientScheme, spawn, kill, createWriter, writeLaunch, writeState, recordBuild, recordStats, recordCapacityRefusal: recordRefusal = recordCapacityRefusal, readEstimates, now, out, emit } = androidSlotOptions(options);
|
|
516
539
|
const progress = options.progress ?? NO_BUILD_PROGRESS;
|
|
517
540
|
const slot = validateDeviceSlot(options.slot);
|
|
518
541
|
const started = now();
|
|
@@ -1054,7 +1077,9 @@ async function runAndroid(options = {}) {
|
|
|
1054
1077
|
platform: "android",
|
|
1055
1078
|
isExpo,
|
|
1056
1079
|
appId: androidPackage,
|
|
1057
|
-
bundleUrl: metroWarmupUrlSetting(settings, "android")
|
|
1080
|
+
bundleUrl: metroWarmupUrlSetting(settings, "android"),
|
|
1081
|
+
logsDir,
|
|
1082
|
+
root
|
|
1058
1083
|
});
|
|
1059
1084
|
const acquiredArtifact = await acquireAndroidArtifact({
|
|
1060
1085
|
context,
|
|
@@ -1109,6 +1134,7 @@ async function runAndroid(options = {}) {
|
|
|
1109
1134
|
resolveRemoteBuild,
|
|
1110
1135
|
uploadRemoteBuild,
|
|
1111
1136
|
loadCacheProviderModule,
|
|
1137
|
+
storedAppId,
|
|
1112
1138
|
acquireSlot,
|
|
1113
1139
|
releaseSlot,
|
|
1114
1140
|
now
|
|
@@ -1140,6 +1166,7 @@ async function runAndroid(options = {}) {
|
|
|
1140
1166
|
place: options.placeHostedAndroid ?? placeHostedAndroid,
|
|
1141
1167
|
writePlacement: options.writeHostedAndroid ?? writeHostedAndroidAsync,
|
|
1142
1168
|
verifyLaunch: verifyLaunched,
|
|
1169
|
+
followLogs: options.followHostedLaunchLogs ?? followHostedLaunchLogs,
|
|
1143
1170
|
writeLaunch,
|
|
1144
1171
|
readApkPackage,
|
|
1145
1172
|
resolveDevClientScheme,
|
|
@@ -1150,6 +1177,7 @@ async function runAndroid(options = {}) {
|
|
|
1150
1177
|
fail,
|
|
1151
1178
|
phase,
|
|
1152
1179
|
enterPhase: progress.step,
|
|
1180
|
+
enterActivity: progress.activity,
|
|
1153
1181
|
out,
|
|
1154
1182
|
json,
|
|
1155
1183
|
useBuildCache,
|
|
@@ -1258,6 +1286,7 @@ async function runAndroid(options = {}) {
|
|
|
1258
1286
|
waitedForBuild: artifact.waitedForBuild,
|
|
1259
1287
|
ccache: ccacheActivity,
|
|
1260
1288
|
uploadPending: artifact.uploadPending,
|
|
1289
|
+
fingerprintCheck: artifact.fingerprintCheck,
|
|
1261
1290
|
providerUpload: artifact.providerUpload,
|
|
1262
1291
|
providerName: artifact.providerName,
|
|
1263
1292
|
remote: artifact.remote,
|
|
@@ -1267,7 +1296,7 @@ async function runAndroid(options = {}) {
|
|
|
1267
1296
|
writer,
|
|
1268
1297
|
phase,
|
|
1269
1298
|
fail,
|
|
1270
|
-
readApkPackage,
|
|
1299
|
+
readApkPackage: (path) => artifact.apkPackage ?? readApkPackage(path),
|
|
1271
1300
|
readProjectPackage: async () => (await integration.appIds()).androidPackage,
|
|
1272
1301
|
packageRemedy: integration.packageRemedy,
|
|
1273
1302
|
install,
|
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
import { D as ownership_claim_exports, S as process_identity_exports, l as WorkspaceProcessCleanupError, m as declareSpawnsOn, o as cancellableSleep, t as getExecutor, v as stopDeclaringSpawnsOn } from "./exec-VFRpu1iA.mjs";
|
|
2
|
-
import {
|
|
2
|
+
import { M as withDirLock$1, N as withDirLockAsync$1 } from "./workspace-state-pUg3_RRA.mjs";
|
|
3
|
+
import { C as saveConfig, D as withConfigLock$1, G as projectDeviceSlots, H as deviceSlotPlatforms, K as removeSlotDevice, O as withConfigLockAsync$1, _ as loadConfig$1, c as ensureConfig, d as getConfigDir, f as getConfigPath$1, z as assignSlotDevice } from "./config-BktkY_zC.mjs";
|
|
3
4
|
import { n as runOperationFileQuiet, t as runOperationFile } from "./operation-exec-CUZifp6Z.mjs";
|
|
4
|
-
import { c as androidDataPartitionSizeBytes } from "./settings-
|
|
5
|
-
import { i as stimDesktopInstalledAsync, n as settingDefault, t as STIM_DESKTOP_OPEN_OPTIONS } from "./stim-desktop-
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
5
|
+
import { c as androidDataPartitionSizeBytes } from "./settings-CosW5X-S.mjs";
|
|
6
|
+
import { i as stimDesktopInstalledAsync, n as settingDefault, t as STIM_DESKTOP_OPEN_OPTIONS } from "./stim-desktop-6Dqp-gjX.mjs";
|
|
7
|
+
import { c as pidExists, p as signalProcessTreeAsync } from "./metro-CjC10t6E.mjs";
|
|
8
|
+
import { renameSync, rmSync, writeFileSync } from "node:fs";
|
|
8
9
|
import { isDeepStrictEqual } from "node:util";
|
|
9
10
|
import { join } from "node:path";
|
|
10
|
-
import { ambientEnv, ambientWrite } from "@stim-cli/core";
|
|
11
|
-
import { ANDROID_EMULATOR_APPS, getParkedMax, isJsonObject, loadConfig, settingDefinition } from "@stim-cli/core/state";
|
|
11
|
+
import { ambientEnv, ambientWrite, ensurePrivateDir } from "@stim-cli/core";
|
|
12
|
+
import { ANDROID_EMULATOR_APPS, createdDevicesFile, createdDevicesLock, getParkedMax, isJsonObject, loadConfig, readCreatedDevices, readCreatedDevices as readCreatedDevices$1, settingDefinition } from "@stim-cli/core/state";
|
|
12
13
|
import { dirname as dirname$1, isAbsolute as isAbsolute$1, join as join$1, resolve as resolve$1 } from "path";
|
|
13
|
-
import { existsSync, lstatSync, mkdirSync, openSync, readFileSync, readdirSync, realpathSync, renameSync, rmSync, statSync, writeFileSync } from "fs";
|
|
14
|
+
import { existsSync as existsSync$1, lstatSync as lstatSync$1, mkdirSync as mkdirSync$1, openSync as openSync$1, readFileSync as readFileSync$1, readdirSync as readdirSync$1, realpathSync as realpathSync$1, renameSync as renameSync$1, rmSync as rmSync$1, statSync as statSync$1, writeFileSync as writeFileSync$1 } from "fs";
|
|
14
15
|
import { rm } from "node:fs/promises";
|
|
15
16
|
import { homedir, tmpdir } from "os";
|
|
16
17
|
//#region src/devices/android-emulator-viewer.ts
|
|
@@ -34,6 +35,52 @@ async function openEmulatorInStimDesktop(serial) {
|
|
|
34
35
|
], STIM_DESKTOP_OPEN_OPTIONS);
|
|
35
36
|
}
|
|
36
37
|
//#endregion
|
|
38
|
+
//#region src/devices/created-devices.ts
|
|
39
|
+
function update(platform, change) {
|
|
40
|
+
const dir = getConfigDir();
|
|
41
|
+
withDirLock$1(createdDevicesLock(), () => {
|
|
42
|
+
const current = readCreatedDevices();
|
|
43
|
+
const entries = new Set(current[platform]);
|
|
44
|
+
if (!change(entries)) return;
|
|
45
|
+
const next = {
|
|
46
|
+
version: 1,
|
|
47
|
+
ios: [...current.ios],
|
|
48
|
+
android: [...current.android],
|
|
49
|
+
web: [...current.web],
|
|
50
|
+
[platform]: [...entries]
|
|
51
|
+
};
|
|
52
|
+
const file = createdDevicesFile();
|
|
53
|
+
const tmp = `${file}.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`;
|
|
54
|
+
writeFileSync(tmp, `${JSON.stringify(next, null, 2)}\n`, { mode: 384 });
|
|
55
|
+
try {
|
|
56
|
+
renameSync(tmp, file);
|
|
57
|
+
} catch (error) {
|
|
58
|
+
rmSync(tmp, { force: true });
|
|
59
|
+
throw error;
|
|
60
|
+
}
|
|
61
|
+
}, { ensureParent: () => ensurePrivateDir(dir) });
|
|
62
|
+
}
|
|
63
|
+
function recordCreatedDevice(platform, id) {
|
|
64
|
+
update(platform, (entries) => entries.size !== entries.add(id).size);
|
|
65
|
+
}
|
|
66
|
+
function forgetCreatedDevice(platform, id) {
|
|
67
|
+
update(platform, (entries) => entries.delete(id));
|
|
68
|
+
}
|
|
69
|
+
/** Waits asynchronously for the ledger lock, then records the device. */
|
|
70
|
+
function recordCreatedDeviceAsync(platform, id) {
|
|
71
|
+
return withDirLockAsync$1(createdDevicesLock(), () => recordCreatedDevice(platform, id), { ensureParent: () => ensurePrivateDir(getConfigDir()) });
|
|
72
|
+
}
|
|
73
|
+
/** Waits asynchronously for the ledger lock, then atomically forgets the device. The synchronous transaction decides whether to commit the removal; cancellation stops admission. */
|
|
74
|
+
function forgetCreatedDeviceAsync(platform, id, signal, transaction = (forget) => {
|
|
75
|
+
forget();
|
|
76
|
+
return true;
|
|
77
|
+
}) {
|
|
78
|
+
return withDirLockAsync$1(createdDevicesLock(), () => transaction(() => forgetCreatedDevice(platform, id)), {
|
|
79
|
+
ensureParent: () => ensurePrivateDir(getConfigDir()),
|
|
80
|
+
signal
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
//#endregion
|
|
37
84
|
//#region src/devices/sim-pool.ts
|
|
38
85
|
const POOL_SETTING_REMEDY = "Run `stim guide settings` for the device pool bounds and where it can be set.";
|
|
39
86
|
function parkedMaxSetting(platform, options = {}) {
|
|
@@ -307,7 +354,7 @@ function androidToolPath(tool, platform = process.platform, env = ambientEnv())
|
|
|
307
354
|
const bare = location.at(-1);
|
|
308
355
|
const name = platform === "win32" ? `${bare}${WINDOWS_SDK_TOOL_EXTENSIONS[tool]}` : bare;
|
|
309
356
|
const abs = join$1(androidHome(env), ...location.slice(0, -1), name);
|
|
310
|
-
return existsSync(abs) ? abs : bare;
|
|
357
|
+
return existsSync$1(abs) ? abs : bare;
|
|
311
358
|
}
|
|
312
359
|
const WINDOWS_BUILD_TOOL_EXTENSIONS = { apksigner: ".bat" };
|
|
313
360
|
function androidBuildToolName(tool, platform = process.platform) {
|
|
@@ -329,7 +376,7 @@ function buildToolsMajor(version) {
|
|
|
329
376
|
const major = Number(String(version ?? "").split(/[.-]/)[0]);
|
|
330
377
|
return Number.isFinite(major) ? major : 0;
|
|
331
378
|
}
|
|
332
|
-
function findBuildTool(tools, { home = androidHome(), readDir = readdirSync, exists = existsSync, platform = process.platform } = {}) {
|
|
379
|
+
function findBuildTool(tools, { home = androidHome(), readDir = readdirSync$1, exists = existsSync$1, platform = process.platform } = {}) {
|
|
333
380
|
const root = join$1(home, "build-tools");
|
|
334
381
|
let versions = [];
|
|
335
382
|
try {
|
|
@@ -358,7 +405,7 @@ function listInstalledSystemImages(onUnreadable, env = ambientEnv()) {
|
|
|
358
405
|
const images = [];
|
|
359
406
|
const list = (dir) => {
|
|
360
407
|
try {
|
|
361
|
-
return readdirSync(dir);
|
|
408
|
+
return readdirSync$1(dir);
|
|
362
409
|
} catch (error) {
|
|
363
410
|
const code = error.code;
|
|
364
411
|
if (code !== "ENOENT" && code !== "ENOTDIR") onUnreadable?.(error);
|
|
@@ -397,7 +444,7 @@ function profileNeedsFoldFeature(profile) {
|
|
|
397
444
|
}
|
|
398
445
|
function systemImageSupportsFold(pkg, home = androidHome()) {
|
|
399
446
|
try {
|
|
400
|
-
const ini = readFileSync(join$1(home, ...pkg.split(";"), "advancedFeatures.ini"), "utf8");
|
|
447
|
+
const ini = readFileSync$1(join$1(home, ...pkg.split(";"), "advancedFeatures.ini"), "utf8");
|
|
401
448
|
return /^\s*SupportPixelFold\s*=\s*on\s*$/im.test(ini);
|
|
402
449
|
} catch {
|
|
403
450
|
return false;
|
|
@@ -425,7 +472,7 @@ async function createOwnedAvd(label, { systemImage, deviceProfile = DEFAULT_AVD_
|
|
|
425
472
|
let env = ambientEnv();
|
|
426
473
|
if (!env.ANDROID_AVD_HOME) {
|
|
427
474
|
const root = avdLookupRoots(env, (process.platform === "win32" ? env.USERPROFILE : env.HOME) || homedir())[0];
|
|
428
|
-
mkdirSync(root, { recursive: true });
|
|
475
|
+
mkdirSync$1(root, { recursive: true });
|
|
429
476
|
env = {
|
|
430
477
|
...env,
|
|
431
478
|
ANDROID_AVD_HOME: root
|
|
@@ -479,7 +526,7 @@ function avdIniValue(configIni, key) {
|
|
|
479
526
|
}
|
|
480
527
|
return null;
|
|
481
528
|
}
|
|
482
|
-
function ownedAvdSystemImage(avdName, { avdDirectory = ownedAvdDirectory, readFile = (path) => readFileSync(path, "utf8") } = {}) {
|
|
529
|
+
function ownedAvdSystemImage(avdName, { avdDirectory = ownedAvdDirectory, readFile = (path) => readFileSync$1(path, "utf8") } = {}) {
|
|
483
530
|
const directory = avdDirectory(avdName);
|
|
484
531
|
if (!directory) return null;
|
|
485
532
|
try {
|
|
@@ -516,7 +563,7 @@ function sanitizeAvdLabel(label) {
|
|
|
516
563
|
function avdConfigIni(avdName, directory = ownedAvdDirectory(avdName)) {
|
|
517
564
|
if (!directory) return null;
|
|
518
565
|
try {
|
|
519
|
-
return readFileSync(join$1(directory, "config.ini"), "utf8");
|
|
566
|
+
return readFileSync$1(join$1(directory, "config.ini"), "utf8");
|
|
520
567
|
} catch {
|
|
521
568
|
return null;
|
|
522
569
|
}
|
|
@@ -779,7 +826,7 @@ function avdStorageRoots(env = ambientEnv()) {
|
|
|
779
826
|
}
|
|
780
827
|
function avdPathExists(path) {
|
|
781
828
|
try {
|
|
782
|
-
lstatSync(path);
|
|
829
|
+
lstatSync$1(path);
|
|
783
830
|
return true;
|
|
784
831
|
} catch (error) {
|
|
785
832
|
if (error.code === "ENOENT") return false;
|
|
@@ -797,7 +844,7 @@ function avdNameAbsent(avdName, roots = avdStorageRoots()) {
|
|
|
797
844
|
}
|
|
798
845
|
function isDirectoryPath(path) {
|
|
799
846
|
try {
|
|
800
|
-
return statSync(path).isDirectory();
|
|
847
|
+
return statSync$1(path).isDirectory();
|
|
801
848
|
} catch (error) {
|
|
802
849
|
if (error.code === "ENOENT") return false;
|
|
803
850
|
throw error;
|
|
@@ -807,17 +854,17 @@ function listOrphanedAvdDirectories(avdName) {
|
|
|
807
854
|
const roots = avdStorageRoots();
|
|
808
855
|
const stores = roots.filter(avdPathExists).map((root) => ({
|
|
809
856
|
root,
|
|
810
|
-
canonicalRoot: realpathSync(root),
|
|
811
|
-
names: readdirSync(root)
|
|
857
|
+
canonicalRoot: realpathSync$1(root),
|
|
858
|
+
names: readdirSync$1(root)
|
|
812
859
|
}));
|
|
813
860
|
const registered = /* @__PURE__ */ new Set();
|
|
814
861
|
for (const { root, canonicalRoot, names } of stores) for (const name of names.filter((entry) => entry.endsWith(".ini"))) {
|
|
815
862
|
const path = join$1(root, name);
|
|
816
|
-
const ini = readFileSync(path, "utf8");
|
|
863
|
+
const ini = readFileSync$1(path, "utf8");
|
|
817
864
|
const targets = /* @__PURE__ */ new Set([...avdIniPaths(root, ini), ...avdIniPaths(canonicalRoot, ini)]);
|
|
818
865
|
if (!targets.size) throw new Error(`Cannot verify AVD registration at ${path}; its data was kept.`);
|
|
819
866
|
for (const target of targets) try {
|
|
820
|
-
registered.add(realpathSync(target));
|
|
867
|
+
registered.add(realpathSync$1(target));
|
|
821
868
|
} catch (error) {
|
|
822
869
|
const code = error.code;
|
|
823
870
|
if (code !== "ENOENT" && code !== "ENOTDIR") throw error;
|
|
@@ -832,8 +879,8 @@ function listOrphanedAvdDirectories(avdName) {
|
|
|
832
879
|
if (roots.some((candidate) => avdPathExists(join$1(candidate, `${name}.ini`)))) continue;
|
|
833
880
|
const directory = join$1(canonicalRoot, entry);
|
|
834
881
|
if (registered.has(directory) || !avdPathExists(directory)) continue;
|
|
835
|
-
const stat = lstatSync(directory);
|
|
836
|
-
if (!stat.isDirectory() || stat.isSymbolicLink() || realpathSync(directory) !== directory) throw new Error(`Cannot verify AVD data at ${directory}; it was kept.`);
|
|
882
|
+
const stat = lstatSync$1(directory);
|
|
883
|
+
if (!stat.isDirectory() || stat.isSymbolicLink() || realpathSync$1(directory) !== directory) throw new Error(`Cannot verify AVD data at ${directory}; it was kept.`);
|
|
837
884
|
if (!orphaned.some((candidate) => candidate.directory === directory)) orphaned.push({
|
|
838
885
|
name,
|
|
839
886
|
directory,
|
|
@@ -852,7 +899,7 @@ function avdLookupRoots(env, home) {
|
|
|
852
899
|
];
|
|
853
900
|
return [...new Set(roots.filter((value) => Boolean(value)))];
|
|
854
901
|
}
|
|
855
|
-
function ownedAvdDirectory(avdName, { env = ambientEnv(), home = (process.platform === "win32" ? env.USERPROFILE : env.HOME) || homedir(), readFile = (path) => readFileSync(path, "utf8"), realpath = realpathSync, isDirectory = (path) => statSync(path).isDirectory() } = {}) {
|
|
902
|
+
function ownedAvdDirectory(avdName, { env = ambientEnv(), home = (process.platform === "win32" ? env.USERPROFILE : env.HOME) || homedir(), readFile = (path) => readFileSync$1(path, "utf8"), realpath = realpathSync$1, isDirectory = (path) => statSync$1(path).isDirectory() } = {}) {
|
|
856
903
|
if (!/^stim-[A-Za-z0-9._-]+$/.test(avdName)) return null;
|
|
857
904
|
for (const root of avdLookupRoots(env, home)) {
|
|
858
905
|
let ini;
|
|
@@ -910,10 +957,10 @@ function withAvdConfigOverrides(contents, overrides) {
|
|
|
910
957
|
return updated.join(newline) + (trailingNewline ? newline : "");
|
|
911
958
|
}
|
|
912
959
|
let avdConfigWriteSequence = 0;
|
|
913
|
-
function configureNewOwnedAvd(avdName, { dataPartitionSizeGb, avdConfig = {} }, { avdDirectory = ownedAvdDirectory, readFile = (path) => readFileSync(path, "utf8"), writeFile = (path, contents) => writeFileSync(path, contents, {
|
|
960
|
+
function configureNewOwnedAvd(avdName, { dataPartitionSizeGb, avdConfig = {} }, { avdDirectory = ownedAvdDirectory, readFile = (path) => readFileSync$1(path, "utf8"), writeFile = (path, contents) => writeFileSync$1(path, contents, {
|
|
914
961
|
encoding: "utf8",
|
|
915
962
|
flag: "wx"
|
|
916
|
-
}), rename = renameSync, remove = (path) => rmSync(path, { force: true }) } = {}) {
|
|
963
|
+
}), rename = renameSync$1, remove = (path) => rmSync$1(path, { force: true }) } = {}) {
|
|
917
964
|
const sizeBytes = androidDataPartitionSizeBytes(dataPartitionSizeGb);
|
|
918
965
|
const directory = avdDirectory(avdName);
|
|
919
966
|
if (!directory) throw new Error(`Could not resolve the content directory for newly created AVD ${avdName}.`);
|
|
@@ -953,7 +1000,7 @@ function avdPoolConfiguration(dataPartitionSizeGb, avdConfig, deviceProfile = DE
|
|
|
953
1000
|
function ownedAvdMatchesConfiguration(avdName, configuration) {
|
|
954
1001
|
const directory = ownedAvdDirectory(avdName);
|
|
955
1002
|
if (!directory) return false;
|
|
956
|
-
const contents = readFileSync(join$1(directory, "config.ini"), "utf8");
|
|
1003
|
+
const contents = readFileSync$1(join$1(directory, "config.ini"), "utf8");
|
|
957
1004
|
const expected = JSON.parse(configuration);
|
|
958
1005
|
return Array.isArray(expected) && expected.length > 0 && expected.every((entry) => Array.isArray(entry) && entry.length === 2 && entry.every((value) => typeof value === "string") && contents.split(/\r?\n/).some((line) => line.trim() === `${entry[0]}=${entry[1]}`));
|
|
959
1006
|
}
|
|
@@ -1068,7 +1115,7 @@ const CRASH_REPORT_MODE_EMULATOR_VERSION = 37;
|
|
|
1068
1115
|
function emulatorCrashDatabases(env = ambientEnv()) {
|
|
1069
1116
|
const root = join$1(env.TMP || env.TEMP || tmpdir(), "AndroidEmulator");
|
|
1070
1117
|
try {
|
|
1071
|
-
return readdirSync(root).filter((name) => /^emu-crash-.*\.db$/.test(name)).map((name) => join$1(root, name));
|
|
1118
|
+
return readdirSync$1(root).filter((name) => /^emu-crash-.*\.db$/.test(name)).map((name) => join$1(root, name));
|
|
1072
1119
|
} catch {
|
|
1073
1120
|
return [];
|
|
1074
1121
|
}
|
|
@@ -1082,7 +1129,7 @@ function emulatorCrashDatabases(env = ambientEnv()) {
|
|
|
1082
1129
|
* removed instead, which has the same effect unless a crash handler is still writing into it.
|
|
1083
1130
|
* https://github.com/appandflow/stim/issues/918
|
|
1084
1131
|
*/
|
|
1085
|
-
function suppressEmulatorCrashConsent({ platform = process.platform, version = emulatorMajorVersion, databases = emulatorCrashDatabases, remove = (path) => rmSync(path, {
|
|
1132
|
+
function suppressEmulatorCrashConsent({ platform = process.platform, version = emulatorMajorVersion, databases = emulatorCrashDatabases, remove = (path) => rmSync$1(path, {
|
|
1086
1133
|
recursive: true,
|
|
1087
1134
|
force: true
|
|
1088
1135
|
}) } = {}) {
|
|
@@ -1120,8 +1167,8 @@ async function bootAndroidEmulator(avdName, consolePort, { logFile, platform = p
|
|
|
1120
1167
|
function emulatorStdio(logFile) {
|
|
1121
1168
|
if (!logFile) return "ignore";
|
|
1122
1169
|
try {
|
|
1123
|
-
mkdirSync(dirname$1(logFile), { recursive: true });
|
|
1124
|
-
const fd = openSync(logFile, "w");
|
|
1170
|
+
mkdirSync$1(dirname$1(logFile), { recursive: true });
|
|
1171
|
+
const fd = openSync$1(logFile, "w");
|
|
1125
1172
|
return [
|
|
1126
1173
|
"ignore",
|
|
1127
1174
|
fd,
|
|
@@ -1329,7 +1376,7 @@ function avdProcessLockPaths(avdDirectory, platform) {
|
|
|
1329
1376
|
}
|
|
1330
1377
|
function readAvdProcessId(path) {
|
|
1331
1378
|
try {
|
|
1332
|
-
const pid = Number(readFileSync(path, "utf8").split("\0")[0]);
|
|
1379
|
+
const pid = Number(readFileSync$1(path, "utf8").split("\0")[0]);
|
|
1333
1380
|
if (!Number.isSafeInteger(pid) || pid <= 0) throw new Error(`Could not read the emulator PID from process lock ${path}.`);
|
|
1334
1381
|
return pid;
|
|
1335
1382
|
} catch (error) {
|
|
@@ -1459,7 +1506,7 @@ const EMULATOR_SIGNAL_GRACE_MS = 5e3;
|
|
|
1459
1506
|
async function waitForAndroidEmulatorShutdown(avdName, shutdown, { operation, timeoutMs = ANDROID_EMULATOR_SHUTDOWN_TIMEOUT_MS, pollMs = ANDROID_EMULATOR_SHUTDOWN_POLL_MS, signalGraceMs = EMULATOR_SIGNAL_GRACE_MS, platform = process.platform, resolveDirectory = ownedAvdDirectory, readProcessId = readAvdProcessId, processAlive = pidExists, listProcesses = (name, host) => listAvdEmulatorProcessesAsync(name, host, operation), captureIdentity = process_identity_exports.captureProcessIdentity, inspectIdentity = process_identity_exports.inspectProcessIdentity, signal = (pid, name) => signalProcessTreeAsync(pid, name, {
|
|
1460
1507
|
platform,
|
|
1461
1508
|
operation
|
|
1462
|
-
}), directoryExists = (path) => statSync(path).isDirectory(), crashHandlerPids = (pid) => emulatorCrashHandlerPids(pid, operation), killCrashHandler = (pid) => signalProcessTreeAsync(pid, "SIGKILL", {
|
|
1509
|
+
}), directoryExists = (path) => statSync$1(path).isDirectory(), crashHandlerPids = (pid) => emulatorCrashHandlerPids(pid, operation), killCrashHandler = (pid) => signalProcessTreeAsync(pid, "SIGKILL", {
|
|
1463
1510
|
platform,
|
|
1464
1511
|
operation
|
|
1465
1512
|
}), now = Date.now, sleep = (ms) => cancellableSleep(ms, {
|
|
@@ -1725,4 +1772,4 @@ function ownedAvdSerialResolver({ timeoutMs } = {}) {
|
|
|
1725
1772
|
};
|
|
1726
1773
|
}
|
|
1727
1774
|
//#endregion
|
|
1728
|
-
export { removeMetroReverses as $, listAdbDevices as A, ownedAvdDeviceProfile as B, emulatorDiskSpaceRemedy as C, getAvdNameForSerial as D, findBuildTool as E, listAvdsAsync as F, ownedAvdSerialResolverAsync as G, ownedAvdMatchesConfiguration as H, listInstalledSystemImages as I, parseAvdSystemImage as J, ownedAvdSystemImage as K, listOrphanedAvdDirectories as L, listAvdDeviceProfiles as M, listAvdDeviceProfilesAsync as N, getAvdNameForSerialAsync as O, listAvds as P, profileNeedsFoldFeature as Q, memoizeEmulatorProbe as R, deleteAvd as S,
|
|
1775
|
+
export { removeMetroReverses as $, listAdbDevices as A, ownedAvdDeviceProfile as B, emulatorDiskSpaceRemedy as C, forgetCreatedDeviceAsync as Ct, getAvdNameForSerial as D, configuredAndroidEmulatorApp as Dt, findBuildTool as E, recordCreatedDeviceAsync as Et, listAvdsAsync as F, ownedAvdSerialResolverAsync as G, ownedAvdMatchesConfiguration as H, listInstalledSystemImages as I, parseAvdSystemImage as J, ownedAvdSystemImage as K, listOrphanedAvdDirectories as L, listAvdDeviceProfiles as M, listAvdDeviceProfilesAsync as N, getAvdNameForSerialAsync as O, listAvds as P, profileNeedsFoldFeature as Q, memoizeEmulatorProbe as R, deleteAvd as S, forgetCreatedDevice as St, extractEmulatorFailure as T, recordCreatedDevice as Tt, ownedAvdName as U, ownedAvdDirectory as V, ownedAvdSerialResolver as W, pickDefaultSystemImage as X, physicalDeviceModel as Y, probeEmulatorSerial as Z, avdPoolConfiguration as _, parkSim as _t, androidDeviceAbi as a, systemImageSupportsFold as at, configureNewOwnedAvd as b, removeParkedAfter as bt, androidPoolNoCandidatesRefusal as c, waitForBoot as ct, androidToolPath as d, isStimOwnedSim as dt, removeOwnedEmulatorMetroReverses as et, assertOwnedAvdStopped as f, POOL_SETTING_REMEDY as ft, avdPathExists as g, isLegacyDeletionClaim as gt, avdNameAbsent as h, eraseParkedAfter as ht, androidDataFreeBytes as i, shutdownAndroidEmulator as it, listAdbDevicesAsync as j, hostSystemImageArch as k, androidSystemImageAbi as l, wipeAvdUserData as lt, avdIniPaths as m, dropParked as mt, OWNED_AVD_CONFIG_DEFAULTS as n, resolveOwnedAvdSerialAsync as nt, androidHome as o, trimAndroidCaches as ot, assertOwnedAvdStoppedAsync as p, adoptParked as pt, parseAvdDeviceProfile as q, androidBuildToolName as r, resolvePhysicalDevice as rt, androidPoolCandidates as s, waitForAndroidEmulatorShutdown as st, DEFAULT_AVD_DEVICE_PROFILE as t, resetAdoptedAvd as tt, androidToolCwd as u, isStimOwnedAvd as ut, avdStorageRoots as v, parkedMaxSetting as vt, emulatorFailureRemedy as w, readCreatedDevices$1 as wt, createOwnedAvd as x, selectParked as xt, bootAndroidEmulator as y, readParked as yt, nextConsolePort as z };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { d as getConfigDir } from "./config-
|
|
3
|
-
import { m as defaultAndroidLayout } from "./settings-
|
|
4
|
-
import { r as register } from "./cache-manifest-
|
|
1
|
+
import { M as withDirLock$1, _ as ensureWorkspaceStorage } from "./workspace-state-pUg3_RRA.mjs";
|
|
2
|
+
import { d as getConfigDir } from "./config-BktkY_zC.mjs";
|
|
3
|
+
import { m as defaultAndroidLayout } from "./settings-CosW5X-S.mjs";
|
|
4
|
+
import { r as register } from "./cache-manifest-BEZ9Bpl1.mjs";
|
|
5
5
|
import { createHash, randomUUID } from "node:crypto";
|
|
6
6
|
import { accessSync, constants, existsSync, mkdirSync, readFileSync, realpathSync, renameSync, statSync, writeFileSync } from "node:fs";
|
|
7
7
|
import { join } from "node:path";
|