linespin
Version:
Simple progress output
94 lines (67 loc) • 2.01 kB
text/coffeescript
###
Linespin - Simple Progress Output
###
'use strict'
c = require './color'
class Linespin
_speed = undefined
_stdout = process.stdout
_spin = ['-', '\\', '|', '/']
_i = 0
constructor: (@message, @doneMessage, @speed) ->
@state = 'stopped'
@message ?= 'Please wait...'
@doneMessage ?= 'Finished'
@speed ?= 200
start: ->
if @state is 'stopped'
@state = 'running'
_stdout.write "\n"
_spinnerMessage @message
_continue @
stop: (message) ->
@state = 'stopped'
_reset()
_lastMessage message || @doneMessage
pending: (message) ->
_pendingMessage message
success: (message) ->
_successMessage message
error: (message) ->
_errorMessage message
warn: (message) ->
_warningMessage message
msg: (message) ->
_message message
# Private Methods
_reset = ->
_i = 0
_continue = (_this) ->
that = _this
setTimeout ->
that.start() if that.state is 'running'
, that.speed
_spinner = ->
"#{_spin[_i = (_i+1) % 4]}"
_prettify = (message, symbol, newline, replace, color1, color2) ->
color2 ?= color1
bump = if newline then "\n\n" else "\n"
override = if replace then "#{c.rewrite}#{c.rewrite}" else c.rewrite
_stdout.write "#{override}#{c[color1]}[#{symbol}] #{c[color2]}#{message}#{c.reset}#{bump}"
# Messages
_spinnerMessage = (message) ->
_prettify message, _spinner(), false, false, 'yellow', 'blue'
_lastMessage = (message) ->
_prettify message, '✓', false, false, 'green', 'blue'
_successMessage = (message) ->
_prettify message, '✓', true, true, 'green', 'grey'
_pendingMessage = (message) ->
_prettify message, '?', true, false, 'blue', 'white'
_message = (message) ->
_prettify message, '•', true, false, 'white'
_errorMessage = (message) ->
_prettify message, '!', true, false, 'red'
_warningMessage = (message) ->
_prettify message, '!', true, false, 'yellow'
# Export
module.exports = Linespin