From 115735a64cf99208dc05f22463b06b78d3fc01f2 Mon Sep 17 00:00:00 2001 From: Dimitri Benin Date: Wed, 3 Apr 2019 05:10:26 +0000 Subject: [PATCH] Refactor TypeScript definition to CommonJS compatible export (#107) --- index.d.ts | 434 +++++++++++++++++++++++++----------------------- index.js | 1 + index.test-d.ts | 5 +- package.json | 10 +- 4 files changed, 236 insertions(+), 214 deletions(-) diff --git a/index.d.ts b/index.d.ts index c7fba81..e1d4f18 100644 --- a/index.d.ts +++ b/index.d.ts @@ -1,237 +1,257 @@ /// -import {Writable as WritableStream} from 'stream'; import {SpinnerName} from 'cli-spinners'; -export type Spinner = Readonly<{ - interval?: number; - frames: string[]; -}>; - -export type Color = - | 'black' - | 'red' - | 'green' - | 'yellow' - | 'blue' - | 'magenta' - | 'cyan' - | 'white' - | 'gray'; - -export type Options = Readonly<{ - /** - * Text to display after the spinner. - */ - text?: string; +declare namespace ora { + interface Spinner { + readonly interval?: number; + readonly frames: string[]; + } - /** - * Text to display before the spinner. - */ - prefixText?: string; + type Color = + | 'black' + | 'red' + | 'green' + | 'yellow' + | 'blue' + | 'magenta' + | 'cyan' + | 'white' + | 'gray'; - /** - * Name of one of the provided spinners. See [`example.js`](https://github.com/BendingBender/ora/blob/master/example.js) in this repo if you want to test out different spinners. On Windows, it will always use the line spinner as the Windows command-line doesn't have proper Unicode support. - * - * @default 'dots' - * - * Or an object like: - * - * @example - * - * { - * interval: 80, // Optional - * frames: ['-', '+', '-'] - * } - * - */ - spinner?: SpinnerName | Spinner; + interface Options { + /** + Text to display after the spinner. + */ + readonly text?: string; - /** - * Color of the spinner. - * - * @default 'cyan' - */ - color?: Color; + /** + Text to display before the spinner. + */ + readonly prefixText?: string; - /** - * Set to `false` to stop Ora from hiding the cursor. - * - * @default true - */ - hideCursor?: boolean; + /** + Name of one of the provided spinners. See [`example.js`](https://github.com/BendingBender/ora/blob/master/example.js) in this repo if you want to test out different spinners. On Windows, it will always use the line spinner as the Windows command-line doesn't have proper Unicode support. - /** - * Indent the spinner with the given number of spaces. - * - * @default 0 - */ - indent?: number; + @default 'dots' - /** - * Interval between each frame. - * - * Spinners provide their own recommended interval, so you don't really need to specify this. Default value: Provided by the spinner or `100`. - */ - interval?: number; + Or an object like: - /** - * Stream to write the output. - * - * You could for example set this to `process.stdout` instead. - * - * @default process.stderr - */ - stream?: WritableStream; + @example + ``` + { + interval: 80, // Optional + frames: ['-', '+', '-'] + } + ``` + */ + readonly spinner?: SpinnerName | Spinner; - /** - * Force enable/disable the spinner. If not specified, the spinner will be enabled if the `stream` is being run inside a TTY context (not spawned or piped) and/or not in a CI environment. - * - * Note that `{isEnabled: false}` doesn't mean it won't output anything. It just means it won't output the spinner, colors, and other ansi escape codes. It will still log text. - */ - isEnabled?: boolean; -}>; - -/** - * Elegant terminal spinner. - * - * @param options - If a string is provided, it is treated as a shortcut for `options.text`. - */ -export default function ora(options?: Options | string): Ora; - -/** - * Starts a spinner for a promise. The spinner is stopped with `.succeed()` if the promise fulfills or with `.fail()` if it rejects. - * - * @param action - The promise to start the spinner for. - * @param options - If a string is provided, it is treated as a shortcut for `options.text`. - * @returns The spinner instance. - */ -export function promise( - action: PromiseLike, - options?: Options | string -): Ora; - -export type PersistOptions = Readonly<{ - /** - * Symbol to replace the spinner with. - * - * @default ' ' - */ - symbol?: string; + /** + Color of the spinner. - /** - * Text to be persisted after the symbol. Default: Current `text`. - */ - text?: string; + @default 'cyan' + */ + readonly color?: Color; - /** - * Text to be persisted before the symbol. Default: Current `prefixText`. - */ - prefixText?: string; -}>; + /** + Set to `false` to stop Ora from hiding the cursor. -export interface Ora { - /** - * A boolean of whether the instance is currently spinning. - */ - readonly isSpinning: boolean; + @default true + */ + readonly hideCursor?: boolean; - /** - * Change the text after the spinner. - */ - text: string; - - /** - * Change the text before the spinner. - */ - prefixText: string; + /** + Indent the spinner with the given number of spaces. - /** - * Change the spinner color. - */ - color: Color; + @default 0 + */ + readonly indent?: number; - /** - * Change the spinner. - */ - spinner: SpinnerName | Spinner; + /** + Interval between each frame. - /** - * Change the spinner indent. - */ - indent: number; + Spinners provide their own recommended interval, so you don't really need to specify this. Default value: Provided by the spinner or `100`. + */ + readonly interval?: number; - /** - * Start the spinner. - * - * @param text - Set the current text. - * @returns The spinner instance. - */ - start(text?: string): Ora; + /** + Stream to write the output. - /** - * Stop and clear the spinner. - * - * @returns The spinner instance. - */ - stop(): Ora; + You could for example set this to `process.stdout` instead. - /** - * Stop the spinner, change it to a green `✔` and persist the current text, or `text` if provided. - * - * @param text - Will persist text if provided. - * @returns The spinner instance. - */ - succeed(text?: string): Ora; + @default process.stderr + */ + readonly stream?: NodeJS.WritableStream; - /** - * Stop the spinner, change it to a red `✖` and persist the current text, or `text` if provided. - * - * @param text - Will persist text if provided. - * @returns The spinner instance. - */ - fail(text?: string): Ora; + /** + Force enable/disable the spinner. If not specified, the spinner will be enabled if the `stream` is being run inside a TTY context (not spawned or piped) and/or not in a CI environment. - /** - * Stop the spinner, change it to a yellow `⚠` and persist the current text, or `text` if provided. - * - * @param text - Will persist text if provided. - * @returns The spinner instance. - */ - warn(text?: string): Ora; + Note that `{isEnabled: false}` doesn't mean it won't output anything. It just means it won't output the spinner, colors, and other ansi escape codes. It will still log text. + */ + readonly isEnabled?: boolean; + } - /** - * Stop the spinner, change it to a blue `ℹ` and persist the current text, or `text` if provided. - * - * @param text - Will persist text if provided. - * @returns The spinner instance. - */ - info(text?: string): Ora; + interface PersistOptions { + /** + Symbol to replace the spinner with. - /** - * Stop the spinner and change the symbol or text. - * - * @returns The spinner instance. - */ - stopAndPersist(options?: PersistOptions): Ora; + @default ' ' + */ + readonly symbol?: string; - /** - * Clear the spinner. - * - * @returns The spinner instance. - */ - clear(): Ora; + /** + Text to be persisted after the symbol. Default: Current `text`. + */ + readonly text?: string; + + /** + Text to be persisted before the symbol. Default: Current `prefixText`. + */ + readonly prefixText?: string; + } + + interface Ora { + /** + A boolean of whether the instance is currently spinning. + */ + readonly isSpinning: boolean; + + /** + Change the text after the spinner. + */ + text: string; + + /** + Change the text before the spinner. + */ + prefixText: string; + + /** + Change the spinner color. + */ + color: Color; + /** + Change the spinner. + */ + spinner: SpinnerName | Spinner; + + /** + Change the spinner indent. + */ + indent: number; + + /** + Start the spinner. + + @param text - Set the current text. + @returns The spinner instance. + */ + start(text?: string): Ora; + + /** + Stop and clear the spinner. + + @returns The spinner instance. + */ + stop(): Ora; + + /** + Stop the spinner, change it to a green `✔` and persist the current text, or `text` if provided. + + @param text - Will persist text if provided. + @returns The spinner instance. + */ + succeed(text?: string): Ora; + + /** + Stop the spinner, change it to a red `✖` and persist the current text, or `text` if provided. + + @param text - Will persist text if provided. + @returns The spinner instance. + */ + fail(text?: string): Ora; + + /** + Stop the spinner, change it to a yellow `⚠` and persist the current text, or `text` if provided. + + @param text - Will persist text if provided. + @returns The spinner instance. + */ + warn(text?: string): Ora; + + /** + Stop the spinner, change it to a blue `ℹ` and persist the current text, or `text` if provided. + + @param text - Will persist text if provided. + @returns The spinner instance. + */ + info(text?: string): Ora; + + /** + Stop the spinner and change the symbol or text. + + @returns The spinner instance. + */ + stopAndPersist(options?: PersistOptions): Ora; + + /** + Clear the spinner. + + @returns The spinner instance. + */ + clear(): Ora; + + /** + Manually render a new frame. + + @returns The spinner instance. + */ + render(): Ora; + + /** + Get a new frame. + + @returns The spinner instance. + */ + frame(): Ora; + } +} + +declare const ora: { /** - * Manually render a new frame. - * - * @returns The spinner instance. - */ - render(): Ora; + Elegant terminal spinner. + + @param options - If a string is provided, it is treated as a shortcut for `options.text`. + + @example + ``` + import ora = require('ora'); + + const spinner = ora('Loading unicorns').start(); + + setTimeout(() => { + spinner.color = 'yellow'; + spinner.text = 'Loading rainbows'; + }, 1000); + ``` + */ + (options?: ora.Options | string): ora.Ora; /** - * Get a new frame. - * - * @returns The spinner instance. - */ - frame(): Ora; -} + Starts a spinner for a promise. The spinner is stopped with `.succeed()` if the promise fulfills or with `.fail()` if it rejects. + + @param action - The promise to start the spinner for. + @param options - If a string is provided, it is treated as a shortcut for `options.text`. + @returns The spinner instance. + */ + promise( + action: PromiseLike, + options?: ora.Options | string + ): ora.Ora; + + // TODO: Remove this for the next major release + default: typeof ora; +}; + +export = ora; diff --git a/index.js b/index.js index ac34492..028db28 100644 --- a/index.js +++ b/index.js @@ -222,6 +222,7 @@ const oraFactory = function (opts) { }; module.exports = oraFactory; +// TODO: Remove this for the next major release module.exports.default = oraFactory; module.exports.promise = (action, options) => { diff --git a/index.test-d.ts b/index.test-d.ts index af7f1f8..b2caf9d 100644 --- a/index.test-d.ts +++ b/index.test-d.ts @@ -1,6 +1,7 @@ -import {expectType} from 'tsd-check'; +import {expectType} from 'tsd'; import {PassThrough as PassThroughStream} from 'stream'; -import ora, {promise} from '.'; +import ora = require('.'); +import {promise} from '.'; const spinner = ora('Loading unicorns'); ora({text: 'Loading unicorns'}); diff --git a/package.json b/package.json index ce7152e..f11be32 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "node": ">=6" }, "scripts": { - "test": "xo && ava && tsd-check" + "test": "xo && ava && tsd" }, "files": [ "index.js", @@ -40,14 +40,14 @@ "cli-cursor": "^2.1.0", "cli-spinners": "^2.0.0", "log-symbols": "^2.2.0", - "strip-ansi": "^5.0.0", + "strip-ansi": "^5.2.0", "wcwidth": "^1.0.1" }, "devDependencies": { - "@types/node": "^11.10.4", - "ava": "^1.2.1", + "@types/node": "^11.13.0", + "ava": "^1.4.1", "get-stream": "^4.1.0", - "tsd-check": "^0.3.0", + "tsd": "^0.7.2", "xo": "^0.24.0" } }