Skip to content
/ Spinner Public

Elegant Asynchronous Terminal (CLI) Spinner for Node.js

License

Notifications You must be signed in to change notification settings

TopCli/Spinner

Repository files navigation

Spinner

version Maintenance mit scorecard build

Asynchronous CLI Spinner. This package has been created to handle simultaneous/multiple spinner at a time. The package has been inspired by Ora but asynchronous.

All available spinners are part of cli-spinners package.

Requirements

Getting Started

This package is available in the Node Package Repository and can be easily installed with npm or yarn.

$ npm i @topcli/spinner
# or
$ yarn add @topcli/spinner

Usage example

Create and wait multiple spinner at a time.

import * as timers from "node:timers/promises";
import { Spinner } from "@topcli/spinner";

async function fnWithSpinner(withPrefix, succeed = true) {
    const spinner = new Spinner()
      .start("Start working!", { withPrefix });

    await timers.setTimeout(1000);
    spinner.text = "Work in progress...";
    await timers.setTimeout(1000);

    if (succeed) {
        spinner.succeed(`All done in ${spinner.elapsedTime.toFixed(2)}ms !`);
    }
    else {
        spinner.failed("Something wrong happened !");
    }
}

await Promise.allSettled([
    fnWithSpinner(),
    fnWithSpinner("Item 1"),
    fnWithSpinner("Item 2", false)
]);
Spinner.reset(); // reset internal count
console.log("All spinners finished!");

If you want to only achieve one Spinner by one Spinner, use it like Ora (it will work)

const spinner = new Spinner().start("Start working!");

await timers.setTimeout(1_000);
spinner.text = "Work in progress...";

await timers.setTimeout(1_000);
spinner.succeed("All done !");

Tip

When you are working on a CLI that can be used as an API too, the verbose option allow you to disable the Spinner.

API

constructor(options?: ISpinnerOptions)

Create a new Spinner. The options payload is described by the following TypeScript interface:

export interface ISpinnerOptions {
  /**
   * Spinner name (from cli-spinners lib)
   *
   * @default "dots"
   */
  name?: cliSpinners.SpinnerName;
  /**
   * Spinner frame color
   *
   * @default "white"
   */
  color?: string;
  /**
   * Do not log anything when disabled
   *
   * @default true
   */
  verbose?: boolean;
}

[!TIP] Check cli-spinners for all the spinner name.

new Spinner({ name: "dots2" });
start(text?: string, options?: IStartOptions): Spinner

Start the spinner and optionaly write the text passed as first parameter.

The options payload is described by the following TypeScript interface:

export interface IStartOptions {
  withPrefix?: string;
}
succeed(text?: string): void

Stop the spinner in the CLI, write the text passed in param and mark it as succeed with a symbol.

failed(text?: string): void

Stop the spinner in the CLI, write the text passed in param and mark it as failed with a symbol.


Contributors ✨

All Contributors

Thanks goes to these wonderful people (emoji key):

Gentilhomme
Gentilhomme

💻 📖 👀 🛡️ 🐛
Alexandre Malaj
Alexandre Malaj

💻 📖 🐛
PierreDemailly
PierreDemailly

💻 🚧
Ben
Ben

🐛

License

MIT