Skip to content

Commit a4032a4

Browse files
committed
feat(cli): improve spinner sensitivity
1 parent ac8fd88 commit a4032a4

File tree

1 file changed

+34
-26
lines changed

1 file changed

+34
-26
lines changed

packages/cli/index.ts

Lines changed: 34 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import glob = require('glob');
77
import fs = require('fs');
88
import os = require('os');
99
import languagePlugins = require('./lib/languagePlugins.js');
10-
import { setTimeout } from 'node:timers/promises';
1110
import { getVSCodeFormattingSettings } from './lib/formatting.js';
1211

1312
const _reset = '\x1b[0m';
@@ -113,11 +112,11 @@ class Project {
113112
const processFiles = new Set<string>();
114113
const tsconfigAndLanguages = new Map<string, string[]>();
115114
const formattingSettings = getFormattingSettings();
115+
const isTTY = process.stdout.isTTY;
116116

117117
let projects: Project[] = [];
118-
let spinner = process.stdout.isTTY ? clack.spinner() : undefined;
118+
let spinner = isTTY ? clack.spinner() : undefined;
119119
let spinnerStopingWarn = false;
120-
let lastSpinnerUpdate = Date.now();
121120
let hasFix = false;
122121
let allFilesNum = 0;
123122
let processed = 0;
@@ -127,7 +126,7 @@ class Project {
127126
let warnings = 0;
128127
let cached = 0;
129128

130-
if (spinner) {
129+
if (isTTY) {
131130
const write = process.stdout.write.bind(process.stdout);
132131
process.stdout.write = (...args) => {
133132
if (spinnerStopingWarn && typeof args[0] === 'string') {
@@ -322,12 +321,12 @@ class Project {
322321
process.exit(1);
323322
}
324323

325-
if (threads === 1) {
326-
await startWorker(worker.createLocal() as any);
327-
} else {
324+
if (isTTY || threads >= 2) {
328325
await Promise.all(new Array(threads).fill(0).map(() => {
329326
return startWorker(worker.create());
330327
}));
328+
} else {
329+
await startWorker(worker.createLocal() as any);
331330
}
332331

333332
(spinner?.stop ?? clack.log.message)(
@@ -408,20 +407,14 @@ class Project {
408407
}
409408

410409
while (project.currentFileIndex < project.fileNames.length) {
411-
const i = project.currentFileIndex++;
412-
const fileName = project.fileNames[i];
410+
const fileName = project.fileNames[project.currentFileIndex++];
411+
addProcessFile(fileName);
412+
413413
const fileStat = fs.statSync(fileName, { throwIfNoEntry: false });
414414
if (!fileStat) {
415415
continue;
416416
}
417417

418-
addProcessFile(fileName);
419-
420-
if (spinner && Date.now() - lastSpinnerUpdate > 100) {
421-
lastSpinnerUpdate = Date.now();
422-
await setTimeout(0);
423-
}
424-
425418
let fileCache = project.cache[fileName];
426419
if (fileCache) {
427420
if (fileCache[0] !== fileStat.mtimeMs) {
@@ -478,7 +471,12 @@ class Project {
478471
}
479472
processed++;
480473

481-
removeProcessFile(fileName);
474+
removeProcessFile(
475+
fileName,
476+
project.currentFileIndex < project.fileNames.length
477+
? project.fileNames[project.currentFileIndex]
478+
: undefined
479+
);
482480
}
483481

484482
cache.saveCache(project.tsconfig, project.configFile!, project.cache, ts.sys.createHash);
@@ -558,17 +556,28 @@ class Project {
558556
updateSpinner();
559557
}
560558

561-
function removeProcessFile(fileName: string) {
559+
function removeProcessFile(fileName: string, nextFileName?: string) {
562560
processFiles.delete(fileName);
563-
updateSpinner();
561+
updateSpinner(nextFileName);
564562
}
565563

566-
function updateSpinner() {
567-
if (processFiles.size === 1) {
568-
const fileName = processFiles.values().next().value!;
569-
spinner?.message(darkGray(`[${processed + processFiles.size}/${allFilesNum}] ${path.relative(process.cwd(), fileName)}`));
564+
function updateSpinner(nextFileName?: string) {
565+
let msg: string | undefined;
566+
if (processFiles.size === 0) {
567+
if (nextFileName) {
568+
msg = darkGray(`[${processed + processFiles.size}/${allFilesNum}] ${path.relative(process.cwd(), nextFileName)}`);
569+
}
570+
}
571+
else if (processFiles.size === 1) {
572+
msg = darkGray(`[${processed + processFiles.size}/${allFilesNum}] ${path.relative(process.cwd(), [...processFiles][0])}`);
570573
} else {
571-
spinner?.message(darkGray(`[${processed + processFiles.size}/${allFilesNum}] Processing ${processFiles.size} files`));
574+
msg = darkGray(`[${processed + processFiles.size}/${allFilesNum}] Processing ${processFiles.size} files`);
575+
}
576+
if (!spinner && isTTY) {
577+
spinner = clack.spinner();
578+
spinner.start(msg);
579+
} else {
580+
spinner?.message(msg);
572581
}
573582
}
574583

@@ -577,8 +586,7 @@ class Project {
577586
spinnerStopingWarn = code === 2;
578587
spinner.stop(msg, code);
579588
spinnerStopingWarn = false;
580-
spinner = clack.spinner();
581-
spinner.start();
589+
spinner = undefined;
582590
} else {
583591
if (code === 1) {
584592
clack.log.error(msg);

0 commit comments

Comments
 (0)