diff --git a/.changeset/orange-dragons-rescue.md b/.changeset/orange-dragons-rescue.md new file mode 100644 index 00000000..daafc677 --- /dev/null +++ b/.changeset/orange-dragons-rescue.md @@ -0,0 +1,6 @@ +--- +"@clack/prompts": patch +"@clack/core": patch +--- + +Fix that isCancelled returned after calling cancel and start methods in progress does not refresh. diff --git a/packages/prompts/src/progress-bar.ts b/packages/prompts/src/progress-bar.ts index 90079a10..713524cc 100644 --- a/packages/prompts/src/progress-bar.ts +++ b/packages/prompts/src/progress-bar.ts @@ -67,7 +67,9 @@ export function progress({ error: spin.error, clear: spin.clear, advance, - isCancelled: spin.isCancelled, + get isCancelled() { + return spin.isCancelled; + }, message: (msg: string) => advance(0, msg), }; } diff --git a/packages/prompts/src/spinner.ts b/packages/prompts/src/spinner.ts index 4db8dbdd..258cff35 100644 --- a/packages/prompts/src/spinner.ts +++ b/packages/prompts/src/spinner.ts @@ -134,6 +134,7 @@ export const spinner = ({ const start = (msg = ''): void => { isSpinnerActive = true; + isCancelled = false; _message = removeTrailingDots(msg); _origin = performance.now(); registerHooks(); @@ -186,6 +187,7 @@ export const spinner = ({ const _stop = (msg = '', code = 0, silent: boolean = false): void => { if (!isSpinnerActive) return; isSpinnerActive = false; + isCancelled = code === 1; clearInterval(loop); if (!accessible) { clearPrevMessage(); diff --git a/packages/prompts/test/progress-bar.test.ts b/packages/prompts/test/progress-bar.test.ts index a64061c8..377930ca 100644 --- a/packages/prompts/test/progress-bar.test.ts +++ b/packages/prompts/test/progress-bar.test.ts @@ -99,6 +99,15 @@ describe.each(['true', 'false'])('prompts - progress (isCI = %s)', (isCI) => { expect(output.buffer).toMatchSnapshot(); }); + test('tracks cancellation', () => { + const result = prompts.progress({ output }); + + result.start(); + result.cancel(); + + expect(result.isCancelled).toBe(true); + }); + test('renders error symbol when calling error()', () => { const result = prompts.progress({ output }); diff --git a/packages/prompts/test/spinner.test.ts b/packages/prompts/test/spinner.test.ts index 18896121..e23dd66c 100644 --- a/packages/prompts/test/spinner.test.ts +++ b/packages/prompts/test/spinner.test.ts @@ -130,6 +130,18 @@ describe.each(['true', 'false'])('spinner (isCI = %s)', (isCI) => { expect(output.buffer).toMatchSnapshot(); }); + test('tracks cancellation and resets it on restart', () => { + const result = prompts.spinner({ output }); + + result.start(); + result.cancel(); + expect(result.isCancelled).toBe(true); + + result.start(); + expect(result.isCancelled).toBe(false); + result.stop(); + }); + test('renders error symbol when calling error()', () => { const result = prompts.spinner({ output });