forked from
nekomimi.pet/wisp.place-monorepo
Monorepo for wisp.place. A static site hosting service built on top of the AT Protocol.
1import { spinner } from '@clack/prompts';
2import pc from 'picocolors';
3
4export { pc };
5
6export function formatBytes(bytes: number): string {
7 if (bytes === 0) return '0 B';
8 const k = 1024;
9 const sizes = ['B', 'KB', 'MB', 'GB'];
10 const i = Math.floor(Math.log(bytes) / Math.log(k));
11 return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i] ?? 'TB'}`;
12}
13
14// Adapter to provide ora-like interface using clack spinner
15export interface SpinnerLike {
16 text: string;
17 start(): SpinnerLike;
18 succeed(text?: string): SpinnerLike;
19 fail(text?: string): SpinnerLike;
20}
21
22export function createSpinner(text: string): SpinnerLike {
23 const s = spinner();
24 let currentText = text;
25 let started = false;
26
27 return {
28 get text() {
29 return currentText;
30 },
31 set text(newText: string) {
32 currentText = newText;
33 if (started) {
34 s.message(newText);
35 }
36 },
37 start() {
38 started = true;
39 s.start(currentText);
40 return this;
41 },
42 succeed(message?: string) {
43 s.stop(pc.green('✓ ') + (message ?? currentText));
44 started = false;
45 return this;
46 },
47 fail(message?: string) {
48 s.stop(pc.red('✗ ') + (message ?? currentText));
49 started = false;
50 return this;
51 }
52 };
53}