summaryrefslogtreecommitdiffstats
path: root/node_modules/gauge
diff options
context:
space:
mode:
authorGravatar Piotr Russ <mail@pruss.it> 2020-11-16 00:10:28 +0100
committerGravatar Piotr Russ <mail@pruss.it> 2020-11-16 00:10:28 +0100
commite06ec920f7a5d784e674c4c4b4e6d1da3dc7391d (patch)
tree55713f725f77b44ebfec86e4eec3ce33e71458ca /node_modules/gauge
downloadwebsite_creator-e06ec920f7a5d784e674c4c4b4e6d1da3dc7391d.tar.gz
website_creator-e06ec920f7a5d784e674c4c4b4e6d1da3dc7391d.tar.bz2
website_creator-e06ec920f7a5d784e674c4c4b4e6d1da3dc7391d.zip
api, login, auth
Diffstat (limited to 'node_modules/gauge')
-rw-r--r--node_modules/gauge/CHANGELOG.md160
-rw-r--r--node_modules/gauge/LICENSE13
-rw-r--r--node_modules/gauge/README.md399
-rw-r--r--node_modules/gauge/base-theme.js14
-rw-r--r--node_modules/gauge/error.js24
-rw-r--r--node_modules/gauge/has-color.js12
-rw-r--r--node_modules/gauge/index.js233
-rw-r--r--node_modules/gauge/package.json91
-rw-r--r--node_modules/gauge/plumbing.js48
-rw-r--r--node_modules/gauge/process.js3
-rw-r--r--node_modules/gauge/progress-bar.js35
-rw-r--r--node_modules/gauge/render-template.js181
-rw-r--r--node_modules/gauge/set-immediate.js7
-rw-r--r--node_modules/gauge/set-interval.js3
-rw-r--r--node_modules/gauge/spin.js5
-rw-r--r--node_modules/gauge/template-item.js73
-rw-r--r--node_modules/gauge/theme-set.js115
-rw-r--r--node_modules/gauge/themes.js54
-rw-r--r--node_modules/gauge/wide-truncate.js25
19 files changed, 1495 insertions, 0 deletions
diff --git a/node_modules/gauge/CHANGELOG.md b/node_modules/gauge/CHANGELOG.md
new file mode 100644
index 0000000..407bc19
--- /dev/null
+++ b/node_modules/gauge/CHANGELOG.md
@@ -0,0 +1,160 @@
+### v2.7.4
+
+* Reset colors prior to ending a line, to eliminate flicker when a line
+ is trucated between start and end color sequences.
+
+### v2.7.3
+
+* Only create our onExit handler when we're enabled and remove it when we're
+ disabled. This stops us from creating multiple onExit handlers when
+ multiple gauge objects are being used.
+* Fix bug where if a theme name were given instead of a theme object, it
+ would crash.
+* Remove supports-color because it's not actually used. Uhm. Yes, I just
+ updated it. >.>
+
+### v2.7.2
+
+* Use supports-color instead of has-color (as the module has been renamed)
+
+### v2.7.1
+
+* Bug fix: Calls to show/pulse while the progress bar is disabled should still
+ update our internal representation of what would be shown should it be enabled.
+
+### v2.7.0
+
+* New feature: Add new `isEnabled` method to allow introspection of the gauge's
+ "enabledness" as controlled by `.enable()` and `.disable()`.
+
+### v2.6.0
+
+* Bug fix: Don't run the code associated with `enable`/`disable` if the gauge
+ is already enabled or disabled respectively. This prevents leaking event
+ listeners, amongst other weirdness.
+* New feature: Template items can have default values that will be used if no
+ value was otherwise passed in.
+
+### v2.5.3
+
+* Default to `enabled` only if we have a tty. Users can always override
+ this by passing in the `enabled` option explicitly or by calling calling
+ `gauge.enable()`.
+
+### v2.5.2
+
+* Externalized `./console-strings.js` into `console-control-strings`.
+
+### v2.5.1
+
+* Update to `signal-exit@3.0.0`, which fixes a compatibility bug with the
+ node profiler.
+* [#39](https://github.com/iarna/gauge/pull/39) Fix tests on 0.10 and add
+ a missing devDependency. ([@helloyou2012](https://github.com/helloyou2012))
+
+### v2.5.0
+
+* Add way to programmatically fetch a list of theme names in a themeset
+ (`Themeset.getThemeNames`).
+
+### v2.4.0
+
+* Add support for setting themesets on existing gauge objects.
+* Add post-IO callback to `gauge.hide()` as it is somtetimes necessary when
+ your terminal is interleaving output from multiple filehandles (ie, stdout
+ & stderr).
+
+### v2.3.1
+
+* Fix a refactor bug in setTheme where it wasn't accepting the various types
+ of args it should.
+
+### v2.3.0
+
+#### FEATURES
+
+* Add setTemplate & setTheme back in.
+* Add support for named themes, you can now ask for things like 'colorASCII'
+ and 'brailleSpinner'. Of course, you can still pass in theme objects.
+ Additionally you can now pass in an object with `hasUnicode`, `hasColor` and
+ `platform` keys in order to override our guesses as to those values when
+ selecting a default theme from the themeset.
+* Make the output stream optional (it defaults to `process.stderr` now).
+* Add `setWriteTo(stream[, tty])` to change the output stream and,
+ optionally, tty.
+
+#### BUG FIXES & REFACTORING
+
+* Abort the display phase early if we're supposed to be hidden and we are.
+* Stop printing a bunch of spaces at the end of lines, since we're already
+ using an erase-to-end-of-line code anyway.
+* The unicode themes were missing the subsection separator.
+
+### v2.2.1
+
+* Fix image in readme
+
+### v2.2.0
+
+* All new themes API– reference themes by name and pass in custom themes and
+ themesets (themesets get platform support autodetection done on them to
+ select the best theme). Theme mixins let you add features to all existing
+ themes.
+* Much, much improved test coverage.
+
+### v2.1.0
+
+* Got rid of ░ in the default platform, noUnicode, hasColor theme. Thanks
+ to @yongtw123 for pointing out this had snuck in.
+* Fiddled with the demo output to make it easier to see the spinner spin. Also
+ added prints before each platforms test output.
+* I forgot to include `signal-exit` in our deps. <.< Thank you @KenanY for
+ finding this. Then I was lazy and made a new commit instead of using his
+ PR. Again, thank you for your patience @KenenY.
+* Drastically speed up travis testing.
+* Add a small javascript demo (demo.js) for showing off the various themes
+ (and testing them on diff platforms).
+* Change: The subsection separator from ⁄ and / (different chars) to >.
+* Fix crasher: A show or pulse without a label would cause the template renderer
+ to complain about a missing value.
+* New feature: Add the ability to disable the clean-up-on-exit behavior.
+ Not something I expect to be widely desirable, but important if you have
+ multiple distinct gauge instances in your app.
+* Use our own color support detection.
+ The `has-color` module proved too magic for my needs, making assumptions
+ as to which stream we write to and reading command line arguments.
+
+### v2.0.0
+
+This is a major rewrite of the internals. Externally there are fewer
+changes:
+
+* On node>0.8 gauge object now prints updates at a fixed rate. This means
+ that when you call `show` it may wate up to `updateInterval` ms before it
+ actually prints an update. You override this behavior with the
+ `fixedFramerate` option.
+* The gauge object now keeps the cursor hidden as long as it's enabled and
+ shown.
+* The constructor's arguments have changed, now it takes a mandatory output
+ stream and an optional options object. The stream no longer needs to be
+ an `ansi`ified stream, although it can be if you want (but we won't make
+ use of its special features).
+* Previously the gauge was disabled by default if `process.stdout` wasn't a
+ tty. Now it always defaults to enabled. If you want the previous
+ behavior set the `enabled` option to `process.stdout.isTTY`.
+* The constructor's options have changed– see the docs for details.
+* Themes are entirely different. If you were using a custom theme, or
+ referring to one directly (eg via `Gauge.unicode` or `Gauge.ascii`) then
+ you'll need to change your code. You can get the equivalent of the latter
+ with:
+ ```
+ var themes = require('gauge/themes')
+ var unicodeTheme = themes(true, true) // returns the color unicode theme for your platform
+ ```
+ The default themes no longer use any ambiguous width characters, so even
+ if you choose to display those as wide your progress bar should still
+ display correctly.
+* Templates are entirely different and if you were using a custom one, you
+ should consult the documentation to learn how to recreate it. If you were
+ using the default, be aware that it has changed and the result looks quite
+ a bit different.
diff --git a/node_modules/gauge/LICENSE b/node_modules/gauge/LICENSE
new file mode 100644
index 0000000..e756052
--- /dev/null
+++ b/node_modules/gauge/LICENSE
@@ -0,0 +1,13 @@
+Copyright (c) 2014, Rebecca Turner <me@re-becca.org>
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/node_modules/gauge/README.md b/node_modules/gauge/README.md
new file mode 100644
index 0000000..bdd60e3
--- /dev/null
+++ b/node_modules/gauge/README.md
@@ -0,0 +1,399 @@
+gauge
+=====
+
+A nearly stateless terminal based horizontal gauge / progress bar.
+
+```javascript
+var Gauge = require("gauge")
+
+var gauge = new Gauge()
+
+gauge.show("test", 0.20)
+
+gauge.pulse("this")
+
+gauge.hide()
+```
+
+![](gauge-demo.gif)
+
+
+### CHANGES FROM 1.x
+
+Gauge 2.x is breaking release, please see the [changelog] for details on
+what's changed if you were previously a user of this module.
+
+[changelog]: CHANGELOG.md
+
+### THE GAUGE CLASS
+
+This is the typical interface to the module– it provides a pretty
+fire-and-forget interface to displaying your status information.
+
+```
+var Gauge = require("gauge")
+
+var gauge = new Gauge([stream], [options])
+```
+
+* **stream** – *(optional, default STDERR)* A stream that progress bar
+ updates are to be written to. Gauge honors backpressure and will pause
+ most writing if it is indicated.
+* **options** – *(optional)* An option object.
+
+Constructs a new gauge. Gauges are drawn on a single line, and are not drawn
+if **stream** isn't a tty and a tty isn't explicitly provided.
+
+If **stream** is a terminal or if you pass in **tty** to **options** then we
+will detect terminal resizes and redraw to fit. We do this by watching for
+`resize` events on the tty. (To work around a bug in verisons of Node prior
+to 2.5.0, we watch for them on stdout if the tty is stderr.) Resizes to
+larger window sizes will be clean, but shrinking the window will always
+result in some cruft.
+
+**IMPORTANT:** If you prevously were passing in a non-tty stream but you still
+want output (for example, a stream wrapped by the `ansi` module) then you
+need to pass in the **tty** option below, as `gauge` needs access to
+the underlying tty in order to do things like terminal resizes and terminal
+width detection.
+
+The **options** object can have the following properties, all of which are
+optional:
+
+* **updateInterval**: How often gauge updates should be drawn, in miliseconds.
+* **fixedFramerate**: Defaults to false on node 0.8, true on everything
+ else. When this is true a timer is created to trigger once every
+ `updateInterval` ms, when false, updates are printed as soon as they come
+ in but updates more often than `updateInterval` are ignored. The reason
+ 0.8 doesn't have this set to true is that it can't `unref` its timer and
+ so it would stop your program from exiting– if you want to use this
+ feature with 0.8 just make sure you call `gauge.disable()` before you
+ expect your program to exit.
+* **themes**: A themeset to use when selecting the theme to use. Defaults
+ to `gauge/themes`, see the [themes] documentation for details.
+* **theme**: Select a theme for use, it can be a:
+ * Theme object, in which case the **themes** is not used.
+ * The name of a theme, which will be looked up in the current *themes*
+ object.
+ * A configuration object with any of `hasUnicode`, `hasColor` or
+ `platform` keys, which if wlll be used to override our guesses when making
+ a default theme selection.
+
+ If no theme is selected then a default is picked using a combination of our
+ best guesses at your OS, color support and unicode support.
+* **template**: Describes what you want your gauge to look like. The
+ default is what npm uses. Detailed [documentation] is later in this
+ document.
+* **hideCursor**: Defaults to true. If true, then the cursor will be hidden
+ while the gauge is displayed.
+* **tty**: The tty that you're ultimately writing to. Defaults to the same
+ as **stream**. This is used for detecting the width of the terminal and
+ resizes. The width used is `tty.columns - 1`. If no tty is available then
+ a width of `79` is assumed.
+* **enabled**: Defaults to true if `tty` is a TTY, false otherwise. If true
+ the gauge starts enabled. If disabled then all update commands are
+ ignored and no gauge will be printed until you call `.enable()`.
+* **Plumbing**: The class to use to actually generate the gauge for
+ printing. This defaults to `require('gauge/plumbing')` and ordinarly you
+ shouldn't need to override this.
+* **cleanupOnExit**: Defaults to true. Ordinarily we register an exit
+ handler to make sure your cursor is turned back on and the progress bar
+ erased when your process exits, even if you Ctrl-C out or otherwise exit
+ unexpectedly. You can disable this and it won't register the exit handler.
+
+[has-unicode]: https://www.npmjs.com/package/has-unicode
+[themes]: #themes
+[documentation]: #templates
+
+#### `gauge.show(section | status, [completed])`
+
+The first argument is either the section, the name of the current thing
+contributing to progress, or an object with keys like **section**,
+**subsection** & **completed** (or any others you have types for in a custom
+template). If you don't want to update or set any of these you can pass
+`null` and it will be ignored.
+
+The second argument is the percent completed as a value between 0 and 1.
+Without it, completion is just not updated. You'll also note that completion
+can be passed in as part of a status object as the first argument. If both
+it and the completed argument are passed in, the completed argument wins.
+
+#### `gauge.hide([cb])`
+
+Removes the gauge from the terminal. Optionally, callback `cb` after IO has
+had an opportunity to happen (currently this just means after `setImmediate`
+has called back.)
+
+It turns out this is important when you're pausing the progress bar on one
+filehandle and printing to another– otherwise (with a big enough print) node
+can end up printing the "end progress bar" bits to the progress bar filehandle
+while other stuff is printing to another filehandle. These getting interleaved
+can cause corruption in some terminals.
+
+#### `gauge.pulse([subsection])`
+
+* **subsection** – *(optional)* The specific thing that triggered this pulse
+
+Spins the spinner in the gauge to show output. If **subsection** is
+included then it will be combined with the last name passed to `gauge.show`.
+
+#### `gauge.disable()`
+
+Hides the gauge and ignores further calls to `show` or `pulse`.
+
+#### `gauge.enable()`
+
+Shows the gauge and resumes updating when `show` or `pulse` is called.
+
+#### `gauge.isEnabled()`
+
+Returns true if the gauge is enabled.
+
+#### `gauge.setThemeset(themes)`
+
+Change the themeset to select a theme from. The same as the `themes` option
+used in the constructor. The theme will be reselected from this themeset.
+
+#### `gauge.setTheme(theme)`
+
+Change the active theme, will be displayed with the next show or pulse. This can be:
+
+* Theme object, in which case the **themes** is not used.
+* The name of a theme, which will be looked up in the current *themes*
+ object.
+* A configuration object with any of `hasUnicode`, `hasColor` or
+ `platform` keys, which if wlll be used to override our guesses when making
+ a default theme selection.
+
+If no theme is selected then a default is picked using a combination of our
+best guesses at your OS, color support and unicode support.
+
+#### `gauge.setTemplate(template)`
+
+Change the active template, will be displayed with the next show or pulse
+
+### Tracking Completion
+
+If you have more than one thing going on that you want to track completion
+of, you may find the related [are-we-there-yet] helpful. It's `change`
+event can be wired up to the `show` method to get a more traditional
+progress bar interface.
+
+[are-we-there-yet]: https://www.npmjs.com/package/are-we-there-yet
+
+### THEMES
+
+```
+var themes = require('gauge/themes')
+
+// fetch the default color unicode theme for this platform
+var ourTheme = themes({hasUnicode: true, hasColor: true})
+
+// fetch the default non-color unicode theme for osx
+var ourTheme = themes({hasUnicode: true, hasColor: false, platform: 'darwin'})
+
+// create a new theme based on the color ascii theme for this platform
+// that brackets the progress bar with arrows
+var ourTheme = themes.newTheme(theme(hasUnicode: false, hasColor: true}), {
+ preProgressbar: '→',
+ postProgressbar: '←'
+})
+```
+
+The object returned by `gauge/themes` is an instance of the `ThemeSet` class.
+
+```
+var ThemeSet = require('gauge/theme-set')
+var themes = new ThemeSet()
+// or
+var themes = require('gauge/themes')
+var mythemes = themes.newThemeset() // creates a new themeset based on the default themes
+```
+
+#### themes(opts)
+#### themes.getDefault(opts)
+
+Theme objects are a function that fetches the default theme based on
+platform, unicode and color support.
+
+Options is an object with the following properties:
+
+* **hasUnicode** - If true, fetch a unicode theme, if no unicode theme is
+ available then a non-unicode theme will be used.
+* **hasColor** - If true, fetch a color theme, if no color theme is
+ available a non-color theme will be used.
+* **platform** (optional) - Defaults to `process.platform`. If no
+ platform match is available then `fallback` is used instead.
+
+If no compatible theme can be found then an error will be thrown with a
+`code` of `EMISSINGTHEME`.
+
+#### themes.addTheme(themeName, themeObj)
+#### themes.addTheme(themeName, [parentTheme], newTheme)
+
+Adds a named theme to the themeset. You can pass in either a theme object,
+as returned by `themes.newTheme` or the arguments you'd pass to
+`themes.newTheme`.
+
+#### themes.getThemeNames()
+
+Return a list of all of the names of the themes in this themeset. Suitable
+for use in `themes.getTheme(…)`.
+
+#### themes.getTheme(name)
+
+Returns the theme object from this theme set named `name`.
+
+If `name` does not exist in this themeset an error will be thrown with
+a `code` of `EMISSINGTHEME`.
+
+#### themes.setDefault([opts], themeName)
+
+`opts` is an object with the following properties.
+
+* **platform** - Defaults to `'fallback'`. If your theme is platform
+ specific, specify that here with the platform from `process.platform`, eg,
+ `win32`, `darwin`, etc.
+* **hasUnicode** - Defaults to `false`. If your theme uses unicode you
+ should set this to true.
+* **hasColor** - Defaults to `false`. If your theme uses color you should
+ set this to true.
+
+`themeName` is the name of the theme (as given to `addTheme`) to use for
+this set of `opts`.
+
+#### themes.newTheme([parentTheme,] newTheme)
+
+Create a new theme object based on `parentTheme`. If no `parentTheme` is
+provided then a minimal parentTheme that defines functions for rendering the
+activity indicator (spinner) and progress bar will be defined. (This
+fallback parent is defined in `gauge/base-theme`.)
+
+newTheme should be a bare object– we'll start by discussing the properties
+defined by the default themes:
+
+* **preProgressbar** - displayed prior to the progress bar, if the progress
+ bar is displayed.
+* **postProgressbar** - displayed after the progress bar, if the progress bar
+ is displayed.
+* **progressBarTheme** - The subtheme passed through to the progress bar
+ renderer, it's an object with `complete` and `remaining` properties
+ that are the strings you want repeated for those sections of the progress
+ bar.
+* **activityIndicatorTheme** - The theme for the activity indicator (spinner),
+ this can either be a string, in which each character is a different step, or
+ an array of strings.
+* **preSubsection** - Displayed as a separator between the `section` and
+ `subsection` when the latter is printed.
+
+More generally, themes can have any value that would be a valid value when rendering
+templates. The properties in the theme are used when their name matches a type in
+the template. Their values can be:
+
+* **strings & numbers** - They'll be included as is
+* **function (values, theme, width)** - Should return what you want in your output.
+ *values* is an object with values provided via `gauge.show`,
+ *theme* is the theme specific to this item (see below) or this theme object,
+ and *width* is the number of characters wide your result should be.
+
+There are a couple of special prefixes:
+
+* **pre** - Is shown prior to the property, if its displayed.
+* **post** - Is shown after the property, if its displayed.
+
+And one special suffix:
+
+* **Theme** - Its value is passed to a function-type item as the theme.
+
+#### themes.addToAllThemes(theme)
+
+This *mixes-in* `theme` into all themes currently defined. It also adds it
+to the default parent theme for this themeset, so future themes added to
+this themeset will get the values from `theme` by default.
+
+#### themes.newThemeset()
+
+Copy the current themeset into a new one. This allows you to easily inherit
+one themeset from another.
+
+### TEMPLATES
+
+A template is an array of objects and strings that, after being evaluated,
+will be turned into the gauge line. The default template is:
+
+```javascript
+[
+ {type: 'progressbar', length: 20},
+ {type: 'activityIndicator', kerning: 1, length: 1},
+ {type: 'section', kerning: 1, default: ''},
+ {type: 'subsection', kerning: 1, default: ''}
+]
+```
+
+The various template elements can either be **plain strings**, in which case they will
+be be included verbatum in the output, or objects with the following properties:
+
+* *type* can be any of the following plus any keys you pass into `gauge.show` plus
+ any keys you have on a custom theme.
+ * `section` – What big thing you're working on now.
+ * `subsection` – What component of that thing is currently working.
+ * `activityIndicator` – Shows a spinner using the `activityIndicatorTheme`
+ from your active theme.
+ * `progressbar` – A progress bar representing your current `completed`
+ using the `progressbarTheme` from your active theme.
+* *kerning* – Number of spaces that must be between this item and other
+ items, if this item is displayed at all.
+* *maxLength* – The maximum length for this element. If its value is longer it
+ will be truncated.
+* *minLength* – The minimum length for this element. If its value is shorter it
+ will be padded according to the *align* value.
+* *align* – (Default: left) Possible values "left", "right" and "center". Works
+ as you'd expect from word processors.
+* *length* – Provides a single value for both *minLength* and *maxLength*. If both
+ *length* and *minLength or *maxLength* are specifed then the latter take precedence.
+* *value* – A literal value to use for this template item.
+* *default* – A default value to use for this template item if a value
+ wasn't otherwise passed in.
+
+### PLUMBING
+
+This is the super simple, assume nothing, do no magic internals used by gauge to
+implement its ordinary interface.
+
+```
+var Plumbing = require('gauge/plumbing')
+var gauge = new Plumbing(theme, template, width)
+```
+
+* **theme**: The theme to use.
+* **template**: The template to use.
+* **width**: How wide your gauge should be
+
+#### `gauge.setTheme(theme)`
+
+Change the active theme.
+
+#### `gauge.setTemplate(template)`
+
+Change the active template.
+
+#### `gauge.setWidth(width)`
+
+Change the width to render at.
+
+#### `gauge.hide()`
+
+Return the string necessary to hide the progress bar
+
+#### `gauge.hideCursor()`
+
+Return a string to hide the cursor.
+
+#### `gauge.showCursor()`
+
+Return a string to show the cursor.
+
+#### `gauge.show(status)`
+
+Using `status` for values, render the provided template with the theme and return
+a string that is suitable for printing to update the gauge.
diff --git a/node_modules/gauge/base-theme.js b/node_modules/gauge/base-theme.js
new file mode 100644
index 0000000..0b67638
--- /dev/null
+++ b/node_modules/gauge/base-theme.js
@@ -0,0 +1,14 @@
+'use strict'
+var spin = require('./spin.js')
+var progressBar = require('./progress-bar.js')
+
+module.exports = {
+ activityIndicator: function (values, theme, width) {
+ if (values.spun == null) return
+ return spin(theme, values.spun)
+ },
+ progressbar: function (values, theme, width) {
+ if (values.completed == null) return
+ return progressBar(theme, width, values.completed)
+ }
+}
diff --git a/node_modules/gauge/error.js b/node_modules/gauge/error.js
new file mode 100644
index 0000000..d9914ba
--- /dev/null
+++ b/node_modules/gauge/error.js
@@ -0,0 +1,24 @@
+'use strict'
+var util = require('util')
+
+var User = exports.User = function User (msg) {
+ var err = new Error(msg)
+ Error.captureStackTrace(err, User)
+ err.code = 'EGAUGE'
+ return err
+}
+
+exports.MissingTemplateValue = function MissingTemplateValue (item, values) {
+ var err = new User(util.format('Missing template value "%s"', item.type))
+ Error.captureStackTrace(err, MissingTemplateValue)
+ err.template = item
+ err.values = values
+ return err
+}
+
+exports.Internal = function Internal (msg) {
+ var err = new Error(msg)
+ Error.captureStackTrace(err, Internal)
+ err.code = 'EGAUGEINTERNAL'
+ return err
+}
diff --git a/node_modules/gauge/has-color.js b/node_modules/gauge/has-color.js
new file mode 100644
index 0000000..e283a25
--- /dev/null
+++ b/node_modules/gauge/has-color.js
@@ -0,0 +1,12 @@
+'use strict'
+
+module.exports = isWin32() || isColorTerm()
+
+function isWin32 () {
+ return process.platform === 'win32'
+}
+
+function isColorTerm () {
+ var termHasColor = /^screen|^xterm|^vt100|color|ansi|cygwin|linux/i
+ return !!process.env.COLORTERM || termHasColor.test(process.env.TERM)
+}
diff --git a/node_modules/gauge/index.js b/node_modules/gauge/index.js
new file mode 100644
index 0000000..c553240
--- /dev/null
+++ b/node_modules/gauge/index.js
@@ -0,0 +1,233 @@
+'use strict'
+var Plumbing = require('./plumbing.js')
+var hasUnicode = require('has-unicode')
+var hasColor = require('./has-color.js')
+var onExit = require('signal-exit')
+var defaultThemes = require('./themes')
+var setInterval = require('./set-interval.js')
+var process = require('./process.js')
+var setImmediate = require('./set-immediate')
+
+module.exports = Gauge
+
+function callWith (obj, method) {
+ return function () {
+ return method.call(obj)
+ }
+}
+
+function Gauge (arg1, arg2) {
+ var options, writeTo
+ if (arg1 && arg1.write) {
+ writeTo = arg1
+ options = arg2 || {}
+ } else if (arg2 && arg2.write) {
+ writeTo = arg2
+ options = arg1 || {}
+ } else {
+ writeTo = process.stderr
+ options = arg1 || arg2 || {}
+ }
+
+ this._status = {
+ spun: 0,
+ section: '',
+ subsection: ''
+ }
+ this._paused = false // are we paused for back pressure?
+ this._disabled = true // are all progress bar updates disabled?
+ this._showing = false // do we WANT the progress bar on screen
+ this._onScreen = false // IS the progress bar on screen
+ this._needsRedraw = false // should we print something at next tick?
+ this._hideCursor = options.hideCursor == null ? true : options.hideCursor
+ this._fixedFramerate = options.fixedFramerate == null
+ ? !(/^v0\.8\./.test(process.version))
+ : options.fixedFramerate
+ this._lastUpdateAt = null
+ this._updateInterval = options.updateInterval == null ? 50 : options.updateInterval
+
+ this._themes = options.themes || defaultThemes
+ this._theme = options.theme
+ var theme = this._computeTheme(options.theme)
+ var template = options.template || [
+ {type: 'progressbar', length: 20},
+ {type: 'activityIndicator', kerning: 1, length: 1},
+ {type: 'section', kerning: 1, default: ''},
+ {type: 'subsection', kerning: 1, default: ''}
+ ]
+ this.setWriteTo(writeTo, options.tty)
+ var PlumbingClass = options.Plumbing || Plumbing
+ this._gauge = new PlumbingClass(theme, template, this.getWidth())
+
+ this._$$doRedraw = callWith(this, this._doRedraw)
+ this._$$handleSizeChange = callWith(this, this._handleSizeChange)
+
+ this._cleanupOnExit = options.cleanupOnExit == null || options.cleanupOnExit
+ this._removeOnExit = null
+
+ if (options.enabled || (options.enabled == null && this._tty && this._tty.isTTY)) {
+ this.enable()
+ } else {
+ this.disable()
+ }
+}
+Gauge.prototype = {}
+
+Gauge.prototype.isEnabled = function () {
+ return !this._disabled
+}
+
+Gauge.prototype.setTemplate = function (template) {
+ this._gauge.setTemplate(template)
+ if (this._showing) this._requestRedraw()
+}
+
+Gauge.prototype._computeTheme = function (theme) {
+ if (!theme) theme = {}
+ if (typeof theme === 'string') {
+ theme = this._themes.getTheme(theme)
+ } else if (theme && (Object.keys(theme).length === 0 || theme.hasUnicode != null || theme.hasColor != null)) {
+ var useUnicode = theme.hasUnicode == null ? hasUnicode() : theme.hasUnicode
+ var useColor = theme.hasColor == null ? hasColor : theme.hasColor
+ theme = this._themes.getDefault({hasUnicode: useUnicode, hasColor: useColor, platform: theme.platform})
+ }
+ return theme
+}
+
+Gauge.prototype.setThemeset = function (themes) {
+ this._themes = themes
+ this.setTheme(this._theme)
+}
+
+Gauge.prototype.setTheme = function (theme) {
+ this._gauge.setTheme(this._computeTheme(theme))
+ if (this._showing) this._requestRedraw()
+ this._theme = theme
+}
+
+Gauge.prototype._requestRedraw = function () {
+ this._needsRedraw = true
+ if (!this._fixedFramerate) this._doRedraw()
+}
+
+Gauge.prototype.getWidth = function () {
+ return ((this._tty && this._tty.columns) || 80) - 1
+}
+
+Gauge.prototype.setWriteTo = function (writeTo, tty) {
+ var enabled = !this._disabled
+ if (enabled) this.disable()
+ this._writeTo = writeTo
+ this._tty = tty ||
+ (writeTo === process.stderr && process.stdout.isTTY && process.stdout) ||
+ (writeTo.isTTY && writeTo) ||
+ this._tty
+ if (this._gauge) this._gauge.setWidth(this.getWidth())
+ if (enabled) this.enable()
+}
+
+Gauge.prototype.enable = function () {
+ if (!this._disabled) return
+ this._disabled = false
+ if (this._tty) this._enableEvents()
+ if (this._showing) this.show()
+}
+
+Gauge.prototype.disable = function () {
+ if (this._disabled) return
+ if (this._showing) {
+ this._lastUpdateAt = null
+ this._showing = false
+ this._doRedraw()
+ this._showing = true
+ }
+ this._disabled = true
+ if (this._tty) this._disableEvents()
+}
+
+Gauge.prototype._enableEvents = function () {
+ if (this._cleanupOnExit) {
+ this._removeOnExit = onExit(callWith(this, this.disable))
+ }
+ this._tty.on('resize', this._$$handleSizeChange)
+ if (this._fixedFramerate) {
+ this.redrawTracker = setInterval(this._$$doRedraw, this._updateInterval)
+ if (this.redrawTracker.unref) this.redrawTracker.unref()
+ }
+}
+
+Gauge.prototype._disableEvents = function () {
+ this._tty.removeListener('resize', this._$$handleSizeChange)
+ if (this._fixedFramerate) clearInterval(this.redrawTracker)
+ if (this._removeOnExit) this._removeOnExit()
+}
+
+Gauge.prototype.hide = function (cb) {
+ if (this._disabled) return cb && process.nextTick(cb)
+ if (!this._showing) return cb && process.nextTick(cb)
+ this._showing = false
+ this._doRedraw()
+ cb && setImmediate(cb)
+}
+
+Gauge.prototype.show = function (section, completed) {
+ this._showing = true
+ if (typeof section === 'string') {
+ this._status.section = section
+ } else if (typeof section === 'object') {
+ var sectionKeys = Object.keys(section)
+ for (var ii = 0; ii < sectionKeys.length; ++ii) {
+ var key = sectionKeys[ii]
+ this._status[key] = section[key]
+ }
+ }
+ if (completed != null) this._status.completed = completed
+ if (this._disabled) return
+ this._requestRedraw()
+}
+
+Gauge.prototype.pulse = function (subsection) {
+ this._status.subsection = subsection || ''
+ this._status.spun ++
+ if (this._disabled) return
+ if (!this._showing) return
+ this._requestRedraw()
+}
+
+Gauge.prototype._handleSizeChange = function () {
+ this._gauge.setWidth(this._tty.columns - 1)
+ this._requestRedraw()
+}
+
+Gauge.prototype._doRedraw = function () {
+ if (this._disabled || this._paused) return
+ if (!this._fixedFramerate) {
+ var now = Date.now()
+ if (this._lastUpdateAt && now - this._lastUpdateAt < this._updateInterval) return
+ this._lastUpdateAt = now
+ }
+ if (!this._showing && this._onScreen) {
+ this._onScreen = false
+ var result = this._gauge.hide()
+ if (this._hideCursor) {
+ result += this._gauge.showCursor()
+ }
+ return this._writeTo.write(result)
+ }
+ if (!this._showing && !this._onScreen) return
+ if (this._showing && !this._onScreen) {
+ this._onScreen = true
+ this._needsRedraw = true
+ if (this._hideCursor) {
+ this._writeTo.write(this._gauge.hideCursor())
+ }
+ }
+ if (!this._needsRedraw) return
+ if (!this._writeTo.write(this._gauge.show(this._status))) {
+ this._paused = true
+ this._writeTo.on('drain', callWith(this, function () {
+ this._paused = false
+ this._doRedraw()
+ }))
+ }
+}
diff --git a/node_modules/gauge/package.json b/node_modules/gauge/package.json
new file mode 100644
index 0000000..382d26f
--- /dev/null
+++ b/node_modules/gauge/package.json
@@ -0,0 +1,91 @@
+{
+ "_from": "gauge@~2.7.3",
+ "_id": "gauge@2.7.4",
+ "_inBundle": false,
+ "_integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
+ "_location": "/gauge",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "range",
+ "registry": true,
+ "raw": "gauge@~2.7.3",
+ "name": "gauge",
+ "escapedName": "gauge",
+ "rawSpec": "~2.7.3",
+ "saveSpec": null,
+ "fetchSpec": "~2.7.3"
+ },
+ "_requiredBy": [
+ "/npmlog"
+ ],
+ "_resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
+ "_shasum": "2c03405c7538c39d7eb37b317022e325fb018bf7",
+ "_spec": "gauge@~2.7.3",
+ "_where": "/home/pruss/Dev/3-minute-website/node_modules/npmlog",
+ "author": {
+ "name": "Rebecca Turner",
+ "email": "me@re-becca.org"
+ },
+ "bugs": {
+ "url": "https://github.com/iarna/gauge/issues"
+ },
+ "bundleDependencies": false,
+ "dependencies": {
+ "aproba": "^1.0.3",
+ "console-control-strings": "^1.0.0",
+ "has-unicode": "^2.0.0",
+ "object-assign": "^4.1.0",
+ "signal-exit": "^3.0.0",
+ "string-width": "^1.0.1",
+ "strip-ansi": "^3.0.1",
+ "wide-align": "^1.1.0"
+ },
+ "deprecated": false,
+ "description": "A terminal based horizontal guage",
+ "devDependencies": {
+ "readable-stream": "^2.0.6",
+ "require-inject": "^1.4.0",
+ "standard": "^7.1.2",
+ "tap": "^5.7.2",
+ "through2": "^2.0.0"
+ },
+ "files": [
+ "base-theme.js",
+ "CHANGELOG.md",
+ "error.js",
+ "has-color.js",
+ "index.js",
+ "LICENSE",
+ "package.json",
+ "plumbing.js",
+ "process.js",
+ "progress-bar.js",
+ "README.md",
+ "render-template.js",
+ "set-immediate.js",
+ "set-interval.js",
+ "spin.js",
+ "template-item.js",
+ "theme-set.js",
+ "themes.js",
+ "wide-truncate.js"
+ ],
+ "homepage": "https://github.com/iarna/gauge",
+ "keywords": [
+ "progressbar",
+ "progress",
+ "gauge"
+ ],
+ "license": "ISC",
+ "main": "index.js",
+ "name": "gauge",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/iarna/gauge.git"
+ },
+ "scripts": {
+ "prepublish": "rm -f *~",
+ "test": "standard && tap test/*.js --coverage"
+ },
+ "version": "2.7.4"
+}
diff --git a/node_modules/gauge/plumbing.js b/node_modules/gauge/plumbing.js
new file mode 100644
index 0000000..1afb4af
--- /dev/null
+++ b/node_modules/gauge/plumbing.js
@@ -0,0 +1,48 @@
+'use strict'
+var consoleControl = require('console-control-strings')
+var renderTemplate = require('./render-template.js')
+var validate = require('aproba')
+
+var Plumbing = module.exports = function (theme, template, width) {
+ if (!width) width = 80
+ validate('OAN', [theme, template, width])
+ this.showing = false
+ this.theme = theme
+ this.width = width
+ this.template = template
+}
+Plumbing.prototype = {}
+
+Plumbing.prototype.setTheme = function (theme) {
+ validate('O', [theme])
+ this.theme = theme
+}
+
+Plumbing.prototype.setTemplate = function (template) {
+ validate('A', [template])
+ this.template = template
+}
+
+Plumbing.prototype.setWidth = function (width) {
+ validate('N', [width])
+ this.width = width
+}
+
+Plumbing.prototype.hide = function () {
+ return consoleControl.gotoSOL() + consoleControl.eraseLine()
+}
+
+Plumbing.prototype.hideCursor = consoleControl.hideCursor
+
+Plumbing.prototype.showCursor = consoleControl.showCursor
+
+Plumbing.prototype.show = function (status) {
+ var values = Object.create(this.theme)
+ for (var key in status) {
+ values[key] = status[key]
+ }
+
+ return renderTemplate(this.width, this.template, values).trim() +
+ consoleControl.color('reset') +
+ consoleControl.eraseLine() + consoleControl.gotoSOL()
+}
diff --git a/node_modules/gauge/process.js b/node_modules/gauge/process.js
new file mode 100644
index 0000000..05e8569
--- /dev/null
+++ b/node_modules/gauge/process.js
@@ -0,0 +1,3 @@
+'use strict'
+// this exists so we can replace it during testing
+module.exports = process
diff --git a/node_modules/gauge/progress-bar.js b/node_modules/gauge/progress-bar.js
new file mode 100644
index 0000000..7f8dd68
--- /dev/null
+++ b/node_modules/gauge/progress-bar.js
@@ -0,0 +1,35 @@
+'use strict'
+var validate = require('aproba')
+var renderTemplate = require('./render-template.js')
+var wideTruncate = require('./wide-truncate')
+var stringWidth = require('string-width')
+
+module.exports = function (theme, width, completed) {
+ validate('ONN', [theme, width, completed])
+ if (completed < 0) completed = 0
+ if (completed > 1) completed = 1
+ if (width <= 0) return ''
+ var sofar = Math.round(width * completed)
+ var rest = width - sofar
+ var template = [
+ {type: 'complete', value: repeat(theme.complete, sofar), length: sofar},
+ {type: 'remaining', value: repeat(theme.remaining, rest), length: rest}
+ ]
+ return renderTemplate(width, template, theme)
+}
+
+// lodash's way of repeating
+function repeat (string, width) {
+ var result = ''
+ var n = width
+ do {
+ if (n % 2) {
+ result += string
+ }
+ n = Math.floor(n / 2)
+ /*eslint no-self-assign: 0*/
+ string += string
+ } while (n && stringWidth(result) < width)
+
+ return wideTruncate(result, width)
+}
diff --git a/node_modules/gauge/render-template.js b/node_modules/gauge/render-template.js
new file mode 100644
index 0000000..3261bfb
--- /dev/null
+++ b/node_modules/gauge/render-template.js
@@ -0,0 +1,181 @@
+'use strict'
+var align = require('wide-align')
+var validate = require('aproba')
+var objectAssign = require('object-assign')
+var wideTruncate = require('./wide-truncate')
+var error = require('./error')
+var TemplateItem = require('./template-item')
+
+function renderValueWithValues (values) {
+ return function (item) {
+ return renderValue(item, values)
+ }
+}
+
+var renderTemplate = module.exports = function (width, template, values) {
+ var items = prepareItems(width, template, values)
+ var rendered = items.map(renderValueWithValues(values)).join('')
+ return align.left(wideTruncate(rendered, width), width)
+}
+
+function preType (item) {
+ var cappedTypeName = item.type[0].toUpperCase() + item.type.slice(1)
+ return 'pre' + cappedTypeName
+}
+
+function postType (item) {
+ var cappedTypeName = item.type[0].toUpperCase() + item.type.slice(1)
+ return 'post' + cappedTypeName
+}
+
+function hasPreOrPost (item, values) {
+ if (!item.type) return
+ return values[preType(item)] || values[postType(item)]
+}
+
+function generatePreAndPost (baseItem, parentValues) {
+ var item = objectAssign({}, baseItem)
+ var values = Object.create(parentValues)
+ var template = []
+ var pre = preType(item)
+ var post = postType(item)
+ if (values[pre]) {
+ template.push({value: values[pre]})
+ values[pre] = null
+ }
+ item.minLength = null
+ item.length = null
+ item.maxLength = null
+ template.push(item)
+ values[item.type] = values[item.type]
+ if (values[post]) {
+ template.push({value: values[post]})
+ values[post] = null
+ }
+ return function ($1, $2, length) {
+ return renderTemplate(length, template, values)
+ }
+}
+
+function prepareItems (width, template, values) {
+ function cloneAndObjectify (item, index, arr) {
+ var cloned = new TemplateItem(item, width)
+ var type = cloned.type
+ if (cloned.value == null) {
+ if (!(type in values)) {
+ if (cloned.default == null) {
+ throw new error.MissingTemplateValue(cloned, values)
+ } else {
+ cloned.value = cloned.default
+ }
+ } else {
+ cloned.value = values[type]
+ }
+ }
+ if (cloned.value == null || cloned.value === '') return null
+ cloned.index = index
+ cloned.first = index === 0
+ cloned.last = index === arr.length - 1
+ if (hasPreOrPost(cloned, values)) cloned.value = generatePreAndPost(cloned, values)
+ return cloned
+ }
+
+ var output = template.map(cloneAndObjectify).filter(function (item) { return item != null })
+
+ var outputLength = 0
+ var remainingSpace = width
+ var variableCount = output.length
+
+ function consumeSpace (length) {
+ if (length > remainingSpace) length = remainingSpace
+ outputLength += length
+ remainingSpace -= length
+ }
+
+ function finishSizing (item, length) {
+ if (item.finished) throw new error.Internal('Tried to finish template item that was already finished')
+ if (length === Infinity) throw new error.Internal('Length of template item cannot be infinity')
+ if (length != null) item.length = length
+ item.minLength = null
+ item.maxLength = null
+ --variableCount
+ item.finished = true
+ if (item.length == null) item.length = item.getBaseLength()
+ if (item.length == null) throw new error.Internal('Finished template items must have a length')
+ consumeSpace(item.getLength())
+ }
+
+ output.forEach(function (item) {
+ if (!item.kerning) return
+ var prevPadRight = item.first ? 0 : output[item.index - 1].padRight
+ if (!item.first && prevPadRight < item.kerning) item.padLeft = item.kerning - prevPadRight
+ if (!item.last) item.padRight = item.kerning
+ })
+
+ // Finish any that have a fixed (literal or intuited) length
+ output.forEach(function (item) {
+ if (item.getBaseLength() == null) return
+ finishSizing(item)
+ })
+
+ var resized = 0
+ var resizing
+ var hunkSize
+ do {
+ resizing = false
+ hunkSize = Math.round(remainingSpace / variableCount)
+ output.forEach(function (item) {
+ if (item.finished) return
+ if (!item.maxLength) return
+ if (item.getMaxLength() < hunkSize) {
+ finishSizing(item, item.maxLength)
+ resizing = true
+ }
+ })
+ } while (resizing && resized++ < output.length)
+ if (resizing) throw new error.Internal('Resize loop iterated too many times while determining maxLength')
+
+ resized = 0
+ do {
+ resizing = false
+ hunkSize = Math.round(remainingSpace / variableCount)
+ output.forEach(function (item) {
+ if (item.finished) return
+ if (!item.minLength) return
+ if (item.getMinLength() >= hunkSize) {
+ finishSizing(item, item.minLength)
+ resizing = true
+ }
+ })
+ } while (resizing && resized++ < output.length)
+ if (resizing) throw new error.Internal('Resize loop iterated too many times while determining minLength')
+
+ hunkSize = Math.round(remainingSpace / variableCount)
+ output.forEach(function (item) {
+ if (item.finished) return
+ finishSizing(item, hunkSize)
+ })
+
+ return output
+}
+
+function renderFunction (item, values, length) {
+ validate('OON', arguments)
+ if (item.type) {
+ return item.value(values, values[item.type + 'Theme'] || {}, length)
+ } else {
+ return item.value(values, {}, length)
+ }
+}
+
+function renderValue (item, values) {
+ var length = item.getBaseLength()
+ var value = typeof item.value === 'function' ? renderFunction(item, values, length) : item.value
+ if (value == null || value === '') return ''
+ var alignWith = align[item.align] || align.left
+ var leftPadding = item.padLeft ? align.left('', item.padLeft) : ''
+ var rightPadding = item.padRight ? align.right('', item.padRight) : ''
+ var truncated = wideTruncate(String(value), length)
+ var aligned = alignWith(truncated, length)
+ return leftPadding + aligned + rightPadding
+}
diff --git a/node_modules/gauge/set-immediate.js b/node_modules/gauge/set-immediate.js
new file mode 100644
index 0000000..6650a48
--- /dev/null
+++ b/node_modules/gauge/set-immediate.js
@@ -0,0 +1,7 @@
+'use strict'
+var process = require('./process')
+try {
+ module.exports = setImmediate
+} catch (ex) {
+ module.exports = process.nextTick
+}
diff --git a/node_modules/gauge/set-interval.js b/node_modules/gauge/set-interval.js
new file mode 100644
index 0000000..5761987
--- /dev/null
+++ b/node_modules/gauge/set-interval.js
@@ -0,0 +1,3 @@
+'use strict'
+// this exists so we can replace it during testing
+module.exports = setInterval
diff --git a/node_modules/gauge/spin.js b/node_modules/gauge/spin.js
new file mode 100644
index 0000000..34142ee
--- /dev/null
+++ b/node_modules/gauge/spin.js
@@ -0,0 +1,5 @@
+'use strict'
+
+module.exports = function spin (spinstr, spun) {
+ return spinstr[spun % spinstr.length]
+}
diff --git a/node_modules/gauge/template-item.js b/node_modules/gauge/template-item.js
new file mode 100644
index 0000000..e46f447
--- /dev/null
+++ b/node_modules/gauge/template-item.js
@@ -0,0 +1,73 @@
+'use strict'
+var stringWidth = require('string-width')
+
+module.exports = TemplateItem
+
+function isPercent (num) {
+ if (typeof num !== 'string') return false
+ return num.slice(-1) === '%'
+}
+
+function percent (num) {
+ return Number(num.slice(0, -1)) / 100
+}
+
+function TemplateItem (values, outputLength) {
+ this.overallOutputLength = outputLength
+ this.finished = false
+ this.type = null
+ this.value = null
+ this.length = null
+ this.maxLength = null
+ this.minLength = null
+ this.kerning = null
+ this.align = 'left'
+ this.padLeft = 0
+ this.padRight = 0
+ this.index = null
+ this.first = null
+ this.last = null
+ if (typeof values === 'string') {
+ this.value = values
+ } else {
+ for (var prop in values) this[prop] = values[prop]
+ }
+ // Realize percents
+ if (isPercent(this.length)) {
+ this.length = Math.round(this.overallOutputLength * percent(this.length))
+ }
+ if (isPercent(this.minLength)) {
+ this.minLength = Math.round(this.overallOutputLength * percent(this.minLength))
+ }
+ if (isPercent(this.maxLength)) {
+ this.maxLength = Math.round(this.overallOutputLength * percent(this.maxLength))
+ }
+ return this
+}
+
+TemplateItem.prototype = {}
+
+TemplateItem.prototype.getBaseLength = function () {
+ var length = this.length
+ if (length == null && typeof this.value === 'string' && this.maxLength == null && this.minLength == null) {
+ length = stringWidth(this.value)
+ }
+ return length
+}
+
+TemplateItem.prototype.getLength = function () {
+ var length = this.getBaseLength()
+ if (length == null) return null
+ return length + this.padLeft + this.padRight
+}
+
+TemplateItem.prototype.getMaxLength = function () {
+ if (this.maxLength == null) return null
+ return this.maxLength + this.padLeft + this.padRight
+}
+
+TemplateItem.prototype.getMinLength = function () {
+ if (this.minLength == null) return null
+ return this.minLength + this.padLeft + this.padRight
+}
+
diff --git a/node_modules/gauge/theme-set.js b/node_modules/gauge/theme-set.js
new file mode 100644
index 0000000..68971d5
--- /dev/null
+++ b/node_modules/gauge/theme-set.js
@@ -0,0 +1,115 @@
+'use strict'
+var objectAssign = require('object-assign')
+
+module.exports = function () {
+ return ThemeSetProto.newThemeSet()
+}
+
+var ThemeSetProto = {}
+
+ThemeSetProto.baseTheme = require('./base-theme.js')
+
+ThemeSetProto.newTheme = function (parent, theme) {
+ if (!theme) {
+ theme = parent
+ parent = this.baseTheme
+ }
+ return objectAssign({}, parent, theme)
+}
+
+ThemeSetProto.getThemeNames = function () {
+ return Object.keys(this.themes)
+}
+
+ThemeSetProto.addTheme = function (name, parent, theme) {
+ this.themes[name] = this.newTheme(parent, theme)
+}
+
+ThemeSetProto.addToAllThemes = function (theme) {
+ var themes = this.themes
+ Object.keys(themes).forEach(function (name) {
+ objectAssign(themes[name], theme)
+ })
+ objectAssign(this.baseTheme, theme)
+}
+
+ThemeSetProto.getTheme = function (name) {
+ if (!this.themes[name]) throw this.newMissingThemeError(name)
+ return this.themes[name]
+}
+
+ThemeSetProto.setDefault = function (opts, name) {
+ if (name == null) {
+ name = opts
+ opts = {}
+ }
+ var platform = opts.platform == null ? 'fallback' : opts.platform
+ var hasUnicode = !!opts.hasUnicode
+ var hasColor = !!opts.hasColor
+ if (!this.defaults[platform]) this.defaults[platform] = {true: {}, false: {}}
+ this.defaults[platform][hasUnicode][hasColor] = name
+}
+
+ThemeSetProto.getDefault = function (opts) {
+ if (!opts) opts = {}
+ var platformName = opts.platform || process.platform
+ var platform = this.defaults[platformName] || this.defaults.fallback
+ var hasUnicode = !!opts.hasUnicode
+ var hasColor = !!opts.hasColor
+ if (!platform) throw this.newMissingDefaultThemeError(platformName, hasUnicode, hasColor)
+ if (!platform[hasUnicode][hasColor]) {
+ if (hasUnicode && hasColor && platform[!hasUnicode][hasColor]) {
+ hasUnicode = false
+ } else if (hasUnicode && hasColor && platform[hasUnicode][!hasColor]) {
+ hasColor = false
+ } else if (hasUnicode && hasColor && platform[!hasUnicode][!hasColor]) {
+ hasUnicode = false
+ hasColor = false
+ } else if (hasUnicode && !hasColor && platform[!hasUnicode][hasColor]) {
+ hasUnicode = false
+ } else if (!hasUnicode && hasColor && platform[hasUnicode][!hasColor]) {
+ hasColor = false
+ } else if (platform === this.defaults.fallback) {
+ throw this.newMissingDefaultThemeError(platformName, hasUnicode, hasColor)
+ }
+ }
+ if (platform[hasUnicode][hasColor]) {
+ return this.getTheme(platform[hasUnicode][hasColor])
+ } else {
+ return this.getDefault(objectAssign({}, opts, {platform: 'fallback'}))
+ }
+}
+
+ThemeSetProto.newMissingThemeError = function newMissingThemeError (name) {
+ var err = new Error('Could not find a gauge theme named "' + name + '"')
+ Error.captureStackTrace.call(err, newMissingThemeError)
+ err.theme = name
+ err.code = 'EMISSINGTHEME'
+ return err
+}
+
+ThemeSetProto.newMissingDefaultThemeError = function newMissingDefaultThemeError (platformName, hasUnicode, hasColor) {
+ var err = new Error(
+ 'Could not find a gauge theme for your platform/unicode/color use combo:\n' +
+ ' platform = ' + platformName + '\n' +
+ ' hasUnicode = ' + hasUnicode + '\n' +
+ ' hasColor = ' + hasColor)
+ Error.captureStackTrace.call(err, newMissingDefaultThemeError)
+ err.platform = platformName
+ err.hasUnicode = hasUnicode
+ err.hasColor = hasColor
+ err.code = 'EMISSINGTHEME'
+ return err
+}
+
+ThemeSetProto.newThemeSet = function () {
+ var themeset = function (opts) {
+ return themeset.getDefault(opts)
+ }
+ return objectAssign(themeset, ThemeSetProto, {
+ themes: objectAssign({}, this.themes),
+ baseTheme: objectAssign({}, this.baseTheme),
+ defaults: JSON.parse(JSON.stringify(this.defaults || {}))
+ })
+}
+
diff --git a/node_modules/gauge/themes.js b/node_modules/gauge/themes.js
new file mode 100644
index 0000000..eb5a4f5
--- /dev/null
+++ b/node_modules/gauge/themes.js
@@ -0,0 +1,54 @@
+'use strict'
+var consoleControl = require('console-control-strings')
+var ThemeSet = require('./theme-set.js')
+
+var themes = module.exports = new ThemeSet()
+
+themes.addTheme('ASCII', {
+ preProgressbar: '[',
+ postProgressbar: ']',
+ progressbarTheme: {
+ complete: '#',
+ remaining: '.'
+ },
+ activityIndicatorTheme: '-\\|/',
+ preSubsection: '>'
+})
+
+themes.addTheme('colorASCII', themes.getTheme('ASCII'), {
+ progressbarTheme: {
+ preComplete: consoleControl.color('inverse'),
+ complete: ' ',
+ postComplete: consoleControl.color('stopInverse'),
+ preRemaining: consoleControl.color('brightBlack'),
+ remaining: '.',
+ postRemaining: consoleControl.color('reset')
+ }
+})
+
+themes.addTheme('brailleSpinner', {
+ preProgressbar: '⸨',
+ postProgressbar: '⸩',
+ progressbarTheme: {
+ complete: '░',
+ remaining: '⠂'
+ },
+ activityIndicatorTheme: '⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏',
+ preSubsection: '>'
+})
+
+themes.addTheme('colorBrailleSpinner', themes.getTheme('brailleSpinner'), {
+ progressbarTheme: {
+ preComplete: consoleControl.color('inverse'),
+ complete: ' ',
+ postComplete: consoleControl.color('stopInverse'),
+ preRemaining: consoleControl.color('brightBlack'),
+ remaining: '░',
+ postRemaining: consoleControl.color('reset')
+ }
+})
+
+themes.setDefault({}, 'ASCII')
+themes.setDefault({hasColor: true}, 'colorASCII')
+themes.setDefault({platform: 'darwin', hasUnicode: true}, 'brailleSpinner')
+themes.setDefault({platform: 'darwin', hasUnicode: true, hasColor: true}, 'colorBrailleSpinner')
diff --git a/node_modules/gauge/wide-truncate.js b/node_modules/gauge/wide-truncate.js
new file mode 100644
index 0000000..c531bc4
--- /dev/null
+++ b/node_modules/gauge/wide-truncate.js
@@ -0,0 +1,25 @@
+'use strict'
+var stringWidth = require('string-width')
+var stripAnsi = require('strip-ansi')
+
+module.exports = wideTruncate
+
+function wideTruncate (str, target) {
+ if (stringWidth(str) === 0) return str
+ if (target <= 0) return ''
+ if (stringWidth(str) <= target) return str
+
+ // We compute the number of bytes of ansi sequences here and add
+ // that to our initial truncation to ensure that we don't slice one
+ // that we want to keep in half.
+ var noAnsi = stripAnsi(str)
+ var ansiSize = str.length + noAnsi.length
+ var truncated = str.slice(0, target + ansiSize)
+
+ // we have to shrink the result to account for our ansi sequence buffer
+ // (if an ansi sequence was truncated) and double width characters.
+ while (stringWidth(truncated) > target) {
+ truncated = truncated.slice(0, -1)
+ }
+ return truncated
+}