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

Folders and files

NameName
Last commit message
Last commit date
Mar 1, 2025
Jan 2, 2025
Jan 2, 2025
Aug 1, 2023
Nov 28, 2021
Jan 26, 2023
Apr 27, 2023
Jul 17, 2024
Jul 17, 2024
Jul 17, 2024
Jan 11, 2023
Jan 2, 2025
Feb 24, 2025
Jan 2, 2025

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