Skip to content

Commit e46826f

Browse files
committed
Refactor the API for stopping spinners & progress bars
1 parent 69508f4 commit e46826f

File tree

7 files changed

+56
-19
lines changed

7 files changed

+56
-19
lines changed

.changeset/odd-bikes-nail.md

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
---
2+
"@clack/prompts": minor
3+
---
4+
5+
Updates the API for stopping spinners and progress bars to be clearer
6+
7+
Previously, both the spinner and progress bar components used a single `stop` method that accepted a code to indicate success, cancellation, or error. This update separates these into distinct methods: `stop()`, `cancel()`, and `error()`:
8+
9+
```diff
10+
const spinner = prompts.spinner();
11+
spinner.start();
12+
13+
// Cancelling a spinner
14+
- spinner.stop(undefined, 1);
15+
+ spinner.cancel();
16+
17+
// Stopping with an error
18+
- spinner.stop(undefined, 2);
19+
+ spinner.error();
20+
```
21+
22+
As before, you can pass a message to each method to customize the output displayed:
23+
24+
```js
25+
spinner.cancel("Operation cancelled by user");
26+
progressBar.error("An error occurred during processing");
27+
```

packages/prompts/src/progress-bar.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ export function progress({
6363
return {
6464
start,
6565
stop: spin.stop,
66+
cancel: spin.cancel,
67+
error: spin.error,
6668
advance,
6769
isCancelled: spin.isCancelled,
6870
message: (msg: string) => advance(0, msg),

packages/prompts/src/spinner.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@ export interface SpinnerOptions extends CommonOptions {
2424

2525
export interface SpinnerResult {
2626
start(msg?: string): void;
27-
stop(msg?: string, code?: number): void;
27+
stop(msg?: string): void;
28+
cancel(msg?: string): void;
29+
error(msg?: string): void;
2830
message(msg?: string): void;
2931
readonly isCancelled: boolean;
3032
}
@@ -61,7 +63,7 @@ export const spinner = ({
6163
: (cancelMessage ?? settings.messages.cancel);
6264
isCancelled = code === 1;
6365
if (isSpinnerActive) {
64-
stop(msg, code);
66+
_stop(msg, code);
6567
if (isCancelled && typeof onCancel === 'function') {
6668
onCancel();
6769
}
@@ -163,7 +165,7 @@ export const spinner = ({
163165
}, delay);
164166
};
165167

166-
const stop = (msg = '', code = 0): void => {
168+
const _stop = (msg = '', code = 0): void => {
167169
if (!isSpinnerActive) return;
168170
isSpinnerActive = false;
169171
clearInterval(loop);
@@ -184,6 +186,10 @@ export const spinner = ({
184186
unblock();
185187
};
186188

189+
const stop = (msg = ''): void => _stop(msg, 0);
190+
const cancel = (msg = ''): void => _stop(msg, 1);
191+
const error = (msg = ''): void => _stop(msg, 2);
192+
187193
const message = (msg = ''): void => {
188194
_message = removeTrailingDots(msg ?? _message);
189195
};
@@ -192,6 +198,8 @@ export const spinner = ({
192198
start,
193199
stop,
194200
message,
201+
cancel,
202+
error,
195203
get isCancelled() {
196204
return isCancelled;
197205
},

packages/prompts/test/__snapshots__/progress-bar.test.ts.snap

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ exports[`prompts - progress (isCI = false) > start > renders timer when indicato
125125
]
126126
`;
127127
128-
exports[`prompts - progress (isCI = false) > stop > renders cancel symbol if code = 1 1`] = `
128+
exports[`prompts - progress (isCI = false) > stop > renders cancel symbol when calling cancel() 1`] = `
129129
[
130130
"<cursor.hide>",
131131
"│
@@ -139,7 +139,7 @@ exports[`prompts - progress (isCI = false) > stop > renders cancel symbol if cod
139139
]
140140
`;
141141
142-
exports[`prompts - progress (isCI = false) > stop > renders error symbol if code > 1 1`] = `
142+
exports[`prompts - progress (isCI = false) > stop > renders error symbol when calling error() 1`] = `
143143
[
144144
"<cursor.hide>",
145145
"│
@@ -382,7 +382,7 @@ exports[`prompts - progress (isCI = true) > start > renders timer when indicator
382382
]
383383
`;
384384
385-
exports[`prompts - progress (isCI = true) > stop > renders cancel symbol if code = 1 1`] = `
385+
exports[`prompts - progress (isCI = true) > stop > renders cancel symbol when calling cancel() 1`] = `
386386
[
387387
"<cursor.hide>",
388388
"│
@@ -398,7 +398,7 @@ exports[`prompts - progress (isCI = true) > stop > renders cancel symbol if code
398398
]
399399
`;
400400
401-
exports[`prompts - progress (isCI = true) > stop > renders error symbol if code > 1 1`] = `
401+
exports[`prompts - progress (isCI = true) > stop > renders error symbol when calling error() 1`] = `
402402
[
403403
"<cursor.hide>",
404404
"│

packages/prompts/test/__snapshots__/spinner.test.ts.snap

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -461,7 +461,7 @@ exports[`spinner (isCI = false) > start > renders timer when indicator is "timer
461461
]
462462
`;
463463
464-
exports[`spinner (isCI = false) > stop > renders cancel symbol if code = 1 1`] = `
464+
exports[`spinner (isCI = false) > stop > renders cancel symbol when calling cancel() 1`] = `
465465
[
466466
"<cursor.hide>",
467467
"│
@@ -475,7 +475,7 @@ exports[`spinner (isCI = false) > stop > renders cancel symbol if code = 1 1`] =
475475
]
476476
`;
477477
478-
exports[`spinner (isCI = false) > stop > renders error symbol if code > 1 1`] = `
478+
exports[`spinner (isCI = false) > stop > renders error symbol when calling error() 1`] = `
479479
[
480480
"<cursor.hide>",
481481
"│
@@ -789,7 +789,7 @@ exports[`spinner (isCI = true) > start > renders timer when indicator is "timer"
789789
]
790790
`;
791791
792-
exports[`spinner (isCI = true) > stop > renders cancel symbol if code = 1 1`] = `
792+
exports[`spinner (isCI = true) > stop > renders cancel symbol when calling cancel() 1`] = `
793793
[
794794
"<cursor.hide>",
795795
"│
@@ -805,7 +805,7 @@ exports[`spinner (isCI = true) > stop > renders cancel symbol if code = 1 1`] =
805805
]
806806
`;
807807
808-
exports[`spinner (isCI = true) > stop > renders error symbol if code > 1 1`] = `
808+
exports[`spinner (isCI = true) > stop > renders error symbol when calling error() 1`] = `
809809
[
810810
"<cursor.hide>",
811811
"│

packages/prompts/test/progress-bar.test.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,26 +87,26 @@ describe.each(['true', 'false'])('prompts - progress (isCI = %s)', (isCI) => {
8787
expect(output.buffer).toMatchSnapshot();
8888
});
8989

90-
test('renders cancel symbol if code = 1', () => {
90+
test('renders cancel symbol when calling cancel()', () => {
9191
const result = prompts.progress({ output });
9292

9393
result.start();
9494

9595
vi.advanceTimersByTime(80);
9696

97-
result.stop('', 1);
97+
result.cancel('');
9898

9999
expect(output.buffer).toMatchSnapshot();
100100
});
101101

102-
test('renders error symbol if code > 1', () => {
102+
test('renders error symbol when calling error()', () => {
103103
const result = prompts.progress({ output });
104104

105105
result.start();
106106

107107
vi.advanceTimersByTime(80);
108108

109-
result.stop('', 2);
109+
result.error('');
110110

111111
expect(output.buffer).toMatchSnapshot();
112112
});

packages/prompts/test/spinner.test.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -117,26 +117,26 @@ describe.each(['true', 'false'])('spinner (isCI = %s)', (isCI) => {
117117
expect(output.buffer).toMatchSnapshot();
118118
});
119119

120-
test('renders cancel symbol if code = 1', () => {
120+
test('renders cancel symbol when calling cancel()', () => {
121121
const result = prompts.spinner({ output });
122122

123123
result.start();
124124

125125
vi.advanceTimersByTime(80);
126126

127-
result.stop('', 1);
127+
result.cancel('');
128128

129129
expect(output.buffer).toMatchSnapshot();
130130
});
131131

132-
test('renders error symbol if code > 1', () => {
132+
test('renders error symbol when calling error()', () => {
133133
const result = prompts.spinner({ output });
134134

135135
result.start();
136136

137137
vi.advanceTimersByTime(80);
138138

139-
result.stop('', 2);
139+
result.error('');
140140

141141
expect(output.buffer).toMatchSnapshot();
142142
});

0 commit comments

Comments
 (0)