From 89371befc10e861e3298abd67f1d6961e12fc788 Mon Sep 17 00:00:00 2001 From: Colin Date: Fri, 24 Mar 2023 16:24:14 +0800 Subject: [PATCH] feat(@clack/prompts): new method `spinner.message(msg: string)` --- .changeset/loud-bugs-move.md | 5 +++++ examples/basic/package.json | 3 ++- examples/basic/spinner.ts | 22 ++++++++++++++++++++++ packages/prompts/src/index.ts | 10 ++++++++-- 4 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 .changeset/loud-bugs-move.md create mode 100644 examples/basic/spinner.ts diff --git a/.changeset/loud-bugs-move.md b/.changeset/loud-bugs-move.md new file mode 100644 index 00000000..2223a433 --- /dev/null +++ b/.changeset/loud-bugs-move.md @@ -0,0 +1,5 @@ +--- +'@clack/prompts': minor +--- + +feat(@clack/prompts): new method `spinner.message(msg: string)` diff --git a/examples/basic/package.json b/examples/basic/package.json index 026aa4ba..0872dda8 100644 --- a/examples/basic/package.json +++ b/examples/basic/package.json @@ -9,7 +9,8 @@ "picocolors": "^1.0.0" }, "scripts": { - "start": "jiti ./index.ts" + "start": "jiti ./index.ts", + "spinner": "jiti ./spinner.ts" }, "devDependencies": { "jiti": "^1.17.0" diff --git a/examples/basic/spinner.ts b/examples/basic/spinner.ts new file mode 100644 index 00000000..2cffcbe3 --- /dev/null +++ b/examples/basic/spinner.ts @@ -0,0 +1,22 @@ +import * as p from '@clack/prompts'; + +p.intro('spinner start...'); + +const spin = p.spinner(); +const total = 10000; +let progress = 0; +spin.start(); + +new Promise((resolve) => { + const timer = setInterval(() => { + progress = Math.min(total, progress + 100); + if (progress >= total) { + clearInterval(timer); + resolve(true); + } + spin.message(`Loading packages [${progress}/${total}]`); // <=== + }, 100); +}).then(() => { + spin.stop(`Done`); + p.outro('spinner stop...'); +}); diff --git a/packages/prompts/src/index.ts b/packages/prompts/src/index.ts index 3b342dd5..ee69ceb7 100644 --- a/packages/prompts/src/index.ts +++ b/packages/prompts/src/index.ts @@ -607,9 +607,11 @@ const frames = unicode ? ['◒', '◐', '◓', '◑'] : ['•', 'o', 'O', '0']; export const spinner = () => { let unblock: () => void; let loop: NodeJS.Timer; + let message = ''; const delay = unicode ? 80 : 120; return { - start(message = '') { + start(msg = '') { + this.message(msg); message = message.replace(/\.?\.?\.$/, ''); unblock = block(); process.stdout.write(`${color.gray(S_BAR)}\n${color.magenta('○')} ${message}\n`); @@ -627,7 +629,11 @@ export const spinner = () => { dot = dot === frames.length ? 0 : dot + 0.125; }, delay); }, - stop(message = '') { + message(msg = '') { + message = msg ?? message; + }, + stop(msg = '') { + this.message(msg); process.stdout.write(cursor.move(-999, -2)); process.stdout.write(erase.down(2)); clearInterval(loop);