diff --git a/.gitattributes b/.gitattributes index 391f0a4..6313b56 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,2 +1 @@ -* text=auto -*.js text eol=lf +* text=auto eol=lf diff --git a/.travis.yml b/.travis.yml index 7d69d74..2ae9d62 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,5 @@ language: node_js node_js: + - '10' - '8' - '6' - - '4' diff --git a/example-all.js b/example-all.js index 4ca0342..adb2bb0 100644 --- a/example-all.js +++ b/example-all.js @@ -1,5 +1,4 @@ 'use strict'; -/* eslint-disable unicorn/no-process-exit */ const readline = require('readline'); const logUpdate = require('log-update'); const cliSpinners = require('.'); @@ -11,7 +10,7 @@ let next; let scrutator; const showNextFrame = () => { - const frames = cliSpinners[spinners[spinner]].frames; + const {frames} = cliSpinners[spinners[spinner]]; logUpdate(frames[frame++ % frames.length] + ' ' + spinners[spinner]); }; @@ -26,6 +25,7 @@ const showNextSpinner = () => { next = setInterval(showNextFrame, s.interval); scrutator = setTimeout(showNextSpinner, Math.max(s.interval * s.frames.length, 1000)); } else { + // eslint-disable-next-line unicorn/no-process-exit process.exit(0); } }; @@ -36,6 +36,7 @@ process.stdin.setRawMode(true); process.stdin.on('keypress', (str, key) => { if (key.ctrl && key.name === 'c') { + // eslint-disable-next-line unicorn/no-process-exit process.exit(130); } diff --git a/example.js b/example.js index e1aad17..8615b25 100644 --- a/example.js +++ b/example.js @@ -6,7 +6,7 @@ const spinner = cliSpinners[process.argv[2] || 'dots']; let i = 0; setInterval(() => { - const frames = spinner.frames; + const {frames} = spinner; logUpdate(frames[i = ++i % frames.length] + ' Unicorns'); }, spinner.interval); diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000..0430880 --- /dev/null +++ b/index.d.ts @@ -0,0 +1,99 @@ +export type SpinnerName = + | 'dots' + | 'dots2' + | 'dots3' + | 'dots4' + | 'dots5' + | 'dots6' + | 'dots7' + | 'dots8' + | 'dots9' + | 'dots10' + | 'dots11' + | 'dots12' + | 'line' + | 'line2' + | 'pipe' + | 'simpleDots' + | 'simpleDotsScrolling' + | 'star' + | 'star2' + | 'flip' + | 'hamburger' + | 'growVertical' + | 'growHorizontal' + | 'balloon' + | 'balloon2' + | 'noise' + | 'bounce' + | 'boxBounce' + | 'boxBounce2' + | 'triangle' + | 'arc' + | 'circle' + | 'squareCorners' + | 'circleQuarters' + | 'circleHalves' + | 'squish' + | 'toggle' + | 'toggle2' + | 'toggle3' + | 'toggle4' + | 'toggle5' + | 'toggle6' + | 'toggle7' + | 'toggle8' + | 'toggle9' + | 'toggle10' + | 'toggle11' + | 'toggle12' + | 'toggle13' + | 'arrow' + | 'arrow2' + | 'arrow3' + | 'bouncingBar' + | 'bouncingBall' + | 'smiley' + | 'monkey' + | 'hearts' + | 'clock' + | 'earth' + | 'moon' + | 'runner' + | 'pong' + | 'shark' + | 'dqpb' + | 'weather' + | 'christmas' + | 'grenade' + | 'point' + | 'layer'; + +export interface Spinner { + /** + * Recommended interval. + */ + readonly interval: number; + + /** + * A list of frames to show for the spinner. + */ + readonly frames: string[]; +} + +/** + * 60+ spinners for use in the terminal. + * + * @example + * + * const cliSpinners = require('cli-spinners'); + * console.log(cliSpinners.dots); + * + * // { + * // interval: 80, + * // frames: ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'] + * // } + */ +declare const cliSpinners: {readonly [spinnerName in SpinnerName]: Spinner}; + +export default cliSpinners; diff --git a/index.js b/index.js index 465d222..b61a7fa 100644 --- a/index.js +++ b/index.js @@ -1,2 +1,6 @@ 'use strict'; -module.exports = require('./spinners.json'); + +const spinners = Object.assign({}, require('./spinners.json')); + +module.exports = spinners; +module.exports.default = spinners; diff --git a/index.test-d.ts b/index.test-d.ts new file mode 100644 index 0000000..1b2c9d2 --- /dev/null +++ b/index.test-d.ts @@ -0,0 +1,4 @@ +import {expectType} from 'tsd-check'; +import cliSpinners, {Spinner} from '.'; + +expectType(cliSpinners.dots); diff --git a/package.json b/package.json index 7564d52..355128e 100644 --- a/package.json +++ b/package.json @@ -13,12 +13,13 @@ "node": ">=4" }, "scripts": { - "test": "xo && ava", + "test": "xo && ava && tsd-check", "asciicast": "asciinema rec --command='node example-all.js' --title='cli-spinner' --quiet" }, "files": [ - "index.js", - "spinners.json" + "index.js", + "index.d.ts", + "spinners.json" ], "keywords": [ "cli", @@ -38,8 +39,9 @@ "json" ], "devDependencies": { - "ava": "*", + "ava": "^1.2.1", "log-update": "^2.1.0", - "xo": "*" + "tsd-check": "^0.3.0", + "xo": "^0.24.0" } } diff --git a/test.js b/test.js index 0688b6c..d4dd2cd 100644 --- a/test.js +++ b/test.js @@ -1,7 +1,7 @@ import test from 'ava'; import m from '.'; -test(t => { +test('api', t => { t.is(typeof m, 'object'); t.is(m.dots.interval, 80); t.true(Array.isArray(m.dots.frames));