summaryrefslogtreecommitdiff
path: root/node_modules/winston
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/winston')
-rw-r--r--node_modules/winston/CHANGELOG.md188
-rw-r--r--node_modules/winston/LICENSE19
-rw-r--r--node_modules/winston/README.md833
-rw-r--r--node_modules/winston/lib/winston.js165
-rw-r--r--node_modules/winston/lib/winston/common.js483
-rw-r--r--node_modules/winston/lib/winston/config.js68
-rw-r--r--node_modules/winston/lib/winston/config/cli-config.js35
-rw-r--r--node_modules/winston/lib/winston/config/npm-config.js27
-rw-r--r--node_modules/winston/lib/winston/config/syslog-config.js31
-rw-r--r--node_modules/winston/lib/winston/container.js127
-rw-r--r--node_modules/winston/lib/winston/exception.js56
-rw-r--r--node_modules/winston/lib/winston/logger.js723
-rw-r--r--node_modules/winston/lib/winston/transports.js29
-rw-r--r--node_modules/winston/lib/winston/transports/console.js130
-rw-r--r--node_modules/winston/lib/winston/transports/file.js678
-rw-r--r--node_modules/winston/lib/winston/transports/http.js232
-rw-r--r--node_modules/winston/lib/winston/transports/memory.js89
-rw-r--r--node_modules/winston/lib/winston/transports/transport.js135
-rw-r--r--node_modules/winston/node_modules/async/.jshintrc24
-rw-r--r--node_modules/winston/node_modules/async/.travis.yml5
-rw-r--r--node_modules/winston/node_modules/async/CHANGELOG.md16
-rw-r--r--node_modules/winston/node_modules/async/LICENSE19
-rw-r--r--node_modules/winston/node_modules/async/README.md1720
-rw-r--r--node_modules/winston/node_modules/async/bower.json40
-rw-r--r--node_modules/winston/node_modules/async/component.json17
-rw-r--r--node_modules/winston/node_modules/async/lib/async.js1283
-rw-r--r--node_modules/winston/node_modules/async/package.json85
-rw-r--r--node_modules/winston/node_modules/async/support/sync-package-managers.js53
-rw-r--r--node_modules/winston/node_modules/colors/.travis.yml6
-rw-r--r--node_modules/winston/node_modules/colors/MIT-LICENSE.txt23
-rw-r--r--node_modules/winston/node_modules/colors/ReadMe.md167
-rw-r--r--node_modules/winston/node_modules/colors/examples/normal-usage.js74
-rw-r--r--node_modules/winston/node_modules/colors/examples/safe-string.js76
-rw-r--r--node_modules/winston/node_modules/colors/lib/colors.js176
-rw-r--r--node_modules/winston/node_modules/colors/lib/custom/trap.js45
-rw-r--r--node_modules/winston/node_modules/colors/lib/custom/zalgo.js104
-rw-r--r--node_modules/winston/node_modules/colors/lib/extendStringPrototype.js118
-rw-r--r--node_modules/winston/node_modules/colors/lib/index.js12
-rw-r--r--node_modules/winston/node_modules/colors/lib/maps/america.js12
-rw-r--r--node_modules/winston/node_modules/colors/lib/maps/rainbow.js13
-rw-r--r--node_modules/winston/node_modules/colors/lib/maps/random.js8
-rw-r--r--node_modules/winston/node_modules/colors/lib/maps/zebra.js5
-rw-r--r--node_modules/winston/node_modules/colors/lib/styles.js77
-rw-r--r--node_modules/winston/node_modules/colors/lib/system/supports-colors.js61
-rw-r--r--node_modules/winston/node_modules/colors/package.json54
-rw-r--r--node_modules/winston/node_modules/colors/safe.js9
-rw-r--r--node_modules/winston/node_modules/colors/screenshots/colors.pngbin0 -> 79787 bytes
-rw-r--r--node_modules/winston/node_modules/colors/tests/basic-test.js50
-rw-r--r--node_modules/winston/node_modules/colors/tests/safe-test.js45
-rw-r--r--node_modules/winston/node_modules/colors/themes/generic-logging.js12
-rw-r--r--node_modules/winston/node_modules/pkginfo/.npmignore2
-rw-r--r--node_modules/winston/node_modules/pkginfo/LICENSE19
-rw-r--r--node_modules/winston/node_modules/pkginfo/README.md86
-rw-r--r--node_modules/winston/node_modules/pkginfo/docs/docco.css194
-rw-r--r--node_modules/winston/node_modules/pkginfo/docs/pkginfo.html101
-rw-r--r--node_modules/winston/node_modules/pkginfo/examples/all-properties.js19
-rw-r--r--node_modules/winston/node_modules/pkginfo/examples/array-argument.js20
-rw-r--r--node_modules/winston/node_modules/pkginfo/examples/multiple-properties.js19
-rw-r--r--node_modules/winston/node_modules/pkginfo/examples/object-argument.js22
-rw-r--r--node_modules/winston/node_modules/pkginfo/examples/package.json10
-rw-r--r--node_modules/winston/node_modules/pkginfo/examples/single-property.js19
-rw-r--r--node_modules/winston/node_modules/pkginfo/examples/subdir/package.json11
-rw-r--r--node_modules/winston/node_modules/pkginfo/examples/target-dir.js20
-rw-r--r--node_modules/winston/node_modules/pkginfo/lib/pkginfo.js136
-rw-r--r--node_modules/winston/node_modules/pkginfo/package.json58
-rw-r--r--node_modules/winston/node_modules/pkginfo/test/pkginfo-test.js83
-rw-r--r--node_modules/winston/package.json81
-rw-r--r--node_modules/winston/test/helpers.js256
-rw-r--r--node_modules/winston/test/transports/console-test.js202
-rw-r--r--node_modules/winston/test/transports/file-archive-test.js83
-rw-r--r--node_modules/winston/test/transports/file-maxfiles-test.js102
-rw-r--r--node_modules/winston/test/transports/file-maxsize-test.js82
-rw-r--r--node_modules/winston/test/transports/file-open-test.js57
-rw-r--r--node_modules/winston/test/transports/file-stress-test.js72
-rw-r--r--node_modules/winston/test/transports/file-tailrolling-test.js92
-rw-r--r--node_modules/winston/test/transports/file-test.js134
-rw-r--r--node_modules/winston/test/transports/http-test.js70
-rw-r--r--node_modules/winston/test/transports/memory-test.js31
-rw-r--r--node_modules/winston/test/transports/transport.js212
79 files changed, 10750 insertions, 0 deletions
diff --git a/node_modules/winston/CHANGELOG.md b/node_modules/winston/CHANGELOG.md
new file mode 100644
index 0000000..2aac1a1
--- /dev/null
+++ b/node_modules/winston/CHANGELOG.md
@@ -0,0 +1,188 @@
+## v2.1.1 / 2015-11-18
+### COLOR ME IMPRESSED EDITION
+
+- [#751](https://github.com/winstonjs/winston/pull/751), Fix colors not appearing in non-tty environments. Fixes [#609](https://github.com/winstonjs/winston/issues/609), [#616](https://github.com/winstonjs/winston/issues/616), [#669](https://github.com/winstonjs/winston/issues/669), [#648](https://github.com/winstonjs/winston/issues/648) (`fiznool`).
+- [#752](https://github.com/winstonjs/winston/pull/752) Correct syslog RFC number. 5424 instead of 524. (`jbenoit2011`)
+
+## v2.1.0 / 2015-11-03
+### TEST ALL THE ECOSYSTEM EDITION
+
+- [#742](https://github.com/winstonjs/winston/pull/742), [32d52b7](https://github.com/winstonjs/winston/commit/32d52b7) Distribute common test files used by transports in the `winston` ecosystem.
+
+## v2.0.1 / 2015-11-02
+### BUGS ALWAYS HAPPEN OK EDITION
+
+- [#739](https://github.com/winstonjs/winston/issues/739), [1f16861](https://github.com/winstonjs/winston/commit/1f16861) Ensure that `logger.log("info", undefined)` does not throw.
+
+## v2.0.0 / 2015-10-29
+### OMG IT'S MY SISTER'S BIRTHDAY EDITION
+
+#### Breaking changes
+
+**Most important**
+- **[0f82204](https://github.com/winstonjs/winston/commit/0f82204) Move `winston.transports.DailyRotateFile` [into a separate module](https://github.com/winstonjs/winston-daily-rotate-file)**: `require('winston-daily-rotate-file');`
+- **[fb9eec0](https://github.com/winstonjs/winston/commit/fb9eec0) Reverse log levels in `npm` and `cli` configs to conform to [RFC524](https://tools.ietf.org/html/rfc5424). Fixes [#424](https://github.com/winstonjs/winston/pull/424) [#406](https://github.com/winstonjs/winston/pull/406) [#290](https://github.com/winstonjs/winston/pull/290)**
+- **[8cd8368](https://github.com/winstonjs/winston/commit/8cd8368) Change the method signature to a `filter` function to be consistent with `rewriter` and log functions:**
+``` js
+function filter (level, msg, meta, inst) {
+ // Filter logic goes here...
+}
+```
+
+**Other breaking changes**
+- [e0c9dde](https://github.com/winstonjs/winston/commit/e0c9dde) Remove `winston.transports.Webhook`. Use `winston.transports.Http` instead.
+- [f71e638](https://github.com/winstonjs/winston/commit/f71e638) Remove `Logger.prototype.addRewriter` and `Logger.prototype.addFilter` since they just push to an Array of functions. Use `logger.filters.push` or `logger.rewriters.push` explicitly instead.
+- [a470ab5](https://github.com/winstonjs/winston/commit/a470ab5) No longer respect the `handleExceptions` option to `new winston.Logger`. Instead just pass in the `exceptionHandlers` option itself.
+- [8cb7048](https://github.com/winstonjs/winston/commit/8cb7048) Removed `Logger.prototype.extend` functionality
+
+#### New features
+- [3aa990c](https://github.com/winstonjs/winston/commit/3aa990c) Added `Logger.prototype.configure` which now contains all logic previously in the `winston.Logger` constructor function. (`indexzero`)
+- [#726](https://github.com/winstonjs/winston/pull/726) Update .npmignore (`coreybutler`)
+- [#700](https://github.com/winstonjs/winston/pull/700) Add an `eol` option to the `Console` transport. (`aquavitae`)
+- [#731](https://github.com/winstonjs/winston/pull/731) Update `lib/transports.js` for better static analysis. (`indexzero`)
+
+#### Fixes, refactoring, and optimizations. OH MY!
+- [#632](https://github.com/winstonjs/winston/pull/632) Allow `File` transport to be an `objectMode` writable stream. (`stambata`)
+- [#527](https://github.com/winstonjs/winston/issues/527), [163f4f9](https://github.com/winstonjs/winston/commit/163f4f9), [3747ccf](https://github.com/winstonjs/winston/commit/3747ccf) Performance optimizations and string interpolation edge cases (`indexzero`)
+- [f0edafd](https://github.com/winstonjs/winston/commit/f0edafd) Code cleanup for reability, ad-hoc styleguide enforcement (`indexzero`)
+
+## v1.1.1 - v1.1.2 / 2015-10
+### MINOR FIXES EDITION
+
+#### Notable changes
+ * [727](https://github.com/winstonjs/winston/pull/727) Fix "raw" mode (`jcrugzz`)
+ * [703](https://github.com/winstonjs/winston/pull/703) Do not modify Error or Date objects when logging. Fixes #610 (`harriha`).
+
+## v1.1.0 / 2015-10-09
+### GREETINGS FROM CARTAGENA EDITION
+
+#### Notable Changes
+ * [#721](https://github.com/winstonjs/winston/pull/721) Fixed octal literal to work with node 4 strict mode (`wesleyeff`)
+ * [#630](https://github.com/winstonjs/winston/pull/630) Add stderrLevels option to Console Transport and update docs (`paulhroth`)
+ * [#626](https://github.com/winstonjs/winston/pull/626) Add the logger (this) in the fourth argument in the rewriters and filters functions (`christophehurpeau `)
+ * [#623](https://github.com/winstonjs/winston/pull/623) Fix Console Transport's align option tests (`paulhroth`, `kikobeats`)
+ * [#692](https://github.com/winstonjs/winston/pull/692) Adding winston-aws-cloudwatch to transport docs (`timdp`)
+
+## v1.0.2 2015-09-25
+### LET'S TALK ON GITTER EDITION
+
+#### Notable Changes
+ * [de80160](https://github.com/winstonjs/winston/commit/de80160) Add Gitter badge (`The Gitter Badger`)
+ * [44564de](https://github.com/winstonjs/winston/commit/44564de) [fix] Correct listeners in `logException`. Fixes [#218](https://github.com/winstonjs/winston/issues/218) [#213](https://github.com/winstonjs/winston/issues/213) [#327](https://github.com/winstonjs/winston/issues/327). (`indexzero`)
+ * [45b1eeb](https://github.com/winstonjs/winston/commit/45b1eeb) [fix] Get `tailFile` function working on latest/all node versions (`Christopher Jeffrey`)
+ * [c6d45f9](https://github.com/winstonjs/winston/commit/c6d45f9) Fixed event subscription on close (`Roman Stetsyshin`)
+
+#### Other changes
+ * TravisCI updates & best practices [87b97cc](https://github.com/winstonjs/winston/commit/87b97cc) [91a5bc4](https://github.com/winstonjs/winston/commit/91a5bc4), [cf24e6a](https://github.com/winstonjs/winston/commit/cf24e6a) (`indexzero`)
+ * [d5397e7](https://github.com/winstonjs/winston/commit/d5397e7) Bump async version (`Roderick Hsiao`)
+ * Documentation updates & fixes [86d7527](https://github.com/winstonjs/winston/commit/86d7527), [38254c1](https://github.com/winstonjs/winston/commit/38254c1), [04e2928](https://github.com/winstonjs/winston/commit/04e2928), [61c8a89](https://github.com/winstonjs/winston/commit/61c8a89), [c42a783](https://github.com/winstonjs/winston/commit/c42a783), [0688a22](https://github.com/winstonjs/winston/commit/0688a22), [eabc113](https://github.com/winstonjs/winston/commit/eabc113) [c9506b7](https://github.com/winstonjs/winston/commit/c9506b7), [17534d2](https://github.com/winstonjs/winston/commit/17534d2), [b575e7b](https://github.com/winstonjs/winston/commit/b575e7b) (`Stefan Thies`, `charukiewicz`, `unLucio`, `Adam Cohen`, `Denis Gorbachev`, `Frederik Ring`, `Luigi Pinca`, `jeffreypriebe`)
+ * Documentation refactor & cleanup [a19607e](https://github.com/winstonjs/winston/commit/a19607e), [d1932b4](https://github.com/winstonjs/winston/commit/d1932b4), [7a13132](https://github.com/winstonjs/winston/commit/7a13132) (`indexzero`)
+
+
+## v1.0.1 / 2015-06-26
+### YAY DOCS EDITION
+
+ * [#639](https://github.com/winstonjs/winston/pull/639) Fix for [#213](https://github.com/winstonjs/winston/issues/213): More than 10 containers triggers EventEmitter memory leak warning (`marcus`)
+ * Documentation and `package.json` updates [cec892c](https://github.com/winstonjs/winston/commit/cec892c), [2f13b4f](https://github.com/winstonjs/winston/commit/2f13b4f), [b246efd](https://github.com/winstonjs/winston/commit/b246efd), [22a5f5a](https://github.com/winstonjs/winston/commit/22a5f5a), [5868b78](https://github.com/winstonjs/winston/commit/5868b78), [99b6b44](https://github.com/winstonjs/winston/commit/99b6b44), [447a813](https://github.com/winstonjs/winston/commit/447a813), [7f75b48](https://github.com/winstonjs/winston/commit/7f75b48) (`peteward44`, `Gilad Peleg`, `Anton Ian Sipos`, `nimrod-becker`, `LarsTi`, `indexzero`)
+
+## v1.0.0 / 2015-04-07
+### OMG 1.0.0 FINALLY EDITION
+
+#### Breaking Changes
+ * [#587](https://github.com/winstonjs/winston/pull/587) Do not extend `String` prototypes as a side effect of using `colors`. (`kenperkins`)
+ * [#581](https://github.com/winstonjs/winston/pull/581) File transports now emit `error` on error of the underlying streams after `maxRetries` attempts. (`ambbell`).
+ * [#583](https://github.com/winstonjs/winston/pull/583), [92729a](https://github.com/winstonjs/winston/commit/92729a68d71d07715501c35d94d2ac06ac03ca08) Use `os.EOL` for all file writing by default. (`Mik13`, `indexzero`)
+ * [#532](https://github.com/winstonjs/winston/pull/532) Delete logger instance from `Container` when `close` event is emitted. (`snater`)
+ * [#380](https://github.com/winstonjs/winston/pull/380) Rename `duration` to `durationMs`, which is now a number a not a string ending in `ms`. (`neoziro`)
+ * [#253](https://github.com/winstonjs/winston/pull/253) Do not set a default level. When `level` is falsey on any `Transport` instance, any `Logger` instance uses the configured level (instead of the Transport level) (`jstamerj`).
+
+#### Other changes
+
+ * [b83de62](https://github.com/winstonjs/winston/commit/b83de62) Fix rendering of stack traces.
+ * [c899cc](https://github.com/winstonjs/winston/commit/c899cc1f0719e49b26ec933e0fa263578168ea3b) Update documentation (Fixes [#549](https://github.com/winstonjs/winston/issues/549))
+ * [#551](https://github.com/winstonjs/winston/pull/551) Filter metadata along with messages
+ * [#578](https://github.com/winstonjs/winston/pull/578) Fixes minor issue with `maxFiles` in `File` transport (Fixes [#556](https://github.com/winstonjs/winston/issues/556)).
+ * [#560](https://github.com/winstonjs/winston/pull/560) Added `showLevel` support to `File` transport.
+ * [#558](https://github.com/winstonjs/winston/pull/558) Added `showLevel` support to `Console` transport.
+
+## v0.9.0 / 2015-02-03
+
+ * [#496](https://github.com/flatiron/winston/pull/496) Updated default option handling for CLI (`oojacoboo`).
+ * [f37634b](https://github.com/flatiron/winston/commit/f37634b) [dist] Only support `node >= 0.8.0`. (`indexzero`)
+ * [91a1e90](https://github.com/flatiron/winston/commit/91a1e90), [50163a0](https://github.com/flatiron/winston/commit/50163a0) Fix #84 [Enable a better unhandled exception experience](https://github.com/flatiron/winston/issues/84) (`samz`)
+ * [8b5fbcd](https://github.com/flatiron/winston/commit/8b5fbcd) #448 Added tailable option to file transport which rolls files backwards instead of creating incrementing appends. Implements #268 (`neouser99`)
+ * [a34f7d2](https://github.com/flatiron/winston/commit/a34f7d2) Custom log formatter functionality were added. (`Melnyk Andii`)
+ * [4c08191](https://github.com/flatiron/winston/commit/4c08191) Added showLevel flag to common.js, file*, memory and console transports. (`Tony Germaneri`)
+ * [64ed8e0](https://github.com/flatiron/winston/commit/64ed8e0) Adding custom pretty print function test. (`Alberto Pose`)
+ * [3872dfb](https://github.com/flatiron/winston/commit/3872dfb) Adding prettyPrint parameter as function example. (`Alberto Pose`)
+ * [2b96eee](https://github.com/flatiron/winston/commit/2b96eee) implemented filters #526 (`Chris Oloff`)
+ * [72273b1](https://github.com/flatiron/winston/commit/72273b1) Added the options to colorize only the level, only the message or all. Default behavior is kept. Using true will only colorize the level and false will not colorize anything. (`Michiel De Mey`)
+ * [178e8a6](https://github.com/flatiron/winston/commit/178e8a6) Prevent message from meta input being overwritten (`Leonard Martin`)
+ * [270be86](https://github.com/flatiron/winston/commit/270be86) [api] Allow for transports to be removed by their string name [test fix] Add test coverage for multiple transports of the same type added in #187. [doc] Document using multiple transports of the same type (`indexzero`)
+ * [0a848fa](https://github.com/flatiron/winston/commit/0a848fa) Add depth options for meta pretty print (`Loïc Mahieu`)
+ * [106b670](https://github.com/flatiron/winston/commit/106b670) Allow debug messages to be sent to stdout (`John Frizelle`)
+ * [ad2d5e1](https://github.com/flatiron/winston/commit/ad2d5e1) [fix] Handle Error instances in a sane way since their properties are non-enumerable __by default.__ Fixes #280. (`indexzero`)
+ * [5109dd0](https://github.com/flatiron/winston/commit/5109dd0) [fix] Have a default `until` before a default `from`. Fixes #478. (`indexzero`)
+ * [d761960](https://github.com/flatiron/winston/commit/d761960) Fix logging regular expression objects (`Chasen Le Hara`)
+ * [2632eb8](https://github.com/flatiron/winston/commit/2632eb8) Add option for EOL chars on FileTransport (`José F. Romaniello`)
+ * [bdecce7](https://github.com/flatiron/winston/commit/bdecce7) Remove duplicate logstash option (`José F. Romaniello`)
+ * [7a01f9a](https://github.com/flatiron/winston/commit/7a01f9a) Update declaration block according to project's style guide (`Ricardo Torres`)
+ * [ae27a19](https://github.com/flatiron/winston/commit/ae27a19) Fixes #306: Can't set customlevels to my loggers (RangeError: Maximum call stack size exceeded) (`Alberto Pose`)
+ * [1ba4f51](https://github.com/flatiron/winston/commit/1ba4f51) [fix] Call `res.resume()` in HttpTransport to get around known issues in streams2. (`indexzero`)
+ * [39e0258](https://github.com/flatiron/winston/commit/39e0258) Updated default option handling for CLI (`Jacob Thomason`)
+ * [8252801](https://github.com/flatiron/winston/commit/8252801) Added logstash support to console transport (`Ramon Snir`)
+ * [18aa301](https://github.com/flatiron/winston/commit/18aa301) Module isStream should be isstream (`Michael Neil`)
+ * [2f5f296](https://github.com/flatiron/winston/commit/2f5f296) options.prettyPrint can now be a function (`Matt Zukowski`)
+ * [a87a876](https://github.com/flatiron/winston/commit/a87a876) Adding rotationFormat prop to file.js (`orcaman`)
+ * [ff187f4](https://github.com/flatiron/winston/commit/ff187f4) Allow custom exception level (`jupiter`)
+
+## 0.8.3 / 2014-11-04
+
+* [fix lowercase issue (`jcrugzz`)](https://github.com/flatiron/winston/commit/b3ffaa10b5fe9d2a510af5348cf4fb3870534123)
+
+## 0.8.2 / 2014-11-04
+
+* [Full fix for #296 with proper streams2 detection with `isstream` for file transport (`jcrugzz`)](https://github.com/flatiron/winston/commit/5c4bd4191468570e46805ed399cad63cfb1856cc)
+* [Add isstream module (`jcrugzz`)](https://github.com/flatiron/winston/commit/498b216d0199aebaef72ee4d8659a00fb737b9ae)
+* [Partially fix #296 with streams2 detection for file transport (`indexzero`)](https://github.com/flatiron/winston/commit/b0227b6c27cf651ffa8b8192ef79ab24296362e3)
+* [add stress test for issue #288 (`indexzero`)](https://github.com/flatiron/winston/commit/e08e504b5b3a00f0acaade75c5ba69e6439c84a6)
+* [lessen timeouts to check test sanity (`indexzero`)](https://github.com/flatiron/winston/commit/e925f5bc398a88464f3e796545ff88912aff7568)
+* [update winston-graylog2 documentation (`unlucio`)](https://github.com/flatiron/winston/commit/49fa86c31baf12c8ac3adced3bdba6deeea2e363)
+* [fix test formatting (`indexzero`)](https://github.com/flatiron/winston/commit/8e2225799520a4598044cdf93006d216812a27f9)
+* [fix so options are not redefined (`indexzero`)](https://github.com/flatiron/winston/commit/d1d146e8a5bb73dcb01579ad433f6d4f70b668ea)
+* [fix self/this issue that broke `http` transport (`indexzero`)](https://github.com/flatiron/winston/commit/d10cbc07755c853b60729ab0cd14aa665da2a63b)
+
+
+## 0.8.1 / 2014-10-06
+
+* [Add label option for DailyRotateFile transport (`francoisTemasys`)](https://github.com/flatiron/winston/pull/459)
+* [fix Logger#transports length check upon Logger#log (`adriano-di-giovanni`, `indexzero`)](https://github.com/flatiron/winston/pull/404)
+* [err can be a string. (`gdw2`, `indexzero`)](https://github.com/flatiron/winston/pull/396)
+* [Added color for pre-defined cli set. (`danilo1105`, `indexzero`)](https://github.com/flatiron/winston/pull/365)
+* [Fix dates on transport test (`revington`)](https://github.com/flatiron/winston/pull/346)
+* [Included the label from options to the output in JSON mode. (`arxony`)](https://github.com/flatiron/winston/pull/326)
+* [Allow using logstash option with the File transport (`gmajoulet`)](https://github.com/flatiron/winston/pull/299)
+* [Be more defensive when working with `query` methods from Transports. Fixes #356. (indexzero)](https://github.com/flatiron/winston/commit/b80638974057f74b521dbe6f43fef2105110afa2)
+* [Catch exceptions for file transport unlinkSync (`calvinfo`)](https://github.com/flatiron/winston/pull/266)
+* [Adding the 'addRewriter' to winston (`machadogj`)](https://github.com/flatiron/winston/pull/258)
+* [Updates to transport documentation (`pose`)](https://github.com/flatiron/winston/pull/262)
+* [fix typo in "Extending another object with Logging" section.](https://github.com/flatiron/winston/pull/281)
+* [Updated README.md - Replaced properties with those listed in winston-mongodb module](https://github.com/flatiron/winston/pull/264)
+
+## 0.8.0 / 2014-09-15
+ * [Fixes for HTTP Transport](https://github.com/flatiron/winston/commit/a876a012641f8eba1a976eada15b6687d4a03f82)
+ * Removing [jsonquest](https://github.com/flatiron/winston/commit/4f088382aeda28012b7a0498829ceb243ed74ac1) and [request](https://github.com/flatiron/winston/commit/a5676313b4e9744802cc3b8e1468e4af48830876) dependencies.
+ * Configuration is now [shalow cloned](https://github.com/flatiron/winston/commit/08fccc81d18536d33050496102d98bde648853f2).
+ * [Added logstash support](https://github.com/flatiron/winston/pull/445/files)
+ * Fix for ["flush" event should always fire after "flush" call bug](https://github.com/flatiron/winston/pull/446/files)
+ * Added tests for file: [open and stress](https://github.com/flatiron/winston/commit/47d885797a2dd0d3cd879305ca813a0bd951c378).
+ * [Test fixes](https://github.com/flatiron/winston/commit/9e39150e0018f43d198ca4c160acef2af9860bf4)
+ * [Fix ")" on string interpolation](https://github.com/flatiron/winston/pull/394/files)
+
+## 0.6.2 / 2012-07-08
+
+ * Added prettyPrint option for console logging
+ * Multi-line values for conditional returns are not allowed
+ * Added acceptance of `stringify` option
+ * Fixed padding for log levels
+
diff --git a/node_modules/winston/LICENSE b/node_modules/winston/LICENSE
new file mode 100644
index 0000000..948d80d
--- /dev/null
+++ b/node_modules/winston/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2010 Charlie Robbins
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE. \ No newline at end of file
diff --git a/node_modules/winston/README.md b/node_modules/winston/README.md
new file mode 100644
index 0000000..7f4497d
--- /dev/null
+++ b/node_modules/winston/README.md
@@ -0,0 +1,833 @@
+# winston
+
+[![Join the chat at https://gitter.im/winstonjs/winston](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/winstonjs/winston?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
+
+[![Version npm](https://img.shields.io/npm/v/winston.svg?style=flat-square)](https://www.npmjs.com/package/winston)[![npm Downloads](https://img.shields.io/npm/dm/winston.svg?style=flat-square)](https://www.npmjs.com/package/winston)[![Build Status](https://img.shields.io/travis/winstonjs/winston/master.svg?style=flat-square)](https://travis-ci.org/winstonjs/winston)[![Dependencies](https://img.shields.io/david/winstonjs/winston.svg?style=flat-square)](https://david-dm.org/winstonjs/winston)
+
+[![NPM](https://nodei.co/npm/winston.png?downloads=true&downloadRank=true)](https://nodei.co/npm/winston/)
+
+A multi-transport async logging library for node.js. <span style="font-size:28px; font-weight:bold;">&quot;CHILL WINSTON! ... I put it in the logs.&quot;</span>
+
+## Motivation
+Winston is designed to be a simple and universal logging library with support for multiple transports. A transport is essentially a storage device for your logs. Each instance of a winston logger can have multiple transports configured at different levels. For example, one may want error logs to be stored in a persistent remote location (like a database), but all logs output to the console or a local file.
+
+There also seemed to be a lot of logging libraries out there that coupled their implementation of logging (i.e. how the logs are stored / indexed) to the API that they exposed to the programmer. This library aims to decouple those parts of the process to make it more flexible and extensible.
+
+## Installation
+
+```bashp
+npm install winston
+```
+
+## Usage
+There are two different ways to use winston: directly via the default logger, or by instantiating your own Logger. The former is merely intended to be a convenient shared logger to use throughout your application if you so choose.
+
+* [Logging](#logging)
+ * [Using the Default Logger](#using-the-default-logger)
+ * [Instantiating your own Logger](#instantiating-your-own-logger)
+ * [Logging with Metadata](#logging-with-metadata)
+ * [String interpolation](#string-interpolation)
+* [Transports](https://github.com/winstonjs/winston/blob/master/docs/transports.md)
+ * [Multiple transports of the same type](#multiple-transports-of-the-same-type)
+* [Profiling](#profiling)
+* [Streaming Logs](#streaming-logs)
+* [Querying Logs](#querying-logs)
+* [Exceptions](#exceptions)
+ * [Handling Uncaught Exceptions with winston](#handling-uncaught-exceptions-with-winston)
+ * [To Exit or Not to Exit](#to-exit-or-not-to-exit)
+* [Logging Levels](#logging-levels)
+ * [Using Logging Levels](#using-logging-levels)
+ * [Using Custom Logging Levels](#using-custom-logging-levels)
+* [Further Reading](#further-reading)
+ * [Events and Callbacks in Winston](#events-and-callbacks-in-winston)
+ * [Working with multiple Loggers in winston](#working-with-multiple-loggers-in-winston)
+ * [Using winston in a CLI tool](#using-winston-in-a-cli-tool)
+ * [Filters and Rewriters](#filters-and-rewriters)
+ * [Adding Custom Transports](#adding-custom-transports)
+* [Installation](#installation)
+* [Run Tests](#run-tests)
+
+
+## Logging
+
+Logging levels in `winston` conform to the severity ordering specified by [RFC5424](https://tools.ietf.org/html/rfc5424): _severity of all levels is assumed to be numerically **ascending** from most important to least important._
+
+### Using the Default Logger
+The default logger is accessible through the winston module directly. Any method that you could call on an instance of a logger is available on the default logger:
+
+``` js
+ var winston = require('winston');
+
+ winston.log('info', 'Hello distributed log files!');
+ winston.info('Hello again distributed logs');
+
+ winston.level = 'debug';
+ winston.log('debug', 'Now my debug messages are written to console!');
+```
+
+By default, only the Console transport is set on the default logger. You can add or remove transports via the add() and remove() methods:
+
+``` js
+ winston.add(winston.transports.File, { filename: 'somefile.log' });
+ winston.remove(winston.transports.Console);
+```
+
+For more documentation about working with each individual transport supported by Winston see the [Winston Transports](docs/transports.md) document.
+
+### Instantiating your own Logger
+If you would prefer to manage the object lifetime of loggers you are free to instantiate them yourself:
+
+``` js
+ var logger = new (winston.Logger)({
+ transports: [
+ new (winston.transports.Console)(),
+ new (winston.transports.File)({ filename: 'somefile.log' })
+ ]
+ });
+```
+
+You can work with this logger in the same way that you work with the default logger:
+
+``` js
+ //
+ // Logging
+ //
+ logger.log('info', 'Hello distributed log files!');
+ logger.info('Hello again distributed logs');
+
+ //
+ // Adding / Removing Transports
+ // (Yes It's chainable)
+ //
+ logger
+ .add(winston.transports.File)
+ .remove(winston.transports.Console);
+```
+
+You can also wholesale reconfigure a `winston.Logger` instance using the `configure` method:
+
+``` js
+ var logger = new winston.Logger({
+ level: 'info',
+ transports: [
+ new (winston.transports.Console)(),
+ new (winston.transports.File)({ filename: 'somefile.log' })
+ ]
+ });
+
+ //
+ // Replaces the previous transports with those in the
+ // new configuration wholesale.
+ //
+ logger.configure({
+ level: 'verbose',
+ transports: [
+ new require('winston-daily-rotate-file')(opts)
+ ]
+ });
+```
+
+
+### Logging with Metadata
+In addition to logging string messages, winston will also optionally log additional JSON metadata objects. Adding metadata is simple:
+
+``` js
+ winston.log('info', 'Test Log Message', { anything: 'This is metadata' });
+```
+
+The way these objects are stored varies from transport to transport (to best support the storage mechanisms offered). Here's a quick summary of how each transports handles metadata:
+
+1. __Console:__ Logged via util.inspect(meta)
+2. __File:__ Logged via util.inspect(meta)
+
+## Multiple transports of the same type
+
+It is possible to use multiple transports of the same type e.g. `winston.transports.File` by passing in a custom `name` when you construct the transport.
+
+``` js
+var logger = new (winston.Logger)({
+ transports: [
+ new (winston.transports.File)({
+ name: 'info-file',
+ filename: 'filelog-info.log',
+ level: 'info'
+ }),
+ new (winston.transports.File)({
+ name: 'error-file',
+ filename: 'filelog-error.log',
+ level: 'error'
+ })
+ ]
+});
+```
+
+If you later want to remove one of these transports you can do so by using the string name. e.g.:
+
+``` js
+logger.remove('info-file');
+```
+
+In this example one could also remove by passing in the instance of the Transport itself. e.g. this is equivalent to the string example above;
+
+``` js
+// Notice it was first in the Array above
+var infoFile = logger.transports[0];
+logger.remove(infoFile);
+```
+
+## Profiling
+In addition to logging messages and metadata, winston also has a simple profiling mechanism implemented for any logger:
+
+``` js
+ //
+ // Start profile of 'test'
+ // Remark: Consider using Date.now() with async operations
+ //
+ winston.profile('test');
+
+ setTimeout(function () {
+ //
+ // Stop profile of 'test'. Logging will now take place:
+ // "17 Jan 21:00:00 - info: test duration=1000ms"
+ //
+ winston.profile('test');
+ }, 1000);
+```
+
+All profile messages are set to the 'info' by default and both message and metadata are optional There are no plans in the Roadmap to make this configurable, but I'm open to suggestions / issues.
+
+### String interpolation
+The `log` method provides the same string interpolation methods like [`util.format`][10].
+
+This allows for the following log messages.
+``` js
+logger.log('info', 'test message %s', 'my string');
+// info: test message my string
+
+logger.log('info', 'test message %d', 123);
+// info: test message 123
+
+logger.log('info', 'test message %j', {number: 123}, {});
+// info: test message {"number":123}
+// meta = {}
+
+logger.log('info', 'test message %s, %s', 'first', 'second', {number: 123});
+// info: test message first, second
+// meta = {number: 123}
+
+logger.log('info', 'test message', 'first', 'second', {number: 123});
+// info: test message first second
+// meta = {number: 123}
+
+logger.log('info', 'test message %s, %s', 'first', 'second', {number: 123}, function(){});
+// info: test message first, second
+// meta = {number: 123}
+// callback = function(){}
+
+logger.log('info', 'test message', 'first', 'second', {number: 123}, function(){});
+// info: test message first second
+// meta = {number: 123}
+// callback = function(){}
+```
+
+
+
+
+
+## Querying Logs
+Winston supports querying of logs with Loggly-like options. [See Loggly Search API](http://wiki.loggly.com/retrieve_events#optional).
+Specifically: `File`, `Couchdb`, `Redis`, `Loggly`, `Nssocket`, and `Http`.
+
+``` js
+ var options = {
+ from: new Date - 24 * 60 * 60 * 1000,
+ until: new Date,
+ limit: 10,
+ start: 0,
+ order: 'desc',
+ fields: ['message']
+ };
+
+ //
+ // Find items logged between today and yesterday.
+ //
+ winston.query(options, function (err, results) {
+ if (err) {
+ throw err;
+ }
+
+ console.log(results);
+ });
+```
+
+## Streaming Logs
+Streaming allows you to stream your logs back from your chosen transport.
+
+``` js
+ //
+ // Start at the end.
+ //
+ winston.stream({ start: -1 }).on('log', function(log) {
+ console.log(log);
+ });
+```
+
+## Exceptions
+
+### Handling Uncaught Exceptions with winston
+
+With `winston`, it is possible to catch and log `uncaughtException` events from your process. There are two distinct ways of enabling this functionality either through the default winston logger or your own logger instance.
+
+If you want to use this feature with the default logger simply call `.handleExceptions()` with a transport instance.
+
+``` js
+ //
+ // You can add a separate exception logger by passing it to `.handleExceptions`
+ //
+ winston.handleExceptions(new winston.transports.File({ filename: 'path/to/exceptions.log' }))
+
+ //
+ // Alternatively you can set `.handleExceptions` to true when adding transports to winston.
+ // You can use the `.humanReadableUnhandledException` option to get more readable exceptions.
+ //
+ winston.add(winston.transports.File, {
+ filename: 'path/to/all-logs.log',
+ handleExceptions: true,
+ humanReadableUnhandledException: true
+ });
+```
+
+### To Exit or Not to Exit
+
+By default, winston will exit after logging an uncaughtException. if this is not the behavior you want,
+set `exitOnError = false`
+
+``` js
+ var logger = new (winston.Logger)({ exitOnError: false });
+
+ //
+ // or, like this:
+ //
+ logger.exitOnError = false;
+```
+
+When working with custom logger instances, you can pass in separate transports to the `exceptionHandlers` property or set `.handleExceptions` on any transport.
+
+Example 1
+
+``` js
+ var logger = new (winston.Logger)({
+ transports: [
+ new winston.transports.File({ filename: 'path/to/all-logs.log' })
+ ],
+ exceptionHandlers: [
+ new winston.transports.File({ filename: 'path/to/exceptions.log' })
+ ]
+ });
+```
+
+Example 2
+
+``` js
+var logger = new winston.Logger({
+ transports: [
+ new winston.transports.Console({
+ handleExceptions: true,
+ json: true
+ })
+ ],
+ exitOnError: false
+});
+```
+
+The `exitOnError` option can also be a function to prevent exit on only certain types of errors:
+
+``` js
+ function ignoreEpipe(err) {
+ return err.code !== 'EPIPE';
+ }
+
+ var logger = new (winston.Logger)({ exitOnError: ignoreEpipe });
+
+ //
+ // or, like this:
+ //
+ logger.exitOnError = ignoreEpipe;
+```
+
+## Logging Levels
+
+Each `level` is given a specific integer priority. The higher the priority the more important the message is considered to be, and the lower the corresponding integer priority. For example, `npm` logging levels are prioritized from 0 to 5 (highest to lowest):
+
+``` js
+{ error: 0, warn: 1, info: 2, verbose: 3, debug: 4, silly: 5 }
+```
+
+Similarly, as specified exactly in RFC5424 the `syslog` levels are prioritized from 0 to 7 (highest to lowest).
+
+```js
+{ emerg: 0, alert: 1, crit: 2, error: 3, warning: 4, notice: 5, info: 6, debug: 7 }
+```
+
+If you do not explicitly define the levels that `winston` should use the `npm` levels above will be used.
+
+### Using Logging Levels
+Setting the level for your logging message can be accomplished in one of two ways. You can pass a string representing the logging level to the log() method or use the level specified methods defined on every winston Logger.
+
+``` js
+ //
+ // Any logger instance
+ //
+ logger.log('silly', "127.0.0.1 - there's no place like home");
+ logger.log('debug', "127.0.0.1 - there's no place like home");
+ logger.log('verbose', "127.0.0.1 - there's no place like home");
+ logger.log('info', "127.0.0.1 - there's no place like home");
+ logger.log('warn', "127.0.0.1 - there's no place like home");
+ logger.log('error', "127.0.0.1 - there's no place like home");
+ logger.info("127.0.0.1 - there's no place like home");
+ logger.warn("127.0.0.1 - there's no place like home");
+ logger.error("127.0.0.1 - there's no place like home");
+
+ //
+ // Default logger
+ //
+ winston.log('info', "127.0.0.1 - there's no place like home");
+ winston.info("127.0.0.1 - there's no place like home");
+```
+
+`winston` allows you to define a `level` property on each transport which specifies the **maximum** level of messages that a transport should log. For example, using the `npm` levels you could log only `error` messages to the console and everything `info` and below to a file (which includes `error` messages):
+
+``` js
+ var logger = new (winston.Logger)({
+ transports: [
+ new (winston.transports.Console)({ level: 'error' }),
+ new (winston.transports.File)({
+ filename: 'somefile.log',
+ level: 'info'
+ })
+ ]
+ });
+```
+
+You may also dynamically change the log level of a transport:
+
+``` js
+ var logger = new (winston.Logger)({
+ transports: [
+ new (winston.transports.Console)({ level: 'warn' }),
+ new (winston.transports.File)({ filename: 'somefile.log', level: 'error' })
+ ]
+ });
+ logger.debug("Will not be logged in either transport!");
+ logger.transports.console.level = 'debug';
+ logger.transports.file.level = 'verbose';
+ logger.verbose("Will be logged in both transports!");
+```
+
+As of 0.2.0, winston supports customizable logging levels, defaulting to [npm][0] style logging levels. Changing logging levels is easy:
+
+``` js
+ //
+ // Change levels on the default winston logger
+ //
+ winston.setLevels(winston.config.syslog.levels);
+
+ //
+ // Change levels on an instance of a logger
+ //
+ logger.setLevels(winston.config.syslog.levels);
+```
+
+Calling `.setLevels` on a logger will remove all of the previous helper methods for the old levels and define helper methods for the new levels. Thus, you should be careful about the logging statements you use when changing levels. For example, if you ran this code after changing to the syslog levels:
+
+``` js
+ //
+ // Logger does not have 'silly' defined since that level is not in the syslog levels
+ //
+ logger.silly('some silly message');
+```
+
+### Using Custom Logging Levels
+In addition to the predefined `npm` and `syslog` levels available in Winston, you can also choose to define your own:
+
+``` js
+ var myCustomLevels = {
+ levels: {
+ foo: 0,
+ bar: 1,
+ baz: 2,
+ foobar: 3
+ },
+ colors: {
+ foo: 'blue',
+ bar: 'green',
+ baz: 'yellow',
+ foobar: 'red'
+ }
+ };
+
+ var customLevelLogger = new (winston.Logger)({ levels: myCustomLevels.levels });
+ customLevelLogger.foobar('some foobar level-ed message');
+```
+
+Although there is slight repetition in this data structure, it enables simple encapsulation if you do not want to have colors. If you do wish to have colors, in addition to passing the levels to the Logger itself, you must make winston aware of them:
+
+``` js
+ //
+ // Make winston aware of these colors
+ //
+ winston.addColors(myCustomLevels.colors);
+```
+
+This enables transports with the 'colorize' option set to appropriately color the output of custom levels.
+
+## Further Reading
+
+### Events and Callbacks in Winston
+Each instance of winston.Logger is also an instance of an [EventEmitter][1]. A log event will be raised each time a transport successfully logs a message:
+
+``` js
+ logger.on('logging', function (transport, level, msg, meta) {
+ // [msg] and [meta] have now been logged at [level] to [transport]
+ });
+
+ logger.info('CHILL WINSTON!', { seriously: true });
+```
+
+It is also worth mentioning that the logger also emits an 'error' event which you should handle or suppress if you don't want unhandled exceptions:
+
+``` js
+ //
+ // Handle errors
+ //
+ logger.on('error', function (err) { /* Do Something */ });
+
+ //
+ // Or just suppress them.
+ //
+ logger.emitErrs = false;
+```
+
+Every logging method described in the previous section also takes an optional callback which will be called only when all of the transports have logged the specified message.
+
+``` js
+ logger.info('CHILL WINSTON!', { seriously: true }, function (err, level, msg, meta) {
+ // [msg] and [meta] have now been logged at [level] to **every** transport.
+ });
+```
+
+### Working with multiple Loggers in winston
+
+Often in larger, more complex applications it is necessary to have multiple logger instances with different settings. Each logger is responsible for a different feature area (or category). This is exposed in `winston` in two ways: through `winston.loggers` and instances of `winston.Container`. In fact, `winston.loggers` is just a predefined instance of `winston.Container`:
+
+``` js
+ var winston = require('winston');
+
+ //
+ // Configure the logger for `category1`
+ //
+ winston.loggers.add('category1', {
+ console: {
+ level: 'silly',
+ colorize: true,
+ label: 'category one'
+ },
+ file: {
+ filename: '/path/to/some/file'
+ }
+ });
+
+ //
+ // Configure the logger for `category2`
+ //
+ winston.loggers.add('category2', {
+ couchdb: {
+ host: '127.0.0.1',
+ port: 5984
+ }
+ });
+```
+
+Now that your loggers are setup you can require winston _in any file in your application_ and access these pre-configured loggers:
+
+``` js
+ var winston = require('winston');
+
+ //
+ // Grab your preconfigured logger
+ //
+ var category1 = winston.loggers.get('category1');
+
+ category1.info('logging from your IoC container-based logger');
+```
+
+If you prefer to manage the `Container` yourself you can simply instantiate one:
+
+``` js
+ var winston = require('winston'),
+ container = new winston.Container();
+
+ container.add('category1', {
+ console: {
+ level: 'silly',
+ colorize: true
+ },
+ file: {
+ filename: '/path/to/some/file'
+ }
+ });
+```
+
+### Sharing transports between Loggers in winston
+
+``` js
+ var winston = require('winston');
+
+ //
+ // Setup transports to be shared across all loggers
+ // in three ways:
+ //
+ // 1. By setting it on the default Container
+ // 2. By passing `transports` into the constructor function of winston.Container
+ // 3. By passing `transports` into the `.get()` or `.add()` methods
+ //
+
+ //
+ // 1. By setting it on the default Container
+ //
+ winston.loggers.options.transports = [
+ // Setup your shared transports here
+ ];
+
+ //
+ // 2. By passing `transports` into the constructor function of winston.Container
+ //
+ var container = new winston.Container({
+ transports: [
+ // Setup your shared transports here
+ ]
+ });
+
+ //
+ // 3. By passing `transports` into the `.get()` or `.add()` methods
+ //
+ winston.loggers.add('some-category', {
+ transports: [
+ // Setup your shared transports here
+ ]
+ });
+
+ container.add('some-category', {
+ transports: [
+ // Setup your shared transports here
+ ]
+ });
+```
+
+### Using winston in a CLI tool
+A common use-case for logging is output to a CLI tool. Winston has a special helper method which will pretty print output from your CLI tool. Here's an example from the [require-analyzer][2] written by [Nodejitsu][3]:
+
+```
+ info: require-analyzer starting in /Users/Charlie/Nodejitsu/require-analyzer
+ info: Found existing dependencies
+ data: {
+ data: colors: '0.x.x',
+ data: eyes: '0.1.x',
+ data: findit: '0.0.x',
+ data: npm: '1.0.x',
+ data: optimist: '0.2.x',
+ data: semver: '1.0.x',
+ data: winston: '0.2.x'
+ data: }
+ info: Analyzing dependencies...
+ info: Done analyzing raw dependencies
+ info: Retrieved packages from npm
+ warn: No additional dependencies found
+```
+
+Configuring output for this style is easy, just use the `.cli()` method on `winston` or an instance of `winston.Logger`:
+
+``` js
+ var winston = require('winston');
+
+ //
+ // Configure CLI output on the default logger
+ //
+ winston.cli();
+
+ //
+ // Configure CLI on an instance of winston.Logger
+ //
+ var logger = new winston.Logger({
+ transports: [
+ new (winston.transports.Console)()
+ ]
+ });
+
+ logger.cli();
+```
+
+### Filters and Rewriters
+Filters allow modifying the contents of **log messages**, and Rewriters allow modifying the contents of **log meta** e.g. to mask data that should not appear in logs.
+
+Both filters and rewriters are simple Arrays of functions which can be provided when creating a `new winston.Logger(options)`. e.g.:
+
+``` js
+var logger = new winston.Logger({
+ rewriters: [function (level, msg, meta) { /* etc etc */ }]
+ filters: [function (level, msg, meta) { /* etc etc */ }]
+})
+```
+
+Like any Array they can also be modified at runtime with no adverse side-effects to the `winston` internals.
+
+``` js
+logger.filters.push(function(level, msg, meta) {
+ return meta.production
+ ? maskCardNumbers(msg)
+ : msg;
+});
+
+logger.info('transaction with card number 123456789012345 successful.');
+```
+
+This may result in this output:
+
+```
+info: transaction with card number 123456****2345 successful.
+```
+
+Where as for rewriters, if you wanted to sanitize the `creditCard` field of your `meta` you could:
+
+``` js
+logger.rewriters.push(function(level, msg, meta) {
+ if (meta.creditCard) {
+ meta.creditCard = maskCardNumbers(meta.creditCard)
+ }
+
+ return meta;
+});
+
+logger.info('transaction ok', { creditCard: 123456789012345 });
+```
+
+which may result in this output:
+
+```
+info: transaction ok creditCard=123456****2345
+```
+
+See [log-filter-test.js](./test/log-filter-test.js), where card number masking is implemented as an example along with [log-rewriter-test.js](./test/log-rewriter-test.js)
+
+## Adding Custom Transports
+Adding a custom transport is actually pretty easy. All you need to do is accept a couple of options, set a name, implement a log() method, and add it to the set of transports exposed by winston.
+
+``` js
+ var util = require('util'),
+ winston = require('winston');
+
+ var CustomLogger = winston.transports.CustomLogger = function (options) {
+ //
+ // Name this logger
+ //
+ this.name = 'customLogger';
+
+ //
+ // Set the level from your options
+ //
+ this.level = options.level || 'info';
+
+ //
+ // Configure your storage backing as you see fit
+ //
+ };
+
+ //
+ // Inherit from `winston.Transport` so you can take advantage
+ // of the base functionality and `.handleExceptions()`.
+ //
+ util.inherits(CustomLogger, winston.Transport);
+
+ CustomLogger.prototype.log = function (level, msg, meta, callback) {
+ //
+ // Store this message and metadata, maybe use some custom logic
+ // then callback indicating success.
+ //
+ callback(null, true);
+ };
+```
+
+### Custom Log Format
+To specify custom log format you should set formatter function for transport. Currently supported transports are: Console, File, Memory.
+Options object will be passed to the format function. It's general properties are: timestamp, level, message, meta. Depending on the transport type may be additional properties.
+
+``` js
+var logger = new (winston.Logger)({
+ transports: [
+ new (winston.transports.Console)({
+ timestamp: function() {
+ return Date.now();
+ },
+ formatter: function(options) {
+ // Return string will be passed to logger.
+ return options.timestamp() +' '+ options.level.toUpperCase() +' '+ (undefined !== options.message ? options.message : '') +
+ (options.meta && Object.keys(options.meta).length ? '\n\t'+ JSON.stringify(options.meta) : '' );
+ }
+ })
+ ]
+});
+logger.info('Data to log.');
+```
+
+### Inspirations
+1. [npm][0]
+2. [log.js][4]
+3. [socket.io][5]
+4. [node-rlog][6]
+5. [BigBrother][7]
+6. [Loggly][8]
+
+## Installation
+
+### Installing npm (node package manager)
+```
+ curl http://npmjs.org/install.sh | sh
+```
+
+### Installing winston
+```
+ [sudo] npm install winston
+```
+
+## Run Tests
+All of the winston tests are written in [vows][9], and designed to be run with npm.
+
+``` bash
+ $ npm test
+```
+
+#### Author: [Charlie Robbins](http://twitter.com/indexzero)
+#### Contributors: [Matthew Bergman](http://github.com/fotoverite), [Marak Squires](http://github.com/marak)
+
+[0]: https://github.com/npm/npmlog/blob/master/log.js
+[1]: http://nodejs.org/docs/v0.3.5/api/events.html#events.EventEmitter
+[2]: http://github.com/nodejitsu/require-analyzer
+[3]: http://nodejitsu.com
+[4]: https://github.com/visionmedia/log.js
+[5]: http://socket.io
+[6]: https://github.com/jbrisbin/node-rlog
+[7]: https://github.com/feisty/BigBrother
+[8]: http://loggly.com
+[9]: http://vowsjs.org
+[10]: http://nodejs.org/api/util.html#util_util_format_format
+[14]: http://nodejs.org/api/stream.html#stream_class_stream_writable
+[16]: https://github.com/indexzero/winston-mongodb
+[17]: https://github.com/indexzero/winston-riak
+[18]: https://github.com/appsattic/winston-simpledb
+[19]: https://github.com/wavded/winston-mail
+[21]: https://github.com/jesseditson/winston-sns
+[22]: https://github.com/flite/winston-graylog2
+[23]: https://github.com/kenperkins/winston-papertrail
+[24]: https://github.com/jorgebay/winston-cassandra
+[25]: https://github.com/jesseditson/winston-sns
+[26]: https://github.com/inspiredjw/winston-dynamodb/
diff --git a/node_modules/winston/lib/winston.js b/node_modules/winston/lib/winston.js
new file mode 100644
index 0000000..43aa6d1
--- /dev/null
+++ b/node_modules/winston/lib/winston.js
@@ -0,0 +1,165 @@
+/*
+ * winston.js: Top-level include defining Winston.
+ *
+ * (C) 2010 Charlie Robbins
+ * MIT LICENCE
+ *
+ */
+
+var winston = exports;
+
+//
+// Expose version using `pkginfo`
+//
+require('pkginfo')(module, 'version');
+
+//
+// Include transports defined by default by winston
+//
+winston.transports = require('./winston/transports');
+
+//
+// Expose utility methods
+//
+var common = require('./winston/common');
+winston.hash = common.hash;
+winston.clone = common.clone;
+winston.longestElement = common.longestElement;
+winston.exception = require('./winston/exception');
+winston.config = require('./winston/config');
+winston.addColors = winston.config.addColors;
+
+//
+// Expose core Logging-related prototypes.
+//
+winston.Container = require('./winston/container').Container;
+winston.Logger = require('./winston/logger').Logger;
+winston.Transport = require('./winston/transports/transport').Transport;
+
+//
+// We create and expose a default `Container` to `winston.loggers` so that the
+// programmer may manage multiple `winston.Logger` instances without any additional overhead.
+//
+// ### some-file1.js
+//
+// var logger = require('winston').loggers.get('something');
+//
+// ### some-file2.js
+//
+// var logger = require('winston').loggers.get('something');
+//
+winston.loggers = new winston.Container();
+
+//
+// We create and expose a 'defaultLogger' so that the programmer may do the
+// following without the need to create an instance of winston.Logger directly:
+//
+// var winston = require('winston');
+// winston.log('info', 'some message');
+// winston.error('some error');
+//
+var defaultLogger = new winston.Logger({
+ transports: [new winston.transports.Console()]
+});
+
+//
+// Pass through the target methods onto `winston.
+//
+var methods = [
+ 'log',
+ 'query',
+ 'stream',
+ 'add',
+ 'remove',
+ 'clear',
+ 'profile',
+ 'startTimer',
+ 'extend',
+ 'cli',
+ 'handleExceptions',
+ 'unhandleExceptions',
+ 'addRewriter',
+ 'addFilter'
+];
+common.setLevels(winston, null, defaultLogger.levels);
+methods.forEach(function (method) {
+ winston[method] = function () {
+ return defaultLogger[method].apply(defaultLogger, arguments);
+ };
+});
+
+//
+// ### function cli ()
+// Configures the default winston logger to have the
+// settings for command-line interfaces: no timestamp,
+// colors enabled, padded output, and additional levels.
+//
+winston.cli = function () {
+ winston.padLevels = true;
+ common.setLevels(winston, defaultLogger.levels, winston.config.cli.levels);
+ defaultLogger.setLevels(winston.config.cli.levels);
+ winston.config.addColors(winston.config.cli.colors);
+
+ if (defaultLogger.transports.console) {
+ defaultLogger.transports.console.colorize = true;
+ defaultLogger.transports.console.timestamp = false;
+ }
+
+ return winston;
+};
+
+//
+// ### function setLevels (target)
+// #### @target {Object} Target levels to use
+// Sets the `target` levels specified on the default winston logger.
+//
+winston.setLevels = function (target) {
+ common.setLevels(winston, defaultLogger.levels, target);
+ defaultLogger.setLevels(target);
+};
+
+//
+// Define getter / setter for the default logger level
+// which need to be exposed by winston.
+//
+Object.defineProperty(winston, 'level', {
+ get: function () {
+ return defaultLogger.level;
+ },
+ set: function (val) {
+ defaultLogger.level = val;
+
+ Object.keys(defaultLogger.transports).forEach(function(key) {
+ defaultLogger.transports[key].level = val;
+ });
+ }
+});
+
+//
+// Define getters / setters for appropriate properties of the
+// default logger which need to be exposed by winston.
+//
+['emitErrs', 'exitOnError', 'padLevels', 'levelLength', 'stripColors'].forEach(function (prop) {
+ Object.defineProperty(winston, prop, {
+ get: function () {
+ return defaultLogger[prop];
+ },
+ set: function (val) {
+ defaultLogger[prop] = val;
+ }
+ });
+});
+
+//
+// @default {Object}
+// The default transports and exceptionHandlers for
+// the default winston logger.
+//
+Object.defineProperty(winston, 'default', {
+ get: function () {
+ return {
+ transports: defaultLogger.transports,
+ exceptionHandlers: defaultLogger.exceptionHandlers
+ };
+ }
+});
diff --git a/node_modules/winston/lib/winston/common.js b/node_modules/winston/lib/winston/common.js
new file mode 100644
index 0000000..29dfec0
--- /dev/null
+++ b/node_modules/winston/lib/winston/common.js
@@ -0,0 +1,483 @@
+/*
+ * common.js: Internal helper and utility functions for winston
+ *
+ * (C) 2010 Charlie Robbins
+ * MIT LICENCE
+ *
+ */
+
+var util = require('util'),
+ crypto = require('crypto'),
+ cycle = require('cycle'),
+ fs = require('fs'),
+ StringDecoder = require('string_decoder').StringDecoder,
+ Stream = require('stream').Stream,
+ config = require('./config');
+
+//
+// ### function setLevels (target, past, current)
+// #### @target {Object} Object on which to set levels.
+// #### @past {Object} Previous levels set on target.
+// #### @current {Object} Current levels to set on target.
+// Create functions on the target objects for each level
+// in current.levels. If past is defined, remove functions
+// for each of those levels.
+//
+exports.setLevels = function (target, past, current, isDefault) {
+ var self = this;
+ if (past) {
+ Object.keys(past).forEach(function (level) {
+ delete target[level];
+ });
+ }
+
+ target.levels = current || config.npm.levels;
+ if (target.padLevels) {
+ target.levelLength = exports.longestElement(Object.keys(target.levels));
+ }
+
+ //
+ // Define prototype methods for each log level
+ // e.g. target.log('info', msg) <=> target.info(msg)
+ //
+ Object.keys(target.levels).forEach(function (level) {
+
+ // TODO Refactor logging methods into a different object to avoid name clashes
+ if (level === 'log') {
+ console.warn('Log level named "log" will clash with the method "log". Consider using a different name.');
+ return;
+ }
+
+ target[level] = function (msg) {
+ // build argument list (level, msg, ... [string interpolate], [{metadata}], [callback])
+ var args = [level].concat(Array.prototype.slice.call(arguments));
+ target.log.apply(target, args);
+ };
+ });
+
+ return target;
+};
+
+//
+// ### function longestElement
+// #### @xs {Array} Array to calculate against
+// Returns the longest element in the `xs` array.
+//
+exports.longestElement = function (xs) {
+ return Math.max.apply(
+ null,
+ xs.map(function (x) { return x.length; })
+ );
+};
+
+//
+// ### function clone (obj)
+// #### @obj {Object} Object to clone.
+// Helper method for deep cloning pure JSON objects
+// i.e. JSON objects that are either literals or objects (no Arrays, etc)
+//
+exports.clone = function (obj) {
+ //
+ // We only need to clone reference types (Object)
+ //
+ var copy = {};
+
+ if (obj instanceof Error) {
+ // With potential custom Error objects, this might not be exactly correct,
+ // but probably close-enough for purposes of this lib.
+ copy = new Error(obj.message);
+ Object.getOwnPropertyNames(obj).forEach(function (key) {
+ copy[key] = obj[key];
+ });
+
+ return copy;
+ }
+ else if (!(obj instanceof Object)) {
+ return obj;
+ }
+ else if (obj instanceof Date) {
+ return new Date(obj.getTime());
+ }
+
+ for (var i in obj) {
+ if (Array.isArray(obj[i])) {
+ copy[i] = obj[i].slice(0);
+ }
+ else if (obj[i] instanceof Buffer) {
+ copy[i] = obj[i].slice(0);
+ }
+ else if (typeof obj[i] != 'function') {
+ copy[i] = obj[i] instanceof Object ? exports.clone(obj[i]) : obj[i];
+ }
+ else if (typeof obj[i] === 'function') {
+ copy[i] = obj[i];
+ }
+ }
+
+ return copy;
+};
+
+//
+// ### function log (options)
+// #### @options {Object} All information about the log serialization.
+// Generic logging function for returning timestamped strings
+// with the following options:
+//
+// {
+// level: 'level to add to serialized message',
+// message: 'message to serialize',
+// meta: 'additional logging metadata to serialize',
+// colorize: false, // Colorizes output (only if `.json` is false)
+// align: false // Align message level.
+// timestamp: true // Adds a timestamp to the serialized message
+// label: 'label to prepend the message'
+// }
+//
+exports.log = function (options) {
+ var timestampFn = typeof options.timestamp === 'function'
+ ? options.timestamp
+ : exports.timestamp,
+ timestamp = options.timestamp ? timestampFn() : null,
+ showLevel = options.showLevel === undefined ? true : options.showLevel,
+ meta = options.meta !== null && options.meta !== undefined && !(options.meta instanceof Error)
+ ? exports.clone(cycle.decycle(options.meta))
+ : options.meta || null,
+ output;
+
+ //
+ // raw mode is intended for outputing winston as streaming JSON to STDOUT
+ //
+ if (options.raw) {
+ if (typeof meta !== 'object' && meta != null) {
+ meta = { meta: meta };
+ }
+ output = exports.clone(meta) || {};
+ output.level = options.level;
+ //
+ // Remark (jcrugzz): This used to be output.message = options.message.stripColors.
+ // I do not know why this is, it does not make sense but im handling that
+ // case here as well as handling the case that does make sense which is to
+ // make the `output.message = options.message`
+ //
+ output.message = options.message.stripColors
+ ? options.message.stripColors
+ : options.message;
+
+ return JSON.stringify(output);
+ }
+
+ //
+ // json mode is intended for pretty printing multi-line json to the terminal
+ //
+ if (options.json || true === options.logstash) {
+ if (typeof meta !== 'object' && meta != null) {
+ meta = { meta: meta };
+ }
+
+ output = exports.clone(meta) || {};
+ output.level = options.level;
+ output.message = output.message || '';
+
+ if (options.label) { output.label = options.label; }
+ if (options.message) { output.message = options.message; }
+ if (timestamp) { output.timestamp = timestamp; }
+
+ if (options.logstash === true) {
+ // use logstash format
+ var logstashOutput = {};
+ if (output.message !== undefined) {
+ logstashOutput['@message'] = output.message;
+ delete output.message;
+ }
+
+ if (output.timestamp !== undefined) {
+ logstashOutput['@timestamp'] = output.timestamp;
+ delete output.timestamp;
+ }
+
+ logstashOutput['@fields'] = exports.clone(output);
+ output = logstashOutput;
+ }
+
+ if (typeof options.stringify === 'function') {
+ return options.stringify(output);
+ }
+
+ return JSON.stringify(output, function (key, value) {
+ return value instanceof Buffer
+ ? value.toString('base64')
+ : value;
+ });
+ }
+
+ //
+ // Remark: this should really be a call to `util.format`.
+ //
+ if (typeof options.formatter == 'function') {
+ return String(options.formatter(exports.clone(options)));
+ }
+
+ output = timestamp ? timestamp + ' - ' : '';
+ if (showLevel) {
+ output += options.colorize === 'all' || options.colorize === 'level' || options.colorize === true
+ ? config.colorize(options.level)
+ : options.level;
+ }
+
+ output += (options.align) ? '\t' : '';
+ output += (timestamp || showLevel) ? ': ' : '';
+ output += options.label ? ('[' + options.label + '] ') : '';
+ output += options.colorize === 'all' || options.colorize === 'message'
+ ? config.colorize(options.level, options.message)
+ : options.message;
+
+ if (meta !== null && meta !== undefined) {
+ if (meta && meta instanceof Error && meta.stack) {
+ meta = meta.stack;
+ }
+
+ if (typeof meta !== 'object') {
+ output += ' ' + meta;
+ }
+ else if (Object.keys(meta).length > 0) {
+ if (typeof options.prettyPrint === 'function') {
+ output += ' ' + options.prettyPrint(meta);
+ } else if (options.prettyPrint) {
+ output += ' ' + '\n' + util.inspect(meta, false, options.depth || null, options.colorize);
+ } else if (
+ options.humanReadableUnhandledException
+ && Object.keys(meta).length === 5
+ && meta.hasOwnProperty('date')
+ && meta.hasOwnProperty('process')
+ && meta.hasOwnProperty('os')
+ && meta.hasOwnProperty('trace')
+ && meta.hasOwnProperty('stack')) {
+
+ //
+ // If meta carries unhandled exception data serialize the stack nicely
+ //
+ var stack = meta.stack;
+ delete meta.stack;
+ delete meta.trace;
+ output += ' ' + exports.serialize(meta);
+ output += '\n' + stack.join('\n');
+ } else {
+ output += ' ' + exports.serialize(meta);
+ }
+ }
+ }
+
+ return output;
+};
+
+exports.capitalize = function (str) {
+ return str && str[0].toUpperCase() + str.slice(1);
+};
+
+//
+// ### function hash (str)
+// #### @str {string} String to hash.
+// Utility function for creating unique ids
+// e.g. Profiling incoming HTTP requests on the same tick
+//
+exports.hash = function (str) {
+ return crypto.createHash('sha1').update(str).digest('hex');
+};
+
+//
+// ### function pad (n)
+// Returns a padded string if `n < 10`.
+//
+exports.pad = function (n) {
+ return n < 10 ? '0' + n.toString(10) : n.toString(10);
+};
+
+//
+// ### function timestamp ()
+// Returns a timestamp string for the current time.
+//
+exports.timestamp = function () {
+ return new Date().toISOString();
+};
+
+//
+// ### function serialize (obj, key)
+// #### @obj {Object|literal} Object to serialize
+// #### @key {string} **Optional** Optional key represented by obj in a larger object
+// Performs simple comma-separated, `key=value` serialization for Loggly when
+// logging to non-JSON inputs.
+//
+exports.serialize = function (obj, key) {
+ if (obj === null) {
+ obj = 'null';
+ }
+ else if (obj === undefined) {
+ obj = 'undefined';
+ }
+ else if (obj === false) {
+ obj = 'false';
+ }
+
+ if (typeof obj !== 'object') {
+ return key ? key + '=' + obj : obj;
+ }
+
+ if (obj instanceof Buffer) {
+ return key ? key + '=' + obj.toString('base64') : obj.toString('base64');
+ }
+
+ var msg = '',
+ keys = Object.keys(obj),
+ length = keys.length;
+
+ for (var i = 0; i < length; i++) {
+ if (Array.isArray(obj[keys[i]])) {
+ msg += keys[i] + '=[';
+
+ for (var j = 0, l = obj[keys[i]].length; j < l; j++) {
+ msg += exports.serialize(obj[keys[i]][j]);
+ if (j < l - 1) {
+ msg += ', ';
+ }
+ }
+
+ msg += ']';
+ }
+ else if (obj[keys[i]] instanceof Date) {
+ msg += keys[i] + '=' + obj[keys[i]];
+ }
+ else {
+ msg += exports.serialize(obj[keys[i]], keys[i]);
+ }
+
+ if (i < length - 1) {
+ msg += ', ';
+ }
+ }
+
+ return msg;
+};
+
+//
+// ### function tailFile (options, callback)
+// #### @options {Object} Options for tail.
+// #### @callback {function} Callback to execute on every line.
+// `tail -f` a file. Options must include file.
+//
+exports.tailFile = function(options, callback) {
+ var buffer = new Buffer(64 * 1024)
+ , decode = new StringDecoder('utf8')
+ , stream = new Stream
+ , buff = ''
+ , pos = 0
+ , row = 0;
+
+ if (options.start === -1) {
+ delete options.start;
+ }
+
+ stream.readable = true;
+ stream.destroy = function() {
+ stream.destroyed = true;
+ stream.emit('end');
+ stream.emit('close');
+ };
+
+ fs.open(options.file, 'a+', '0644', function(err, fd) {
+ if (err) {
+ if (!callback) {
+ stream.emit('error', err);
+ } else {
+ callback(err);
+ }
+ stream.destroy();
+ return;
+ }
+
+ (function read() {
+ if (stream.destroyed) {
+ fs.close(fd);
+ return;
+ }
+
+ return fs.read(fd, buffer, 0, buffer.length, pos, function(err, bytes) {
+ if (err) {
+ if (!callback) {
+ stream.emit('error', err);
+ } else {
+ callback(err);
+ }
+ stream.destroy();
+ return;
+ }
+
+ if (!bytes) {
+ if (buff) {
+ if (options.start == null || row > options.start) {
+ if (!callback) {
+ stream.emit('line', buff);
+ } else {
+ callback(null, buff);
+ }
+ }
+ row++;
+ buff = '';
+ }
+ return setTimeout(read, 1000);
+ }
+
+ var data = decode.write(buffer.slice(0, bytes));
+
+ if (!callback) {
+ stream.emit('data', data);
+ }
+
+ var data = (buff + data).split(/\n+/)
+ , l = data.length - 1
+ , i = 0;
+
+ for (; i < l; i++) {
+ if (options.start == null || row > options.start) {
+ if (!callback) {
+ stream.emit('line', data[i]);
+ } else {
+ callback(null, data[i]);
+ }
+ }
+ row++;
+ }
+
+ buff = data[l];
+
+ pos += bytes;
+
+ return read();
+ });
+ })();
+ });
+
+ if (!callback) {
+ return stream;
+ }
+
+ return stream.destroy;
+};
+
+//
+// ### function stringArrayToSet (array)
+// #### @strArray {Array} Array of Set-elements as strings.
+// #### @errMsg {string} **Optional** Custom error message thrown on invalid input.
+// Returns a Set-like object with strArray's elements as keys (each with the value true).
+//
+exports.stringArrayToSet = function (strArray, errMsg) {
+ if (typeof errMsg === 'undefined') {
+ errMsg = 'Cannot make set from Array with non-string elements';
+ }
+ return strArray.reduce(function (set, el) {
+ if (!(typeof el === 'string' || el instanceof String)) {
+ throw new Error(errMsg);
+ }
+ set[el] = true;
+ return set;
+ }, Object.create(null));
+};
diff --git a/node_modules/winston/lib/winston/config.js b/node_modules/winston/lib/winston/config.js
new file mode 100644
index 0000000..1bb52fd
--- /dev/null
+++ b/node_modules/winston/lib/winston/config.js
@@ -0,0 +1,68 @@
+/*
+ * config.js: Default settings for all levels that winston knows about
+ *
+ * (C) 2010 Charlie Robbins
+ * MIT LICENCE
+ *
+ */
+
+var colors = require('colors/safe');
+
+// Fix colors not appearing in non-tty environments
+colors.enabled = true;
+
+var config = exports,
+ allColors = exports.allColors = {};
+
+config.addColors = function (colors) {
+ mixin(allColors, colors);
+};
+
+config.colorize = function (level, message) {
+ if (typeof message === 'undefined') message = level;
+
+ var colorized = message;
+ if (allColors[level] instanceof Array) {
+ for (var i = 0, l = allColors[level].length; i < l; ++i) {
+ colorized = colors[allColors[level][i]](colorized);
+ }
+ }
+ else if (allColors[level].match(/\s/)) {
+ var colorArr = allColors[level].split(/\s+/);
+ for (var i = 0; i < colorArr.length; ++i) {
+ colorized = colors[colorArr[i]](colorized);
+ }
+ allColors[level] = colorArr;
+ }
+ else {
+ colorized = colors[allColors[level]](colorized);
+ }
+
+ return colorized;
+};
+
+//
+// Export config sets
+//
+config.cli = require('./config/cli-config');
+config.npm = require('./config/npm-config');
+config.syslog = require('./config/syslog-config');
+
+//
+// Add colors for pre-defined config sets
+//
+config.addColors(config.cli.colors);
+config.addColors(config.npm.colors);
+config.addColors(config.syslog.colors);
+
+function mixin (target) {
+ var args = Array.prototype.slice.call(arguments, 1);
+
+ args.forEach(function (a) {
+ var keys = Object.keys(a);
+ for (var i = 0; i < keys.length; i++) {
+ target[keys[i]] = a[keys[i]];
+ }
+ });
+ return target;
+};
diff --git a/node_modules/winston/lib/winston/config/cli-config.js b/node_modules/winston/lib/winston/config/cli-config.js
new file mode 100644
index 0000000..764d2a8
--- /dev/null
+++ b/node_modules/winston/lib/winston/config/cli-config.js
@@ -0,0 +1,35 @@
+/*
+ * cli-config.js: Config that conform to commonly used CLI logging levels.
+ *
+ * (C) 2010 Charlie Robbins
+ * MIT LICENCE
+ *
+ */
+
+var cliConfig = exports;
+
+cliConfig.levels = {
+ error: 0,
+ warn: 1,
+ help: 2,
+ data: 3,
+ info: 4,
+ debug: 5,
+ prompt: 6,
+ verbose: 7,
+ input: 8,
+ silly: 9,
+};
+
+cliConfig.colors = {
+ error: 'red',
+ warn: 'yellow',
+ help: 'cyan',
+ data: 'grey',
+ info: 'green',
+ debug: 'blue',
+ prompt: 'grey',
+ verbose: 'cyan',
+ input: 'grey',
+ silly: 'magenta'
+};
diff --git a/node_modules/winston/lib/winston/config/npm-config.js b/node_modules/winston/lib/winston/config/npm-config.js
new file mode 100644
index 0000000..6402ab3
--- /dev/null
+++ b/node_modules/winston/lib/winston/config/npm-config.js
@@ -0,0 +1,27 @@
+/*
+ * npm-config.js: Config that conform to npm logging levels.
+ *
+ * (C) 2010 Charlie Robbins
+ * MIT LICENCE
+ *
+ */
+
+var npmConfig = exports;
+
+npmConfig.levels = {
+ error: 0,
+ warn: 1,
+ info: 2,
+ verbose: 3,
+ debug: 4,
+ silly: 5
+};
+
+npmConfig.colors = {
+ error: 'red',
+ warn: 'yellow',
+ info: 'green',
+ verbose: 'cyan',
+ debug: 'blue',
+ silly: 'magenta'
+};
diff --git a/node_modules/winston/lib/winston/config/syslog-config.js b/node_modules/winston/lib/winston/config/syslog-config.js
new file mode 100644
index 0000000..67c6a09
--- /dev/null
+++ b/node_modules/winston/lib/winston/config/syslog-config.js
@@ -0,0 +1,31 @@
+/*
+ * syslog-config.js: Config that conform to syslog logging levels.
+ *
+ * (C) 2010 Charlie Robbins
+ * MIT LICENCE
+ *
+ */
+
+var syslogConfig = exports;
+
+syslogConfig.levels = {
+ emerg: 0,
+ alert: 1,
+ crit: 2,
+ error: 3,
+ warning: 4,
+ notice: 5,
+ info: 6,
+ debug: 7
+};
+
+syslogConfig.colors = {
+ emerg: 'red',
+ alert: 'yellow',
+ crit: 'red',
+ error: 'red',
+ warning: 'red',
+ notice: 'yellow',
+ info: 'green',
+ debug: 'blue'
+};
diff --git a/node_modules/winston/lib/winston/container.js b/node_modules/winston/lib/winston/container.js
new file mode 100644
index 0000000..f5faaa7
--- /dev/null
+++ b/node_modules/winston/lib/winston/container.js
@@ -0,0 +1,127 @@
+/*
+ * container.js: Inversion of control container for winston logger instances
+ *
+ * (C) 2010 Charlie Robbins
+ * MIT LICENCE
+ *
+ */
+
+var common = require('./common'),
+ winston = require('../winston'),
+ extend = require('util')._extend;
+
+//
+// ### function Container (options)
+// #### @options {Object} Default pass-thru options for Loggers
+// Constructor function for the Container object responsible for managing
+// a set of `winston.Logger` instances based on string ids.
+//
+var Container = exports.Container = function (options) {
+ this.loggers = {};
+ this.options = options || {};
+ this.default = {
+ transports: [
+ new winston.transports.Console({
+ level: 'silly',
+ colorize: false
+ })
+ ]
+ }
+};
+
+//
+// ### function get / add (id, options)
+// #### @id {string} Id of the Logger to get
+// #### @options {Object} **Optional** Options for the Logger instance
+// Retreives a `winston.Logger` instance for the specified `id`. If
+// an instance does not exist, one is created.
+//
+Container.prototype.get = Container.prototype.add = function (id, options) {
+ var self = this,
+ existing;
+
+ if (!this.loggers[id]) {
+ //
+ // Remark: Simple shallow clone for configuration options in case we pass in
+ // instantiated protoypal objects
+ //
+ options = extend({}, options || this.options || this.default);
+ existing = options.transports || this.options.transports;
+ //
+ // Remark: Make sure if we have an array of transports we slice it to make copies
+ // of those references.
+ //
+ options.transports = existing ? existing.slice() : [];
+
+ if (options.transports.length === 0 && (!options || !options['console'])) {
+ options.transports.push(this.default.transports[0]);
+ }
+
+ Object.keys(options).forEach(function (key) {
+ if (key === 'transports') {
+ return;
+ }
+
+ var name = common.capitalize(key);
+
+ if (!winston.transports[name]) {
+ throw new Error('Cannot add unknown transport: ' + name);
+ }
+
+ var namedOptions = options[key];
+ namedOptions.id = id;
+ options.transports.push(new (winston.transports[name])(namedOptions));
+ });
+
+ this.loggers[id] = new winston.Logger(options);
+
+ this.loggers[id].on('close', function () {
+ self._delete(id);
+ });
+ }
+
+ return this.loggers[id];
+};
+
+//
+// ### function close (id)
+// #### @id {string} **Optional** Id of the Logger instance to find
+// Returns a boolean value indicating if this instance
+// has a logger with the specified `id`.
+//
+Container.prototype.has = function (id) {
+ return !!this.loggers[id];
+};
+
+//
+// ### function close (id)
+// #### @id {string} **Optional** Id of the Logger instance to close
+// Closes a `Logger` instance with the specified `id` if it exists.
+// If no `id` is supplied then all Loggers are closed.
+//
+Container.prototype.close = function (id) {
+ var self = this;
+
+ function _close (id) {
+ if (!self.loggers[id]) {
+ return;
+ }
+
+ self.loggers[id].close();
+ self._delete(id);
+ }
+
+ return id ? _close(id) : Object.keys(this.loggers).forEach(function (id) {
+ _close(id);
+ });
+};
+
+//
+// ### @private function _delete (id)
+// #### @id {string} Id of the Logger instance to delete from container
+// Deletes a `Logger` instance with the specified `id`.
+//
+Container.prototype._delete = function (id) {
+ delete this.loggers[id];
+}
+
diff --git a/node_modules/winston/lib/winston/exception.js b/node_modules/winston/lib/winston/exception.js
new file mode 100644
index 0000000..22717dd
--- /dev/null
+++ b/node_modules/winston/lib/winston/exception.js
@@ -0,0 +1,56 @@
+/*
+ * exception.js: Utility methods for gathing information about uncaughtExceptions.
+ *
+ * (C) 2010 Charlie Robbins
+ * MIT LICENCE
+ *
+ */
+
+var os = require('os'),
+ stackTrace = require('stack-trace');
+
+var exception = exports;
+
+exception.getAllInfo = function (err) {
+ return {
+ date: new Date().toString(),
+ process: exception.getProcessInfo(),
+ os: exception.getOsInfo(),
+ trace: exception.getTrace(err),
+ stack: err.stack && err.stack.split('\n')
+ };
+};
+
+exception.getProcessInfo = function () {
+ return {
+ pid: process.pid,
+ uid: process.getuid ? process.getuid() : null,
+ gid: process.getgid ? process.getgid() : null,
+ cwd: process.cwd(),
+ execPath: process.execPath,
+ version: process.version,
+ argv: process.argv,
+ memoryUsage: process.memoryUsage()
+ };
+};
+
+exception.getOsInfo = function () {
+ return {
+ loadavg: os.loadavg(),
+ uptime: os.uptime()
+ };
+};
+
+exception.getTrace = function (err) {
+ var trace = err ? stackTrace.parse(err) : stackTrace.get();
+ return trace.map(function (site) {
+ return {
+ column: site.getColumnNumber(),
+ file: site.getFileName(),
+ function: site.getFunctionName(),
+ line: site.getLineNumber(),
+ method: site.getMethodName(),
+ native: site.isNative(),
+ }
+ });
+};
diff --git a/node_modules/winston/lib/winston/logger.js b/node_modules/winston/lib/winston/logger.js
new file mode 100644
index 0000000..97fba64
--- /dev/null
+++ b/node_modules/winston/lib/winston/logger.js
@@ -0,0 +1,723 @@
+/*
+ * logger.js: Core logger object used by winston.
+ *
+ * (C) 2010 Charlie Robbins
+ * MIT LICENCE
+ *
+ */
+
+var events = require('events'),
+ util = require('util'),
+ async = require('async'),
+ config = require('./config'),
+ common = require('./common'),
+ exception = require('./exception'),
+ Stream = require('stream').Stream;
+
+const formatRegExp = /%[sdj%]/g;
+
+//
+// ### function Logger (options)
+// #### @options {Object} Options for this instance.
+// Constructor function for the Logger object responsible
+// for persisting log messages and metadata to one or more transports.
+//
+var Logger = exports.Logger = function (options) {
+ events.EventEmitter.call(this);
+ this.configure(options);
+};
+
+//
+// Inherit from `events.EventEmitter`.
+//
+util.inherits(Logger, events.EventEmitter);
+
+//
+// ### function configure (options)
+// This will wholesale reconfigure this instance by:
+// 1. Resetting all transports. Older transports will be removed implicitly.
+// 2. Set all other options including levels, colors, rewriters, filters,
+// exceptionHandlers, etc.
+//
+Logger.prototype.configure = function (options) {
+ var self = this;
+
+ //
+ // If we have already been setup with transports
+ // then remove them before proceeding.
+ //
+ if (Array.isArray(this._names) && this._names.length) {
+ this.clear();
+ }
+
+ options = options || {};
+ this.transports = {};
+ this._names = [];
+
+ if (options.transports) {
+ options.transports.forEach(function (transport) {
+ self.add(transport, null, true);
+ });
+ }
+
+ //
+ // Set Levels and default logging level
+ //
+ this.padLevels = options.padLevels || false;
+ this.setLevels(options.levels);
+ if (options.colors) {
+ config.addColors(options.colors);
+ }
+
+ //
+ // Hoist other options onto this instance.
+ //
+ this.level = options.level || 'info';
+ this.emitErrs = options.emitErrs || false;
+ this.stripColors = options.stripColors || false;
+ this.exitOnError = typeof options.exitOnError !== 'undefined'
+ ? options.exitOnError
+ : true;
+
+ //
+ // Setup internal state as empty Objects even though it is
+ // defined lazily later to ensure a strong existential API contract.
+ //
+ this.exceptionHandlers = {};
+ this.profilers = {};
+
+ ['rewriters', 'filters'].forEach(function (kind) {
+ self[kind] = Array.isArray(options[kind])
+ ? options[kind]
+ : [];
+ });
+
+ if (options.exceptionHandlers) {
+ this.handleExceptions(options.exceptionHandlers);
+ }
+};
+
+//
+// ### function log (level, msg, [meta], callback)
+// #### @level {string} Level at which to log the message.
+// #### @msg {string} Message to log
+// #### @meta {Object} **Optional** Additional metadata to attach
+// #### @callback {function} Continuation to respond to when complete.
+// Core logging method exposed to Winston. Metadata is optional.
+//
+Logger.prototype.log = function (level) {
+ var args = Array.prototype.slice.call(arguments, 1),
+ self = this,
+ transports;
+
+ while (args[args.length - 1] === null) {
+ args.pop();
+ }
+
+ //
+ // Determining what is `meta` and what are arguments for string interpolation
+ // turns out to be VERY tricky. e.g. in the cases like this:
+ //
+ // logger.info('No interpolation symbols', 'ok', 'why', { meta: 'is-this' });
+ //
+ var callback = typeof args[args.length - 1] === 'function'
+ ? args.pop()
+ : null;
+
+ //
+ // Handle errors appropriately.
+ //
+ function onError(err) {
+ if (callback) {
+ callback(err);
+ }
+ else if (self.emitErrs) {
+ self.emit('error', err);
+ }
+ }
+
+ if (this._names.length === 0) {
+ return onError(new Error('Cannot log with no transports.'));
+ }
+ else if (typeof self.levels[level] === 'undefined') {
+ return onError(new Error('Unknown log level: ' + level));
+ }
+
+ //
+ // If there are no transports that match the level
+ // then be eager and return. This could potentially be calculated
+ // during `setLevels` for more performance gains.
+ //
+ var targets = this._names.filter(function (name) {
+ var transport = self.transports[name];
+ return (transport.level && self.levels[transport.level] >= self.levels[level])
+ || (!transport.level && self.levels[self.level] >= self.levels[level]);
+ });
+
+ if (!targets.length) {
+ if (callback) { callback(); }
+ return;
+ }
+
+ //
+ // Determining what is `meta` and what are arguments for string interpolation
+ // turns out to be VERY tricky. e.g. in the cases like this:
+ //
+ // logger.info('No interpolation symbols', 'ok', 'why', { meta: 'is-this' });
+ //
+ var metaType = Object.prototype.toString.call(args[args.length - 1]),
+ fmtMatch = args[0] && args[0].match && args[0].match(formatRegExp),
+ isFormat = fmtMatch && fmtMatch.length,
+ validMeta = !isFormat
+ ? metaType === '[object Object]' || metaType === '[object Error]' || metaType === '[object Array]'
+ : metaType === '[object Object]',
+ meta = validMeta ? args.pop() : {},
+ msg = util.format.apply(null, args);
+
+ //
+ // Respond to the callback.
+ //
+ function finish(err) {
+ if (callback) {
+ if (err) return callback(err);
+ callback(null, level, msg, meta);
+ }
+
+ callback = null;
+ if (!err) {
+ self.emit('logged', level, msg, meta);
+ }
+ }
+
+ // If we should pad for levels, do so
+ if (this.padLevels) {
+ msg = new Array(this.levelLength - level.length + 1).join(' ') + msg;
+ }
+
+ this.rewriters.forEach(function (rewriter) {
+ meta = rewriter(level, msg, meta, self);
+ });
+
+ this.filters.forEach(function(filter) {
+ var filtered = filter(level, msg, meta, self);
+ if (typeof filtered === 'string')
+ msg = filtered;
+ else {
+ msg = filtered.msg;
+ meta = filtered.meta;
+ }
+ });
+
+ //
+ // For consideration of terminal 'color" programs like colors.js,
+ // which can add ANSI escape color codes to strings, we destyle the
+ // ANSI color escape codes when `this.stripColors` is set.
+ //
+ // see: http://en.wikipedia.org/wiki/ANSI_escape_code
+ //
+ if (this.stripColors) {
+ var code = /\u001b\[(\d+(;\d+)*)?m/g;
+ msg = ('' + msg).replace(code, '');
+ }
+
+ //
+ // Log for each transport and emit 'logging' event
+ //
+ function transportLog(name, next) {
+ var transport = self.transports[name];
+ transport.log(level, msg, meta, function (err) {
+ if (err) {
+ err.transport = transport;
+ finish(err);
+ return next();
+ }
+
+ self.emit('logging', transport, level, msg, meta);
+ next();
+ });
+ }
+
+ async.forEach(targets, transportLog, finish);
+ return this;
+};
+
+//
+// ### function query (options, callback)
+// #### @options {Object} Query options for this instance.
+// #### @callback {function} Continuation to respond to when complete.
+// Queries the all transports for this instance with the specified `options`.
+// This will aggregate each transport's results into one object containing
+// a property per transport.
+//
+Logger.prototype.query = function (options, callback) {
+ if (typeof options === 'function') {
+ callback = options;
+ options = {};
+ }
+
+ var self = this,
+ options = options || {},
+ results = {},
+ query = common.clone(options.query) || {},
+ transports;
+
+ //
+ // Helper function to query a single transport
+ //
+ function queryTransport(transport, next) {
+ if (options.query) {
+ options.query = transport.formatQuery(query);
+ }
+
+ transport.query(options, function (err, results) {
+ if (err) {
+ return next(err);
+ }
+
+ next(null, transport.formatResults(results, options.format));
+ });
+ }
+
+ //
+ // Helper function to accumulate the results from
+ // `queryTransport` into the `results`.
+ //
+ function addResults(transport, next) {
+ queryTransport(transport, function (err, result) {
+ //
+ // queryTransport could potentially invoke the callback
+ // multiple times since Transport code can be unpredictable.
+ //
+ if (next) {
+ result = err || result;
+ if (result) {
+ results[transport.name] = result;
+ }
+
+ next();
+ }
+
+ next = null;
+ });
+ }
+
+ //
+ // If an explicit transport is being queried then
+ // respond with the results from only that transport
+ //
+ if (options.transport) {
+ options.transport = options.transport.toLowerCase();
+ return queryTransport(this.transports[options.transport], callback);
+ }
+
+ //
+ // Create a list of all transports for this instance.
+ //
+ transports = this._names.map(function (name) {
+ return self.transports[name];
+ }).filter(function (transport) {
+ return !!transport.query;
+ });
+
+ //
+ // Iterate over the transports in parallel setting the
+ // appropriate key in the `results`
+ //
+ async.forEach(transports, addResults, function () {
+ callback(null, results);
+ });
+};
+
+//
+// ### function stream (options)
+// #### @options {Object} Stream options for this instance.
+// Returns a log stream for all transports. Options object is optional.
+//
+Logger.prototype.stream = function (options) {
+ var self = this,
+ options = options || {},
+ out = new Stream,
+ streams = [],
+ transports;
+
+ if (options.transport) {
+ var transport = this.transports[options.transport];
+ delete options.transport;
+ if (transport && transport.stream) {
+ return transport.stream(options);
+ }
+ }
+
+ out._streams = streams;
+ out.destroy = function () {
+ var i = streams.length;
+ while (i--) streams[i].destroy();
+ };
+
+ //
+ // Create a list of all transports for this instance.
+ //
+ transports = this._names.map(function (name) {
+ return self.transports[name];
+ }).filter(function (transport) {
+ return !!transport.stream;
+ });
+
+ transports.forEach(function (transport) {
+ var stream = transport.stream(options);
+ if (!stream) return;
+
+ streams.push(stream);
+
+ stream.on('log', function (log) {
+ log.transport = log.transport || [];
+ log.transport.push(transport.name);
+ out.emit('log', log);
+ });
+
+ stream.on('error', function (err) {
+ err.transport = err.transport || [];
+ err.transport.push(transport.name);
+ out.emit('error', err);
+ });
+ });
+
+ return out;
+};
+
+//
+// ### function close ()
+// Cleans up resources (streams, event listeners) for all
+// transports associated with this instance (if necessary).
+//
+Logger.prototype.close = function () {
+ var self = this;
+
+ this._names.forEach(function (name) {
+ var transport = self.transports[name];
+ if (transport && transport.close) {
+ transport.close();
+ }
+ });
+
+ this.emit('close');
+};
+
+//
+// ### function handleExceptions ([tr0, tr1...] || tr0, tr1, ...)
+// Handles `uncaughtException` events for the current process by
+// ADDING any handlers passed in.
+//
+Logger.prototype.handleExceptions = function () {
+ var args = Array.prototype.slice.call(arguments),
+ handlers = [],
+ self = this;
+
+ args.forEach(function (a) {
+ if (Array.isArray(a)) {
+ handlers = handlers.concat(a);
+ }
+ else {
+ handlers.push(a);
+ }
+ });
+
+ this.exceptionHandlers = this.exceptionHandlers || {};
+ handlers.forEach(function (handler) {
+ self.exceptionHandlers[handler.name] = handler;
+ });
+
+ this._hnames = Object.keys(self.exceptionHandlers);
+
+ if (!this.catchExceptions) {
+ this.catchExceptions = this._uncaughtException.bind(this);
+ process.on('uncaughtException', this.catchExceptions);
+ }
+};
+
+//
+// ### function unhandleExceptions ()
+// Removes any handlers to `uncaughtException` events
+// for the current process
+//
+Logger.prototype.unhandleExceptions = function () {
+ var self = this;
+
+ if (this.catchExceptions) {
+ Object.keys(this.exceptionHandlers).forEach(function (name) {
+ var handler = self.exceptionHandlers[name];
+ if (handler.close) {
+ handler.close();
+ }
+ });
+
+ this.exceptionHandlers = {};
+ Object.keys(this.transports).forEach(function (name) {
+ var transport = self.transports[name];
+ if (transport.handleExceptions) {
+ transport.handleExceptions = false;
+ }
+ })
+
+ process.removeListener('uncaughtException', this.catchExceptions);
+ this.catchExceptions = false;
+ }
+};
+
+//
+// ### function add (transport, [options])
+// #### @transport {Transport} Prototype of the Transport object to add.
+// #### @options {Object} **Optional** Options for the Transport to add.
+// #### @instance {Boolean} **Optional** Value indicating if `transport` is already instantiated.
+// Adds a transport of the specified type to this instance.
+//
+Logger.prototype.add = function (transport, options, created) {
+ var instance = created ? transport : (new (transport)(options));
+
+ if (!instance.name && !instance.log) {
+ throw new Error('Unknown transport with no log() method');
+ }
+ else if (this.transports[instance.name]) {
+ throw new Error('Transport already attached: ' + instance.name);
+ }
+
+ this.transports[instance.name] = instance;
+ this._names = Object.keys(this.transports);
+
+ //
+ // Listen for the `error` event on the new Transport
+ //
+ instance._onError = this._onError.bind(this, instance)
+ if (!created) {
+ instance.on('error', instance._onError);
+ }
+
+ //
+ // If this transport has `handleExceptions` set to `true`
+ // and we are not already handling exceptions, do so.
+ //
+ if (instance.handleExceptions && !this.catchExceptions) {
+ this.handleExceptions();
+ }
+
+ return this;
+};
+
+//
+// ### function clear ()
+// Remove all transports from this instance
+//
+Logger.prototype.clear = function () {
+ Object.keys(this.transports).forEach(function (name) {
+ this.remove({ name: name });
+ }, this);
+};
+
+//
+// ### function remove (transport)
+// #### @transport {Transport|String} Transport or Name to remove.
+// Removes a transport of the specified type from this instance.
+//
+Logger.prototype.remove = function (transport) {
+ var name = typeof transport !== 'string'
+ ? transport.name || transport.prototype.name
+ : transport;
+
+ if (!this.transports[name]) {
+ throw new Error('Transport ' + name + ' not attached to this instance');
+ }
+
+ var instance = this.transports[name];
+ delete this.transports[name];
+ this._names = Object.keys(this.transports);
+
+ if (instance.close) {
+ instance.close();
+ }
+
+ if (instance._onError) {
+ instance.removeListener('error', instance._onError);
+ }
+ return this;
+};
+
+//
+// ### function startTimer ()
+// Returns an object corresponding to a specific timing. When done
+// is called the timer will finish and log the duration. e.g.:
+//
+// timer = winston.startTimer()
+// setTimeout(function(){
+// timer.done("Logging message");
+// }, 1000);
+//
+Logger.prototype.startTimer = function () {
+ return new ProfileHandler(this);
+};
+
+//
+// ### function profile (id, [msg, meta, callback])
+// #### @id {string} Unique id of the profiler
+// #### @msg {string} **Optional** Message to log
+// #### @meta {Object} **Optional** Additional metadata to attach
+// #### @callback {function} **Optional** Continuation to respond to when complete.
+// Tracks the time inbetween subsequent calls to this method
+// with the same `id` parameter. The second call to this method
+// will log the difference in milliseconds along with the message.
+//
+Logger.prototype.profile = function (id) {
+ var now = Date.now(), then, args,
+ msg, meta, callback;
+
+ if (this.profilers[id]) {
+ then = this.profilers[id];
+ delete this.profilers[id];
+
+ // Support variable arguments: msg, meta, callback
+ args = Array.prototype.slice.call(arguments);
+ callback = typeof args[args.length - 1] === 'function' ? args.pop() : null;
+ meta = typeof args[args.length - 1] === 'object' ? args.pop() : {};
+ msg = args.length === 2 ? args[1] : id;
+
+ // Set the duration property of the metadata
+ meta.durationMs = now - then;
+ return this.info(msg, meta, callback);
+ }
+ else {
+ this.profilers[id] = now;
+ }
+
+ return this;
+};
+
+//
+// ### function setLevels (target)
+// #### @target {Object} Target levels to use on this instance
+// Sets the `target` levels specified on this instance.
+//
+Logger.prototype.setLevels = function (target) {
+ return common.setLevels(this, this.levels, target);
+};
+
+//
+// ### function cli ()
+// Configures this instance to have the default
+// settings for command-line interfaces: no timestamp,
+// colors enabled, padded output, and additional levels.
+//
+Logger.prototype.cli = function () {
+ this.padLevels = true;
+ this.setLevels(config.cli.levels);
+ config.addColors(config.cli.colors);
+
+ if (this.transports.console) {
+ this.transports.console.colorize = this.transports.console.colorize || true;
+ this.transports.console.timestamp = this.transports.console.timestamp || false;
+ }
+
+ return this;
+};
+
+//
+// ### @private function _uncaughtException (err)
+// #### @err {Error} Error to handle
+// Logs all relevant information around the `err` and
+// exits the current process.
+//
+Logger.prototype._uncaughtException = function (err) {
+ var self = this,
+ responded = false,
+ info = exception.getAllInfo(err),
+ handlers = this._getExceptionHandlers(),
+ timeout,
+ doExit;
+
+ //
+ // Calculate if we should exit on this error
+ //
+ doExit = typeof this.exitOnError === 'function'
+ ? this.exitOnError(err)
+ : this.exitOnError;
+
+ function logAndWait(transport, next) {
+ transport.logException('uncaughtException: ' + (err.message || err), info, next, err);
+ }
+
+ function gracefulExit() {
+ if (doExit && !responded) {
+ //
+ // Remark: Currently ignoring any exceptions from transports
+ // when catching uncaught exceptions.
+ //
+ clearTimeout(timeout);
+ responded = true;
+ process.exit(1);
+ }
+ }
+
+ if (!handlers || handlers.length === 0) {
+ return gracefulExit();
+ }
+
+ //
+ // Log to all transports and allow the operation to take
+ // only up to `3000ms`.
+ //
+ async.forEach(handlers, logAndWait, gracefulExit);
+ if (doExit) {
+ timeout = setTimeout(gracefulExit, 3000);
+ }
+};
+
+//
+// ### @private function _getExceptionHandlers ()
+// Returns the list of transports and exceptionHandlers
+// for this instance.
+//
+Logger.prototype._getExceptionHandlers = function () {
+ var self = this;
+
+ return this._hnames.map(function (name) {
+ return self.exceptionHandlers[name];
+ }).concat(this._names.map(function (name) {
+ return self.transports[name].handleExceptions && self.transports[name];
+ })).filter(Boolean);
+};
+
+//
+// ### @private function _onError (transport, err)
+// #### @transport {Object} Transport on which the error occured
+// #### @err {Error} Error that occurred on the transport
+// Bubbles the error, `err`, that occured on the specified `transport`
+// up from this instance if `emitErrs` has been set.
+//
+Logger.prototype._onError = function (transport, err) {
+ if (this.emitErrs) {
+ this.emit('error', err, transport);
+ }
+};
+
+//
+// ### @private ProfileHandler
+// Constructor function for the ProfileHandler instance used by
+// `Logger.prototype.startTimer`. When done is called the timer
+// will finish and log the duration.
+//
+function ProfileHandler(logger) {
+ this.logger = logger;
+ this.start = Date.now();
+}
+
+//
+// ### function done (msg)
+// Ends the current timer (i.e. ProfileHandler) instance and
+// logs the `msg` along with the duration since creation.
+//
+ProfileHandler.prototype.done = function (msg) {
+ var args = Array.prototype.slice.call(arguments),
+ callback = typeof args[args.length - 1] === 'function' ? args.pop() : null,
+ meta = typeof args[args.length - 1] === 'object' ? args.pop() : {};
+
+ meta.duration = (Date.now()) - this.start + 'ms';
+ return this.logger.info(msg, meta, callback);
+};
diff --git a/node_modules/winston/lib/winston/transports.js b/node_modules/winston/lib/winston/transports.js
new file mode 100644
index 0000000..34f800e
--- /dev/null
+++ b/node_modules/winston/lib/winston/transports.js
@@ -0,0 +1,29 @@
+/*
+ * transports.js: Set of all transports Winston knows about
+ *
+ * (C) 2010 Charlie Robbins
+ * MIT LICENCE
+ *
+ */
+
+var path = require('path');
+
+//
+// Setup all transports as lazy-loaded getters.
+//
+Object.defineProperties(
+ exports,
+ ['Console', 'File', 'Http', 'Memory']
+ .reduce(function (acc, name) {
+ acc[name] = {
+ configurable: true,
+ enumerable: true,
+ get: function () {
+ var fullpath = path.join(__dirname, 'transports', name.toLowerCase());
+ return exports[name] = require(fullpath)[name];
+ }
+ };
+
+ return acc;
+ }, {})
+);
diff --git a/node_modules/winston/lib/winston/transports/console.js b/node_modules/winston/lib/winston/transports/console.js
new file mode 100644
index 0000000..f573e17
--- /dev/null
+++ b/node_modules/winston/lib/winston/transports/console.js
@@ -0,0 +1,130 @@
+/*
+ * console.js: Transport for outputting to the console
+ *
+ * (C) 2010 Charlie Robbins
+ * MIT LICENCE
+ *
+ */
+
+var events = require('events'),
+ os = require('os'),
+ util = require('util'),
+ common = require('../common'),
+ Transport = require('./transport').Transport;
+
+//
+// ### function Console (options)
+// #### @options {Object} Options for this instance.
+// Constructor function for the Console transport object responsible
+// for persisting log messages and metadata to a terminal or TTY.
+//
+var Console = exports.Console = function (options) {
+ Transport.call(this, options);
+ options = options || {};
+
+ this.json = options.json || false;
+ this.colorize = options.colorize || false;
+ this.prettyPrint = options.prettyPrint || false;
+ this.timestamp = typeof options.timestamp !== 'undefined' ? options.timestamp : false;
+ this.showLevel = options.showLevel === undefined ? true : options.showLevel;
+ this.label = options.label || null;
+ this.logstash = options.logstash || false;
+ this.depth = options.depth || null;
+ this.align = options.align || false;
+ this.stderrLevels = setStderrLevels(options.stderrLevels, options.debugStdout);
+ this.eol = options.eol || os.EOL;
+
+ if (this.json) {
+ this.stringify = options.stringify || function (obj) {
+ return JSON.stringify(obj, null, 2);
+ };
+ }
+
+ //
+ // Convert stderrLevels into an Object for faster key-lookup times than an Array.
+ //
+ // For backwards compatibility, stderrLevels defaults to ['error', 'debug']
+ // or ['error'] depending on whether options.debugStdout is true.
+ //
+ function setStderrLevels (levels, debugStdout) {
+ var defaultMsg = 'Cannot have non-string elements in stderrLevels Array';
+ if (debugStdout) {
+ if (levels) {
+ //
+ // Don't allow setting both debugStdout and stderrLevels together,
+ // since this could cause behaviour a programmer might not expect.
+ //
+ throw new Error('Cannot set debugStdout and stderrLevels together');
+ }
+
+ return common.stringArrayToSet(['error'], defaultMsg);
+ }
+
+ if (!levels) {
+ return common.stringArrayToSet(['error', 'debug'], defaultMsg);
+ } else if (!(Array.isArray(levels))) {
+ throw new Error('Cannot set stderrLevels to type other than Array');
+ }
+
+ return common.stringArrayToSet(levels, defaultMsg);
+ };
+};
+
+//
+// Inherit from `winston.Transport`.
+//
+util.inherits(Console, Transport);
+
+//
+// Expose the name of this Transport on the prototype
+//
+Console.prototype.name = 'console';
+
+//
+// ### function log (level, msg, [meta], callback)
+// #### @level {string} Level at which to log the message.
+// #### @msg {string} Message to log
+// #### @meta {Object} **Optional** Additional metadata to attach
+// #### @callback {function} Continuation to respond to when complete.
+// Core logging method exposed to Winston. Metadata is optional.
+//
+Console.prototype.log = function (level, msg, meta, callback) {
+ if (this.silent) {
+ return callback(null, true);
+ }
+
+ var self = this,
+ output;
+
+ output = common.log({
+ colorize: this.colorize,
+ json: this.json,
+ level: level,
+ message: msg,
+ meta: meta,
+ stringify: this.stringify,
+ timestamp: this.timestamp,
+ showLevel: this.showLevel,
+ prettyPrint: this.prettyPrint,
+ raw: this.raw,
+ label: this.label,
+ logstash: this.logstash,
+ depth: this.depth,
+ formatter: this.formatter,
+ align: this.align,
+ humanReadableUnhandledException: this.humanReadableUnhandledException
+ });
+
+ if (this.stderrLevels[level]) {
+ process.stderr.write(output + '\n');
+ } else {
+ process.stdout.write(output + this.eol);
+ }
+
+ //
+ // Emit the `logged` event immediately because the event loop
+ // will not exit until `process.stdout` has drained anyway.
+ //
+ self.emit('logged');
+ callback(null, true);
+};
diff --git a/node_modules/winston/lib/winston/transports/file.js b/node_modules/winston/lib/winston/transports/file.js
new file mode 100644
index 0000000..b3df4b5
--- /dev/null
+++ b/node_modules/winston/lib/winston/transports/file.js
@@ -0,0 +1,678 @@
+/*
+ * file.js: Transport for outputting to a local log file
+ *
+ * (C) 2010 Charlie Robbins
+ * MIT LICENCE
+ *
+ */
+
+var events = require('events'),
+ fs = require('fs'),
+ path = require('path'),
+ util = require('util'),
+ async = require('async'),
+ zlib = require('zlib'),
+ common = require('../common'),
+ Transport = require('./transport').Transport,
+ isWritable = require('isstream').isWritable,
+ Stream = require('stream').Stream,
+ os = require('os');
+
+//
+// ### function File (options)
+// #### @options {Object} Options for this instance.
+// Constructor function for the File transport object responsible
+// for persisting log messages and metadata to one or more files.
+//
+var File = exports.File = function (options) {
+ var self = this;
+ Transport.call(this, options);
+
+ //
+ // Helper function which throws an `Error` in the event
+ // that any of the rest of the arguments is present in `options`.
+ //
+ function throwIf (target /*, illegal... */) {
+ Array.prototype.slice.call(arguments, 1).forEach(function (name) {
+ if (options[name]) {
+ throw new Error('Cannot set ' + name + ' and ' + target + 'together');
+ }
+ });
+ }
+
+ if (options.filename || options.dirname) {
+ throwIf('filename or dirname', 'stream');
+ this._basename = this.filename = options.filename
+ ? path.basename(options.filename)
+ : 'winston.log';
+
+ this.dirname = options.dirname || path.dirname(options.filename);
+ this.options = options.options || { flags: 'a' };
+
+ //
+ // "24 bytes" is maybe a good value for logging lines.
+ //
+ this.options.highWaterMark = this.options.highWaterMark || 24;
+ }
+ else if (options.stream) {
+ throwIf('stream', 'filename', 'maxsize');
+ this._stream = options.stream;
+ this._isStreams2 = isWritable(this._stream);
+ this._stream.on('error', function(error){
+ self.emit('error', error);
+ });
+ //
+ // We need to listen for drain events when
+ // write() returns false. This can make node
+ // mad at times.
+ //
+ this._stream.setMaxListeners(Infinity);
+ }
+ else {
+ throw new Error('Cannot log to file without filename or stream.');
+ }
+
+ this.json = options.json !== false;
+ this.logstash = options.logstash || false;
+ this.colorize = options.colorize || false;
+ this.maxsize = options.maxsize || null;
+ this.rotationFormat = options.rotationFormat || false;
+ this.zippedArchive = options.zippedArchive || false;
+ this.maxFiles = options.maxFiles || null;
+ this.prettyPrint = options.prettyPrint || false;
+ this.label = options.label || null;
+ this.timestamp = options.timestamp != null ? options.timestamp : true;
+ this.eol = options.eol || os.EOL;
+ this.tailable = options.tailable || false;
+ this.depth = options.depth || null;
+ this.showLevel = options.showLevel === undefined ? true : options.showLevel;
+ this.maxRetries = options.maxRetries || 2;
+
+ if (this.json) {
+ this.stringify = options.stringify;
+ }
+
+ //
+ // Internal state variables representing the number
+ // of files this instance has created and the current
+ // size (in bytes) of the current logfile.
+ //
+ this._size = 0;
+ this._created = 0;
+ this._buffer = [];
+ this._draining = false;
+ this._opening = false;
+ this._failures = 0;
+ this._archive = null;
+};
+
+//
+// Inherit from `winston.Transport`.
+//
+util.inherits(File, Transport);
+
+//
+// Expose the name of this Transport on the prototype
+//
+File.prototype.name = 'file';
+
+//
+// ### function log (level, msg, [meta], callback)
+// #### @level {string} Level at which to log the message.
+// #### @msg {string} Message to log
+// #### @meta {Object} **Optional** Additional metadata to attach
+// #### @callback {function} Continuation to respond to when complete.
+// Core logging method exposed to Winston. Metadata is optional.
+//
+File.prototype.log = function (level, msg, meta, callback) {
+ if (this.silent) {
+ return callback(null, true);
+ }
+
+ //
+ // If failures exceeds maxRetries then we can't access the
+ // stream. In this case we need to perform a noop and return
+ // an error.
+ //
+ if (this._failures >= this.maxRetries) {
+ return callback(new Error('Transport is in a failed state.'));
+ }
+
+ var self = this;
+
+ if (typeof msg !== 'string') {
+ msg = '' + msg;
+ }
+
+ var output = common.log({
+ level: level,
+ message: msg,
+ meta: meta,
+ json: this.json,
+ logstash: this.logstash,
+ colorize: this.colorize,
+ prettyPrint: this.prettyPrint,
+ timestamp: this.timestamp,
+ showLevel: this.showLevel,
+ stringify: this.stringify,
+ label: this.label,
+ depth: this.depth,
+ formatter: this.formatter,
+ humanReadableUnhandledException: this.humanReadableUnhandledException
+ });
+
+ if (typeof output === 'string') {
+ output += this.eol;
+ }
+
+ if (!this.filename) {
+ //
+ // If there is no `filename` on this instance then it was configured
+ // with a raw `WriteableStream` instance and we should not perform any
+ // size restrictions.
+ //
+ this._write(output, callback);
+ this._size += output.length;
+ this._lazyDrain();
+ }
+ else {
+ this.open(function (err) {
+ if (err) {
+ //
+ // If there was an error enqueue the message
+ //
+ return self._buffer.push([output, callback]);
+ }
+
+ self._write(output, callback);
+ self._size += output.length;
+ self._lazyDrain();
+ });
+ }
+};
+
+//
+// ### function _write (data, cb)
+// #### @data {String|Buffer} Data to write to the instance's stream.
+// #### @cb {function} Continuation to respond to when complete.
+// Write to the stream, ensure execution of a callback on completion.
+//
+File.prototype._write = function(data, callback) {
+ if (this._isStreams2) {
+ this._stream.write(data);
+ return callback && process.nextTick(function () {
+ callback(null, true);
+ });
+ }
+
+ // If this is a file write stream, we could use the builtin
+ // callback functionality, however, the stream is not guaranteed
+ // to be an fs.WriteStream.
+ var ret = this._stream.write(data);
+ if (!callback) return;
+ if (ret === false) {
+ return this._stream.once('drain', function() {
+ callback(null, true);
+ });
+ }
+ process.nextTick(function () {
+ callback(null, true);
+ });
+};
+
+//
+// ### function query (options, callback)
+// #### @options {Object} Loggly-like query options for this instance.
+// #### @callback {function} Continuation to respond to when complete.
+// Query the transport. Options object is optional.
+//
+File.prototype.query = function (options, callback) {
+ if (typeof options === 'function') {
+ callback = options;
+ options = {};
+ }
+
+ var file = path.join(this.dirname, this.filename),
+ options = this.normalizeQuery(options),
+ buff = '',
+ results = [],
+ row = 0;
+
+ var stream = fs.createReadStream(file, {
+ encoding: 'utf8'
+ });
+
+ stream.on('error', function (err) {
+ if (stream.readable) {
+ stream.destroy();
+ }
+ if (!callback) return;
+ return err.code !== 'ENOENT'
+ ? callback(err)
+ : callback(null, results);
+ });
+
+ stream.on('data', function (data) {
+ var data = (buff + data).split(/\n+/),
+ l = data.length - 1,
+ i = 0;
+
+ for (; i < l; i++) {
+ if (!options.start || row >= options.start) {
+ add(data[i]);
+ }
+ row++;
+ }
+
+ buff = data[l];
+ });
+
+ stream.on('close', function () {
+ if (buff) add(buff, true);
+ if (options.order === 'desc') {
+ results = results.reverse();
+ }
+ if (callback) callback(null, results);
+ });
+
+ function add(buff, attempt) {
+ try {
+ var log = JSON.parse(buff);
+ if (check(log)) push(log);
+ } catch (e) {
+ if (!attempt) {
+ stream.emit('error', e);
+ }
+ }
+ }
+
+ function push(log) {
+ if (options.rows && results.length >= options.rows) {
+ if (stream.readable) {
+ stream.destroy();
+ }
+ return;
+ }
+
+ if (options.fields) {
+ var obj = {};
+ options.fields.forEach(function (key) {
+ obj[key] = log[key];
+ });
+ log = obj;
+ }
+
+ results.push(log);
+ }
+
+ function check(log) {
+ if (!log) return;
+
+ if (typeof log !== 'object') return;
+
+ var time = new Date(log.timestamp);
+ if ((options.from && time < options.from)
+ || (options.until && time > options.until)) {
+ return;
+ }
+
+ return true;
+ }
+};
+
+//
+// ### function stream (options)
+// #### @options {Object} Stream options for this instance.
+// Returns a log stream for this transport. Options object is optional.
+//
+File.prototype.stream = function (options) {
+ var file = path.join(this.dirname, this.filename),
+ options = options || {},
+ stream = new Stream;
+
+ var tail = {
+ file: file,
+ start: options.start
+ };
+
+ stream.destroy = common.tailFile(tail, function (err, line) {
+
+ if(err){
+ return stream.emit('error',err);
+ }
+
+ try {
+ stream.emit('data', line);
+ line = JSON.parse(line);
+ stream.emit('log', line);
+ } catch (e) {
+ stream.emit('error', e);
+ }
+ });
+
+ return stream;
+};
+
+//
+// ### function open (callback)
+// #### @callback {function} Continuation to respond to when complete
+// Checks to see if a new file needs to be created based on the `maxsize`
+// (if any) and the current size of the file used.
+//
+File.prototype.open = function (callback) {
+ if (this.opening) {
+ //
+ // If we are already attempting to open the next
+ // available file then respond with a value indicating
+ // that the message should be buffered.
+ //
+ return callback(true);
+ }
+ else if (!this._stream || (this.maxsize && this._size >= this.maxsize)) {
+ //
+ // If we dont have a stream or have exceeded our size, then create
+ // the next stream and respond with a value indicating that
+ // the message should be buffered.
+ //
+ callback(true);
+ return this._createStream();
+ }
+
+ this._archive = this.zippedArchive ? this._stream.path : null;
+
+ //
+ // Otherwise we have a valid (and ready) stream.
+ //
+ callback();
+};
+
+//
+// ### function close ()
+// Closes the stream associated with this instance.
+//
+File.prototype.close = function () {
+ var self = this;
+
+ if (this._stream) {
+ this._stream.end();
+ this._stream.destroySoon();
+
+ this._stream.once('finish', function () {
+ self.emit('flush');
+ self.emit('closed');
+ });
+ }
+};
+
+//
+// ### function flush ()
+// Flushes any buffered messages to the current `stream`
+// used by this instance.
+//
+File.prototype.flush = function () {
+ var self = this;
+
+ // If nothing to flush, there will be no "flush" event from native stream
+ // Thus, the "open" event will never be fired (see _createStream.createAndFlush function)
+ // That means, self.opening will never set to false and no logs will be written to disk
+ if (!this._buffer.length) {
+ return self.emit('flush');
+ }
+
+ //
+ // Iterate over the `_buffer` of enqueued messaged
+ // and then write them to the newly created stream.
+ //
+ this._buffer.forEach(function (item) {
+ var str = item[0],
+ callback = item[1];
+
+ process.nextTick(function () {
+ self._write(str, callback);
+ self._size += str.length;
+ });
+ });
+
+ //
+ // Quickly truncate the `_buffer` once the write operations
+ // have been started
+ //
+ self._buffer.length = 0;
+
+ //
+ // When the stream has drained we have flushed
+ // our buffer.
+ //
+ self._stream.once('drain', function () {
+ self.emit('flush');
+ self.emit('logged');
+ });
+};
+
+//
+// ### @private function _createStream ()
+// Attempts to open the next appropriate file for this instance
+// based on the common state (such as `maxsize` and `_basename`).
+//
+File.prototype._createStream = function () {
+ var self = this;
+ this.opening = true;
+
+ (function checkFile (target) {
+ var fullname = path.join(self.dirname, target);
+
+ //
+ // Creates the `WriteStream` and then flushes any
+ // buffered messages.
+ //
+ function createAndFlush (size) {
+ if (self._stream) {
+ self._stream.end();
+ self._stream.destroySoon();
+ }
+
+ self._size = size;
+ self.filename = target;
+ self._stream = fs.createWriteStream(fullname, self.options);
+ self._isStreams2 = isWritable(self._stream);
+ self._stream.on('error', function(error){
+ if (self._failures < self.maxRetries) {
+ self._createStream();
+ self._failures++;
+ }
+ else {
+ self.emit('error', error);
+ }
+ });
+ //
+ // We need to listen for drain events when
+ // write() returns false. This can make node
+ // mad at times.
+ //
+ self._stream.setMaxListeners(Infinity);
+
+ //
+ // When the current stream has finished flushing
+ // then we can be sure we have finished opening
+ // and thus can emit the `open` event.
+ //
+ self.once('flush', function () {
+ // Because "flush" event is based on native stream "drain" event,
+ // logs could be written inbetween "self.flush()" and here
+ // Therefore, we need to flush again to make sure everything is flushed
+ self.flush();
+
+ self.opening = false;
+ self.emit('open', fullname);
+ });
+ //
+ // Remark: It is possible that in the time it has taken to find the
+ // next logfile to be written more data than `maxsize` has been buffered,
+ // but for sensible limits (10s - 100s of MB) this seems unlikely in less
+ // than one second.
+ //
+ self.flush();
+ compressFile();
+ }
+
+ function compressFile() {
+ if (self._archive) {
+ var gzip = zlib.createGzip();
+
+ var inp = fs.createReadStream(String(self._archive));
+ var out = fs.createWriteStream(self._archive + '.gz');
+
+ inp.pipe(gzip).pipe(out);
+
+ fs.unlink(String(self._archive));
+ self._archive = '';
+ }
+ }
+
+ fs.stat(fullname, function (err, stats) {
+ if (err) {
+ if (err.code !== 'ENOENT') {
+ return self.emit('error', err);
+ }
+ return createAndFlush(0);
+ }
+
+ if (!stats || (self.maxsize && stats.size >= self.maxsize)) {
+ //
+ // If `stats.size` is greater than the `maxsize` for
+ // this instance then try again
+ //
+ return self._incFile(function() {
+ checkFile(self._getFile());
+ });
+ }
+
+ createAndFlush(stats.size);
+ });
+ })(this._getFile());
+};
+
+
+File.prototype._incFile = function (callback) {
+ var ext = path.extname(this._basename),
+ basename = path.basename(this._basename, ext),
+ oldest,
+ target;
+
+ if (!this.tailable) {
+ this._created += 1;
+ this._checkMaxFilesIncrementing(ext, basename, callback);
+ }
+ else {
+ this._checkMaxFilesTailable(ext, basename, callback);
+ }
+};
+
+//
+// ### @private function _getFile ()
+// Gets the next filename to use for this instance
+// in the case that log filesizes are being capped.
+//
+File.prototype._getFile = function () {
+ var ext = path.extname(this._basename),
+ basename = path.basename(this._basename, ext);
+
+ //
+ // Caveat emptor (indexzero): rotationFormat() was broken by design
+ // when combined with max files because the set of files to unlink
+ // is never stored.
+ //
+ return !this.tailable && this._created
+ ? basename + (this.rotationFormat ? this.rotationFormat() : this._created) + ext
+ : basename + ext;
+};
+
+//
+// ### @private function _checkMaxFilesIncrementing ()
+// Increment the number of files created or
+// checked by this instance.
+//
+File.prototype._checkMaxFilesIncrementing = function (ext, basename, callback) {
+ var oldest, target,
+ self = this;
+
+ if (self.zippedArchive) {
+ self._archive = path.join(self.dirname, basename +
+ ((self._created === 1) ? '' : self._created-1) +
+ ext);
+ }
+
+
+ // Check for maxFiles option and delete file
+ if (!self.maxFiles || self._created < self.maxFiles) {
+ return callback();
+ }
+
+ oldest = self._created - self.maxFiles;
+ target = path.join(self.dirname, basename + (oldest !== 0 ? oldest : '') + ext +
+ (self.zippedArchive ? '.gz' : ''));
+ fs.unlink(target, callback);
+};
+
+//
+// ### @private function _checkMaxFilesTailable ()
+//
+// Roll files forward based on integer, up to maxFiles.
+// e.g. if base if file.log and it becomes oversized, roll
+// to file1.log, and allow file.log to be re-used. If
+// file is oversized again, roll file1.log to file2.log,
+// roll file.log to file1.log, and so on.
+File.prototype._checkMaxFilesTailable = function (ext, basename, callback) {
+ var tasks = [],
+ self = this;
+
+ if (!this.maxFiles)
+ return;
+
+ for (var x = this.maxFiles - 1; x > 0; x--) {
+ tasks.push(function (i) {
+ return function (cb) {
+ var tmppath = path.join(self.dirname, basename + (i - 1) + ext +
+ (self.zippedArchive ? '.gz' : ''));
+ fs.exists(tmppath, function (exists) {
+ if (!exists) {
+ return cb(null);
+ }
+
+ fs.rename(tmppath, path.join(self.dirname, basename + i + ext +
+ (self.zippedArchive ? '.gz' : '')), cb);
+ });
+ };
+ }(x));
+ }
+
+ if (self.zippedArchive) {
+ self._archive = path.join(self.dirname, basename + 1 + ext);
+ }
+ async.series(tasks, function (err) {
+ fs.rename(
+ path.join(self.dirname, basename + ext),
+ path.join(self.dirname, basename + 1 + ext),
+ callback
+ );
+ });
+};
+
+//
+// ### @private function _lazyDrain ()
+// Lazily attempts to emit the `logged` event when `this.stream` has
+// drained. This is really just a simple mutex that only works because
+// Node.js is single-threaded.
+//
+File.prototype._lazyDrain = function () {
+ var self = this;
+
+ if (!this._draining && this._stream) {
+ this._draining = true;
+
+ this._stream.once('drain', function () {
+ this._draining = false;
+ self.emit('logged');
+ });
+ }
+};
diff --git a/node_modules/winston/lib/winston/transports/http.js b/node_modules/winston/lib/winston/transports/http.js
new file mode 100644
index 0000000..f7e1af6
--- /dev/null
+++ b/node_modules/winston/lib/winston/transports/http.js
@@ -0,0 +1,232 @@
+var util = require('util'),
+ winston = require('../../winston'),
+ http = require('http'),
+ https = require('https'),
+ Stream = require('stream').Stream,
+ Transport = require('./transport').Transport;
+
+//
+// ### function Http (options)
+// #### @options {Object} Options for this instance.
+// Constructor function for the Http transport object responsible
+// for persisting log messages and metadata to a terminal or TTY.
+//
+var Http = exports.Http = function (options) {
+ Transport.call(this, options);
+ options = options || {};
+
+ this.name = 'http';
+ this.ssl = !!options.ssl;
+ this.host = options.host || 'localhost';
+ this.port = options.port;
+ this.auth = options.auth;
+ this.path = options.path || '';
+
+ if (!this.port) {
+ this.port = this.ssl ? 443 : 80;
+ }
+};
+
+util.inherits(Http, winston.Transport);
+
+//
+// Expose the name of this Transport on the prototype
+//
+Http.prototype.name = 'http';
+
+//
+// ### function _request (options, callback)
+// #### @callback {function} Continuation to respond to when complete.
+// Make a request to a winstond server or any http server which can
+// handle json-rpc.
+//
+Http.prototype._request = function (options, callback) {
+ options = options || {};
+
+ var auth = options.auth || this.auth,
+ path = options.path || this.path || '',
+ req;
+
+ delete options.auth;
+ delete options.path;
+
+ // Prepare options for outgoing HTTP request
+ req = (this.ssl ? https : http).request({
+ host: this.host,
+ port: this.port,
+ path: '/' + path.replace(/^\//, ''),
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ auth: (auth) ? auth.username + ':' + auth.password : ''
+ });
+
+ req.on('error', callback);
+ req.on('response', function (res) {
+ res.on('end', function () {
+ callback(null, res);
+ });
+
+ res.resume();
+ });
+
+ req.end(new Buffer(JSON.stringify(options), 'utf8'));
+};
+
+//
+// ### function log (level, msg, [meta], callback)
+// #### @level {string} Level at which to log the message.
+// #### @msg {string} Message to log
+// #### @meta {Object} **Optional** Additional metadata to attach
+// #### @callback {function} Continuation to respond to when complete.
+// Core logging method exposed to Winston. Metadata is optional.
+//
+Http.prototype.log = function (level, msg, meta, callback) {
+ var self = this;
+
+ if (typeof meta === 'function') {
+ callback = meta;
+ meta = {};
+ }
+
+ var options = {
+ method: 'collect',
+ params: {
+ level: level,
+ message: msg,
+ meta: meta
+ }
+ };
+
+ if (meta) {
+ if (meta.path) {
+ options.path = meta.path;
+ delete meta.path;
+ }
+
+ if (meta.auth) {
+ options.auth = meta.auth;
+ delete meta.auth;
+ }
+ }
+
+ this._request(options, function (err, res) {
+ if (res && res.statusCode !== 200) {
+ err = new Error('HTTP Status Code: ' + res.statusCode);
+ }
+
+ if (err) return callback(err);
+
+ // TODO: emit 'logged' correctly,
+ // keep track of pending logs.
+ self.emit('logged');
+
+ if (callback) callback(null, true);
+ });
+};
+
+//
+// ### function query (options, callback)
+// #### @options {Object} Loggly-like query options for this instance.
+// #### @callback {function} Continuation to respond to when complete.
+// Query the transport. Options object is optional.
+//
+Http.prototype.query = function (options, callback) {
+ if (typeof options === 'function') {
+ callback = options;
+ options = {};
+ }
+
+ var self = this,
+ options = this.normalizeQuery(options);
+
+ options = {
+ method: 'query',
+ params: options
+ };
+
+ if (options.params.path) {
+ options.path = options.params.path;
+ delete options.params.path;
+ }
+
+ if (options.params.auth) {
+ options.auth = options.params.auth;
+ delete options.params.auth;
+ }
+
+ this._request(options, function (err, res, body) {
+ if (res && res.statusCode !== 200) {
+ err = new Error('HTTP Status Code: ' + res.statusCode);
+ }
+
+ if (err) return callback(err);
+
+ if (typeof body === 'string') {
+ try {
+ body = JSON.parse(body);
+ } catch (e) {
+ return callback(e);
+ }
+ }
+
+ callback(null, body);
+ });
+};
+
+//
+// ### function stream (options)
+// #### @options {Object} Stream options for this instance.
+// Returns a log stream for this transport. Options object is optional.
+//
+Http.prototype.stream = function (options) {
+ options = options || {};
+
+ var self = this,
+ stream = new Stream,
+ req,
+ buff;
+
+ stream.destroy = function () {
+ req.destroy();
+ };
+
+ options = {
+ method: 'stream',
+ params: options
+ };
+
+ if (options.params.path) {
+ options.path = options.params.path;
+ delete options.params.path;
+ }
+
+ if (options.params.auth) {
+ options.auth = options.params.auth;
+ delete options.params.auth;
+ }
+
+ req = this._request(options);
+ buff = '';
+
+ req.on('data', function (data) {
+ var data = (buff + data).split(/\n+/),
+ l = data.length - 1,
+ i = 0;
+
+ for (; i < l; i++) {
+ try {
+ stream.emit('log', JSON.parse(data[i]));
+ } catch (e) {
+ stream.emit('error', e);
+ }
+ }
+
+ buff = data[l];
+ });
+
+ req.on('error', function (err) {
+ stream.emit('error', err);
+ });
+
+ return stream;
+};
diff --git a/node_modules/winston/lib/winston/transports/memory.js b/node_modules/winston/lib/winston/transports/memory.js
new file mode 100644
index 0000000..e4f562e
--- /dev/null
+++ b/node_modules/winston/lib/winston/transports/memory.js
@@ -0,0 +1,89 @@
+var events = require('events'),
+ util = require('util'),
+ common = require('../common'),
+ Transport = require('./transport').Transport;
+
+//
+// ### function Memory (options)
+// #### @options {Object} Options for this instance.
+// Constructor function for the Memory transport object responsible
+// for persisting log messages and metadata to a memory array of messages.
+//
+var Memory = exports.Memory = function (options) {
+ Transport.call(this, options);
+ options = options || {};
+
+ this.errorOutput = [];
+ this.writeOutput = [];
+
+ this.json = options.json || false;
+ this.colorize = options.colorize || false;
+ this.prettyPrint = options.prettyPrint || false;
+ this.timestamp = typeof options.timestamp !== 'undefined' ? options.timestamp : false;
+ this.showLevel = options.showLevel === undefined ? true : options.showLevel;
+ this.label = options.label || null;
+ this.depth = options.depth || null;
+
+ if (this.json) {
+ this.stringify = options.stringify || function (obj) {
+ return JSON.stringify(obj, null, 2);
+ };
+ }
+};
+
+//
+// Inherit from `winston.Transport`.
+//
+util.inherits(Memory, Transport);
+
+//
+// Expose the name of this Transport on the prototype
+//
+Memory.prototype.name = 'memory';
+
+//
+// ### function log (level, msg, [meta], callback)
+// #### @level {string} Level at which to log the message.
+// #### @msg {string} Message to log
+// #### @meta {Object} **Optional** Additional metadata to attach
+// #### @callback {function} Continuation to respond to when complete.
+// Core logging method exposed to Winston. Metadata is optional.
+//
+Memory.prototype.log = function (level, msg, meta, callback) {
+ if (this.silent) {
+ return callback(null, true);
+ }
+
+ var self = this,
+ output;
+
+ output = common.log({
+ colorize: this.colorize,
+ json: this.json,
+ level: level,
+ message: msg,
+ meta: meta,
+ stringify: this.stringify,
+ timestamp: this.timestamp,
+ prettyPrint: this.prettyPrint,
+ raw: this.raw,
+ label: this.label,
+ depth: this.depth,
+ formatter: this.formatter,
+ humanReadableUnhandledException: this.humanReadableUnhandledException
+ });
+
+ if (level === 'error' || level === 'debug') {
+ this.errorOutput.push(output);
+ } else {
+ this.writeOutput.push(output);
+ }
+
+ self.emit('logged');
+ callback(null, true);
+};
+
+Memory.prototype.clearLogs = function () {
+ this.errorOutput = [];
+ this.writeOutput = [];
+};
diff --git a/node_modules/winston/lib/winston/transports/transport.js b/node_modules/winston/lib/winston/transports/transport.js
new file mode 100644
index 0000000..d279d00
--- /dev/null
+++ b/node_modules/winston/lib/winston/transports/transport.js
@@ -0,0 +1,135 @@
+/*
+ * transport.js: Base Transport object for all Winston transports.
+ *
+ * (C) 2010 Charlie Robbins
+ * MIT LICENCE
+ *
+ */
+
+var events = require('events'),
+ util = require('util');
+
+//
+// ### function Transport (options)
+// #### @options {Object} Options for this instance.
+// Constructor function for the Tranport object responsible
+// base functionality for all winston transports.
+//
+var Transport = exports.Transport = function (options) {
+ events.EventEmitter.call(this);
+
+ options = options || {};
+ this.silent = options.silent || false;
+ this.raw = options.raw || false;
+ this.name = options.name || this.name;
+ this.formatter = options.formatter;
+
+ //
+ // Do not set a default level. When `level` is falsey on any
+ // `Transport` instance, any `Logger` instance uses the
+ // configured level (instead of the Transport level)
+ //
+ this.level = options.level;
+
+ this.handleExceptions = options.handleExceptions || false;
+ this.exceptionsLevel = options.exceptionsLevel || 'error';
+ this.humanReadableUnhandledException = options.humanReadableUnhandledException || false;
+};
+
+//
+// Inherit from `events.EventEmitter`.
+//
+util.inherits(Transport, events.EventEmitter);
+
+//
+// ### function formatQuery (query)
+// #### @query {string|Object} Query to format
+// Formats the specified `query` Object (or string) to conform
+// with the underlying implementation of this transport.
+//
+Transport.prototype.formatQuery = function (query) {
+ return query;
+};
+
+//
+// ### function normalizeQuery (query)
+// #### @options {string|Object} Query to normalize
+// Normalize options for query
+//
+Transport.prototype.normalizeQuery = function (options) {
+ //
+ // Use options similar to loggly.
+ // [See Loggly Search API](http://wiki.loggly.com/retrieve_events#optional)
+ //
+
+ options = options || {};
+
+ // limit
+ options.rows = options.rows || options.limit || 10;
+
+ // starting row offset
+ options.start = options.start || 0;
+
+ // now
+ options.until = options.until || new Date;
+ if (typeof options.until !== 'object') {
+ options.until = new Date(options.until);
+ }
+
+ // now - 24
+ options.from = options.from || (options.until - (24 * 60 * 60 * 1000));
+ if (typeof options.from !== 'object') {
+ options.from = new Date(options.from);
+ }
+
+
+ // 'asc' or 'desc'
+ options.order = options.order || 'desc';
+
+ // which fields to select
+ options.fields = options.fields;
+
+ return options;
+};
+
+//
+// ### function formatResults (results, options)
+// #### @results {Object|Array} Results returned from `.query`.
+// #### @options {Object} **Optional** Formatting options
+// Formats the specified `results` with the given `options` accordinging
+// to the implementation of this transport.
+//
+Transport.prototype.formatResults = function (results, options) {
+ return results;
+};
+
+//
+// ### function logException (msg, meta, callback)
+// #### @msg {string} Message to log
+// #### @meta {Object} **Optional** Additional metadata to attach
+// #### @callback {function} Continuation to respond to when complete.
+// Logs the specified `msg`, `meta` and responds to the callback once the log
+// operation is complete to ensure that the event loop will not exit before
+// all logging has completed.
+//
+Transport.prototype.logException = function (msg, meta, callback) {
+ var self = this,
+ called;
+
+ if (this.silent) {
+ return callback();
+ }
+
+ function onComplete () {
+ if (!called) {
+ called = true;
+ self.removeListener('logged', onComplete);
+ self.removeListener('error', onComplete);
+ callback();
+ }
+ }
+
+ this.once('logged', onComplete);
+ this.once('error', onComplete);
+ this.log(self.exceptionsLevel, msg, meta, function () { });
+};
diff --git a/node_modules/winston/node_modules/async/.jshintrc b/node_modules/winston/node_modules/async/.jshintrc
new file mode 100644
index 0000000..172f491
--- /dev/null
+++ b/node_modules/winston/node_modules/async/.jshintrc
@@ -0,0 +1,24 @@
+{
+ // Enforcing options
+ "eqeqeq": false,
+ "forin": true,
+ "indent": 4,
+ "noarg": true,
+ "undef": true,
+ "trailing": true,
+ "evil": true,
+ "laxcomma": true,
+
+ // Relaxing options
+ "onevar": false,
+ "asi": false,
+ "eqnull": true,
+ "expr": false,
+ "loopfunc": true,
+ "sub": true,
+ "browser": true,
+ "node": true,
+ "globals": {
+ "define": true
+ }
+}
diff --git a/node_modules/winston/node_modules/async/.travis.yml b/node_modules/winston/node_modules/async/.travis.yml
new file mode 100644
index 0000000..6064ca0
--- /dev/null
+++ b/node_modules/winston/node_modules/async/.travis.yml
@@ -0,0 +1,5 @@
+language: node_js
+node_js:
+ - "0.10"
+ - "0.12"
+ - "iojs"
diff --git a/node_modules/winston/node_modules/async/CHANGELOG.md b/node_modules/winston/node_modules/async/CHANGELOG.md
new file mode 100644
index 0000000..7d39c37
--- /dev/null
+++ b/node_modules/winston/node_modules/async/CHANGELOG.md
@@ -0,0 +1,16 @@
+# v1.0.0
+
+No known breaking changes, we are simply complying with semver from here on out.
+
+Changes:
+
+- Start using a changelog!
+- Add `forEachOf` for iterating over Objects (or to iterate Arrays with indexes available) (#168 #704 #321)
+- Detect deadlocks in `auto` (#663)
+- Better support for require.js (#527)
+- Throw if queue created with concurrency `0` (#714)
+- Fix unneeded iteration in `queue.resume()` (#758)
+- Guard against timer mocking overriding `setImmediate` (#609 #611)
+- Miscellaneous doc fixes (#542 #596 #615 #628 #631 #690 #729)
+- Use single noop function internally (#546)
+- Optimize internal `_each`, `_map` and `_keys` functions.
diff --git a/node_modules/winston/node_modules/async/LICENSE b/node_modules/winston/node_modules/async/LICENSE
new file mode 100644
index 0000000..8f29698
--- /dev/null
+++ b/node_modules/winston/node_modules/async/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2010-2014 Caolan McMahon
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/node_modules/winston/node_modules/async/README.md b/node_modules/winston/node_modules/async/README.md
new file mode 100644
index 0000000..7e5e15f
--- /dev/null
+++ b/node_modules/winston/node_modules/async/README.md
@@ -0,0 +1,1720 @@
+# Async.js
+
+[![Build Status via Travis CI](https://travis-ci.org/caolan/async.svg?branch=master)](https://travis-ci.org/caolan/async)
+[![NPM version](http://img.shields.io/npm/v/async.svg)](https://www.npmjs.org/package/async)
+
+
+Async is a utility module which provides straight-forward, powerful functions
+for working with asynchronous JavaScript. Although originally designed for
+use with [Node.js](http://nodejs.org) and installable via `npm install async`,
+it can also be used directly in the browser.
+
+Async is also installable via:
+
+- [bower](http://bower.io/): `bower install async`
+- [component](https://github.com/component/component): `component install
+ caolan/async`
+- [jam](http://jamjs.org/): `jam install async`
+- [spm](http://spmjs.io/): `spm install async`
+
+Async provides around 20 functions that include the usual 'functional'
+suspects (`map`, `reduce`, `filter`, `each`…) as well as some common patterns
+for asynchronous control flow (`parallel`, `series`, `waterfall`…). All these
+functions assume you follow the Node.js convention of providing a single
+callback as the last argument of your `async` function.
+
+
+## Quick Examples
+
+```javascript
+async.map(['file1','file2','file3'], fs.stat, function(err, results){
+ // results is now an array of stats for each file
+});
+
+async.filter(['file1','file2','file3'], fs.exists, function(results){
+ // results now equals an array of the existing files
+});
+
+async.parallel([
+ function(){ ... },
+ function(){ ... }
+], callback);
+
+async.series([
+ function(){ ... },
+ function(){ ... }
+]);
+```
+
+There are many more functions available so take a look at the docs below for a
+full list. This module aims to be comprehensive, so if you feel anything is
+missing please create a GitHub issue for it.
+
+## Common Pitfalls
+
+### Binding a context to an iterator
+
+This section is really about `bind`, not about `async`. If you are wondering how to
+make `async` execute your iterators in a given context, or are confused as to why
+a method of another library isn't working as an iterator, study this example:
+
+```js
+// Here is a simple object with an (unnecessarily roundabout) squaring method
+var AsyncSquaringLibrary = {
+ squareExponent: 2,
+ square: function(number, callback){
+ var result = Math.pow(number, this.squareExponent);
+ setTimeout(function(){
+ callback(null, result);
+ }, 200);
+ }
+};
+
+async.map([1, 2, 3], AsyncSquaringLibrary.square, function(err, result){
+ // result is [NaN, NaN, NaN]
+ // This fails because the `this.squareExponent` expression in the square
+ // function is not evaluated in the context of AsyncSquaringLibrary, and is
+ // therefore undefined.
+});
+
+async.map([1, 2, 3], AsyncSquaringLibrary.square.bind(AsyncSquaringLibrary), function(err, result){
+ // result is [1, 4, 9]
+ // With the help of bind we can attach a context to the iterator before
+ // passing it to async. Now the square function will be executed in its
+ // 'home' AsyncSquaringLibrary context and the value of `this.squareExponent`
+ // will be as expected.
+});
+```
+
+## Download
+
+The source is available for download from
+[GitHub](https://github.com/caolan/async/blob/master/lib/async.js).
+Alternatively, you can install using Node Package Manager (`npm`):
+
+ npm install async
+
+As well as using Bower:
+
+ bower install async
+
+__Development:__ [async.js](https://github.com/caolan/async/raw/master/lib/async.js) - 29.6kb Uncompressed
+
+## In the Browser
+
+So far it's been tested in IE6, IE7, IE8, FF3.6 and Chrome 5.
+
+Usage:
+
+```html
+<script type="text/javascript" src="async.js"></script>
+<script type="text/javascript">
+
+ async.map(data, asyncProcess, function(err, results){
+ alert(results);
+ });
+
+</script>
+```
+
+## Documentation
+
+### Collections
+
+* [`each`](#each)
+* [`eachSeries`](#eachSeries)
+* [`eachLimit`](#eachLimit)
+* [`forEachOf`](#forEachOf)
+* [`forEachOfSeries`](#forEachOfSeries)
+* [`forEachOfLimit`](#forEachOfLimit)
+* [`map`](#map)
+* [`mapSeries`](#mapSeries)
+* [`mapLimit`](#mapLimit)
+* [`filter`](#filter)
+* [`filterSeries`](#filterSeries)
+* [`reject`](#reject)
+* [`rejectSeries`](#rejectSeries)
+* [`reduce`](#reduce)
+* [`reduceRight`](#reduceRight)
+* [`detect`](#detect)
+* [`detectSeries`](#detectSeries)
+* [`sortBy`](#sortBy)
+* [`some`](#some)
+* [`every`](#every)
+* [`concat`](#concat)
+* [`concatSeries`](#concatSeries)
+
+### Control Flow
+
+* [`series`](#seriestasks-callback)
+* [`parallel`](#parallel)
+* [`parallelLimit`](#parallellimittasks-limit-callback)
+* [`whilst`](#whilst)
+* [`doWhilst`](#doWhilst)
+* [`until`](#until)
+* [`doUntil`](#doUntil)
+* [`forever`](#forever)
+* [`waterfall`](#waterfall)
+* [`compose`](#compose)
+* [`seq`](#seq)
+* [`applyEach`](#applyEach)
+* [`applyEachSeries`](#applyEachSeries)
+* [`queue`](#queue)
+* [`priorityQueue`](#priorityQueue)
+* [`cargo`](#cargo)
+* [`auto`](#auto)
+* [`retry`](#retry)
+* [`iterator`](#iterator)
+* [`apply`](#apply)
+* [`nextTick`](#nextTick)
+* [`times`](#times)
+* [`timesSeries`](#timesSeries)
+
+### Utils
+
+* [`memoize`](#memoize)
+* [`unmemoize`](#unmemoize)
+* [`log`](#log)
+* [`dir`](#dir)
+* [`noConflict`](#noConflict)
+
+
+## Collections
+
+<a name="forEach" />
+<a name="each" />
+### each(arr, iterator, callback)
+
+Applies the function `iterator` to each item in `arr`, in parallel.
+The `iterator` is called with an item from the list, and a callback for when it
+has finished. If the `iterator` passes an error to its `callback`, the main
+`callback` (for the `each` function) is immediately called with the error.
+
+Note, that since this function applies `iterator` to each item in parallel,
+there is no guarantee that the iterator functions will complete in order.
+
+__Arguments__
+
+* `arr` - An array to iterate over.
+* `iterator(item, callback)` - A function to apply to each item in `arr`.
+ The iterator is passed a `callback(err)` which must be called once it has
+ completed. If no error has occurred, the `callback` should be run without
+ arguments or with an explicit `null` argument. The array index is not passed
+ to the iterator. If you need the index, use [`forEachOf`](#forEachOf).
+* `callback(err)` - A callback which is called when all `iterator` functions
+ have finished, or an error occurs.
+
+__Examples__
+
+
+```js
+// assuming openFiles is an array of file names and saveFile is a function
+// to save the modified contents of that file:
+
+async.each(openFiles, saveFile, function(err){
+ // if any of the saves produced an error, err would equal that error
+});
+```
+
+```js
+// assuming openFiles is an array of file names
+
+async.each(openFiles, function(file, callback) {
+
+ // Perform operation on file here.
+ console.log('Processing file ' + file);
+
+ if( file.length > 32 ) {
+ console.log('This file name is too long');
+ callback('File name too long');
+ } else {
+ // Do work to process file here
+ console.log('File processed');
+ callback();
+ }
+}, function(err){
+ // if any of the file processing produced an error, err would equal that error
+ if( err ) {
+ // One of the iterations produced an error.
+ // All processing will now stop.
+ console.log('A file failed to process');
+ } else {
+ console.log('All files have been processed successfully');
+ }
+});
+```
+
+---------------------------------------
+
+<a name="forEachSeries" />
+<a name="eachSeries" />
+### eachSeries(arr, iterator, callback)
+
+The same as [`each`](#each), only `iterator` is applied to each item in `arr` in
+series. The next `iterator` is only called once the current one has completed.
+This means the `iterator` functions will complete in order.
+
+
+---------------------------------------
+
+<a name="forEachLimit" />
+<a name="eachLimit" />
+### eachLimit(arr, limit, iterator, callback)
+
+The same as [`each`](#each), only no more than `limit` `iterator`s will be simultaneously
+running at any time.
+
+Note that the items in `arr` are not processed in batches, so there is no guarantee that
+the first `limit` `iterator` functions will complete before any others are started.
+
+__Arguments__
+
+* `arr` - An array to iterate over.
+* `limit` - The maximum number of `iterator`s to run at any time.
+* `iterator(item, callback)` - A function to apply to each item in `arr`.
+ The iterator is passed a `callback(err)` which must be called once it has
+ completed. If no error has occurred, the callback should be run without
+ arguments or with an explicit `null` argument.
+* `callback(err)` - A callback which is called when all `iterator` functions
+ have finished, or an error occurs.
+
+__Example__
+
+```js
+// Assume documents is an array of JSON objects and requestApi is a
+// function that interacts with a rate-limited REST api.
+
+async.eachLimit(documents, 20, requestApi, function(err){
+ // if any of the saves produced an error, err would equal that error
+});
+```
+
+---------------------------------------
+
+<a name="forEachOf" />
+<a name="eachOf" />
+
+### forEachOf(obj, iterator, callback)
+
+Like `each`, except that it iterates over objects, and passes the key as the second argument to the iterator.
+
+__Arguments__
+
+* `obj` - An object or array to iterate over.
+* `iterator(item, key, callback)` - A function to apply to each item in `obj`.
+The `key` is the item's key, or index in the case of an array. The iterator is
+passed a `callback(err)` which must be called once it has completed. If no
+error has occurred, the callback should be run without arguments or with an
+explicit `null` argument.
+* `callback(err)` - A callback which is called when all `iterator` functions have finished, or an error occurs.
+
+__Example__
+
+```js
+var obj = {dev: "/dev.json", test: "/test.json", prod: "/prod.json"};
+var configs = {};
+
+async.forEachOf(obj, function (value, key, callback) {
+ fs.readFile(__dirname + value, "utf8", function (err, data) {
+ if (err) return callback(err);
+ try {
+ configs[key] = JSON.parse(data);
+ } catch (e) {
+ return callback(e);
+ }
+ callback();
+ })
+}, function (err) {
+ if (err) console.error(err.message);
+ // configs is now a map of JSON data
+ doSomethingWith(configs);
+})
+```
+
+---------------------------------------
+
+<a name="forEachOfSeries" />
+<a name="eachOfSeries" />
+
+### forEachOfSeries(obj, iterator, callback)
+
+Like [`forEachOf`](#forEachOf), except only one `iterator` is run at a time. The order of execution is not guaranteed for objects, but it will be guaranteed for arrays.
+
+---------------------------------------
+
+<a name="forEachOfLimit" />
+<a name="eachOfLimit" />
+
+### forEachOfLimit(obj, limit, iterator, callback)
+
+Like [`forEachOf`](#forEachOf), except the number of `iterator`s running at a given time is controlled by `limit`.
+
+
+---------------------------------------
+
+<a name="map" />
+### map(arr, iterator, callback)
+
+Produces a new array of values by mapping each value in `arr` through
+the `iterator` function. The `iterator` is called with an item from `arr` and a
+callback for when it has finished processing. Each of these callback takes 2 arguments:
+an `error`, and the transformed item from `arr`. If `iterator` passes an error to its
+callback, the main `callback` (for the `map` function) is immediately called with the error.
+
+Note, that since this function applies the `iterator` to each item in parallel,
+there is no guarantee that the `iterator` functions will complete in order.
+However, the results array will be in the same order as the original `arr`.
+
+__Arguments__
+
+* `arr` - An array to iterate over.
+* `iterator(item, callback)` - A function to apply to each item in `arr`.
+ The iterator is passed a `callback(err, transformed)` which must be called once
+ it has completed with an error (which can be `null`) and a transformed item.
+* `callback(err, results)` - A callback which is called when all `iterator`
+ functions have finished, or an error occurs. Results is an array of the
+ transformed items from the `arr`.
+
+__Example__
+
+```js
+async.map(['file1','file2','file3'], fs.stat, function(err, results){
+ // results is now an array of stats for each file
+});
+```
+
+---------------------------------------
+
+<a name="mapSeries" />
+### mapSeries(arr, iterator, callback)
+
+The same as [`map`](#map), only the `iterator` is applied to each item in `arr` in
+series. The next `iterator` is only called once the current one has completed.
+The results array will be in the same order as the original.
+
+
+---------------------------------------
+
+<a name="mapLimit" />
+### mapLimit(arr, limit, iterator, callback)
+
+The same as [`map`](#map), only no more than `limit` `iterator`s will be simultaneously
+running at any time.
+
+Note that the items are not processed in batches, so there is no guarantee that
+the first `limit` `iterator` functions will complete before any others are started.
+
+__Arguments__
+
+* `arr` - An array to iterate over.
+* `limit` - The maximum number of `iterator`s to run at any time.
+* `iterator(item, callback)` - A function to apply to each item in `arr`.
+ The iterator is passed a `callback(err, transformed)` which must be called once
+ it has completed with an error (which can be `null`) and a transformed item.
+* `callback(err, results)` - A callback which is called when all `iterator`
+ calls have finished, or an error occurs. The result is an array of the
+ transformed items from the original `arr`.
+
+__Example__
+
+```js
+async.mapLimit(['file1','file2','file3'], 1, fs.stat, function(err, results){
+ // results is now an array of stats for each file
+});
+```
+
+---------------------------------------
+
+<a name="select" />
+<a name="filter" />
+### filter(arr, iterator, callback)
+
+__Alias:__ `select`
+
+Returns a new array of all the values in `arr` which pass an async truth test.
+_The callback for each `iterator` call only accepts a single argument of `true` or
+`false`; it does not accept an error argument first!_ This is in-line with the
+way node libraries work with truth tests like `fs.exists`. This operation is
+performed in parallel, but the results array will be in the same order as the
+original.
+
+__Arguments__
+
+* `arr` - An array to iterate over.
+* `iterator(item, callback)` - A truth test to apply to each item in `arr`.
+ The `iterator` is passed a `callback(truthValue)`, which must be called with a
+ boolean argument once it has completed.
+* `callback(results)` - A callback which is called after all the `iterator`
+ functions have finished.
+
+__Example__
+
+```js
+async.filter(['file1','file2','file3'], fs.exists, function(results){
+ // results now equals an array of the existing files
+});
+```
+
+---------------------------------------
+
+<a name="selectSeries" />
+<a name="filterSeries" />
+### filterSeries(arr, iterator, callback)
+
+__Alias:__ `selectSeries`
+
+The same as [`filter`](#filter) only the `iterator` is applied to each item in `arr` in
+series. The next `iterator` is only called once the current one has completed.
+The results array will be in the same order as the original.
+
+---------------------------------------
+
+<a name="reject" />
+### reject(arr, iterator, callback)
+
+The opposite of [`filter`](#filter). Removes values that pass an `async` truth test.
+
+---------------------------------------
+
+<a name="rejectSeries" />
+### rejectSeries(arr, iterator, callback)
+
+The same as [`reject`](#reject), only the `iterator` is applied to each item in `arr`
+in series.
+
+
+---------------------------------------
+
+<a name="reduce" />
+### reduce(arr, memo, iterator, callback)
+
+__Aliases:__ `inject`, `foldl`
+
+Reduces `arr` into a single value using an async `iterator` to return
+each successive step. `memo` is the initial state of the reduction.
+This function only operates in series.
+
+For performance reasons, it may make sense to split a call to this function into
+a parallel map, and then use the normal `Array.prototype.reduce` on the results.
+This function is for situations where each step in the reduction needs to be async;
+if you can get the data before reducing it, then it's probably a good idea to do so.
+
+__Arguments__
+
+* `arr` - An array to iterate over.
+* `memo` - The initial state of the reduction.
+* `iterator(memo, item, callback)` - A function applied to each item in the
+ array to produce the next step in the reduction. The `iterator` is passed a
+ `callback(err, reduction)` which accepts an optional error as its first
+ argument, and the state of the reduction as the second. If an error is
+ passed to the callback, the reduction is stopped and the main `callback` is
+ immediately called with the error.
+* `callback(err, result)` - A callback which is called after all the `iterator`
+ functions have finished. Result is the reduced value.
+
+__Example__
+
+```js
+async.reduce([1,2,3], 0, function(memo, item, callback){
+ // pointless async:
+ process.nextTick(function(){
+ callback(null, memo + item)
+ });
+}, function(err, result){
+ // result is now equal to the last value of memo, which is 6
+});
+```
+
+---------------------------------------
+
+<a name="reduceRight" />
+### reduceRight(arr, memo, iterator, callback)
+
+__Alias:__ `foldr`
+
+Same as [`reduce`](#reduce), only operates on `arr` in reverse order.
+
+
+---------------------------------------
+
+<a name="detect" />
+### detect(arr, iterator, callback)
+
+Returns the first value in `arr` that passes an async truth test. The
+`iterator` is applied in parallel, meaning the first iterator to return `true` will
+fire the detect `callback` with that result. That means the result might not be
+the first item in the original `arr` (in terms of order) that passes the test.
+
+If order within the original `arr` is important, then look at [`detectSeries`](#detectSeries).
+
+__Arguments__
+
+* `arr` - An array to iterate over.
+* `iterator(item, callback)` - A truth test to apply to each item in `arr`.
+ The iterator is passed a `callback(truthValue)` which must be called with a
+ boolean argument once it has completed.
+* `callback(result)` - A callback which is called as soon as any iterator returns
+ `true`, or after all the `iterator` functions have finished. Result will be
+ the first item in the array that passes the truth test (iterator) or the
+ value `undefined` if none passed.
+
+__Example__
+
+```js
+async.detect(['file1','file2','file3'], fs.exists, function(result){
+ // result now equals the first file in the list that exists
+});
+```
+
+---------------------------------------
+
+<a name="detectSeries" />
+### detectSeries(arr, iterator, callback)
+
+The same as [`detect`](#detect), only the `iterator` is applied to each item in `arr`
+in series. This means the result is always the first in the original `arr` (in
+terms of array order) that passes the truth test.
+
+
+---------------------------------------
+
+<a name="sortBy" />
+### sortBy(arr, iterator, callback)
+
+Sorts a list by the results of running each `arr` value through an async `iterator`.
+
+__Arguments__
+
+* `arr` - An array to iterate over.
+* `iterator(item, callback)` - A function to apply to each item in `arr`.
+ The iterator is passed a `callback(err, sortValue)` which must be called once it
+ has completed with an error (which can be `null`) and a value to use as the sort
+ criteria.
+* `callback(err, results)` - A callback which is called after all the `iterator`
+ functions have finished, or an error occurs. Results is the items from
+ the original `arr` sorted by the values returned by the `iterator` calls.
+
+__Example__
+
+```js
+async.sortBy(['file1','file2','file3'], function(file, callback){
+ fs.stat(file, function(err, stats){
+ callback(err, stats.mtime);
+ });
+}, function(err, results){
+ // results is now the original array of files sorted by
+ // modified date
+});
+```
+
+__Sort Order__
+
+By modifying the callback parameter the sorting order can be influenced:
+
+```js
+//ascending order
+async.sortBy([1,9,3,5], function(x, callback){
+ callback(null, x);
+}, function(err,result){
+ //result callback
+} );
+
+//descending order
+async.sortBy([1,9,3,5], function(x, callback){
+ callback(null, x*-1); //<- x*-1 instead of x, turns the order around
+}, function(err,result){
+ //result callback
+} );
+```
+
+---------------------------------------
+
+<a name="some" />
+### some(arr, iterator, callback)
+
+__Alias:__ `any`
+
+Returns `true` if at least one element in the `arr` satisfies an async test.
+_The callback for each iterator call only accepts a single argument of `true` or
+`false`; it does not accept an error argument first!_ This is in-line with the
+way node libraries work with truth tests like `fs.exists`. Once any iterator
+call returns `true`, the main `callback` is immediately called.
+
+__Arguments__
+
+* `arr` - An array to iterate over.
+* `iterator(item, callback)` - A truth test to apply to each item in the array
+ in parallel. The iterator is passed a callback(truthValue) which must be
+ called with a boolean argument once it has completed.
+* `callback(result)` - A callback which is called as soon as any iterator returns
+ `true`, or after all the iterator functions have finished. Result will be
+ either `true` or `false` depending on the values of the async tests.
+
+__Example__
+
+```js
+async.some(['file1','file2','file3'], fs.exists, function(result){
+ // if result is true then at least one of the files exists
+});
+```
+
+---------------------------------------
+
+<a name="every" />
+### every(arr, iterator, callback)
+
+__Alias:__ `all`
+
+Returns `true` if every element in `arr` satisfies an async test.
+_The callback for each `iterator` call only accepts a single argument of `true` or
+`false`; it does not accept an error argument first!_ This is in-line with the
+way node libraries work with truth tests like `fs.exists`.
+
+__Arguments__
+
+* `arr` - An array to iterate over.
+* `iterator(item, callback)` - A truth test to apply to each item in the array
+ in parallel. The iterator is passed a callback(truthValue) which must be
+ called with a boolean argument once it has completed.
+* `callback(result)` - A callback which is called after all the `iterator`
+ functions have finished. Result will be either `true` or `false` depending on
+ the values of the async tests.
+
+__Example__
+
+```js
+async.every(['file1','file2','file3'], fs.exists, function(result){
+ // if result is true then every file exists
+});
+```
+
+---------------------------------------
+
+<a name="concat" />
+### concat(arr, iterator, callback)
+
+Applies `iterator` to each item in `arr`, concatenating the results. Returns the
+concatenated list. The `iterator`s are called in parallel, and the results are
+concatenated as they return. There is no guarantee that the results array will
+be returned in the original order of `arr` passed to the `iterator` function.
+
+__Arguments__
+
+* `arr` - An array to iterate over.
+* `iterator(item, callback)` - A function to apply to each item in `arr`.
+ The iterator is passed a `callback(err, results)` which must be called once it
+ has completed with an error (which can be `null`) and an array of results.
+* `callback(err, results)` - A callback which is called after all the `iterator`
+ functions have finished, or an error occurs. Results is an array containing
+ the concatenated results of the `iterator` function.
+
+__Example__
+
+```js
+async.concat(['dir1','dir2','dir3'], fs.readdir, function(err, files){
+ // files is now a list of filenames that exist in the 3 directories
+});
+```
+
+---------------------------------------
+
+<a name="concatSeries" />
+### concatSeries(arr, iterator, callback)
+
+Same as [`concat`](#concat), but executes in series instead of parallel.
+
+
+## Control Flow
+
+<a name="series" />
+### series(tasks, [callback])
+
+Run the functions in the `tasks` array in series, each one running once the previous
+function has completed. If any functions in the series pass an error to its
+callback, no more functions are run, and `callback` is immediately called with the value of the error.
+Otherwise, `callback` receives an array of results when `tasks` have completed.
+
+It is also possible to use an object instead of an array. Each property will be
+run as a function, and the results will be passed to the final `callback` as an object
+instead of an array. This can be a more readable way of handling results from
+[`series`](#series).
+
+**Note** that while many implementations preserve the order of object properties, the
+[ECMAScript Language Specifcation](http://www.ecma-international.org/ecma-262/5.1/#sec-8.6)
+explicitly states that
+
+> The mechanics and order of enumerating the properties is not specified.
+
+So if you rely on the order in which your series of functions are executed, and want
+this to work on all platforms, consider using an array.
+
+__Arguments__
+
+* `tasks` - An array or object containing functions to run, each function is passed
+ a `callback(err, result)` it must call on completion with an error `err` (which can
+ be `null`) and an optional `result` value.
+* `callback(err, results)` - An optional callback to run once all the functions
+ have completed. This function gets a results array (or object) containing all
+ the result arguments passed to the `task` callbacks.
+
+__Example__
+
+```js
+async.series([
+ function(callback){
+ // do some stuff ...
+ callback(null, 'one');
+ },
+ function(callback){
+ // do some more stuff ...
+ callback(null, 'two');
+ }
+],
+// optional callback
+function(err, results){
+ // results is now equal to ['one', 'two']
+});
+
+
+// an example using an object instead of an array
+async.series({
+ one: function(callback){
+ setTimeout(function(){
+ callback(null, 1);
+ }, 200);
+ },
+ two: function(callback){
+ setTimeout(function(){
+ callback(null, 2);
+ }, 100);
+ }
+},
+function(err, results) {
+ // results is now equal to: {one: 1, two: 2}
+});
+```
+
+---------------------------------------
+
+<a name="parallel" />
+### parallel(tasks, [callback])
+
+Run the `tasks` array of functions in parallel, without waiting until the previous
+function has completed. If any of the functions pass an error to its
+callback, the main `callback` is immediately called with the value of the error.
+Once the `tasks` have completed, the results are passed to the final `callback` as an
+array.
+
+It is also possible to use an object instead of an array. Each property will be
+run as a function and the results will be passed to the final `callback` as an object
+instead of an array. This can be a more readable way of handling results from
+[`parallel`](#parallel).
+
+
+__Arguments__
+
+* `tasks` - An array or object containing functions to run. Each function is passed
+ a `callback(err, result)` which it must call on completion with an error `err`
+ (which can be `null`) and an optional `result` value.
+* `callback(err, results)` - An optional callback to run once all the functions
+ have completed. This function gets a results array (or object) containing all
+ the result arguments passed to the task callbacks.
+
+__Example__
+
+```js
+async.parallel([
+ function(callback){
+ setTimeout(function(){
+ callback(null, 'one');
+ }, 200);
+ },
+ function(callback){
+ setTimeout(function(){
+ callback(null, 'two');
+ }, 100);
+ }
+],
+// optional callback
+function(err, results){
+ // the results array will equal ['one','two'] even though
+ // the second function had a shorter timeout.
+});
+
+
+// an example using an object instead of an array
+async.parallel({
+ one: function(callback){
+ setTimeout(function(){
+ callback(null, 1);
+ }, 200);
+ },
+ two: function(callback){
+ setTimeout(function(){
+ callback(null, 2);
+ }, 100);
+ }
+},
+function(err, results) {
+ // results is now equals to: {one: 1, two: 2}
+});
+```
+
+---------------------------------------
+
+<a name="parallelLimit" />
+### parallelLimit(tasks, limit, [callback])
+
+The same as [`parallel`](#parallel), only `tasks` are executed in parallel
+with a maximum of `limit` tasks executing at any time.
+
+Note that the `tasks` are not executed in batches, so there is no guarantee that
+the first `limit` tasks will complete before any others are started.
+
+__Arguments__
+
+* `tasks` - An array or object containing functions to run, each function is passed
+ a `callback(err, result)` it must call on completion with an error `err` (which can
+ be `null`) and an optional `result` value.
+* `limit` - The maximum number of `tasks` to run at any time.
+* `callback(err, results)` - An optional callback to run once all the functions
+ have completed. This function gets a results array (or object) containing all
+ the result arguments passed to the `task` callbacks.
+
+---------------------------------------
+
+<a name="whilst" />
+### whilst(test, fn, callback)
+
+Repeatedly call `fn`, while `test` returns `true`. Calls `callback` when stopped,
+or an error occurs.
+
+__Arguments__
+
+* `test()` - synchronous truth test to perform before each execution of `fn`.
+* `fn(callback)` - A function which is called each time `test` passes. The function is
+ passed a `callback(err)`, which must be called once it has completed with an
+ optional `err` argument.
+* `callback(err)` - A callback which is called after the test fails and repeated
+ execution of `fn` has stopped.
+
+__Example__
+
+```js
+var count = 0;
+
+async.whilst(
+ function () { return count < 5; },
+ function (callback) {
+ count++;
+ setTimeout(callback, 1000);
+ },
+ function (err) {
+ // 5 seconds have passed
+ }
+);
+```
+
+---------------------------------------
+
+<a name="doWhilst" />
+### doWhilst(fn, test, callback)
+
+The post-check version of [`whilst`](#whilst). To reflect the difference in
+the order of operations, the arguments `test` and `fn` are switched.
+
+`doWhilst` is to `whilst` as `do while` is to `while` in plain JavaScript.
+
+---------------------------------------
+
+<a name="until" />
+### until(test, fn, callback)
+
+Repeatedly call `fn` until `test` returns `true`. Calls `callback` when stopped,
+or an error occurs.
+
+The inverse of [`whilst`](#whilst).
+
+---------------------------------------
+
+<a name="doUntil" />
+### doUntil(fn, test, callback)
+
+Like [`doWhilst`](#doWhilst), except the `test` is inverted. Note the argument ordering differs from `until`.
+
+---------------------------------------
+
+<a name="forever" />
+### forever(fn, errback)
+
+Calls the asynchronous function `fn` with a callback parameter that allows it to
+call itself again, in series, indefinitely.
+
+If an error is passed to the callback then `errback` is called with the
+error, and execution stops, otherwise it will never be called.
+
+```js
+async.forever(
+ function(next) {
+ // next is suitable for passing to things that need a callback(err [, whatever]);
+ // it will result in this function being called again.
+ },
+ function(err) {
+ // if next is called with a value in its first parameter, it will appear
+ // in here as 'err', and execution will stop.
+ }
+);
+```
+
+---------------------------------------
+
+<a name="waterfall" />
+### waterfall(tasks, [callback])
+
+Runs the `tasks` array of functions in series, each passing their results to the next in
+the array. However, if any of the `tasks` pass an error to their own callback, the
+next function is not executed, and the main `callback` is immediately called with
+the error.
+
+__Arguments__
+
+* `tasks` - An array of functions to run, each function is passed a
+ `callback(err, result1, result2, ...)` it must call on completion. The first
+ argument is an error (which can be `null`) and any further arguments will be
+ passed as arguments in order to the next task.
+* `callback(err, [results])` - An optional callback to run once all the functions
+ have completed. This will be passed the results of the last task's callback.
+
+
+
+__Example__
+
+```js
+async.waterfall([
+ function(callback) {
+ callback(null, 'one', 'two');
+ },
+ function(arg1, arg2, callback) {
+ // arg1 now equals 'one' and arg2 now equals 'two'
+ callback(null, 'three');
+ },
+ function(arg1, callback) {
+ // arg1 now equals 'three'
+ callback(null, 'done');
+ }
+], function (err, result) {
+ // result now equals 'done'
+});
+```
+
+---------------------------------------
+<a name="compose" />
+### compose(fn1, fn2...)
+
+Creates a function which is a composition of the passed asynchronous
+functions. Each function consumes the return value of the function that
+follows. Composing functions `f()`, `g()`, and `h()` would produce the result of
+`f(g(h()))`, only this version uses callbacks to obtain the return values.
+
+Each function is executed with the `this` binding of the composed function.
+
+__Arguments__
+
+* `functions...` - the asynchronous functions to compose
+
+
+__Example__
+
+```js
+function add1(n, callback) {
+ setTimeout(function () {
+ callback(null, n + 1);
+ }, 10);
+}
+
+function mul3(n, callback) {
+ setTimeout(function () {
+ callback(null, n * 3);
+ }, 10);
+}
+
+var add1mul3 = async.compose(mul3, add1);
+
+add1mul3(4, function (err, result) {
+ // result now equals 15
+});
+```
+
+---------------------------------------
+<a name="seq" />
+### seq(fn1, fn2...)
+
+Version of the compose function that is more natural to read.
+Each function consumes the return value of the previous function.
+It is the equivalent of [`compose`](#compose) with the arguments reversed.
+
+Each function is executed with the `this` binding of the composed function.
+
+__Arguments__
+
+* functions... - the asynchronous functions to compose
+
+
+__Example__
+
+```js
+// Requires lodash (or underscore), express3 and dresende's orm2.
+// Part of an app, that fetches cats of the logged user.
+// This example uses `seq` function to avoid overnesting and error
+// handling clutter.
+app.get('/cats', function(request, response) {
+ var User = request.models.User;
+ async.seq(
+ _.bind(User.get, User), // 'User.get' has signature (id, callback(err, data))
+ function(user, fn) {
+ user.getCats(fn); // 'getCats' has signature (callback(err, data))
+ }
+ )(req.session.user_id, function (err, cats) {
+ if (err) {
+ console.error(err);
+ response.json({ status: 'error', message: err.message });
+ } else {
+ response.json({ status: 'ok', message: 'Cats found', data: cats });
+ }
+ });
+});
+```
+
+---------------------------------------
+<a name="applyEach" />
+### applyEach(fns, args..., callback)
+
+Applies the provided arguments to each function in the array, calling
+`callback` after all functions have completed. If you only provide the first
+argument, then it will return a function which lets you pass in the
+arguments as if it were a single function call.
+
+__Arguments__
+
+* `fns` - the asynchronous functions to all call with the same arguments
+* `args...` - any number of separate arguments to pass to the function
+* `callback` - the final argument should be the callback, called when all
+ functions have completed processing
+
+
+__Example__
+
+```js
+async.applyEach([enableSearch, updateSchema], 'bucket', callback);
+
+// partial application example:
+async.each(
+ buckets,
+ async.applyEach([enableSearch, updateSchema]),
+ callback
+);
+```
+
+---------------------------------------
+
+<a name="applyEachSeries" />
+### applyEachSeries(arr, args..., callback)
+
+The same as [`applyEach`](#applyEach) only the functions are applied in series.
+
+---------------------------------------
+
+<a name="queue" />
+### queue(worker, concurrency)
+
+Creates a `queue` object with the specified `concurrency`. Tasks added to the
+`queue` are processed in parallel (up to the `concurrency` limit). If all
+`worker`s are in progress, the task is queued until one becomes available.
+Once a `worker` completes a `task`, that `task`'s callback is called.
+
+__Arguments__
+
+* `worker(task, callback)` - An asynchronous function for processing a queued
+ task, which must call its `callback(err)` argument when finished, with an
+ optional `error` as an argument.
+* `concurrency` - An `integer` for determining how many `worker` functions should be
+ run in parallel.
+
+__Queue objects__
+
+The `queue` object returned by this function has the following properties and
+methods:
+
+* `length()` - a function returning the number of items waiting to be processed.
+* `started` - a function returning whether or not any items have been pushed and processed by the queue
+* `running()` - a function returning the number of items currently being processed.
+* `idle()` - a function returning false if there are items waiting or being processed, or true if not.
+* `concurrency` - an integer for determining how many `worker` functions should be
+ run in parallel. This property can be changed after a `queue` is created to
+ alter the concurrency on-the-fly.
+* `push(task, [callback])` - add a new task to the `queue`. Calls `callback` once
+ the `worker` has finished processing the task. Instead of a single task, a `tasks` array
+ can be submitted. The respective callback is used for every task in the list.
+* `unshift(task, [callback])` - add a new task to the front of the `queue`.
+* `saturated` - a callback that is called when the `queue` length hits the `concurrency` limit,
+ and further tasks will be queued.
+* `empty` - a callback that is called when the last item from the `queue` is given to a `worker`.
+* `drain` - a callback that is called when the last item from the `queue` has returned from the `worker`.
+* `paused` - a boolean for determining whether the queue is in a paused state
+* `pause()` - a function that pauses the processing of tasks until `resume()` is called.
+* `resume()` - a function that resumes the processing of queued tasks when the queue is paused.
+* `kill()` - a function that removes the `drain` callback and empties remaining tasks from the queue forcing it to go idle.
+
+__Example__
+
+```js
+// create a queue object with concurrency 2
+
+var q = async.queue(function (task, callback) {
+ console.log('hello ' + task.name);
+ callback();
+}, 2);
+
+
+// assign a callback
+q.drain = function() {
+ console.log('all items have been processed');
+}
+
+// add some items to the queue
+
+q.push({name: 'foo'}, function (err) {
+ console.log('finished processing foo');
+});
+q.push({name: 'bar'}, function (err) {
+ console.log('finished processing bar');
+});
+
+// add some items to the queue (batch-wise)
+
+q.push([{name: 'baz'},{name: 'bay'},{name: 'bax'}], function (err) {
+ console.log('finished processing item');
+});
+
+// add some items to the front of the queue
+
+q.unshift({name: 'bar'}, function (err) {
+ console.log('finished processing bar');
+});
+```
+
+
+---------------------------------------
+
+<a name="priorityQueue" />
+### priorityQueue(worker, concurrency)
+
+The same as [`queue`](#queue) only tasks are assigned a priority and completed in ascending priority order. There are two differences between `queue` and `priorityQueue` objects:
+
+* `push(task, priority, [callback])` - `priority` should be a number. If an array of
+ `tasks` is given, all tasks will be assigned the same priority.
+* The `unshift` method was removed.
+
+---------------------------------------
+
+<a name="cargo" />
+### cargo(worker, [payload])
+
+Creates a `cargo` object with the specified payload. Tasks added to the
+cargo will be processed altogether (up to the `payload` limit). If the
+`worker` is in progress, the task is queued until it becomes available. Once
+the `worker` has completed some tasks, each callback of those tasks is called.
+Check out [this animation](https://camo.githubusercontent.com/6bbd36f4cf5b35a0f11a96dcd2e97711ffc2fb37/68747470733a2f2f662e636c6f75642e6769746875622e636f6d2f6173736574732f313637363837312f36383130382f62626330636662302d356632392d313165322d393734662d3333393763363464633835382e676966) for how `cargo` and `queue` work.
+
+While [queue](#queue) passes only one task to one of a group of workers
+at a time, cargo passes an array of tasks to a single worker, repeating
+when the worker is finished.
+
+__Arguments__
+
+* `worker(tasks, callback)` - An asynchronous function for processing an array of
+ queued tasks, which must call its `callback(err)` argument when finished, with
+ an optional `err` argument.
+* `payload` - An optional `integer` for determining how many tasks should be
+ processed per round; if omitted, the default is unlimited.
+
+__Cargo objects__
+
+The `cargo` object returned by this function has the following properties and
+methods:
+
+* `length()` - A function returning the number of items waiting to be processed.
+* `payload` - An `integer` for determining how many tasks should be
+ process per round. This property can be changed after a `cargo` is created to
+ alter the payload on-the-fly.
+* `push(task, [callback])` - Adds `task` to the `queue`. The callback is called
+ once the `worker` has finished processing the task. Instead of a single task, an array of `tasks`
+ can be submitted. The respective callback is used for every task in the list.
+* `saturated` - A callback that is called when the `queue.length()` hits the concurrency and further tasks will be queued.
+* `empty` - A callback that is called when the last item from the `queue` is given to a `worker`.
+* `drain` - A callback that is called when the last item from the `queue` has returned from the `worker`.
+
+__Example__
+
+```js
+// create a cargo object with payload 2
+
+var cargo = async.cargo(function (tasks, callback) {
+ for(var i=0; i<tasks.length; i++){
+ console.log('hello ' + tasks[i].name);
+ }
+ callback();
+}, 2);
+
+
+// add some items
+
+cargo.push({name: 'foo'}, function (err) {
+ console.log('finished processing foo');
+});
+cargo.push({name: 'bar'}, function (err) {
+ console.log('finished processing bar');
+});
+cargo.push({name: 'baz'}, function (err) {
+ console.log('finished processing baz');
+});
+```
+
+---------------------------------------
+
+<a name="auto" />
+### auto(tasks, [callback])
+
+Determines the best order for running the functions in `tasks`, based on their
+requirements. Each function can optionally depend on other functions being completed
+first, and each function is run as soon as its requirements are satisfied.
+
+If any of the functions pass an error to their callback, it will not
+complete (so any other functions depending on it will not run), and the main
+`callback` is immediately called with the error. Functions also receive an
+object containing the results of functions which have completed so far.
+
+Note, all functions are called with a `results` object as a second argument,
+so it is unsafe to pass functions in the `tasks` object which cannot handle the
+extra argument.
+
+For example, this snippet of code:
+
+```js
+async.auto({
+ readData: async.apply(fs.readFile, 'data.txt', 'utf-8')
+}, callback);
+```
+
+will have the effect of calling `readFile` with the results object as the last
+argument, which will fail:
+
+```js
+fs.readFile('data.txt', 'utf-8', cb, {});
+```
+
+Instead, wrap the call to `readFile` in a function which does not forward the
+`results` object:
+
+```js
+async.auto({
+ readData: function(cb, results){
+ fs.readFile('data.txt', 'utf-8', cb);
+ }
+}, callback);
+```
+
+__Arguments__
+
+* `tasks` - An object. Each of its properties is either a function or an array of
+ requirements, with the function itself the last item in the array. The object's key
+ of a property serves as the name of the task defined by that property,
+ i.e. can be used when specifying requirements for other tasks.
+ The function receives two arguments: (1) a `callback(err, result)` which must be
+ called when finished, passing an `error` (which can be `null`) and the result of
+ the function's execution, and (2) a `results` object, containing the results of
+ the previously executed functions.
+* `callback(err, results)` - An optional callback which is called when all the
+ tasks have been completed. It receives the `err` argument if any `tasks`
+ pass an error to their callback. Results are always returned; however, if
+ an error occurs, no further `tasks` will be performed, and the results
+ object will only contain partial results.
+
+
+__Example__
+
+```js
+async.auto({
+ get_data: function(callback){
+ console.log('in get_data');
+ // async code to get some data
+ callback(null, 'data', 'converted to array');
+ },
+ make_folder: function(callback){
+ console.log('in make_folder');
+ // async code to create a directory to store a file in
+ // this is run at the same time as getting the data
+ callback(null, 'folder');
+ },
+ write_file: ['get_data', 'make_folder', function(callback, results){
+ console.log('in write_file', JSON.stringify(results));
+ // once there is some data and the directory exists,
+ // write the data to a file in the directory
+ callback(null, 'filename');
+ }],
+ email_link: ['write_file', function(callback, results){
+ console.log('in email_link', JSON.stringify(results));
+ // once the file is written let's email a link to it...
+ // results.write_file contains the filename returned by write_file.
+ callback(null, {'file':results.write_file, 'email':'user@example.com'});
+ }]
+}, function(err, results) {
+ console.log('err = ', err);
+ console.log('results = ', results);
+});
+```
+
+This is a fairly trivial example, but to do this using the basic parallel and
+series functions would look like this:
+
+```js
+async.parallel([
+ function(callback){
+ console.log('in get_data');
+ // async code to get some data
+ callback(null, 'data', 'converted to array');
+ },
+ function(callback){
+ console.log('in make_folder');
+ // async code to create a directory to store a file in
+ // this is run at the same time as getting the data
+ callback(null, 'folder');
+ }
+],
+function(err, results){
+ async.series([
+ function(callback){
+ console.log('in write_file', JSON.stringify(results));
+ // once there is some data and the directory exists,
+ // write the data to a file in the directory
+ results.push('filename');
+ callback(null);
+ },
+ function(callback){
+ console.log('in email_link', JSON.stringify(results));
+ // once the file is written let's email a link to it...
+ callback(null, {'file':results.pop(), 'email':'user@example.com'});
+ }
+ ]);
+});
+```
+
+For a complicated series of `async` tasks, using the [`auto`](#auto) function makes adding
+new tasks much easier (and the code more readable).
+
+
+---------------------------------------
+
+<a name="retry" />
+### retry([times = 5], task, [callback])
+
+Attempts to get a successful response from `task` no more than `times` times before
+returning an error. If the task is successful, the `callback` will be passed the result
+of the successful task. If all attempts fail, the callback will be passed the error and
+result (if any) of the final attempt.
+
+__Arguments__
+
+* `times` - An integer indicating how many times to attempt the `task` before giving up. Defaults to 5.
+* `task(callback, results)` - A function which receives two arguments: (1) a `callback(err, result)`
+ which must be called when finished, passing `err` (which can be `null`) and the `result` of
+ the function's execution, and (2) a `results` object, containing the results of
+ the previously executed functions (if nested inside another control flow).
+* `callback(err, results)` - An optional callback which is called when the
+ task has succeeded, or after the final failed attempt. It receives the `err` and `result` arguments of the last attempt at completing the `task`.
+
+The [`retry`](#retry) function can be used as a stand-alone control flow by passing a
+callback, as shown below:
+
+```js
+async.retry(3, apiMethod, function(err, result) {
+ // do something with the result
+});
+```
+
+It can also be embeded within other control flow functions to retry individual methods
+that are not as reliable, like this:
+
+```js
+async.auto({
+ users: api.getUsers.bind(api),
+ payments: async.retry(3, api.getPayments.bind(api))
+}, function(err, results) {
+ // do something with the results
+});
+```
+
+
+---------------------------------------
+
+<a name="iterator" />
+### iterator(tasks)
+
+Creates an iterator function which calls the next function in the `tasks` array,
+returning a continuation to call the next one after that. It's also possible to
+“peek” at the next iterator with `iterator.next()`.
+
+This function is used internally by the `async` module, but can be useful when
+you want to manually control the flow of functions in series.
+
+__Arguments__
+
+* `tasks` - An array of functions to run.
+
+__Example__
+
+```js
+var iterator = async.iterator([
+ function(){ sys.p('one'); },
+ function(){ sys.p('two'); },
+ function(){ sys.p('three'); }
+]);
+
+node> var iterator2 = iterator();
+'one'
+node> var iterator3 = iterator2();
+'two'
+node> iterator3();
+'three'
+node> var nextfn = iterator2.next();
+node> nextfn();
+'three'
+```
+
+---------------------------------------
+
+<a name="apply" />
+### apply(function, arguments..)
+
+Creates a continuation function with some arguments already applied.
+
+Useful as a shorthand when combined with other control flow functions. Any arguments
+passed to the returned function are added to the arguments originally passed
+to apply.
+
+__Arguments__
+
+* `function` - The function you want to eventually apply all arguments to.
+* `arguments...` - Any number of arguments to automatically apply when the
+ continuation is called.
+
+__Example__
+
+```js
+// using apply
+
+async.parallel([
+ async.apply(fs.writeFile, 'testfile1', 'test1'),
+ async.apply(fs.writeFile, 'testfile2', 'test2'),
+]);
+
+
+// the same process without using apply
+
+async.parallel([
+ function(callback){
+ fs.writeFile('testfile1', 'test1', callback);
+ },
+ function(callback){
+ fs.writeFile('testfile2', 'test2', callback);
+ }
+]);
+```
+
+It's possible to pass any number of additional arguments when calling the
+continuation:
+
+```js
+node> var fn = async.apply(sys.puts, 'one');
+node> fn('two', 'three');
+one
+two
+three
+```
+
+---------------------------------------
+
+<a name="nextTick" />
+### nextTick(callback), setImmediate(callback)
+
+Calls `callback` on a later loop around the event loop. In Node.js this just
+calls `process.nextTick`; in the browser it falls back to `setImmediate(callback)`
+if available, otherwise `setTimeout(callback, 0)`, which means other higher priority
+events may precede the execution of `callback`.
+
+This is used internally for browser-compatibility purposes.
+
+__Arguments__
+
+* `callback` - The function to call on a later loop around the event loop.
+
+__Example__
+
+```js
+var call_order = [];
+async.nextTick(function(){
+ call_order.push('two');
+ // call_order now equals ['one','two']
+});
+call_order.push('one')
+```
+
+<a name="times" />
+### times(n, callback)
+
+Calls the `callback` function `n` times, and accumulates results in the same manner
+you would use with [`map`](#map).
+
+__Arguments__
+
+* `n` - The number of times to run the function.
+* `iterator` - The function to call `n` times.
+* `callback` - see [`map`](#map)
+
+__Example__
+
+```js
+// Pretend this is some complicated async factory
+var createUser = function(id, callback) {
+ callback(null, {
+ id: 'user' + id
+ })
+}
+// generate 5 users
+async.times(5, function(n, next){
+ createUser(n, function(err, user) {
+ next(err, user)
+ })
+}, function(err, users) {
+ // we should now have 5 users
+});
+```
+
+<a name="timesSeries" />
+### timesSeries(n, callback)
+
+The same as [`times`](#times), only the iterator is applied to each item in `arr` in
+series. The next `iterator` is only called once the current one has completed.
+The results array will be in the same order as the original.
+
+
+## Utils
+
+<a name="memoize" />
+### memoize(fn, [hasher])
+
+Caches the results of an `async` function. When creating a hash to store function
+results against, the callback is omitted from the hash and an optional hash
+function can be used.
+
+If no hash function is specified, the first argument is used as a hash key, which may work reasonably if it is a string or a data type that converts to a distinct string. Note that objects and arrays will not behave reasonably. Neither will cases where the other arguments are significant. In such cases, specify your own hash function.
+
+The cache of results is exposed as the `memo` property of the function returned
+by `memoize`.
+
+__Arguments__
+
+* `fn` - The function to proxy and cache results from.
+* `hasher` - An optional function for generating a custom hash for storing
+ results. It has all the arguments applied to it apart from the callback, and
+ must be synchronous.
+
+__Example__
+
+```js
+var slow_fn = function (name, callback) {
+ // do something
+ callback(null, result);
+};
+var fn = async.memoize(slow_fn);
+
+// fn can now be used as if it were slow_fn
+fn('some name', function () {
+ // callback
+});
+```
+
+<a name="unmemoize" />
+### unmemoize(fn)
+
+Undoes a [`memoize`](#memoize)d function, reverting it to the original, unmemoized
+form. Handy for testing.
+
+__Arguments__
+
+* `fn` - the memoized function
+
+<a name="log" />
+### log(function, arguments)
+
+Logs the result of an `async` function to the `console`. Only works in Node.js or
+in browsers that support `console.log` and `console.error` (such as FF and Chrome).
+If multiple arguments are returned from the async function, `console.log` is
+called on each argument in order.
+
+__Arguments__
+
+* `function` - The function you want to eventually apply all arguments to.
+* `arguments...` - Any number of arguments to apply to the function.
+
+__Example__
+
+```js
+var hello = function(name, callback){
+ setTimeout(function(){
+ callback(null, 'hello ' + name);
+ }, 1000);
+};
+```
+```js
+node> async.log(hello, 'world');
+'hello world'
+```
+
+---------------------------------------
+
+<a name="dir" />
+### dir(function, arguments)
+
+Logs the result of an `async` function to the `console` using `console.dir` to
+display the properties of the resulting object. Only works in Node.js or
+in browsers that support `console.dir` and `console.error` (such as FF and Chrome).
+If multiple arguments are returned from the async function, `console.dir` is
+called on each argument in order.
+
+__Arguments__
+
+* `function` - The function you want to eventually apply all arguments to.
+* `arguments...` - Any number of arguments to apply to the function.
+
+__Example__
+
+```js
+var hello = function(name, callback){
+ setTimeout(function(){
+ callback(null, {hello: name});
+ }, 1000);
+};
+```
+```js
+node> async.dir(hello, 'world');
+{hello: 'world'}
+```
+
+---------------------------------------
+
+<a name="noConflict" />
+### noConflict()
+
+Changes the value of `async` back to its original value, returning a reference to the
+`async` object.
diff --git a/node_modules/winston/node_modules/async/bower.json b/node_modules/winston/node_modules/async/bower.json
new file mode 100644
index 0000000..9e4156d
--- /dev/null
+++ b/node_modules/winston/node_modules/async/bower.json
@@ -0,0 +1,40 @@
+{
+ "name": "async",
+ "description": "Higher-order functions and common patterns for asynchronous code",
+ "version": "1.0.0",
+ "main": "lib/async.js",
+ "keywords": [
+ "async",
+ "callback",
+ "utility",
+ "module"
+ ],
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/caolan/async.git"
+ },
+ "devDependencies": {
+ "benchmark": "~1.0.0",
+ "jshint": "~2.7.0",
+ "lodash": ">=2.4.1",
+ "mkdirp": "~0.5.1",
+ "nodeunit": ">0.0.0",
+ "uglify-js": "1.2.x"
+ },
+ "moduleType": [
+ "amd",
+ "globals",
+ "node"
+ ],
+ "ignore": [
+ "**/.*",
+ "node_modules",
+ "bower_components",
+ "test",
+ "tests"
+ ],
+ "authors": [
+ "Caolan McMahon"
+ ]
+} \ No newline at end of file
diff --git a/node_modules/winston/node_modules/async/component.json b/node_modules/winston/node_modules/async/component.json
new file mode 100644
index 0000000..c876b0a
--- /dev/null
+++ b/node_modules/winston/node_modules/async/component.json
@@ -0,0 +1,17 @@
+{
+ "name": "async",
+ "description": "Higher-order functions and common patterns for asynchronous code",
+ "version": "1.0.0",
+ "keywords": [
+ "async",
+ "callback",
+ "utility",
+ "module"
+ ],
+ "license": "MIT",
+ "main": "lib/async.js",
+ "repository": "caolan/async",
+ "scripts": [
+ "lib/async.js"
+ ]
+} \ No newline at end of file
diff --git a/node_modules/winston/node_modules/async/lib/async.js b/node_modules/winston/node_modules/async/lib/async.js
new file mode 100644
index 0000000..1e76ee8
--- /dev/null
+++ b/node_modules/winston/node_modules/async/lib/async.js
@@ -0,0 +1,1283 @@
+/*!
+ * async
+ * https://github.com/caolan/async
+ *
+ * Copyright 2010-2014 Caolan McMahon
+ * Released under the MIT license
+ */
+(function () {
+
+ var async = {};
+ var noop = function () {};
+
+ // global on the server, window in the browser
+ var root, previous_async;
+
+ if (typeof window == 'object' && this === window) {
+ root = window;
+ }
+ else if (typeof global == 'object' && this === global) {
+ root = global;
+ }
+ else {
+ root = this;
+ }
+
+ if (root != null) {
+ previous_async = root.async;
+ }
+
+ async.noConflict = function () {
+ root.async = previous_async;
+ return async;
+ };
+
+ function only_once(fn) {
+ var called = false;
+ return function() {
+ if (called) throw new Error("Callback was already called.");
+ called = true;
+ fn.apply(root, arguments);
+ };
+ }
+
+ //// cross-browser compatiblity functions ////
+
+ var _toString = Object.prototype.toString;
+
+ var _isArray = Array.isArray || function (obj) {
+ return _toString.call(obj) === '[object Array]';
+ };
+
+ var _each = function (arr, iterator) {
+ var index = -1,
+ length = arr.length;
+
+ while (++index < length) {
+ iterator(arr[index], index, arr);
+ }
+ };
+
+ var _map = function (arr, iterator) {
+ var index = -1,
+ length = arr.length,
+ result = Array(length);
+
+ while (++index < length) {
+ result[index] = iterator(arr[index], index, arr);
+ }
+ return result;
+ };
+
+ var _reduce = function (arr, iterator, memo) {
+ _each(arr, function (x, i, a) {
+ memo = iterator(memo, x, i, a);
+ });
+ return memo;
+ };
+
+ var _forEachOf = function (object, iterator) {
+ _each(_keys(object), function (key) {
+ iterator(object[key], key);
+ });
+ };
+
+ var _keys = Object.keys || function (obj) {
+ var keys = [];
+ for (var k in obj) {
+ if (obj.hasOwnProperty(k)) {
+ keys.push(k);
+ }
+ }
+ return keys;
+ };
+
+ var _baseSlice = function (arr, start) {
+ start = start || 0;
+ var index = -1;
+ var length = arr.length;
+
+ if (start) {
+ length -= start;
+ length = length < 0 ? 0 : length;
+ }
+ var result = Array(length);
+
+ while (++index < length) {
+ result[index] = arr[index + start];
+ }
+ return result;
+ };
+
+ //// exported async module functions ////
+
+ //// nextTick implementation with browser-compatible fallback ////
+
+ // capture the global reference to guard against fakeTimer mocks
+ var _setImmediate;
+ if (typeof setImmediate === 'function') {
+ _setImmediate = setImmediate;
+ }
+
+ if (typeof process === 'undefined' || !(process.nextTick)) {
+ if (_setImmediate) {
+ async.nextTick = function (fn) {
+ // not a direct alias for IE10 compatibility
+ _setImmediate(fn);
+ };
+ async.setImmediate = async.nextTick;
+ }
+ else {
+ async.nextTick = function (fn) {
+ setTimeout(fn, 0);
+ };
+ async.setImmediate = async.nextTick;
+ }
+ }
+ else {
+ async.nextTick = process.nextTick;
+ if (_setImmediate) {
+ async.setImmediate = function (fn) {
+ // not a direct alias for IE10 compatibility
+ _setImmediate(fn);
+ };
+ }
+ else {
+ async.setImmediate = async.nextTick;
+ }
+ }
+
+ async.each = function (arr, iterator, callback) {
+ callback = callback || noop;
+ if (!arr.length) {
+ return callback();
+ }
+ var completed = 0;
+ _each(arr, function (x) {
+ iterator(x, only_once(done) );
+ });
+ function done(err) {
+ if (err) {
+ callback(err);
+ callback = noop;
+ }
+ else {
+ completed += 1;
+ if (completed >= arr.length) {
+ callback();
+ }
+ }
+ }
+ };
+ async.forEach = async.each;
+
+ async.eachSeries = function (arr, iterator, callback) {
+ callback = callback || noop;
+ if (!arr.length) {
+ return callback();
+ }
+ var completed = 0;
+ var iterate = function () {
+ iterator(arr[completed], function (err) {
+ if (err) {
+ callback(err);
+ callback = noop;
+ }
+ else {
+ completed += 1;
+ if (completed >= arr.length) {
+ callback();
+ }
+ else {
+ iterate();
+ }
+ }
+ });
+ };
+ iterate();
+ };
+ async.forEachSeries = async.eachSeries;
+
+
+ async.eachLimit = function (arr, limit, iterator, callback) {
+ var fn = _eachLimit(limit);
+ fn.apply(null, [arr, iterator, callback]);
+ };
+ async.forEachLimit = async.eachLimit;
+
+ var _eachLimit = function (limit) {
+
+ return function (arr, iterator, callback) {
+ callback = callback || noop;
+ if (!arr.length || limit <= 0) {
+ return callback();
+ }
+ var completed = 0;
+ var started = 0;
+ var running = 0;
+
+ (function replenish () {
+ if (completed >= arr.length) {
+ return callback();
+ }
+
+ while (running < limit && started < arr.length) {
+ started += 1;
+ running += 1;
+ iterator(arr[started - 1], function (err) {
+ if (err) {
+ callback(err);
+ callback = noop;
+ }
+ else {
+ completed += 1;
+ running -= 1;
+ if (completed >= arr.length) {
+ callback();
+ }
+ else {
+ replenish();
+ }
+ }
+ });
+ }
+ })();
+ };
+ };
+
+
+
+ async.forEachOf = async.eachOf = function (object, iterator, callback) {
+ callback = callback || function () {};
+ var size = object.length || _keys(object).length;
+ var completed = 0;
+ if (!size) {
+ return callback();
+ }
+ _forEachOf(object, function (value, key) {
+ iterator(object[key], key, function (err) {
+ if (err) {
+ callback(err);
+ callback = function () {};
+ } else {
+ completed += 1;
+ if (completed === size) {
+ callback(null);
+ }
+ }
+ });
+ });
+ };
+
+ async.forEachOfSeries = async.eachOfSeries = function (obj, iterator, callback) {
+ callback = callback || function () {};
+ var keys = _keys(obj);
+ var size = keys.length;
+ if (!size) {
+ return callback();
+ }
+ var completed = 0;
+ var iterate = function () {
+ var sync = true;
+ var key = keys[completed];
+ iterator(obj[key], key, function (err) {
+ if (err) {
+ callback(err);
+ callback = function () {};
+ }
+ else {
+ completed += 1;
+ if (completed >= size) {
+ callback(null);
+ }
+ else {
+ if (sync) {
+ async.nextTick(iterate);
+ }
+ else {
+ iterate();
+ }
+ }
+ }
+ });
+ sync = false;
+ };
+ iterate();
+ };
+
+
+
+ async.forEachOfLimit = async.eachOfLimit = function (obj, limit, iterator, callback) {
+ _forEachOfLimit(limit)(obj, iterator, callback);
+ };
+
+ var _forEachOfLimit = function (limit) {
+
+ return function (obj, iterator, callback) {
+ callback = callback || function () {};
+ var keys = _keys(obj);
+ var size = keys.length;
+ if (!size || limit <= 0) {
+ return callback();
+ }
+ var completed = 0;
+ var started = 0;
+ var running = 0;
+
+ (function replenish () {
+ if (completed >= size) {
+ return callback();
+ }
+
+ while (running < limit && started < size) {
+ started += 1;
+ running += 1;
+ var key = keys[started - 1];
+ iterator(obj[key], key, function (err) {
+ if (err) {
+ callback(err);
+ callback = function () {};
+ }
+ else {
+ completed += 1;
+ running -= 1;
+ if (completed >= size) {
+ callback();
+ }
+ else {
+ replenish();
+ }
+ }
+ });
+ }
+ })();
+ };
+ };
+
+
+ var doParallel = function (fn) {
+ return function () {
+ var args = _baseSlice(arguments);
+ return fn.apply(null, [async.each].concat(args));
+ };
+ };
+ var doParallelLimit = function(limit, fn) {
+ return function () {
+ var args = _baseSlice(arguments);
+ return fn.apply(null, [_eachLimit(limit)].concat(args));
+ };
+ };
+ var doSeries = function (fn) {
+ return function () {
+ var args = _baseSlice(arguments);
+ return fn.apply(null, [async.eachSeries].concat(args));
+ };
+ };
+
+
+ var _asyncMap = function (eachfn, arr, iterator, callback) {
+ arr = _map(arr, function (x, i) {
+ return {index: i, value: x};
+ });
+ if (!callback) {
+ eachfn(arr, function (x, callback) {
+ iterator(x.value, function (err) {
+ callback(err);
+ });
+ });
+ } else {
+ var results = [];
+ eachfn(arr, function (x, callback) {
+ iterator(x.value, function (err, v) {
+ results[x.index] = v;
+ callback(err);
+ });
+ }, function (err) {
+ callback(err, results);
+ });
+ }
+ };
+ async.map = doParallel(_asyncMap);
+ async.mapSeries = doSeries(_asyncMap);
+ async.mapLimit = function (arr, limit, iterator, callback) {
+ return _mapLimit(limit)(arr, iterator, callback);
+ };
+
+ var _mapLimit = function(limit) {
+ return doParallelLimit(limit, _asyncMap);
+ };
+
+ // reduce only has a series version, as doing reduce in parallel won't
+ // work in many situations.
+ async.reduce = function (arr, memo, iterator, callback) {
+ async.eachSeries(arr, function (x, callback) {
+ iterator(memo, x, function (err, v) {
+ memo = v;
+ callback(err);
+ });
+ }, function (err) {
+ callback(err, memo);
+ });
+ };
+ // inject alias
+ async.inject = async.reduce;
+ // foldl alias
+ async.foldl = async.reduce;
+
+ async.reduceRight = function (arr, memo, iterator, callback) {
+ var reversed = _map(arr, function (x) {
+ return x;
+ }).reverse();
+ async.reduce(reversed, memo, iterator, callback);
+ };
+ // foldr alias
+ async.foldr = async.reduceRight;
+
+ var _filter = function (eachfn, arr, iterator, callback) {
+ var results = [];
+ arr = _map(arr, function (x, i) {
+ return {index: i, value: x};
+ });
+ eachfn(arr, function (x, callback) {
+ iterator(x.value, function (v) {
+ if (v) {
+ results.push(x);
+ }
+ callback();
+ });
+ }, function (err) {
+ callback(_map(results.sort(function (a, b) {
+ return a.index - b.index;
+ }), function (x) {
+ return x.value;
+ }));
+ });
+ };
+ async.filter = doParallel(_filter);
+ async.filterSeries = doSeries(_filter);
+ // select alias
+ async.select = async.filter;
+ async.selectSeries = async.filterSeries;
+
+ var _reject = function (eachfn, arr, iterator, callback) {
+ var results = [];
+ arr = _map(arr, function (x, i) {
+ return {index: i, value: x};
+ });
+ eachfn(arr, function (x, callback) {
+ iterator(x.value, function (v) {
+ if (!v) {
+ results.push(x);
+ }
+ callback();
+ });
+ }, function (err) {
+ callback(_map(results.sort(function (a, b) {
+ return a.index - b.index;
+ }), function (x) {
+ return x.value;
+ }));
+ });
+ };
+ async.reject = doParallel(_reject);
+ async.rejectSeries = doSeries(_reject);
+
+ var _detect = function (eachfn, arr, iterator, main_callback) {
+ eachfn(arr, function (x, callback) {
+ iterator(x, function (result) {
+ if (result) {
+ main_callback(x);
+ main_callback = noop;
+ }
+ else {
+ callback();
+ }
+ });
+ }, function (err) {
+ main_callback();
+ });
+ };
+ async.detect = doParallel(_detect);
+ async.detectSeries = doSeries(_detect);
+
+ async.some = function (arr, iterator, main_callback) {
+ async.each(arr, function (x, callback) {
+ iterator(x, function (v) {
+ if (v) {
+ main_callback(true);
+ main_callback = noop;
+ }
+ callback();
+ });
+ }, function (err) {
+ main_callback(false);
+ });
+ };
+ // any alias
+ async.any = async.some;
+
+ async.every = function (arr, iterator, main_callback) {
+ async.each(arr, function (x, callback) {
+ iterator(x, function (v) {
+ if (!v) {
+ main_callback(false);
+ main_callback = noop;
+ }
+ callback();
+ });
+ }, function (err) {
+ main_callback(true);
+ });
+ };
+ // all alias
+ async.all = async.every;
+
+ async.sortBy = function (arr, iterator, callback) {
+ async.map(arr, function (x, callback) {
+ iterator(x, function (err, criteria) {
+ if (err) {
+ callback(err);
+ }
+ else {
+ callback(null, {value: x, criteria: criteria});
+ }
+ });
+ }, function (err, results) {
+ if (err) {
+ return callback(err);
+ }
+ else {
+ var fn = function (left, right) {
+ var a = left.criteria, b = right.criteria;
+ return a < b ? -1 : a > b ? 1 : 0;
+ };
+ callback(null, _map(results.sort(fn), function (x) {
+ return x.value;
+ }));
+ }
+ });
+ };
+
+ async.auto = function (tasks, callback) {
+ callback = callback || noop;
+ var keys = _keys(tasks);
+ var remainingTasks = keys.length;
+ if (!remainingTasks) {
+ return callback();
+ }
+
+ var results = {};
+
+ var listeners = [];
+ var addListener = function (fn) {
+ listeners.unshift(fn);
+ };
+ var removeListener = function (fn) {
+ for (var i = 0; i < listeners.length; i += 1) {
+ if (listeners[i] === fn) {
+ listeners.splice(i, 1);
+ return;
+ }
+ }
+ };
+ var taskComplete = function () {
+ remainingTasks--;
+ _each(listeners.slice(0), function (fn) {
+ fn();
+ });
+ };
+
+ addListener(function () {
+ if (!remainingTasks) {
+ var theCallback = callback;
+ // prevent final callback from calling itself if it errors
+ callback = noop;
+
+ theCallback(null, results);
+ }
+ });
+
+ _each(keys, function (k) {
+ var task = _isArray(tasks[k]) ? tasks[k]: [tasks[k]];
+ var taskCallback = function (err) {
+ var args = _baseSlice(arguments, 1);
+ if (args.length <= 1) {
+ args = args[0];
+ }
+ if (err) {
+ var safeResults = {};
+ _each(_keys(results), function(rkey) {
+ safeResults[rkey] = results[rkey];
+ });
+ safeResults[k] = args;
+ callback(err, safeResults);
+ // stop subsequent errors hitting callback multiple times
+ callback = noop;
+ }
+ else {
+ results[k] = args;
+ async.setImmediate(taskComplete);
+ }
+ };
+ var requires = task.slice(0, Math.abs(task.length - 1)) || [];
+ // prevent dead-locks
+ var len = requires.length;
+ var dep;
+ while (len--) {
+ if (!(dep = tasks[requires[len]])) {
+ throw new Error('Has inexistant dependency');
+ }
+ if (_isArray(dep) && !!~dep.indexOf(k)) {
+ throw new Error('Has cyclic dependencies');
+ }
+ }
+ var ready = function () {
+ return _reduce(requires, function (a, x) {
+ return (a && results.hasOwnProperty(x));
+ }, true) && !results.hasOwnProperty(k);
+ };
+ if (ready()) {
+ task[task.length - 1](taskCallback, results);
+ }
+ else {
+ var listener = function () {
+ if (ready()) {
+ removeListener(listener);
+ task[task.length - 1](taskCallback, results);
+ }
+ };
+ addListener(listener);
+ }
+ });
+ };
+
+ async.retry = function(times, task, callback) {
+ var DEFAULT_TIMES = 5;
+ var attempts = [];
+ // Use defaults if times not passed
+ if (typeof times === 'function') {
+ callback = task;
+ task = times;
+ times = DEFAULT_TIMES;
+ }
+ // Make sure times is a number
+ times = parseInt(times, 10) || DEFAULT_TIMES;
+ var wrappedTask = function(wrappedCallback, wrappedResults) {
+ var retryAttempt = function(task, finalAttempt) {
+ return function(seriesCallback) {
+ task(function(err, result){
+ seriesCallback(!err || finalAttempt, {err: err, result: result});
+ }, wrappedResults);
+ };
+ };
+ while (times) {
+ attempts.push(retryAttempt(task, !(times-=1)));
+ }
+ async.series(attempts, function(done, data){
+ data = data[data.length - 1];
+ (wrappedCallback || callback)(data.err, data.result);
+ });
+ };
+ // If a callback is passed, run this as a controll flow
+ return callback ? wrappedTask() : wrappedTask;
+ };
+
+ async.waterfall = function (tasks, callback) {
+ callback = callback || noop;
+ if (!_isArray(tasks)) {
+ var err = new Error('First argument to waterfall must be an array of functions');
+ return callback(err);
+ }
+ if (!tasks.length) {
+ return callback();
+ }
+ var wrapIterator = function (iterator) {
+ return function (err) {
+ if (err) {
+ callback.apply(null, arguments);
+ callback = noop;
+ }
+ else {
+ var args = _baseSlice(arguments, 1);
+ var next = iterator.next();
+ if (next) {
+ args.push(wrapIterator(next));
+ }
+ else {
+ args.push(callback);
+ }
+ async.setImmediate(function () {
+ iterator.apply(null, args);
+ });
+ }
+ };
+ };
+ wrapIterator(async.iterator(tasks))();
+ };
+
+ var _parallel = function(eachfn, tasks, callback) {
+ callback = callback || noop;
+ if (_isArray(tasks)) {
+ eachfn.map(tasks, function (fn, callback) {
+ if (fn) {
+ fn(function (err) {
+ var args = _baseSlice(arguments, 1);
+ if (args.length <= 1) {
+ args = args[0];
+ }
+ callback.call(null, err, args);
+ });
+ }
+ }, callback);
+ }
+ else {
+ var results = {};
+ eachfn.each(_keys(tasks), function (k, callback) {
+ tasks[k](function (err) {
+ var args = _baseSlice(arguments, 1);
+ if (args.length <= 1) {
+ args = args[0];
+ }
+ results[k] = args;
+ callback(err);
+ });
+ }, function (err) {
+ callback(err, results);
+ });
+ }
+ };
+
+ async.parallel = function (tasks, callback) {
+ _parallel({ map: async.map, each: async.each }, tasks, callback);
+ };
+
+ async.parallelLimit = function(tasks, limit, callback) {
+ _parallel({ map: _mapLimit(limit), each: _eachLimit(limit) }, tasks, callback);
+ };
+
+ async.series = function (tasks, callback) {
+ callback = callback || noop;
+ if (_isArray(tasks)) {
+ async.mapSeries(tasks, function (fn, callback) {
+ if (fn) {
+ fn(function (err) {
+ var args = _baseSlice(arguments, 1);
+ if (args.length <= 1) {
+ args = args[0];
+ }
+ callback.call(null, err, args);
+ });
+ }
+ }, callback);
+ }
+ else {
+ var results = {};
+ async.eachSeries(_keys(tasks), function (k, callback) {
+ tasks[k](function (err) {
+ var args = _baseSlice(arguments, 1);
+ if (args.length <= 1) {
+ args = args[0];
+ }
+ results[k] = args;
+ callback(err);
+ });
+ }, function (err) {
+ callback(err, results);
+ });
+ }
+ };
+
+ async.iterator = function (tasks) {
+ var makeCallback = function (index) {
+ var fn = function () {
+ if (tasks.length) {
+ tasks[index].apply(null, arguments);
+ }
+ return fn.next();
+ };
+ fn.next = function () {
+ return (index < tasks.length - 1) ? makeCallback(index + 1): null;
+ };
+ return fn;
+ };
+ return makeCallback(0);
+ };
+
+ async.apply = function (fn) {
+ var args = _baseSlice(arguments, 1);
+ return function () {
+ return fn.apply(
+ null, args.concat(_baseSlice(arguments))
+ );
+ };
+ };
+
+ var _concat = function (eachfn, arr, fn, callback) {
+ var r = [];
+ eachfn(arr, function (x, cb) {
+ fn(x, function (err, y) {
+ r = r.concat(y || []);
+ cb(err);
+ });
+ }, function (err) {
+ callback(err, r);
+ });
+ };
+ async.concat = doParallel(_concat);
+ async.concatSeries = doSeries(_concat);
+
+ async.whilst = function (test, iterator, callback) {
+ if (test()) {
+ iterator(function (err) {
+ if (err) {
+ return callback(err);
+ }
+ async.whilst(test, iterator, callback);
+ });
+ }
+ else {
+ callback();
+ }
+ };
+
+ async.doWhilst = function (iterator, test, callback) {
+ iterator(function (err) {
+ if (err) {
+ return callback(err);
+ }
+ var args = _baseSlice(arguments, 1);
+ if (test.apply(null, args)) {
+ async.doWhilst(iterator, test, callback);
+ }
+ else {
+ callback();
+ }
+ });
+ };
+
+ async.until = function (test, iterator, callback) {
+ if (!test()) {
+ iterator(function (err) {
+ if (err) {
+ return callback(err);
+ }
+ async.until(test, iterator, callback);
+ });
+ }
+ else {
+ callback();
+ }
+ };
+
+ async.doUntil = function (iterator, test, callback) {
+ iterator(function (err) {
+ if (err) {
+ return callback(err);
+ }
+ var args = _baseSlice(arguments, 1);
+ if (!test.apply(null, args)) {
+ async.doUntil(iterator, test, callback);
+ }
+ else {
+ callback();
+ }
+ });
+ };
+
+ async.queue = function (worker, concurrency) {
+ if (concurrency === undefined) {
+ concurrency = 1;
+ }
+ else if(concurrency === 0) {
+ throw new Error('Concurrency must not be zero');
+ }
+ function _insert(q, data, pos, callback) {
+ if (!q.started){
+ q.started = true;
+ }
+ if (!_isArray(data)) {
+ data = [data];
+ }
+ if(data.length === 0) {
+ // call drain immediately if there are no tasks
+ return async.setImmediate(function() {
+ if (q.drain) {
+ q.drain();
+ }
+ });
+ }
+ _each(data, function(task) {
+ var item = {
+ data: task,
+ callback: typeof callback === 'function' ? callback : null
+ };
+
+ if (pos) {
+ q.tasks.unshift(item);
+ } else {
+ q.tasks.push(item);
+ }
+
+ if (q.saturated && q.tasks.length === q.concurrency) {
+ q.saturated();
+ }
+ async.setImmediate(q.process);
+ });
+ }
+
+ var workers = 0;
+ var q = {
+ tasks: [],
+ concurrency: concurrency,
+ saturated: null,
+ empty: null,
+ drain: null,
+ started: false,
+ paused: false,
+ push: function (data, callback) {
+ _insert(q, data, false, callback);
+ },
+ kill: function () {
+ q.drain = null;
+ q.tasks = [];
+ },
+ unshift: function (data, callback) {
+ _insert(q, data, true, callback);
+ },
+ process: function () {
+ if (!q.paused && workers < q.concurrency && q.tasks.length) {
+ var task = q.tasks.shift();
+ if (q.empty && q.tasks.length === 0) {
+ q.empty();
+ }
+ workers += 1;
+ var next = function () {
+ workers -= 1;
+ if (task.callback) {
+ task.callback.apply(task, arguments);
+ }
+ if (q.drain && q.tasks.length + workers === 0) {
+ q.drain();
+ }
+ q.process();
+ };
+ var cb = only_once(next);
+ worker(task.data, cb);
+ }
+ },
+ length: function () {
+ return q.tasks.length;
+ },
+ running: function () {
+ return workers;
+ },
+ idle: function() {
+ return q.tasks.length + workers === 0;
+ },
+ pause: function () {
+ if (q.paused === true) { return; }
+ q.paused = true;
+ },
+ resume: function () {
+ if (q.paused === false) { return; }
+ q.paused = false;
+ var resumeCount = Math.min(q.concurrency, q.tasks.length);
+ // Need to call q.process once per concurrent
+ // worker to preserve full concurrency after pause
+ for (var w = 1; w <= resumeCount; w++) {
+ async.setImmediate(q.process);
+ }
+ }
+ };
+ return q;
+ };
+
+ async.priorityQueue = function (worker, concurrency) {
+
+ function _compareTasks(a, b){
+ return a.priority - b.priority;
+ }
+
+ function _binarySearch(sequence, item, compare) {
+ var beg = -1,
+ end = sequence.length - 1;
+ while (beg < end) {
+ var mid = beg + ((end - beg + 1) >>> 1);
+ if (compare(item, sequence[mid]) >= 0) {
+ beg = mid;
+ } else {
+ end = mid - 1;
+ }
+ }
+ return beg;
+ }
+
+ function _insert(q, data, priority, callback) {
+ if (!q.started){
+ q.started = true;
+ }
+ if (!_isArray(data)) {
+ data = [data];
+ }
+ if(data.length === 0) {
+ // call drain immediately if there are no tasks
+ return async.setImmediate(function() {
+ if (q.drain) {
+ q.drain();
+ }
+ });
+ }
+ _each(data, function(task) {
+ var item = {
+ data: task,
+ priority: priority,
+ callback: typeof callback === 'function' ? callback : null
+ };
+
+ q.tasks.splice(_binarySearch(q.tasks, item, _compareTasks) + 1, 0, item);
+
+ if (q.saturated && q.tasks.length === q.concurrency) {
+ q.saturated();
+ }
+ async.setImmediate(q.process);
+ });
+ }
+
+ // Start with a normal queue
+ var q = async.queue(worker, concurrency);
+
+ // Override push to accept second parameter representing priority
+ q.push = function (data, priority, callback) {
+ _insert(q, data, priority, callback);
+ };
+
+ // Remove unshift function
+ delete q.unshift;
+
+ return q;
+ };
+
+ async.cargo = function (worker, payload) {
+ var working = false,
+ tasks = [];
+
+ var cargo = {
+ tasks: tasks,
+ payload: payload,
+ saturated: null,
+ empty: null,
+ drain: null,
+ drained: true,
+ push: function (data, callback) {
+ if (!_isArray(data)) {
+ data = [data];
+ }
+ _each(data, function(task) {
+ tasks.push({
+ data: task,
+ callback: typeof callback === 'function' ? callback : null
+ });
+ cargo.drained = false;
+ if (cargo.saturated && tasks.length === payload) {
+ cargo.saturated();
+ }
+ });
+ async.setImmediate(cargo.process);
+ },
+ process: function process() {
+ if (working) return;
+ if (tasks.length === 0) {
+ if(cargo.drain && !cargo.drained) cargo.drain();
+ cargo.drained = true;
+ return;
+ }
+
+ var ts = typeof payload === 'number' ?
+ tasks.splice(0, payload) :
+ tasks.splice(0, tasks.length);
+
+ var ds = _map(ts, function (task) {
+ return task.data;
+ });
+
+ if(cargo.empty) cargo.empty();
+ working = true;
+ worker(ds, function () {
+ working = false;
+
+ var args = arguments;
+ _each(ts, function (data) {
+ if (data.callback) {
+ data.callback.apply(null, args);
+ }
+ });
+
+ process();
+ });
+ },
+ length: function () {
+ return tasks.length;
+ },
+ running: function () {
+ return working;
+ }
+ };
+ return cargo;
+ };
+
+ var _console_fn = function (name) {
+ return function (fn) {
+ var args = _baseSlice(arguments, 1);
+ fn.apply(null, args.concat([function (err) {
+ var args = _baseSlice(arguments, 1);
+ if (typeof console !== 'undefined') {
+ if (err) {
+ if (console.error) {
+ console.error(err);
+ }
+ }
+ else if (console[name]) {
+ _each(args, function (x) {
+ console[name](x);
+ });
+ }
+ }
+ }]));
+ };
+ };
+ async.log = _console_fn('log');
+ async.dir = _console_fn('dir');
+ /*async.info = _console_fn('info');
+ async.warn = _console_fn('warn');
+ async.error = _console_fn('error');*/
+
+ async.memoize = function (fn, hasher) {
+ var memo = {};
+ var queues = {};
+ hasher = hasher || function (x) {
+ return x;
+ };
+ var memoized = function () {
+ var args = _baseSlice(arguments);
+ var callback = args.pop();
+ var key = hasher.apply(null, args);
+ if (key in memo) {
+ async.nextTick(function () {
+ callback.apply(null, memo[key]);
+ });
+ }
+ else if (key in queues) {
+ queues[key].push(callback);
+ }
+ else {
+ queues[key] = [callback];
+ fn.apply(null, args.concat([function () {
+ memo[key] = _baseSlice(arguments);
+ var q = queues[key];
+ delete queues[key];
+ for (var i = 0, l = q.length; i < l; i++) {
+ q[i].apply(null, arguments);
+ }
+ }]));
+ }
+ };
+ memoized.memo = memo;
+ memoized.unmemoized = fn;
+ return memoized;
+ };
+
+ async.unmemoize = function (fn) {
+ return function () {
+ return (fn.unmemoized || fn).apply(null, arguments);
+ };
+ };
+
+ async.times = function (count, iterator, callback) {
+ var counter = [];
+ for (var i = 0; i < count; i++) {
+ counter.push(i);
+ }
+ return async.map(counter, iterator, callback);
+ };
+
+ async.timesSeries = function (count, iterator, callback) {
+ var counter = [];
+ for (var i = 0; i < count; i++) {
+ counter.push(i);
+ }
+ return async.mapSeries(counter, iterator, callback);
+ };
+
+ async.seq = function (/* functions... */) {
+ var fns = arguments;
+ return function () {
+ var that = this;
+ var args = _baseSlice(arguments);
+ var callback = args.pop();
+ async.reduce(fns, args, function (newargs, fn, cb) {
+ fn.apply(that, newargs.concat([function () {
+ var err = arguments[0];
+ var nextargs = _baseSlice(arguments, 1);
+ cb(err, nextargs);
+ }]));
+ },
+ function (err, results) {
+ callback.apply(that, [err].concat(results));
+ });
+ };
+ };
+
+ async.compose = function (/* functions... */) {
+ return async.seq.apply(null, Array.prototype.reverse.call(arguments));
+ };
+
+ var _applyEach = function (eachfn, fns /*args...*/) {
+ var go = function () {
+ var that = this;
+ var args = _baseSlice(arguments);
+ var callback = args.pop();
+ return eachfn(fns, function (fn, cb) {
+ fn.apply(that, args.concat([cb]));
+ },
+ callback);
+ };
+ if (arguments.length > 2) {
+ var args = _baseSlice(arguments, 2);
+ return go.apply(this, args);
+ }
+ else {
+ return go;
+ }
+ };
+ async.applyEach = doParallel(_applyEach);
+ async.applyEachSeries = doSeries(_applyEach);
+
+ async.forever = function (fn, callback) {
+ function next(err) {
+ if (err) {
+ if (callback) {
+ return callback(err);
+ }
+ throw err;
+ }
+ fn(next);
+ }
+ next();
+ };
+
+ // Node.js
+ if (typeof module !== 'undefined' && module.exports) {
+ module.exports = async;
+ }
+ // AMD / RequireJS
+ else if (typeof define !== 'undefined' && define.amd) {
+ define([], function () {
+ return async;
+ });
+ }
+ // included directly via <script> tag
+ else {
+ root.async = async;
+ }
+
+}());
diff --git a/node_modules/winston/node_modules/async/package.json b/node_modules/winston/node_modules/async/package.json
new file mode 100644
index 0000000..cc6e6bc
--- /dev/null
+++ b/node_modules/winston/node_modules/async/package.json
@@ -0,0 +1,85 @@
+{
+ "_from": "async@~1.0.0",
+ "_id": "async@1.0.0",
+ "_inBundle": false,
+ "_integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=",
+ "_location": "/winston/async",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "range",
+ "registry": true,
+ "raw": "async@~1.0.0",
+ "name": "async",
+ "escapedName": "async",
+ "rawSpec": "~1.0.0",
+ "saveSpec": null,
+ "fetchSpec": "~1.0.0"
+ },
+ "_requiredBy": [
+ "/winston"
+ ],
+ "_resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+ "_shasum": "f8fc04ca3a13784ade9e1641af98578cfbd647a9",
+ "_spec": "async@~1.0.0",
+ "_where": "/data/dev/Projets/Bingoloto Remote/node_modules/winston",
+ "author": {
+ "name": "Caolan McMahon"
+ },
+ "bugs": {
+ "url": "https://github.com/caolan/async/issues"
+ },
+ "bundleDependencies": false,
+ "deprecated": false,
+ "description": "Higher-order functions and common patterns for asynchronous code",
+ "devDependencies": {
+ "benchmark": "~1.0.0",
+ "jshint": "~2.7.0",
+ "lodash": ">=2.4.1",
+ "mkdirp": "~0.5.1",
+ "nodeunit": ">0.0.0",
+ "uglify-js": "1.2.x"
+ },
+ "homepage": "https://github.com/caolan/async#readme",
+ "jam": {
+ "main": "lib/async.js",
+ "include": [
+ "lib/async.js",
+ "README.md",
+ "LICENSE"
+ ],
+ "categories": [
+ "Utilities"
+ ]
+ },
+ "keywords": [
+ "async",
+ "callback",
+ "utility",
+ "module"
+ ],
+ "license": "MIT",
+ "main": "lib/async.js",
+ "name": "async",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/caolan/async.git"
+ },
+ "scripts": {
+ "lint": "jshint lib/*.js test/*.js perf/*.js",
+ "test": "npm run-script lint && nodeunit test/test-async.js"
+ },
+ "spm": {
+ "main": "lib/async.js"
+ },
+ "version": "1.0.0",
+ "volo": {
+ "main": "lib/async.js",
+ "ignore": [
+ "**/.*",
+ "node_modules",
+ "bower_components",
+ "test",
+ "tests"
+ ]
+ }
+}
diff --git a/node_modules/winston/node_modules/async/support/sync-package-managers.js b/node_modules/winston/node_modules/async/support/sync-package-managers.js
new file mode 100644
index 0000000..5b26119
--- /dev/null
+++ b/node_modules/winston/node_modules/async/support/sync-package-managers.js
@@ -0,0 +1,53 @@
+#!/usr/bin/env node
+
+// This should probably be its own module but complaints about bower/etc.
+// support keep coming up and I'd rather just enable the workflow here for now
+// and figure out where this should live later. -- @beaugunderson
+
+var fs = require('fs');
+var _ = require('lodash');
+
+var packageJson = require('../package.json');
+
+var IGNORES = ['**/.*', 'node_modules', 'bower_components', 'test', 'tests'];
+var INCLUDES = ['lib/async.js', 'README.md', 'LICENSE'];
+var REPOSITORY_NAME = 'caolan/async';
+
+packageJson.jam = {
+ main: packageJson.main,
+ include: INCLUDES,
+ categories: ['Utilities']
+};
+
+packageJson.spm = {
+ main: packageJson.main
+};
+
+packageJson.volo = {
+ main: packageJson.main,
+ ignore: IGNORES
+};
+
+var bowerSpecific = {
+ moduleType: ['amd', 'globals', 'node'],
+ ignore: IGNORES,
+ authors: [packageJson.author]
+};
+
+var bowerInclude = ['name', 'description', 'version', 'main', 'keywords',
+ 'license', 'homepage', 'repository', 'devDependencies'];
+
+var componentSpecific = {
+ repository: REPOSITORY_NAME,
+ scripts: [packageJson.main]
+};
+
+var componentInclude = ['name', 'description', 'version', 'keywords',
+ 'license', 'main'];
+
+var bowerJson = _.merge({}, _.pick(packageJson, bowerInclude), bowerSpecific);
+var componentJson = _.merge({}, _.pick(packageJson, componentInclude), componentSpecific);
+
+fs.writeFileSync('./bower.json', JSON.stringify(bowerJson, null, 2));
+fs.writeFileSync('./component.json', JSON.stringify(componentJson, null, 2));
+fs.writeFileSync('./package.json', JSON.stringify(packageJson, null, 2));
diff --git a/node_modules/winston/node_modules/colors/.travis.yml b/node_modules/winston/node_modules/colors/.travis.yml
new file mode 100644
index 0000000..ec43125
--- /dev/null
+++ b/node_modules/winston/node_modules/colors/.travis.yml
@@ -0,0 +1,6 @@
+language: node_js
+node_js:
+ - "0.11"
+ - "0.10"
+ - "0.8"
+ - "0.6" \ No newline at end of file
diff --git a/node_modules/winston/node_modules/colors/MIT-LICENSE.txt b/node_modules/winston/node_modules/colors/MIT-LICENSE.txt
new file mode 100644
index 0000000..3de4e33
--- /dev/null
+++ b/node_modules/winston/node_modules/colors/MIT-LICENSE.txt
@@ -0,0 +1,23 @@
+Original Library
+ - Copyright (c) Marak Squires
+
+Additional Functionality
+ - Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE. \ No newline at end of file
diff --git a/node_modules/winston/node_modules/colors/ReadMe.md b/node_modules/winston/node_modules/colors/ReadMe.md
new file mode 100644
index 0000000..beb5b14
--- /dev/null
+++ b/node_modules/winston/node_modules/colors/ReadMe.md
@@ -0,0 +1,167 @@
+# colors.js
+
+## get color and style in your node.js console
+
+<img src="https://github.com/Marak/colors.js/raw/master/screenshots/colors.png"/>
+
+## Installation
+
+ npm install colors
+
+## colors and styles!
+
+### text colors
+
+ - black
+ - red
+ - green
+ - yellow
+ - blue
+ - magenta
+ - cyan
+ - white
+ - gray
+ - grey
+
+### background colors
+
+
+
+ - bgBlack
+ - bgRed
+ - bgGreen
+ - bgYellow
+ - bgBlue
+ - bgMagenta
+ - bgCyan
+ - bgWhite
+
+### styles
+
+ - reset
+ - bold
+ - dim
+ - italic
+ - underline
+ - inverse
+ - hidden
+ - strikethrough
+
+### extras
+
+ - rainbow
+ - zebra
+ - america
+ - trap
+ - random
+
+
+## Usage
+
+By popular demand, `colors` now ships with two types of usages!
+
+The super nifty way
+
+```js
+var colors = require('colors');
+
+console.log('hello'.green); // outputs green text
+console.log('i like cake and pies'.underline.red) // outputs red underlined text
+console.log('inverse the color'.inverse); // inverses the color
+console.log('OMG Rainbows!'.rainbow); // rainbow
+console.log('Run the trap'.trap); // Drops the bass
+
+```
+
+or a slightly less nifty way which doesn't extend `String.prototype`
+
+```js
+var colors = require('colors/safe');
+
+console.log(colors.green('hello')); // outputs green text
+console.log(colors.red.underline('i like cake and pies')) // outputs red underlined text
+console.log(colors.inverse('inverse the color')); // inverses the color
+console.log(colors.rainbow('OMG Rainbows!')); // rainbow
+console.log(colors.trap('Run the trap')); // Drops the bass
+
+```
+
+I prefer the first way. Some people seem to be afraid of extending `String.prototype` and prefer the second way.
+
+If you are writing good code you will never have an issue with the first approach. If you really don't want to touch `String.prototype`, the second usage will not touch `String` native object.
+
+## Disabling Colors
+
+To disable colors you can pass the following arguments in the command line to your application:
+
+```bash
+node myapp.js --no-color
+```
+
+## Console.log [string substitution](http://nodejs.org/docs/latest/api/console.html#console_console_log_data)
+
+```js
+var name = 'Marak';
+console.log(colors.green('Hello %s'), name);
+// outputs -> 'Hello Marak'
+```
+
+## Custom themes
+
+### Using standard API
+
+```js
+
+var colors = require('colors');
+
+colors.setTheme({
+ silly: 'rainbow',
+ input: 'grey',
+ verbose: 'cyan',
+ prompt: 'grey',
+ info: 'green',
+ data: 'grey',
+ help: 'cyan',
+ warn: 'yellow',
+ debug: 'blue',
+ error: 'red'
+});
+
+// outputs red text
+console.log("this is an error".error);
+
+// outputs yellow text
+console.log("this is a warning".warn);
+```
+
+### Using string safe API
+
+```js
+var colors = require('colors/safe');
+
+// set single property
+var error = colors.red;
+error('this is red');
+
+// set theme
+colors.setTheme({
+ silly: 'rainbow',
+ input: 'grey',
+ verbose: 'cyan',
+ prompt: 'grey',
+ info: 'green',
+ data: 'grey',
+ help: 'cyan',
+ warn: 'yellow',
+ debug: 'blue',
+ error: 'red'
+});
+
+// outputs red text
+console.log(colors.error("this is an error"));
+
+// outputs yellow text
+console.log(colors.warn("this is a warning"));
+```
+
+*Protip: There is a secret undocumented style in `colors`. If you find the style you can summon him.* \ No newline at end of file
diff --git a/node_modules/winston/node_modules/colors/examples/normal-usage.js b/node_modules/winston/node_modules/colors/examples/normal-usage.js
new file mode 100644
index 0000000..2818741
--- /dev/null
+++ b/node_modules/winston/node_modules/colors/examples/normal-usage.js
@@ -0,0 +1,74 @@
+var colors = require('../lib/index');
+
+console.log("First some yellow text".yellow);
+
+console.log("Underline that text".yellow.underline);
+
+console.log("Make it bold and red".red.bold);
+
+console.log(("Double Raindows All Day Long").rainbow)
+
+console.log("Drop the bass".trap)
+
+console.log("DROP THE RAINBOW BASS".trap.rainbow)
+
+
+console.log('Chains are also cool.'.bold.italic.underline.red); // styles not widely supported
+
+console.log('So '.green + 'are'.underline + ' ' + 'inverse'.inverse + ' styles! '.yellow.bold); // styles not widely supported
+console.log("Zebras are so fun!".zebra);
+
+//
+// Remark: .strikethrough may not work with Mac OS Terminal App
+//
+console.log("This is " + "not".strikethrough + " fun.");
+
+console.log('Background color attack!'.black.bgWhite)
+console.log('Use random styles on everything!'.random)
+console.log('America, Heck Yeah!'.america)
+
+
+console.log('Setting themes is useful')
+
+//
+// Custom themes
+//
+console.log('Generic logging theme as JSON'.green.bold.underline);
+// Load theme with JSON literal
+colors.setTheme({
+ silly: 'rainbow',
+ input: 'grey',
+ verbose: 'cyan',
+ prompt: 'grey',
+ info: 'green',
+ data: 'grey',
+ help: 'cyan',
+ warn: 'yellow',
+ debug: 'blue',
+ error: 'red'
+});
+
+// outputs red text
+console.log("this is an error".error);
+
+// outputs yellow text
+console.log("this is a warning".warn);
+
+// outputs grey text
+console.log("this is an input".input);
+
+console.log('Generic logging theme as file'.green.bold.underline);
+
+// Load a theme from file
+colors.setTheme(__dirname + '/../themes/generic-logging.js');
+
+// outputs red text
+console.log("this is an error".error);
+
+// outputs yellow text
+console.log("this is a warning".warn);
+
+// outputs grey text
+console.log("this is an input".input);
+
+//console.log("Don't summon".zalgo) \ No newline at end of file
diff --git a/node_modules/winston/node_modules/colors/examples/safe-string.js b/node_modules/winston/node_modules/colors/examples/safe-string.js
new file mode 100644
index 0000000..111b363
--- /dev/null
+++ b/node_modules/winston/node_modules/colors/examples/safe-string.js
@@ -0,0 +1,76 @@
+var colors = require('../safe');
+
+console.log(colors.yellow("First some yellow text"));
+
+console.log(colors.yellow.underline("Underline that text"));
+
+console.log(colors.red.bold("Make it bold and red"));
+
+console.log(colors.rainbow("Double Raindows All Day Long"))
+
+console.log(colors.trap("Drop the bass"))
+
+console.log(colors.rainbow(colors.trap("DROP THE RAINBOW BASS")));
+
+console.log(colors.bold.italic.underline.red('Chains are also cool.')); // styles not widely supported
+
+
+console.log(colors.green('So ') + colors.underline('are') + ' ' + colors.inverse('inverse') + colors.yellow.bold(' styles! ')); // styles not widely supported
+
+console.log(colors.zebra("Zebras are so fun!"));
+
+console.log("This is " + colors.strikethrough("not") + " fun.");
+
+
+console.log(colors.black.bgWhite('Background color attack!'));
+console.log(colors.random('Use random styles on everything!'))
+console.log(colors.america('America, Heck Yeah!'));
+
+console.log('Setting themes is useful')
+
+//
+// Custom themes
+//
+//console.log('Generic logging theme as JSON'.green.bold.underline);
+// Load theme with JSON literal
+colors.setTheme({
+ silly: 'rainbow',
+ input: 'grey',
+ verbose: 'cyan',
+ prompt: 'grey',
+ info: 'green',
+ data: 'grey',
+ help: 'cyan',
+ warn: 'yellow',
+ debug: 'blue',
+ error: 'red'
+});
+
+// outputs red text
+console.log(colors.error("this is an error"));
+
+// outputs yellow text
+console.log(colors.warn("this is a warning"));
+
+// outputs grey text
+console.log(colors.input("this is an input"));
+
+
+// console.log('Generic logging theme as file'.green.bold.underline);
+
+// Load a theme from file
+colors.setTheme(__dirname + '/../themes/generic-logging.js');
+
+// outputs red text
+console.log(colors.error("this is an error"));
+
+// outputs yellow text
+console.log(colors.warn("this is a warning"));
+
+// outputs grey text
+console.log(colors.input("this is an input"));
+
+// console.log(colors.zalgo("Don't summon him"))
+
+
+
diff --git a/node_modules/winston/node_modules/colors/lib/colors.js b/node_modules/winston/node_modules/colors/lib/colors.js
new file mode 100644
index 0000000..59898de
--- /dev/null
+++ b/node_modules/winston/node_modules/colors/lib/colors.js
@@ -0,0 +1,176 @@
+/*
+
+The MIT License (MIT)
+
+Original Library
+ - Copyright (c) Marak Squires
+
+Additional functionality
+ - Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+*/
+
+var colors = {};
+module['exports'] = colors;
+
+colors.themes = {};
+
+var ansiStyles = colors.styles = require('./styles');
+var defineProps = Object.defineProperties;
+
+colors.supportsColor = require('./system/supports-colors');
+
+if (typeof colors.enabled === "undefined") {
+ colors.enabled = colors.supportsColor;
+}
+
+colors.stripColors = colors.strip = function(str){
+ return ("" + str).replace(/\x1B\[\d+m/g, '');
+};
+
+
+var stylize = colors.stylize = function stylize (str, style) {
+ return ansiStyles[style].open + str + ansiStyles[style].close;
+}
+
+var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g;
+var escapeStringRegexp = function (str) {
+ if (typeof str !== 'string') {
+ throw new TypeError('Expected a string');
+ }
+ return str.replace(matchOperatorsRe, '\\$&');
+}
+
+function build(_styles) {
+ var builder = function builder() {
+ return applyStyle.apply(builder, arguments);
+ };
+ builder._styles = _styles;
+ // __proto__ is used because we must return a function, but there is
+ // no way to create a function with a different prototype.
+ builder.__proto__ = proto;
+ return builder;
+}
+
+var styles = (function () {
+ var ret = {};
+ ansiStyles.grey = ansiStyles.gray;
+ Object.keys(ansiStyles).forEach(function (key) {
+ ansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g');
+ ret[key] = {
+ get: function () {
+ return build(this._styles.concat(key));
+ }
+ };
+ });
+ return ret;
+})();
+
+var proto = defineProps(function colors() {}, styles);
+
+function applyStyle() {
+ var args = arguments;
+ var argsLen = args.length;
+ var str = argsLen !== 0 && String(arguments[0]);
+ if (argsLen > 1) {
+ for (var a = 1; a < argsLen; a++) {
+ str += ' ' + args[a];
+ }
+ }
+
+ if (!colors.enabled || !str) {
+ return str;
+ }
+
+ var nestedStyles = this._styles;
+
+ var i = nestedStyles.length;
+ while (i--) {
+ var code = ansiStyles[nestedStyles[i]];
+ str = code.open + str.replace(code.closeRe, code.open) + code.close;
+ }
+
+ return str;
+}
+
+function applyTheme (theme) {
+ for (var style in theme) {
+ (function(style){
+ colors[style] = function(str){
+ return colors[theme[style]](str);
+ };
+ })(style)
+ }
+}
+
+colors.setTheme = function (theme) {
+ if (typeof theme === 'string') {
+ try {
+ colors.themes[theme] = require(theme);
+ applyTheme(colors.themes[theme]);
+ return colors.themes[theme];
+ } catch (err) {
+ console.log(err);
+ return err;
+ }
+ } else {
+ applyTheme(theme);
+ }
+};
+
+function init() {
+ var ret = {};
+ Object.keys(styles).forEach(function (name) {
+ ret[name] = {
+ get: function () {
+ return build([name]);
+ }
+ };
+ });
+ return ret;
+}
+
+var sequencer = function sequencer (map, str) {
+ var exploded = str.split(""), i = 0;
+ exploded = exploded.map(map);
+ return exploded.join("");
+};
+
+// custom formatter methods
+colors.trap = require('./custom/trap');
+colors.zalgo = require('./custom/zalgo');
+
+// maps
+colors.maps = {};
+colors.maps.america = require('./maps/america');
+colors.maps.zebra = require('./maps/zebra');
+colors.maps.rainbow = require('./maps/rainbow');
+colors.maps.random = require('./maps/random')
+
+for (var map in colors.maps) {
+ (function(map){
+ colors[map] = function (str) {
+ return sequencer(colors.maps[map], str);
+ }
+ })(map)
+}
+
+defineProps(colors, init()); \ No newline at end of file
diff --git a/node_modules/winston/node_modules/colors/lib/custom/trap.js b/node_modules/winston/node_modules/colors/lib/custom/trap.js
new file mode 100644
index 0000000..3f09143
--- /dev/null
+++ b/node_modules/winston/node_modules/colors/lib/custom/trap.js
@@ -0,0 +1,45 @@
+module['exports'] = function runTheTrap (text, options) {
+ var result = "";
+ text = text || "Run the trap, drop the bass";
+ text = text.split('');
+ var trap = {
+ a: ["\u0040", "\u0104", "\u023a", "\u0245", "\u0394", "\u039b", "\u0414"],
+ b: ["\u00df", "\u0181", "\u0243", "\u026e", "\u03b2", "\u0e3f"],
+ c: ["\u00a9", "\u023b", "\u03fe"],
+ d: ["\u00d0", "\u018a", "\u0500" , "\u0501" ,"\u0502", "\u0503"],
+ e: ["\u00cb", "\u0115", "\u018e", "\u0258", "\u03a3", "\u03be", "\u04bc", "\u0a6c"],
+ f: ["\u04fa"],
+ g: ["\u0262"],
+ h: ["\u0126", "\u0195", "\u04a2", "\u04ba", "\u04c7", "\u050a"],
+ i: ["\u0f0f"],
+ j: ["\u0134"],
+ k: ["\u0138", "\u04a0", "\u04c3", "\u051e"],
+ l: ["\u0139"],
+ m: ["\u028d", "\u04cd", "\u04ce", "\u0520", "\u0521", "\u0d69"],
+ n: ["\u00d1", "\u014b", "\u019d", "\u0376", "\u03a0", "\u048a"],
+ o: ["\u00d8", "\u00f5", "\u00f8", "\u01fe", "\u0298", "\u047a", "\u05dd", "\u06dd", "\u0e4f"],
+ p: ["\u01f7", "\u048e"],
+ q: ["\u09cd"],
+ r: ["\u00ae", "\u01a6", "\u0210", "\u024c", "\u0280", "\u042f"],
+ s: ["\u00a7", "\u03de", "\u03df", "\u03e8"],
+ t: ["\u0141", "\u0166", "\u0373"],
+ u: ["\u01b1", "\u054d"],
+ v: ["\u05d8"],
+ w: ["\u0428", "\u0460", "\u047c", "\u0d70"],
+ x: ["\u04b2", "\u04fe", "\u04fc", "\u04fd"],
+ y: ["\u00a5", "\u04b0", "\u04cb"],
+ z: ["\u01b5", "\u0240"]
+ }
+ text.forEach(function(c){
+ c = c.toLowerCase();
+ var chars = trap[c] || [" "];
+ var rand = Math.floor(Math.random() * chars.length);
+ if (typeof trap[c] !== "undefined") {
+ result += trap[c][rand];
+ } else {
+ result += c;
+ }
+ });
+ return result;
+
+}
diff --git a/node_modules/winston/node_modules/colors/lib/custom/zalgo.js b/node_modules/winston/node_modules/colors/lib/custom/zalgo.js
new file mode 100644
index 0000000..4dc20c8
--- /dev/null
+++ b/node_modules/winston/node_modules/colors/lib/custom/zalgo.js
@@ -0,0 +1,104 @@
+// please no
+module['exports'] = function zalgo(text, options) {
+ text = text || " he is here ";
+ var soul = {
+ "up" : [
+ '̍', '̎', '̄', '̅',
+ '̿', '̑', '̆', '̐',
+ '͒', '͗', '͑', '̇',
+ '̈', '̊', '͂', '̓',
+ '̈', '͊', '͋', '͌',
+ '̃', '̂', '̌', '͐',
+ '̀', '́', '̋', '̏',
+ '̒', '̓', '̔', '̽',
+ '̉', 'ͣ', 'ͤ', 'ͥ',
+ 'ͦ', 'ͧ', 'ͨ', 'ͩ',
+ 'ͪ', 'ͫ', 'ͬ', 'ͭ',
+ 'ͮ', 'ͯ', '̾', '͛',
+ '͆', '̚'
+ ],
+ "down" : [
+ '̖', '̗', '̘', '̙',
+ '̜', '̝', '̞', '̟',
+ '̠', '̤', '̥', '̦',
+ '̩', '̪', '̫', '̬',
+ '̭', '̮', '̯', '̰',
+ '̱', '̲', '̳', '̹',
+ '̺', '̻', '̼', 'ͅ',
+ '͇', '͈', '͉', '͍',
+ '͎', '͓', '͔', '͕',
+ '͖', '͙', '͚', '̣'
+ ],
+ "mid" : [
+ '̕', '̛', '̀', '́',
+ '͘', '̡', '̢', '̧',
+ '̨', '̴', '̵', '̶',
+ '͜', '͝', '͞',
+ '͟', '͠', '͢', '̸',
+ '̷', '͡', ' ҉'
+ ]
+ },
+ all = [].concat(soul.up, soul.down, soul.mid),
+ zalgo = {};
+
+ function randomNumber(range) {
+ var r = Math.floor(Math.random() * range);
+ return r;
+ }
+
+ function is_char(character) {
+ var bool = false;
+ all.filter(function (i) {
+ bool = (i === character);
+ });
+ return bool;
+ }
+
+
+ function heComes(text, options) {
+ var result = '', counts, l;
+ options = options || {};
+ options["up"] = options["up"] || true;
+ options["mid"] = options["mid"] || true;
+ options["down"] = options["down"] || true;
+ options["size"] = options["size"] || "maxi";
+ text = text.split('');
+ for (l in text) {
+ if (is_char(l)) {
+ continue;
+ }
+ result = result + text[l];
+ counts = {"up" : 0, "down" : 0, "mid" : 0};
+ switch (options.size) {
+ case 'mini':
+ counts.up = randomNumber(8);
+ counts.min = randomNumber(2);
+ counts.down = randomNumber(8);
+ break;
+ case 'maxi':
+ counts.up = randomNumber(16) + 3;
+ counts.min = randomNumber(4) + 1;
+ counts.down = randomNumber(64) + 3;
+ break;
+ default:
+ counts.up = randomNumber(8) + 1;
+ counts.mid = randomNumber(6) / 2;
+ counts.down = randomNumber(8) + 1;
+ break;
+ }
+
+ var arr = ["up", "mid", "down"];
+ for (var d in arr) {
+ var index = arr[d];
+ for (var i = 0 ; i <= counts[index]; i++) {
+ if (options[index]) {
+ result = result + soul[index][randomNumber(soul[index].length)];
+ }
+ }
+ }
+ }
+ return result;
+ }
+ // don't summon him
+ return heComes(text);
+}
diff --git a/node_modules/winston/node_modules/colors/lib/extendStringPrototype.js b/node_modules/winston/node_modules/colors/lib/extendStringPrototype.js
new file mode 100644
index 0000000..b6b5b03
--- /dev/null
+++ b/node_modules/winston/node_modules/colors/lib/extendStringPrototype.js
@@ -0,0 +1,118 @@
+var colors = require('./colors'),
+ styles = require('./styles');
+
+module['exports'] = function () {
+
+ //
+ // Extends prototype of native string object to allow for "foo".red syntax
+ //
+ var addProperty = function (color, func) {
+ String.prototype.__defineGetter__(color, func);
+ };
+
+ var sequencer = function sequencer (map, str) {
+ return function () {
+ var exploded = this.split(""), i = 0;
+ exploded = exploded.map(map);
+ return exploded.join("");
+ }
+ };
+
+ var stylize = function stylize (str, style) {
+ return styles[style].open + str + styles[style].close;
+ }
+
+ addProperty('strip', function () {
+ return colors.strip(this);
+ });
+
+ addProperty('stripColors', function () {
+ return colors.strip(this);
+ });
+
+ addProperty("trap", function(){
+ return colors.trap(this);
+ });
+
+ addProperty("zalgo", function(){
+ return colors.zalgo(this);
+ });
+
+ addProperty("zebra", function(){
+ return colors.zebra(this);
+ });
+
+ addProperty("rainbow", function(){
+ return colors.rainbow(this);
+ });
+
+ addProperty("random", function(){
+ return colors.random(this);
+ });
+
+ addProperty("america", function(){
+ return colors.america(this);
+ });
+
+ //
+ // Iterate through all default styles and colors
+ //
+ var x = Object.keys(colors.styles);
+ x.forEach(function (style) {
+ addProperty(style, function () {
+ return stylize(this, style);
+ });
+ });
+
+ function applyTheme(theme) {
+ //
+ // Remark: This is a list of methods that exist
+ // on String that you should not overwrite.
+ //
+ var stringPrototypeBlacklist = [
+ '__defineGetter__', '__defineSetter__', '__lookupGetter__', '__lookupSetter__', 'charAt', 'constructor',
+ 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable', 'toLocaleString', 'toString', 'valueOf', 'charCodeAt',
+ 'indexOf', 'lastIndexof', 'length', 'localeCompare', 'match', 'replace', 'search', 'slice', 'split', 'substring',
+ 'toLocaleLowerCase', 'toLocaleUpperCase', 'toLowerCase', 'toUpperCase', 'trim', 'trimLeft', 'trimRight'
+ ];
+
+ Object.keys(theme).forEach(function (prop) {
+ if (stringPrototypeBlacklist.indexOf(prop) !== -1) {
+ console.log('warn: '.red + ('String.prototype' + prop).magenta + ' is probably something you don\'t want to override. Ignoring style name');
+ }
+ else {
+ if (typeof(theme[prop]) === 'string') {
+ colors[prop] = colors[theme[prop]];
+ addProperty(prop, function () {
+ return colors[theme[prop]](this);
+ });
+ }
+ else {
+ addProperty(prop, function () {
+ var ret = this;
+ for (var t = 0; t < theme[prop].length; t++) {
+ ret = exports[theme[prop][t]](ret);
+ }
+ return ret;
+ });
+ }
+ }
+ });
+ }
+
+ colors.setTheme = function (theme) {
+ if (typeof theme === 'string') {
+ try {
+ colors.themes[theme] = require(theme);
+ applyTheme(colors.themes[theme]);
+ return colors.themes[theme];
+ } catch (err) {
+ console.log(err);
+ return err;
+ }
+ } else {
+ applyTheme(theme);
+ }
+ };
+
+}; \ No newline at end of file
diff --git a/node_modules/winston/node_modules/colors/lib/index.js b/node_modules/winston/node_modules/colors/lib/index.js
new file mode 100644
index 0000000..96d2b84
--- /dev/null
+++ b/node_modules/winston/node_modules/colors/lib/index.js
@@ -0,0 +1,12 @@
+var colors = require('./colors');
+module['exports'] = colors;
+
+// Remark: By default, colors will add style properties to String.prototype
+//
+// If you don't wish to extend String.prototype you can do this instead and native String will not be touched
+//
+// var colors = require('colors/safe);
+// colors.red("foo")
+//
+//
+var extendStringPrototype = require('./extendStringPrototype')(); \ No newline at end of file
diff --git a/node_modules/winston/node_modules/colors/lib/maps/america.js b/node_modules/winston/node_modules/colors/lib/maps/america.js
new file mode 100644
index 0000000..a07d832
--- /dev/null
+++ b/node_modules/winston/node_modules/colors/lib/maps/america.js
@@ -0,0 +1,12 @@
+var colors = require('../colors');
+
+module['exports'] = (function() {
+ return function (letter, i, exploded) {
+ if(letter === " ") return letter;
+ switch(i%3) {
+ case 0: return colors.red(letter);
+ case 1: return colors.white(letter)
+ case 2: return colors.blue(letter)
+ }
+ }
+})(); \ No newline at end of file
diff --git a/node_modules/winston/node_modules/colors/lib/maps/rainbow.js b/node_modules/winston/node_modules/colors/lib/maps/rainbow.js
new file mode 100644
index 0000000..a7ce24e
--- /dev/null
+++ b/node_modules/winston/node_modules/colors/lib/maps/rainbow.js
@@ -0,0 +1,13 @@
+var colors = require('../colors');
+
+module['exports'] = (function () {
+ var rainbowColors = ['red', 'yellow', 'green', 'blue', 'magenta']; //RoY G BiV
+ return function (letter, i, exploded) {
+ if (letter === " ") {
+ return letter;
+ } else {
+ return colors[rainbowColors[i++ % rainbowColors.length]](letter);
+ }
+ };
+})();
+
diff --git a/node_modules/winston/node_modules/colors/lib/maps/random.js b/node_modules/winston/node_modules/colors/lib/maps/random.js
new file mode 100644
index 0000000..5cd101f
--- /dev/null
+++ b/node_modules/winston/node_modules/colors/lib/maps/random.js
@@ -0,0 +1,8 @@
+var colors = require('../colors');
+
+module['exports'] = (function () {
+ var available = ['underline', 'inverse', 'grey', 'yellow', 'red', 'green', 'blue', 'white', 'cyan', 'magenta'];
+ return function(letter, i, exploded) {
+ return letter === " " ? letter : colors[available[Math.round(Math.random() * (available.length - 1))]](letter);
+ };
+})(); \ No newline at end of file
diff --git a/node_modules/winston/node_modules/colors/lib/maps/zebra.js b/node_modules/winston/node_modules/colors/lib/maps/zebra.js
new file mode 100644
index 0000000..bf7dcde
--- /dev/null
+++ b/node_modules/winston/node_modules/colors/lib/maps/zebra.js
@@ -0,0 +1,5 @@
+var colors = require('../colors');
+
+module['exports'] = function (letter, i, exploded) {
+ return i % 2 === 0 ? letter : colors.inverse(letter);
+}; \ No newline at end of file
diff --git a/node_modules/winston/node_modules/colors/lib/styles.js b/node_modules/winston/node_modules/colors/lib/styles.js
new file mode 100644
index 0000000..067d590
--- /dev/null
+++ b/node_modules/winston/node_modules/colors/lib/styles.js
@@ -0,0 +1,77 @@
+/*
+The MIT License (MIT)
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+*/
+
+var styles = {};
+module['exports'] = styles;
+
+var codes = {
+ reset: [0, 0],
+
+ bold: [1, 22],
+ dim: [2, 22],
+ italic: [3, 23],
+ underline: [4, 24],
+ inverse: [7, 27],
+ hidden: [8, 28],
+ strikethrough: [9, 29],
+
+ black: [30, 39],
+ red: [31, 39],
+ green: [32, 39],
+ yellow: [33, 39],
+ blue: [34, 39],
+ magenta: [35, 39],
+ cyan: [36, 39],
+ white: [37, 39],
+ gray: [90, 39],
+ grey: [90, 39],
+
+ bgBlack: [40, 49],
+ bgRed: [41, 49],
+ bgGreen: [42, 49],
+ bgYellow: [43, 49],
+ bgBlue: [44, 49],
+ bgMagenta: [45, 49],
+ bgCyan: [46, 49],
+ bgWhite: [47, 49],
+
+ // legacy styles for colors pre v1.0.0
+ blackBG: [40, 49],
+ redBG: [41, 49],
+ greenBG: [42, 49],
+ yellowBG: [43, 49],
+ blueBG: [44, 49],
+ magentaBG: [45, 49],
+ cyanBG: [46, 49],
+ whiteBG: [47, 49]
+
+};
+
+Object.keys(codes).forEach(function (key) {
+ var val = codes[key];
+ var style = styles[key] = [];
+ style.open = '\u001b[' + val[0] + 'm';
+ style.close = '\u001b[' + val[1] + 'm';
+}); \ No newline at end of file
diff --git a/node_modules/winston/node_modules/colors/lib/system/supports-colors.js b/node_modules/winston/node_modules/colors/lib/system/supports-colors.js
new file mode 100644
index 0000000..3e008aa
--- /dev/null
+++ b/node_modules/winston/node_modules/colors/lib/system/supports-colors.js
@@ -0,0 +1,61 @@
+/*
+The MIT License (MIT)
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+*/
+
+var argv = process.argv;
+
+module.exports = (function () {
+ if (argv.indexOf('--no-color') !== -1 ||
+ argv.indexOf('--color=false') !== -1) {
+ return false;
+ }
+
+ if (argv.indexOf('--color') !== -1 ||
+ argv.indexOf('--color=true') !== -1 ||
+ argv.indexOf('--color=always') !== -1) {
+ return true;
+ }
+
+ if (process.stdout && !process.stdout.isTTY) {
+ return false;
+ }
+
+ if (process.platform === 'win32') {
+ return true;
+ }
+
+ if ('COLORTERM' in process.env) {
+ return true;
+ }
+
+ if (process.env.TERM === 'dumb') {
+ return false;
+ }
+
+ if (/^screen|^xterm|^vt100|color|ansi|cygwin|linux/i.test(process.env.TERM)) {
+ return true;
+ }
+
+ return false;
+})(); \ No newline at end of file
diff --git a/node_modules/winston/node_modules/colors/package.json b/node_modules/winston/node_modules/colors/package.json
new file mode 100644
index 0000000..61f4a07
--- /dev/null
+++ b/node_modules/winston/node_modules/colors/package.json
@@ -0,0 +1,54 @@
+{
+ "_from": "colors@1.0.x",
+ "_id": "colors@1.0.3",
+ "_inBundle": false,
+ "_integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
+ "_location": "/winston/colors",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "range",
+ "registry": true,
+ "raw": "colors@1.0.x",
+ "name": "colors",
+ "escapedName": "colors",
+ "rawSpec": "1.0.x",
+ "saveSpec": null,
+ "fetchSpec": "1.0.x"
+ },
+ "_requiredBy": [
+ "/winston"
+ ],
+ "_resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "_shasum": "0433f44d809680fdeb60ed260f1b0c262e82a40b",
+ "_spec": "colors@1.0.x",
+ "_where": "/data/dev/Projets/Bingoloto Remote/node_modules/winston",
+ "author": {
+ "name": "Marak Squires"
+ },
+ "bugs": {
+ "url": "https://github.com/Marak/colors.js/issues"
+ },
+ "bundleDependencies": false,
+ "deprecated": false,
+ "description": "get colors in your node.js console",
+ "engines": {
+ "node": ">=0.1.90"
+ },
+ "homepage": "https://github.com/Marak/colors.js",
+ "keywords": [
+ "ansi",
+ "terminal",
+ "colors"
+ ],
+ "license": "MIT",
+ "main": "./lib/index",
+ "name": "colors",
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/Marak/colors.js.git"
+ },
+ "scripts": {
+ "test": "node tests/basic-test.js && node tests/safe-test.js"
+ },
+ "version": "1.0.3"
+}
diff --git a/node_modules/winston/node_modules/colors/safe.js b/node_modules/winston/node_modules/colors/safe.js
new file mode 100644
index 0000000..a6a1f3a
--- /dev/null
+++ b/node_modules/winston/node_modules/colors/safe.js
@@ -0,0 +1,9 @@
+//
+// Remark: Requiring this file will use the "safe" colors API which will not touch String.prototype
+//
+// var colors = require('colors/safe);
+// colors.red("foo")
+//
+//
+var colors = require('./lib/colors');
+module['exports'] = colors; \ No newline at end of file
diff --git a/node_modules/winston/node_modules/colors/screenshots/colors.png b/node_modules/winston/node_modules/colors/screenshots/colors.png
new file mode 100644
index 0000000..7200a62
--- /dev/null
+++ b/node_modules/winston/node_modules/colors/screenshots/colors.png
Binary files differ
diff --git a/node_modules/winston/node_modules/colors/tests/basic-test.js b/node_modules/winston/node_modules/colors/tests/basic-test.js
new file mode 100644
index 0000000..fda8af4
--- /dev/null
+++ b/node_modules/winston/node_modules/colors/tests/basic-test.js
@@ -0,0 +1,50 @@
+var assert = require('assert'),
+ colors = require('../lib/index');
+
+var s = 'string';
+
+function a(s, code) {
+ return '\x1B[' + code.toString() + 'm' + s + '\x1B[39m';
+}
+
+function aE(s, color, code) {
+ assert.equal(s[color], a(s, code));
+ assert.equal(colors[color](s), a(s, code));
+ assert.equal(s[color], colors[color](s));
+ assert.equal(s[color].strip, s);
+ assert.equal(s[color].strip, colors.strip(s));
+}
+
+function h(s, color) {
+ return '<span style="color:' + color + ';">' + s + '</span>';
+}
+
+var stylesColors = ['white', 'black', 'blue', 'cyan', 'green', 'magenta', 'red', 'yellow'];
+var stylesAll = stylesColors.concat(['bold', 'italic', 'underline', 'inverse', 'rainbow']);
+
+colors.mode = 'console';
+assert.equal(s.bold, '\x1B[1m' + s + '\x1B[22m');
+assert.equal(s.italic, '\x1B[3m' + s + '\x1B[23m');
+assert.equal(s.underline, '\x1B[4m' + s + '\x1B[24m');
+assert.equal(s.strikethrough, '\x1B[9m' + s + '\x1B[29m');
+assert.equal(s.inverse, '\x1B[7m' + s + '\x1B[27m');
+
+assert.ok(s.rainbow);
+
+aE(s, 'white', 37);
+aE(s, 'grey', 90);
+aE(s, 'black', 30);
+aE(s, 'blue', 34);
+aE(s, 'cyan', 36);
+aE(s, 'green', 32);
+aE(s, 'magenta', 35);
+aE(s, 'red', 31);
+aE(s, 'yellow', 33);
+
+assert.equal(s, 'string');
+
+colors.setTheme({error:'red'});
+
+assert.equal(typeof("astring".red),'string');
+assert.equal(typeof("astring".error),'string');
+
diff --git a/node_modules/winston/node_modules/colors/tests/safe-test.js b/node_modules/winston/node_modules/colors/tests/safe-test.js
new file mode 100644
index 0000000..daad4f9
--- /dev/null
+++ b/node_modules/winston/node_modules/colors/tests/safe-test.js
@@ -0,0 +1,45 @@
+var assert = require('assert'),
+ colors = require('../safe');
+
+var s = 'string';
+
+function a(s, code) {
+ return '\x1B[' + code.toString() + 'm' + s + '\x1B[39m';
+}
+
+function aE(s, color, code) {
+ assert.equal(colors[color](s), a(s, code));
+ assert.equal(colors.strip(s), s);
+}
+
+function h(s, color) {
+ return '<span style="color:' + color + ';">' + s + '</span>';
+}
+
+var stylesColors = ['white', 'black', 'blue', 'cyan', 'green', 'magenta', 'red', 'yellow'];
+var stylesAll = stylesColors.concat(['bold', 'italic', 'underline', 'inverse', 'rainbow']);
+
+colors.mode = 'console';
+assert.equal(colors.bold(s), '\x1B[1m' + s + '\x1B[22m');
+assert.equal(colors.italic(s), '\x1B[3m' + s + '\x1B[23m');
+assert.equal(colors.underline(s), '\x1B[4m' + s + '\x1B[24m');
+assert.equal(colors.strikethrough(s), '\x1B[9m' + s + '\x1B[29m');
+assert.equal(colors.inverse(s), '\x1B[7m' + s + '\x1B[27m');
+
+assert.ok(colors.rainbow);
+
+aE(s, 'white', 37);
+aE(s, 'grey', 90);
+aE(s, 'black', 30);
+aE(s, 'blue', 34);
+aE(s, 'cyan', 36);
+aE(s, 'green', 32);
+aE(s, 'magenta', 35);
+aE(s, 'red', 31);
+aE(s, 'yellow', 33);
+
+assert.equal(s, 'string');
+colors.setTheme({error:'red'});
+
+assert.equal(typeof(colors.red("astring")), 'string');
+assert.equal(typeof(colors.error("astring")), 'string'); \ No newline at end of file
diff --git a/node_modules/winston/node_modules/colors/themes/generic-logging.js b/node_modules/winston/node_modules/colors/themes/generic-logging.js
new file mode 100644
index 0000000..571972c
--- /dev/null
+++ b/node_modules/winston/node_modules/colors/themes/generic-logging.js
@@ -0,0 +1,12 @@
+module['exports'] = {
+ silly: 'rainbow',
+ input: 'grey',
+ verbose: 'cyan',
+ prompt: 'grey',
+ info: 'green',
+ data: 'grey',
+ help: 'cyan',
+ warn: 'yellow',
+ debug: 'blue',
+ error: 'red'
+}; \ No newline at end of file
diff --git a/node_modules/winston/node_modules/pkginfo/.npmignore b/node_modules/winston/node_modules/pkginfo/.npmignore
new file mode 100644
index 0000000..9303c34
--- /dev/null
+++ b/node_modules/winston/node_modules/pkginfo/.npmignore
@@ -0,0 +1,2 @@
+node_modules/
+npm-debug.log \ No newline at end of file
diff --git a/node_modules/winston/node_modules/pkginfo/LICENSE b/node_modules/winston/node_modules/pkginfo/LICENSE
new file mode 100644
index 0000000..ed4a4e7
--- /dev/null
+++ b/node_modules/winston/node_modules/pkginfo/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2010 Charlie Robbins.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE. \ No newline at end of file
diff --git a/node_modules/winston/node_modules/pkginfo/README.md b/node_modules/winston/node_modules/pkginfo/README.md
new file mode 100644
index 0000000..7a363bf
--- /dev/null
+++ b/node_modules/winston/node_modules/pkginfo/README.md
@@ -0,0 +1,86 @@
+# node-pkginfo
+
+An easy way to expose properties on a module from a package.json
+
+## Installation
+
+### Installing npm (node package manager)
+```
+ curl http://npmjs.org/install.sh | sh
+```
+
+### Installing pkginfo
+```
+ [sudo] npm install pkginfo
+```
+
+## Motivation
+How often when writing node.js modules have you written the following line(s) of code?
+
+* Hard code your version string into your code
+
+``` js
+ exports.version = '0.1.0';
+```
+
+* Programmatically expose the version from the package.json
+
+``` js
+ exports.version = require('/path/to/package.json').version;
+```
+
+In other words, how often have you wanted to expose basic information from your package.json onto your module programmatically? **WELL NOW YOU CAN!**
+
+## Usage
+
+Using `pkginfo` is idiot-proof, just require and invoke it.
+
+``` js
+ var pkginfo = require('pkginfo')(module);
+
+ console.dir(module.exports);
+```
+
+By invoking the `pkginfo` module all of the properties in your `package.json` file will be automatically exposed on the callee module (i.e. the parent module of `pkginfo`).
+
+Here's a sample of the output:
+
+```
+ { name: 'simple-app',
+ description: 'A test fixture for pkginfo',
+ version: '0.1.0',
+ author: 'Charlie Robbins <charlie.robbins@gmail.com>',
+ keywords: [ 'test', 'fixture' ],
+ main: './index.js',
+ scripts: { test: 'vows test/*-test.js --spec' },
+ engines: { node: '>= 0.4.0' } }
+```
+
+### Expose specific properties
+If you don't want to expose **all** properties on from your `package.json` on your module then simple pass those properties to the `pkginfo` function:
+
+``` js
+ var pkginfo = require('pkginfo')(module, 'version', 'author');
+
+ console.dir(module.exports);
+```
+
+```
+ { version: '0.1.0',
+ author: 'Charlie Robbins <charlie.robbins@gmail.com>' }
+```
+
+If you're looking for further usage see the [examples][0] included in this repository.
+
+## Run Tests
+Tests are written in [vows][1] and give complete coverage of all APIs.
+
+```
+ vows test/*-test.js --spec
+```
+
+[0]: https://github.com/indexzero/node-pkginfo/tree/master/examples
+[1]: http://vowsjs.org
+
+#### Author: [Charlie Robbins](http://nodejitsu.com)
+#### License: MIT
diff --git a/node_modules/winston/node_modules/pkginfo/docs/docco.css b/node_modules/winston/node_modules/pkginfo/docs/docco.css
new file mode 100644
index 0000000..bd54134
--- /dev/null
+++ b/node_modules/winston/node_modules/pkginfo/docs/docco.css
@@ -0,0 +1,194 @@
+/*--------------------- Layout and Typography ----------------------------*/
+body {
+ font-family: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif;
+ font-size: 15px;
+ line-height: 22px;
+ color: #252519;
+ margin: 0; padding: 0;
+}
+a {
+ color: #261a3b;
+}
+ a:visited {
+ color: #261a3b;
+ }
+p {
+ margin: 0 0 15px 0;
+}
+h4, h5, h6 {
+ color: #333;
+ margin: 6px 0 6px 0;
+ font-size: 13px;
+}
+ h2, h3 {
+ margin-bottom: 0;
+ color: #000;
+ }
+ h1 {
+ margin-top: 40px;
+ margin-bottom: 15px;
+ color: #000;
+ }
+#container {
+ position: relative;
+}
+#background {
+ position: fixed;
+ top: 0; left: 525px; right: 0; bottom: 0;
+ background: #f5f5ff;
+ border-left: 1px solid #e5e5ee;
+ z-index: -1;
+}
+#jump_to, #jump_page {
+ background: white;
+ -webkit-box-shadow: 0 0 25px #777; -moz-box-shadow: 0 0 25px #777;
+ -webkit-border-bottom-left-radius: 5px; -moz-border-radius-bottomleft: 5px;
+ font: 10px Arial;
+ text-transform: uppercase;
+ cursor: pointer;
+ text-align: right;
+}
+#jump_to, #jump_wrapper {
+ position: fixed;
+ right: 0; top: 0;
+ padding: 5px 10px;
+}
+ #jump_wrapper {
+ padding: 0;
+ display: none;
+ }
+ #jump_to:hover #jump_wrapper {
+ display: block;
+ }
+ #jump_page {
+ padding: 5px 0 3px;
+ margin: 0 0 25px 25px;
+ }
+ #jump_page .source {
+ display: block;
+ padding: 5px 10px;
+ text-decoration: none;
+ border-top: 1px solid #eee;
+ }
+ #jump_page .source:hover {
+ background: #f5f5ff;
+ }
+ #jump_page .source:first-child {
+ }
+table td {
+ border: 0;
+ outline: 0;
+}
+ td.docs, th.docs {
+ max-width: 450px;
+ min-width: 450px;
+ min-height: 5px;
+ padding: 10px 25px 1px 50px;
+ overflow-x: hidden;
+ vertical-align: top;
+ text-align: left;
+ }
+ .docs pre {
+ margin: 15px 0 15px;
+ padding-left: 15px;
+ }
+ .docs p tt, .docs p code {
+ background: #f8f8ff;
+ border: 1px solid #dedede;
+ font-size: 12px;
+ padding: 0 0.2em;
+ }
+ .pilwrap {
+ position: relative;
+ }
+ .pilcrow {
+ font: 12px Arial;
+ text-decoration: none;
+ color: #454545;
+ position: absolute;
+ top: 3px; left: -20px;
+ padding: 1px 2px;
+ opacity: 0;
+ -webkit-transition: opacity 0.2s linear;
+ }
+ td.docs:hover .pilcrow {
+ opacity: 1;
+ }
+ td.code, th.code {
+ padding: 14px 15px 16px 25px;
+ width: 100%;
+ vertical-align: top;
+ background: #f5f5ff;
+ border-left: 1px solid #e5e5ee;
+ }
+ pre, tt, code {
+ font-size: 12px; line-height: 18px;
+ font-family: Menlo, Monaco, Consolas, "Lucida Console", monospace;
+ margin: 0; padding: 0;
+ }
+
+
+/*---------------------- Syntax Highlighting -----------------------------*/
+td.linenos { background-color: #f0f0f0; padding-right: 10px; }
+span.lineno { background-color: #f0f0f0; padding: 0 5px 0 5px; }
+body .hll { background-color: #ffffcc }
+body .c { color: #408080; font-style: italic } /* Comment */
+body .err { border: 1px solid #FF0000 } /* Error */
+body .k { color: #954121 } /* Keyword */
+body .o { color: #666666 } /* Operator */
+body .cm { color: #408080; font-style: italic } /* Comment.Multiline */
+body .cp { color: #BC7A00 } /* Comment.Preproc */
+body .c1 { color: #408080; font-style: italic } /* Comment.Single */
+body .cs { color: #408080; font-style: italic } /* Comment.Special */
+body .gd { color: #A00000 } /* Generic.Deleted */
+body .ge { font-style: italic } /* Generic.Emph */
+body .gr { color: #FF0000 } /* Generic.Error */
+body .gh { color: #000080; font-weight: bold } /* Generic.Heading */
+body .gi { color: #00A000 } /* Generic.Inserted */
+body .go { color: #808080 } /* Generic.Output */
+body .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
+body .gs { font-weight: bold } /* Generic.Strong */
+body .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
+body .gt { color: #0040D0 } /* Generic.Traceback */
+body .kc { color: #954121 } /* Keyword.Constant */
+body .kd { color: #954121; font-weight: bold } /* Keyword.Declaration */
+body .kn { color: #954121; font-weight: bold } /* Keyword.Namespace */
+body .kp { color: #954121 } /* Keyword.Pseudo */
+body .kr { color: #954121; font-weight: bold } /* Keyword.Reserved */
+body .kt { color: #B00040 } /* Keyword.Type */
+body .m { color: #666666 } /* Literal.Number */
+body .s { color: #219161 } /* Literal.String */
+body .na { color: #7D9029 } /* Name.Attribute */
+body .nb { color: #954121 } /* Name.Builtin */
+body .nc { color: #0000FF; font-weight: bold } /* Name.Class */
+body .no { color: #880000 } /* Name.Constant */
+body .nd { color: #AA22FF } /* Name.Decorator */
+body .ni { color: #999999; font-weight: bold } /* Name.Entity */
+body .ne { color: #D2413A; font-weight: bold } /* Name.Exception */
+body .nf { color: #0000FF } /* Name.Function */
+body .nl { color: #A0A000 } /* Name.Label */
+body .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
+body .nt { color: #954121; font-weight: bold } /* Name.Tag */
+body .nv { color: #19469D } /* Name.Variable */
+body .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
+body .w { color: #bbbbbb } /* Text.Whitespace */
+body .mf { color: #666666 } /* Literal.Number.Float */
+body .mh { color: #666666 } /* Literal.Number.Hex */
+body .mi { color: #666666 } /* Literal.Number.Integer */
+body .mo { color: #666666 } /* Literal.Number.Oct */
+body .sb { color: #219161 } /* Literal.String.Backtick */
+body .sc { color: #219161 } /* Literal.String.Char */
+body .sd { color: #219161; font-style: italic } /* Literal.String.Doc */
+body .s2 { color: #219161 } /* Literal.String.Double */
+body .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
+body .sh { color: #219161 } /* Literal.String.Heredoc */
+body .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
+body .sx { color: #954121 } /* Literal.String.Other */
+body .sr { color: #BB6688 } /* Literal.String.Regex */
+body .s1 { color: #219161 } /* Literal.String.Single */
+body .ss { color: #19469D } /* Literal.String.Symbol */
+body .bp { color: #954121 } /* Name.Builtin.Pseudo */
+body .vc { color: #19469D } /* Name.Variable.Class */
+body .vg { color: #19469D } /* Name.Variable.Global */
+body .vi { color: #19469D } /* Name.Variable.Instance */
+body .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file
diff --git a/node_modules/winston/node_modules/pkginfo/docs/pkginfo.html b/node_modules/winston/node_modules/pkginfo/docs/pkginfo.html
new file mode 100644
index 0000000..bf615fa
--- /dev/null
+++ b/node_modules/winston/node_modules/pkginfo/docs/pkginfo.html
@@ -0,0 +1,101 @@
+<!DOCTYPE html> <html> <head> <title>pkginfo.js</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <link rel="stylesheet" media="all" href="docco.css" /> </head> <body> <div id="container"> <div id="background"></div> <table cellpadding="0" cellspacing="0"> <thead> <tr> <th class="docs"> <h1> pkginfo.js </h1> </th> <th class="code"> </th> </tr> </thead> <tbody> <tr id="section-1"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-1">&#182;</a> </div> </td> <td class="code"> <div class="highlight"><pre><span class="cm">/*</span>
+<span class="cm"> * pkginfo.js: Top-level include for the pkginfo module</span>
+<span class="cm"> *</span>
+<span class="cm"> * (C) 2011, Charlie Robbins</span>
+<span class="cm"> *</span>
+<span class="cm"> */</span>
+
+<span class="kd">var</span> <span class="nx">fs</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;fs&#39;</span><span class="p">),</span>
+ <span class="nx">path</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;path&#39;</span><span class="p">);</span></pre></div> </td> </tr> <tr id="section-2"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-2">&#182;</a> </div> <h3>function pkginfo ([options, 'property', 'property' ..])</h3>
+
+<h4>@pmodule {Module} Parent module to read from.</h4>
+
+<h4>@options {Object|Array|string} <strong>Optional</strong> Options used when exposing properties.</h4>
+
+<h4>@arguments {string...} <strong>Optional</strong> Specified properties to expose.</h4>
+
+<p>Exposes properties from the package.json file for the parent module on
+it's exports. Valid usage:</p>
+
+<p><code>require('pkginfo')()</code></p>
+
+<p><code>require('pkginfo')('version', 'author');</code></p>
+
+<p><code>require('pkginfo')(['version', 'author']);</code></p>
+
+<p><code>require('pkginfo')({ include: ['version', 'author'] });</code></p> </td> <td class="code"> <div class="highlight"><pre><span class="kd">var</span> <span class="nx">pkginfo</span> <span class="o">=</span> <span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">pmodule</span><span class="p">,</span> <span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
+ <span class="kd">var</span> <span class="nx">args</span> <span class="o">=</span> <span class="p">[].</span><span class="nx">slice</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="nx">arguments</span><span class="p">,</span> <span class="mi">2</span><span class="p">).</span><span class="nx">filter</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">arg</span><span class="p">)</span> <span class="p">{</span>
+ <span class="k">return</span> <span class="k">typeof</span> <span class="nx">arg</span> <span class="o">===</span> <span class="s1">&#39;string&#39;</span><span class="p">;</span>
+ <span class="p">});</span>
+ </pre></div> </td> </tr> <tr id="section-3"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-3">&#182;</a> </div> <p><strong>Parse variable arguments</strong></p> </td> <td class="code"> <div class="highlight"><pre> <span class="k">if</span> <span class="p">(</span><span class="nb">Array</span><span class="p">.</span><span class="nx">isArray</span><span class="p">(</span><span class="nx">options</span><span class="p">))</span> <span class="p">{</span></pre></div> </td> </tr> <tr id="section-4"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-4">&#182;</a> </div> <p>If the options passed in is an Array assume that
+it is the Array of properties to expose from the
+on the package.json file on the parent module.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">options</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">include</span><span class="o">:</span> <span class="nx">options</span> <span class="p">};</span>
+ <span class="p">}</span>
+ <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">options</span> <span class="o">===</span> <span class="s1">&#39;string&#39;</span><span class="p">)</span> <span class="p">{</span></pre></div> </td> </tr> <tr id="section-5"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-5">&#182;</a> </div> <p>Otherwise if the first argument is a string, then
+assume that it is the first property to expose from
+the package.json file on the parent module.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">options</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">include</span><span class="o">:</span> <span class="p">[</span><span class="nx">options</span><span class="p">]</span> <span class="p">};</span>
+ <span class="p">}</span>
+ </pre></div> </td> </tr> <tr id="section-6"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-6">&#182;</a> </div> <p><strong>Setup default options</strong></p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">options</span> <span class="o">=</span> <span class="nx">options</span> <span class="o">||</span> <span class="p">{</span> <span class="nx">include</span><span class="o">:</span> <span class="p">[]</span> <span class="p">};</span>
+
+ <span class="k">if</span> <span class="p">(</span><span class="nx">args</span><span class="p">.</span><span class="nx">length</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span></pre></div> </td> </tr> <tr id="section-7"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-7">&#182;</a> </div> <p>If additional string arguments have been passed in
+then add them to the properties to expose on the
+parent module. </p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">options</span><span class="p">.</span><span class="nx">include</span> <span class="o">=</span> <span class="nx">options</span><span class="p">.</span><span class="nx">include</span><span class="p">.</span><span class="nx">concat</span><span class="p">(</span><span class="nx">args</span><span class="p">);</span>
+ <span class="p">}</span>
+
+ <span class="kd">var</span> <span class="nx">pkg</span> <span class="o">=</span> <span class="nx">pkginfo</span><span class="p">.</span><span class="nx">read</span><span class="p">(</span><span class="nx">pmodule</span><span class="p">,</span> <span class="nx">options</span><span class="p">.</span><span class="nx">dir</span><span class="p">).</span><span class="kr">package</span><span class="p">;</span>
+ <span class="nb">Object</span><span class="p">.</span><span class="nx">keys</span><span class="p">(</span><span class="nx">pkg</span><span class="p">).</span><span class="nx">forEach</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">key</span><span class="p">)</span> <span class="p">{</span>
+ <span class="k">if</span> <span class="p">(</span><span class="nx">options</span><span class="p">.</span><span class="nx">include</span><span class="p">.</span><span class="nx">length</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="o">&amp;&amp;</span> <span class="o">!~</span><span class="nx">options</span><span class="p">.</span><span class="nx">include</span><span class="p">.</span><span class="nx">indexOf</span><span class="p">(</span><span class="nx">key</span><span class="p">))</span> <span class="p">{</span>
+ <span class="k">return</span><span class="p">;</span>
+ <span class="p">}</span>
+
+ <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">pmodule</span><span class="p">.</span><span class="nx">exports</span><span class="p">[</span><span class="nx">key</span><span class="p">])</span> <span class="p">{</span>
+ <span class="nx">pmodule</span><span class="p">.</span><span class="nx">exports</span><span class="p">[</span><span class="nx">key</span><span class="p">]</span> <span class="o">=</span> <span class="nx">pkg</span><span class="p">[</span><span class="nx">key</span><span class="p">];</span>
+ <span class="p">}</span>
+ <span class="p">});</span>
+
+ <span class="k">return</span> <span class="nx">pkginfo</span><span class="p">;</span>
+<span class="p">};</span></pre></div> </td> </tr> <tr id="section-8"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-8">&#182;</a> </div> <h3>function find (dir)</h3>
+
+<h4>@pmodule {Module} Parent module to read from.</h4>
+
+<h4>@dir {string} <strong>Optional</strong> Directory to start search from.</h4>
+
+<p>Searches up the directory tree from <code>dir</code> until it finds a directory
+which contains a <code>package.json</code> file. </p> </td> <td class="code"> <div class="highlight"><pre><span class="nx">pkginfo</span><span class="p">.</span><span class="nx">find</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">pmodule</span><span class="p">,</span> <span class="nx">dir</span><span class="p">)</span> <span class="p">{</span>
+ <span class="nx">dir</span> <span class="o">=</span> <span class="nx">dir</span> <span class="o">||</span> <span class="nx">pmodule</span><span class="p">.</span><span class="nx">filename</span><span class="p">;</span>
+ <span class="nx">dir</span> <span class="o">=</span> <span class="nx">path</span><span class="p">.</span><span class="nx">dirname</span><span class="p">(</span><span class="nx">dir</span><span class="p">);</span>
+
+ <span class="kd">var</span> <span class="nx">files</span> <span class="o">=</span> <span class="nx">fs</span><span class="p">.</span><span class="nx">readdirSync</span><span class="p">(</span><span class="nx">dir</span><span class="p">);</span>
+
+ <span class="k">if</span> <span class="p">(</span><span class="o">~</span><span class="nx">files</span><span class="p">.</span><span class="nx">indexOf</span><span class="p">(</span><span class="s1">&#39;package.json&#39;</span><span class="p">))</span> <span class="p">{</span>
+ <span class="k">return</span> <span class="nx">path</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="nx">dir</span><span class="p">,</span> <span class="s1">&#39;package.json&#39;</span><span class="p">);</span>
+ <span class="p">}</span>
+
+ <span class="k">if</span> <span class="p">(</span><span class="nx">dir</span> <span class="o">===</span> <span class="s1">&#39;/&#39;</span><span class="p">)</span> <span class="p">{</span>
+ <span class="k">throw</span> <span class="k">new</span> <span class="nb">Error</span><span class="p">(</span><span class="s1">&#39;Could not find package.json up from: &#39;</span> <span class="o">+</span> <span class="nx">dir</span><span class="p">);</span>
+ <span class="p">}</span>
+
+ <span class="k">return</span> <span class="nx">pkginfo</span><span class="p">.</span><span class="nx">find</span><span class="p">(</span><span class="nx">dir</span><span class="p">);</span>
+<span class="p">};</span></pre></div> </td> </tr> <tr id="section-9"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-9">&#182;</a> </div> <h3>function read (pmodule, dir)</h3>
+
+<h4>@pmodule {Module} Parent module to read from.</h4>
+
+<h4>@dir {string} <strong>Optional</strong> Directory to start search from.</h4>
+
+<p>Searches up the directory tree from <code>dir</code> until it finds a directory
+which contains a <code>package.json</code> file and returns the package information.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nx">pkginfo</span><span class="p">.</span><span class="nx">read</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">pmodule</span><span class="p">,</span> <span class="nx">dir</span><span class="p">)</span> <span class="p">{</span>
+ <span class="nx">dir</span> <span class="o">=</span> <span class="nx">pkginfo</span><span class="p">.</span><span class="nx">find</span><span class="p">(</span><span class="nx">pmodule</span><span class="p">,</span> <span class="nx">dir</span><span class="p">);</span>
+
+ <span class="kd">var</span> <span class="nx">data</span> <span class="o">=</span> <span class="nx">fs</span><span class="p">.</span><span class="nx">readFileSync</span><span class="p">(</span><span class="nx">dir</span><span class="p">).</span><span class="nx">toString</span><span class="p">();</span>
+
+ <span class="k">return</span> <span class="p">{</span>
+ <span class="nx">dir</span><span class="o">:</span> <span class="nx">dir</span><span class="p">,</span>
+ <span class="kr">package</span><span class="o">:</span> <span class="nx">JSON</span><span class="p">.</span><span class="nx">parse</span><span class="p">(</span><span class="nx">data</span><span class="p">)</span>
+ <span class="p">};</span>
+<span class="p">};</span></pre></div> </td> </tr> <tr id="section-10"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-10">&#182;</a> </div> <p>Call <code>pkginfo</code> on this module and expose version.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nx">pkginfo</span><span class="p">(</span><span class="nx">module</span><span class="p">,</span> <span class="p">{</span>
+ <span class="nx">dir</span><span class="o">:</span> <span class="nx">__dirname</span><span class="p">,</span>
+ <span class="nx">include</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;version&#39;</span><span class="p">],</span>
+ <span class="nx">target</span><span class="o">:</span> <span class="nx">pkginfo</span>
+<span class="p">});</span>
+
+</pre></div> </td> </tr> </tbody> </table> </div> </body> </html> \ No newline at end of file
diff --git a/node_modules/winston/node_modules/pkginfo/examples/all-properties.js b/node_modules/winston/node_modules/pkginfo/examples/all-properties.js
new file mode 100644
index 0000000..fd1d831
--- /dev/null
+++ b/node_modules/winston/node_modules/pkginfo/examples/all-properties.js
@@ -0,0 +1,19 @@
+/*
+ * all-properties.js: Sample of including all properties from a package.json file
+ *
+ * (C) 2011, Charlie Robbins
+ *
+ */
+
+var util = require('util'),
+ pkginfo = require('../lib/pkginfo')(module);
+
+exports.someFunction = function () {
+ console.log('some of your custom logic here');
+};
+
+console.log('Inspecting module:');
+console.dir(module.exports);
+
+console.log('\nAll exports exposed:');
+console.error(Object.keys(module.exports)); \ No newline at end of file
diff --git a/node_modules/winston/node_modules/pkginfo/examples/array-argument.js b/node_modules/winston/node_modules/pkginfo/examples/array-argument.js
new file mode 100644
index 0000000..b1b6848
--- /dev/null
+++ b/node_modules/winston/node_modules/pkginfo/examples/array-argument.js
@@ -0,0 +1,20 @@
+/*
+ * array-argument.js: Sample of including specific properties from a package.json file
+ * using Array argument syntax.
+ *
+ * (C) 2011, Charlie Robbins
+ *
+ */
+
+var util = require('util'),
+ pkginfo = require('../lib/pkginfo')(module, ['version', 'author']);
+
+exports.someFunction = function () {
+ console.log('some of your custom logic here');
+};
+
+console.log('Inspecting module:');
+console.dir(module.exports);
+
+console.log('\nAll exports exposed:');
+console.error(Object.keys(module.exports)); \ No newline at end of file
diff --git a/node_modules/winston/node_modules/pkginfo/examples/multiple-properties.js b/node_modules/winston/node_modules/pkginfo/examples/multiple-properties.js
new file mode 100644
index 0000000..b4b5fd6
--- /dev/null
+++ b/node_modules/winston/node_modules/pkginfo/examples/multiple-properties.js
@@ -0,0 +1,19 @@
+/*
+ * multiple-properties.js: Sample of including multiple properties from a package.json file
+ *
+ * (C) 2011, Charlie Robbins
+ *
+ */
+
+var util = require('util'),
+ pkginfo = require('../lib/pkginfo')(module, 'version', 'author');
+
+exports.someFunction = function () {
+ console.log('some of your custom logic here');
+};
+
+console.log('Inspecting module:');
+console.dir(module.exports);
+
+console.log('\nAll exports exposed:');
+console.error(Object.keys(module.exports)); \ No newline at end of file
diff --git a/node_modules/winston/node_modules/pkginfo/examples/object-argument.js b/node_modules/winston/node_modules/pkginfo/examples/object-argument.js
new file mode 100644
index 0000000..28420c8
--- /dev/null
+++ b/node_modules/winston/node_modules/pkginfo/examples/object-argument.js
@@ -0,0 +1,22 @@
+/*
+ * object-argument.js: Sample of including specific properties from a package.json file
+ * using Object argument syntax.
+ *
+ * (C) 2011, Charlie Robbins
+ *
+ */
+
+var util = require('util'),
+ pkginfo = require('../lib/pkginfo')(module, {
+ include: ['version', 'author']
+ });
+
+exports.someFunction = function () {
+ console.log('some of your custom logic here');
+};
+
+console.log('Inspecting module:');
+console.dir(module.exports);
+
+console.log('\nAll exports exposed:');
+console.error(Object.keys(module.exports)); \ No newline at end of file
diff --git a/node_modules/winston/node_modules/pkginfo/examples/package.json b/node_modules/winston/node_modules/pkginfo/examples/package.json
new file mode 100644
index 0000000..1f2f01c
--- /dev/null
+++ b/node_modules/winston/node_modules/pkginfo/examples/package.json
@@ -0,0 +1,10 @@
+{
+ "name": "simple-app",
+ "description": "A test fixture for pkginfo",
+ "version": "0.1.0",
+ "author": "Charlie Robbins <charlie.robbins@gmail.com>",
+ "keywords": ["test", "fixture"],
+ "main": "./index.js",
+ "scripts": { "test": "vows test/*-test.js --spec" },
+ "engines": { "node": ">= 0.4.0" }
+}
diff --git a/node_modules/winston/node_modules/pkginfo/examples/single-property.js b/node_modules/winston/node_modules/pkginfo/examples/single-property.js
new file mode 100644
index 0000000..4f44561
--- /dev/null
+++ b/node_modules/winston/node_modules/pkginfo/examples/single-property.js
@@ -0,0 +1,19 @@
+/*
+ * single-property.js: Sample of including a single specific properties from a package.json file
+ *
+ * (C) 2011, Charlie Robbins
+ *
+ */
+
+var util = require('util'),
+ pkginfo = require('../lib/pkginfo')(module, 'version');
+
+exports.someFunction = function () {
+ console.log('some of your custom logic here');
+};
+
+console.log('Inspecting module:');
+console.dir(module.exports);
+
+console.log('\nAll exports exposed:');
+console.error(Object.keys(module.exports)); \ No newline at end of file
diff --git a/node_modules/winston/node_modules/pkginfo/examples/subdir/package.json b/node_modules/winston/node_modules/pkginfo/examples/subdir/package.json
new file mode 100644
index 0000000..aa85410
--- /dev/null
+++ b/node_modules/winston/node_modules/pkginfo/examples/subdir/package.json
@@ -0,0 +1,11 @@
+{
+ "name": "simple-app-subdir",
+ "description": "A test fixture for pkginfo",
+ "version": "0.1.0",
+ "author": "Charlie Robbins <charlie.robbins@gmail.com>",
+ "keywords": ["test", "fixture"],
+ "main": "./index.js",
+ "scripts": { "test": "vows test/*-test.js --spec" },
+ "engines": { "node": ">= 0.4.0" },
+ "subdironly": "true"
+}
diff --git a/node_modules/winston/node_modules/pkginfo/examples/target-dir.js b/node_modules/winston/node_modules/pkginfo/examples/target-dir.js
new file mode 100644
index 0000000..88770e6
--- /dev/null
+++ b/node_modules/winston/node_modules/pkginfo/examples/target-dir.js
@@ -0,0 +1,20 @@
+/*
+ * multiple-properties.js: Sample of including multiple properties from a package.json file
+ *
+ * (C) 2011, Charlie Robbins
+ *
+ */
+
+var util = require('util'),
+ path = require('path'),
+ pkginfo = require('../lib/pkginfo')(module, { dir: path.resolve(__dirname, 'subdir' )});
+
+exports.someFunction = function () {
+ console.log('some of your custom logic here');
+};
+
+console.log('Inspecting module:');
+console.dir(module.exports);
+
+console.log('\nAll exports exposed:');
+console.error(Object.keys(module.exports)); \ No newline at end of file
diff --git a/node_modules/winston/node_modules/pkginfo/lib/pkginfo.js b/node_modules/winston/node_modules/pkginfo/lib/pkginfo.js
new file mode 100644
index 0000000..c5dc020
--- /dev/null
+++ b/node_modules/winston/node_modules/pkginfo/lib/pkginfo.js
@@ -0,0 +1,136 @@
+/*
+ * pkginfo.js: Top-level include for the pkginfo module
+ *
+ * (C) 2011, Charlie Robbins
+ *
+ */
+
+var fs = require('fs'),
+ path = require('path');
+
+//
+// ### function pkginfo ([options, 'property', 'property' ..])
+// #### @pmodule {Module} Parent module to read from.
+// #### @options {Object|Array|string} **Optional** Options used when exposing properties.
+// #### @arguments {string...} **Optional** Specified properties to expose.
+// Exposes properties from the package.json file for the parent module on
+// it's exports. Valid usage:
+//
+// `require('pkginfo')()`
+//
+// `require('pkginfo')('version', 'author');`
+//
+// `require('pkginfo')(['version', 'author']);`
+//
+// `require('pkginfo')({ include: ['version', 'author'] });`
+//
+var pkginfo = module.exports = function (pmodule, options) {
+ var args = [].slice.call(arguments, 2).filter(function (arg) {
+ return typeof arg === 'string';
+ });
+
+ //
+ // **Parse variable arguments**
+ //
+ if (Array.isArray(options)) {
+ //
+ // If the options passed in is an Array assume that
+ // it is the Array of properties to expose from the
+ // on the package.json file on the parent module.
+ //
+ options = { include: options };
+ }
+ else if (typeof options === 'string') {
+ //
+ // Otherwise if the first argument is a string, then
+ // assume that it is the first property to expose from
+ // the package.json file on the parent module.
+ //
+ options = { include: [options] };
+ }
+
+ //
+ // **Setup default options**
+ //
+ options = options || {};
+
+ // ensure that includes have been defined
+ options.include = options.include || [];
+
+ if (args.length > 0) {
+ //
+ // If additional string arguments have been passed in
+ // then add them to the properties to expose on the
+ // parent module.
+ //
+ options.include = options.include.concat(args);
+ }
+
+ var pkg = pkginfo.read(pmodule, options.dir).package;
+ Object.keys(pkg).forEach(function (key) {
+ if (options.include.length > 0 && !~options.include.indexOf(key)) {
+ return;
+ }
+
+ if (!pmodule.exports[key]) {
+ pmodule.exports[key] = pkg[key];
+ }
+ });
+
+ return pkginfo;
+};
+
+//
+// ### function find (dir)
+// #### @pmodule {Module} Parent module to read from.
+// #### @dir {string} **Optional** Directory to start search from.
+// Searches up the directory tree from `dir` until it finds a directory
+// which contains a `package.json` file.
+//
+pkginfo.find = function (pmodule, dir) {
+ if (! dir) {
+ dir = path.dirname(pmodule.filename);
+ }
+
+ var files = fs.readdirSync(dir);
+
+ if (~files.indexOf('package.json')) {
+ return path.join(dir, 'package.json');
+ }
+
+ if (dir === '/') {
+ throw new Error('Could not find package.json up from: ' + dir);
+ }
+ else if (!dir || dir === '.') {
+ throw new Error('Cannot find package.json from unspecified directory');
+ }
+
+ return pkginfo.find(pmodule, path.dirname(dir));
+};
+
+//
+// ### function read (pmodule, dir)
+// #### @pmodule {Module} Parent module to read from.
+// #### @dir {string} **Optional** Directory to start search from.
+// Searches up the directory tree from `dir` until it finds a directory
+// which contains a `package.json` file and returns the package information.
+//
+pkginfo.read = function (pmodule, dir) {
+ dir = pkginfo.find(pmodule, dir);
+
+ var data = fs.readFileSync(dir).toString();
+
+ return {
+ dir: dir,
+ package: JSON.parse(data)
+ };
+};
+
+//
+// Call `pkginfo` on this module and expose version.
+//
+pkginfo(module, {
+ dir: __dirname,
+ include: ['version'],
+ target: pkginfo
+}); \ No newline at end of file
diff --git a/node_modules/winston/node_modules/pkginfo/package.json b/node_modules/winston/node_modules/pkginfo/package.json
new file mode 100644
index 0000000..79ac8ce
--- /dev/null
+++ b/node_modules/winston/node_modules/pkginfo/package.json
@@ -0,0 +1,58 @@
+{
+ "_from": "pkginfo@0.3.x",
+ "_id": "pkginfo@0.3.1",
+ "_inBundle": false,
+ "_integrity": "sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE=",
+ "_location": "/winston/pkginfo",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "range",
+ "registry": true,
+ "raw": "pkginfo@0.3.x",
+ "name": "pkginfo",
+ "escapedName": "pkginfo",
+ "rawSpec": "0.3.x",
+ "saveSpec": null,
+ "fetchSpec": "0.3.x"
+ },
+ "_requiredBy": [
+ "/winston"
+ ],
+ "_resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz",
+ "_shasum": "5b29f6a81f70717142e09e765bbeab97b4f81e21",
+ "_spec": "pkginfo@0.3.x",
+ "_where": "/data/dev/Projets/Bingoloto Remote/node_modules/winston",
+ "author": {
+ "name": "Charlie Robbins",
+ "email": "charlie.robbins@gmail.com"
+ },
+ "bugs": {
+ "url": "https://github.com/indexzero/node-pkginfo/issues"
+ },
+ "bundleDependencies": false,
+ "deprecated": false,
+ "description": "An easy way to expose properties on a module from a package.json",
+ "devDependencies": {
+ "vows": "0.7.x"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
+ },
+ "homepage": "https://github.com/indexzero/node-pkginfo#readme",
+ "keywords": [
+ "info",
+ "tools",
+ "package.json"
+ ],
+ "license": "MIT",
+ "main": "./lib/pkginfo.js",
+ "name": "pkginfo",
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/indexzero/node-pkginfo.git"
+ },
+ "scripts": {
+ "test": "vows test/*-test.js --spec"
+ },
+ "version": "0.3.1"
+}
diff --git a/node_modules/winston/node_modules/pkginfo/test/pkginfo-test.js b/node_modules/winston/node_modules/pkginfo/test/pkginfo-test.js
new file mode 100644
index 0000000..a59f077
--- /dev/null
+++ b/node_modules/winston/node_modules/pkginfo/test/pkginfo-test.js
@@ -0,0 +1,83 @@
+/*
+ * pkginfo-test.js: Tests for the pkginfo module.
+ *
+ * (C) 2011, Charlie Robbins
+ *
+ */
+
+var assert = require('assert'),
+ exec = require('child_process').exec,
+ fs = require('fs'),
+ path = require('path'),
+ vows = require('vows'),
+ pkginfo = require('../lib/pkginfo');
+
+function assertProperties (source, target) {
+ assert.lengthOf(source, target.length + 1);
+ target.forEach(function (prop) {
+ assert.isTrue(!!~source.indexOf(prop));
+ });
+}
+
+function compareWithExample(targetPath) {
+ var examplePaths = ['package.json'];
+
+ if (targetPath) {
+ examplePaths.unshift(targetPath);
+ }
+
+ return function(exposed) {
+ var pkg = fs.readFileSync(path.join.apply(null, [__dirname, '..', 'examples'].concat(examplePaths))).toString(),
+ keys = Object.keys(JSON.parse(pkg));
+
+ assertProperties(exposed, keys);
+ };
+}
+
+function testExposes (options) {
+ return {
+ topic: function () {
+ exec('node ' + path.join(__dirname, '..', 'examples', options.script), this.callback);
+ },
+ "should expose that property correctly": function (err, stdout, stderr) {
+ assert.isNull(err);
+
+ var exposed = stderr.match(/'(\w+)'/ig).map(function (p) {
+ return p.substring(1, p.length - 1);
+ });
+
+ return !options.assert
+ ? assertProperties(exposed, options.properties)
+ : options.assert(exposed);
+ }
+ }
+}
+
+vows.describe('pkginfo').addBatch({
+ "When using the pkginfo module": {
+ "and passed a single `string` argument": testExposes({
+ script: 'single-property.js',
+ properties: ['version']
+ }),
+ "and passed multiple `string` arguments": testExposes({
+ script: 'multiple-properties.js',
+ properties: ['version', 'author']
+ }),
+ "and passed an `object` argument": testExposes({
+ script: 'object-argument.js',
+ properties: ['version', 'author']
+ }),
+ "and passed an `array` argument": testExposes({
+ script: 'array-argument.js',
+ properties: ['version', 'author']
+ }),
+ "and read from a specified directory": testExposes({
+ script: 'target-dir.js',
+ assert: compareWithExample('subdir')
+ }),
+ "and passed no arguments": testExposes({
+ script: 'all-properties.js',
+ assert: compareWithExample()
+ })
+ }
+}).export(module);
diff --git a/node_modules/winston/package.json b/node_modules/winston/package.json
new file mode 100644
index 0000000..39a3587
--- /dev/null
+++ b/node_modules/winston/package.json
@@ -0,0 +1,81 @@
+{
+ "_from": "winston@2.1.x",
+ "_id": "winston@2.1.1",
+ "_inBundle": false,
+ "_integrity": "sha1-PJNJ0ZYgf9G9/51LxD73JRDjoS4=",
+ "_location": "/winston",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "range",
+ "registry": true,
+ "raw": "winston@2.1.x",
+ "name": "winston",
+ "escapedName": "winston",
+ "rawSpec": "2.1.x",
+ "saveSpec": null,
+ "fetchSpec": "2.1.x"
+ },
+ "_requiredBy": [
+ "/prompt"
+ ],
+ "_resolved": "https://registry.npmjs.org/winston/-/winston-2.1.1.tgz",
+ "_shasum": "3c9349d196207fd1bdff9d4bc43ef72510e3a12e",
+ "_spec": "winston@2.1.x",
+ "_where": "/data/dev/Projets/Bingoloto Remote/node_modules/prompt",
+ "author": {
+ "name": "Charlie Robbins",
+ "email": "charlie.robbins@gmail.com"
+ },
+ "bugs": {
+ "url": "https://github.com/winstonjs/winston/issues"
+ },
+ "bundleDependencies": false,
+ "dependencies": {
+ "async": "~1.0.0",
+ "colors": "1.0.x",
+ "cycle": "1.0.x",
+ "eyes": "0.1.x",
+ "isstream": "0.1.x",
+ "pkginfo": "0.3.x",
+ "stack-trace": "0.0.x"
+ },
+ "deprecated": false,
+ "description": "A multi-transport async logging library for Node.js",
+ "devDependencies": {
+ "cross-spawn-async": "^2.0.0",
+ "hock": "1.x.x",
+ "std-mocks": "~1.0.0",
+ "vows": "0.7.x"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ },
+ "homepage": "https://github.com/winstonjs/winston#readme",
+ "keywords": [
+ "winston",
+ "logging",
+ "sysadmin",
+ "tools"
+ ],
+ "license": "MIT",
+ "main": "./lib/winston",
+ "maintainers": [
+ {
+ "name": "Jarrett Cruger",
+ "email": "jcrugzz@gmail.com"
+ },
+ {
+ "name": "Alberto Pose",
+ "email": "albertopose@gmail.com"
+ }
+ ],
+ "name": "winston",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/winstonjs/winston.git"
+ },
+ "scripts": {
+ "test": "vows --spec --isolate"
+ },
+ "version": "2.1.1"
+}
diff --git a/node_modules/winston/test/helpers.js b/node_modules/winston/test/helpers.js
new file mode 100644
index 0000000..8575fb6
--- /dev/null
+++ b/node_modules/winston/test/helpers.js
@@ -0,0 +1,256 @@
+/*
+ * helpers.js: Test helpers for winston
+ *
+ * (C) 2010 Charlie Robbins
+ * MIT LICENSE
+ *
+ */
+
+var assert = require('assert'),
+ fs = require('fs'),
+ path = require('path'),
+ spawn = require('child_process').spawn,
+ util = require('util'),
+ vows = require('vows'),
+ winston = require('../lib/winston');
+
+var helpers = exports;
+
+helpers.size = function (obj) {
+ var size = 0, key;
+ for (key in obj) {
+ if (obj.hasOwnProperty(key)) {
+ size++;
+ }
+ }
+
+ return size;
+};
+
+helpers.tryUnlink = function (file) {
+ try { fs.unlinkSync(file) }
+ catch (ex) { }
+};
+
+helpers.assertDateInfo = function (info) {
+ assert.isNumber(Date.parse(info));
+};
+
+helpers.assertProcessInfo = function (info) {
+ assert.isNumber(info.pid);
+ assert.isNumber(info.uid);
+ assert.isNumber(info.gid);
+ assert.isString(info.cwd);
+ assert.isString(info.execPath);
+ assert.isString(info.version);
+ assert.isArray(info.argv);
+ assert.isObject(info.memoryUsage);
+};
+
+helpers.assertOsInfo = function (info) {
+ assert.isArray(info.loadavg);
+ assert.isNumber(info.uptime);
+};
+
+helpers.assertTrace = function (trace) {
+ trace.forEach(function (site) {
+ assert.isTrue(!site.column || typeof site.column === 'number');
+ assert.isTrue(!site.line || typeof site.line === 'number');
+ assert.isTrue(!site.file || typeof site.file === 'string');
+ assert.isTrue(!site.method || typeof site.method === 'string');
+ assert.isTrue(!site.function || typeof site.function === 'string');
+ assert.isTrue(typeof site.native === 'boolean');
+ });
+};
+
+helpers.assertLogger = function (logger, level) {
+ assert.instanceOf(logger, winston.Logger);
+ assert.isFunction(logger.log);
+ assert.isFunction(logger.add);
+ assert.isFunction(logger.remove);
+ assert.equal(logger.level, level || "info");
+ Object.keys(logger.levels).forEach(function (method) {
+ assert.isFunction(logger[method]);
+ });
+};
+
+helpers.assertConsole = function (transport) {
+ assert.instanceOf(transport, winston.transports.Console);
+ assert.isFunction(transport.log);
+};
+
+helpers.assertMemory = function (transport) {
+ assert.instanceOf(transport, winston.transports.Memory);
+ assert.isFunction(transport.log);
+};
+
+helpers.assertFile = function (transport) {
+ assert.instanceOf(transport, winston.transports.File);
+ assert.isFunction(transport.log);
+};
+
+helpers.assertCouchdb = function (transport) {
+ assert.instanceOf(transport, winston.transports.Couchdb);
+ assert.isFunction(transport.log);
+};
+
+helpers.assertHandleExceptions = function (options) {
+ return {
+ topic: function () {
+ var that = this,
+ child = spawn('node', [options.script]);
+
+ helpers.tryUnlink(options.logfile);
+ child.on('exit', function () {
+ fs.readFile(options.logfile, that.callback);
+ });
+ },
+ "should save the error information to the specified file": function (err, data) {
+ assert.isTrue(!err);
+ data = JSON.parse(data);
+
+ assert.isObject(data);
+ helpers.assertProcessInfo(data.process);
+ helpers.assertOsInfo(data.os);
+ helpers.assertTrace(data.trace);
+ if (options.message) {
+ assert.equal('uncaughtException: ' + options.message, data.message);
+ }
+ }
+ };
+};
+
+helpers.assertFailedTransport = function (transport) {
+ return {
+ topic: function () {
+ var self = this;
+ transport.on('error', function(emitErr){
+ transport.log('error', 'test message 2', {}, function(logErr, logged){
+ self.callback(emitErr, logErr);
+ });
+ });
+ transport.log('error', 'test message');
+ },
+ "should emit an error": function (emitErr, logErr) {
+ assert.instanceOf(emitErr, Error);
+ assert.equal(emitErr.code, 'ENOENT');
+ },
+ "should enter noop failed state": function (emitErr, logErr) {
+ assert.instanceOf(logErr, Error);
+ assert.equal(transport._failures, transport.maxRetries);
+ }
+ };
+};
+
+helpers.testNpmLevels = function (transport, assertMsg, assertFn) {
+ return helpers.testLevels(winston.config.npm.levels, transport, assertMsg, assertFn);
+};
+
+helpers.testSyslogLevels = function (transport, assertMsg, assertFn) {
+ return helpers.testLevels(winston.config.syslog.levels, transport, assertMsg, assertFn);
+};
+
+helpers.testLevels = function (levels, transport, assertMsg, assertFn) {
+ var tests = {};
+
+ Object.keys(levels).forEach(function (level) {
+ var test = {
+ topic: function () {
+ transport.log(level, 'test message', {}, this.callback.bind(this, null));
+ }
+ };
+
+ test[assertMsg] = assertFn;
+ tests['with the ' + level + ' level'] = test;
+ });
+
+ var metadatatest = {
+ topic: function () {
+ transport.log('info', 'test message', { metadata: true }, this.callback.bind(this, null));
+ }
+ };
+
+ metadatatest[assertMsg] = assertFn;
+ tests['when passed metadata'] = metadatatest;
+
+ var primmetadatatest = {
+ topic: function () {
+ transport.log('info', 'test message', 'metadata', this.callback.bind(this, null));
+ }
+ };
+
+ primmetadatatest[assertMsg] = assertFn;
+ tests['when passed primitive metadata'] = primmetadatatest;
+
+ var circmetadata = { };
+ circmetadata['metadata'] = circmetadata;
+
+ var circmetadatatest = {
+ topic: function () {
+ transport.log('info', 'test message', circmetadata, this.callback.bind(this, null));
+ }
+ };
+
+ circmetadatatest[assertMsg] = assertFn;
+ tests['when passed circular metadata'] = circmetadatatest;
+
+ return tests;
+};
+
+helpers.assertOptionsThrow = function (options, errMsg) {
+ return function () {
+ assert.throws(
+ function () {
+ try {
+ new (winston.transports.Console)(options);
+ } catch (err) {
+ throw(err);
+ }
+ },
+ new RegExp('^' + errMsg.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') + '$')
+ );
+ }
+};
+
+helpers.assertStderrLevels = function (transport, stderrLevels) {
+ return function () {
+ assert.equal(
+ JSON.stringify(Object.keys(transport.stderrLevels).sort()),
+ JSON.stringify(stderrLevels.sort())
+ );
+ }
+};
+
+helpers.testLoggingToStreams = function (levels, transport, stderrLevels, stdMocks) {
+ return {
+ topic: function () {
+ stdMocks.use();
+ transport.showLevel = true;
+ Object.keys(levels).forEach(function (level) {
+ transport.log(
+ level,
+ level + ' should go to ' + (stderrLevels.indexOf(level) > -1 ? 'stderr' : 'stdout'),
+ {},
+ function () {}
+ );
+ });
+ var output = stdMocks.flush();
+ stdMocks.restore();
+ this.callback(null, output, levels);
+ },
+ "output should go to the appropriate streams": function (ign, output, levels) {
+ var outCount = 0,
+ errCount = 0;
+ Object.keys(levels).forEach(function (level) {
+ var line;
+ if (stderrLevels.indexOf(level) > -1) {
+ line = output.stderr[errCount++];
+ assert.equal(line, level + ': ' + level + ' should go to stderr\n');
+ } else {
+ line = output.stdout[outCount++];
+ assert.equal(line, level + ': ' + level + ' should go to stdout\n');
+ }
+ });
+ }
+ }
+};
diff --git a/node_modules/winston/test/transports/console-test.js b/node_modules/winston/test/transports/console-test.js
new file mode 100644
index 0000000..de868b3
--- /dev/null
+++ b/node_modules/winston/test/transports/console-test.js
@@ -0,0 +1,202 @@
+/*
+ * console-test.js: Tests for instances of the Console transport
+ *
+ * (C) 2010 Charlie Robbins
+ * MIT LICENSE
+ *
+ */
+
+var path = require('path'),
+ vows = require('vows'),
+ assert = require('assert'),
+ winston = require('../../lib/winston'),
+ helpers = require('../helpers'),
+ stdMocks = require('std-mocks');
+
+var npmTransport = new (winston.transports.Console)(),
+ syslogTransport = new (winston.transports.Console)({ levels: winston.config.syslog.levels }),
+ alignTransport = new (winston.transports.Console)({ showLevel: true, align: true }),
+ defaultTransport = new (winston.transports.Console)(),
+ rawTransport = new (winston.transports.Console)({ level: 'verbose', raw: true }),
+ debugStdoutTransport = new (winston.transports.Console)({ debugStdout: true }),
+ stderrLevelsTransport = new (winston.transports.Console)({ stderrLevels: ['info', 'warn'] }),
+ customLevels = {
+ alpha: 0,
+ beta: 1,
+ gamma: 2,
+ delta: 3,
+ epsilon: 4,
+ },
+ customLevelsAndStderrTransport = new (winston.transports.Console)({
+ levels: customLevels,
+ stderrLevels: ['delta', 'epsilon']
+ }),
+ noStderrTransport = new (winston.transports.Console)({ stderrLevels: [] });
+
+vows.describe('winston/transports/console').addBatch({
+ "An instance of the Console Transport": {
+ "with showLevel off": {
+ topic : function() {
+ npmTransport.showLevel = false;
+ stdMocks.use();
+ npmTransport.log('info', 'Le message', { meta: true }, this.callback);
+ },
+ "should not have level prepended": function () {
+ stdMocks.restore();
+ var output = stdMocks.flush(),
+ line = output.stdout[0];
+
+ assert.equal(line, 'Le message meta=true\n');
+ }
+ }
+ }
+}).addBatch({
+ "An instance of the Console Transport": {
+ "with showLevel on": {
+ topic : function() {
+ npmTransport.showLevel = true;
+ stdMocks.use();
+ npmTransport.log('info', '');
+ },
+ "should have level prepended": function () {
+ stdMocks.restore();
+ var output = stdMocks.flush(),
+ line = output.stdout[0];
+
+ assert.equal(line, 'info: \n');
+ }
+ },
+ }
+}).addBatch({
+ "An instance of the Console Transport": {
+ "with npm levels": {
+ "should have the proper methods defined": function () {
+ helpers.assertConsole(npmTransport);
+ },
+ "the log() method": helpers.testNpmLevels(npmTransport, "should respond with true", function (ign, err, logged) {
+ assert.isNull(err);
+ assert.isTrue(logged);
+ })
+ },
+ "with syslog levels": {
+ "should have the proper methods defined": function () {
+ helpers.assertConsole(syslogTransport);
+ },
+ "the log() method": helpers.testSyslogLevels(syslogTransport, "should respond with true", function (ign, err, logged) {
+ assert.isNull(err);
+ assert.isTrue(logged);
+ })
+ },
+ "with end-of-line": {
+ topic : function() {
+ npmTransport.eol = 'X';
+ stdMocks.use();
+ npmTransport.log('info', 'Le message', { meta: true }, this.callback);
+ },
+ "should have end-of-line character appended": function () {
+ stdMocks.restore();
+ var output = stdMocks.flush(),
+ line = output.stdout[0];
+ console.dir(line);
+
+ assert.equal(line, 'info: Le message meta=trueX');
+ }
+ }
+ }
+}).addBatch({
+ "An instance of the Console Transport with the align option on": {
+ topic : function() {
+ stdMocks.use();
+ alignTransport.log('info', '');
+ },
+ "should have logs aligned": function () {
+ stdMocks.restore();
+ var output = stdMocks.flush(),
+ line = output.stdout[0];
+
+ assert.equal(line, 'info\011: \n');
+ }
+ }
+}).addBatch({
+ "with align off": {
+ topic : function() {
+ alignTransport.align = false;
+ stdMocks.use();
+ alignTransport.log('info', '');
+ },
+ "should not have logs aligned": function () {
+ stdMocks.restore();
+ var output = stdMocks.flush(),
+ line = output.stdout[0];
+
+ assert.equal(line, 'info: \n');
+ }
+ }
+}).addBatch({
+ 'An instance of a raw Console transport': {
+ 'logging to stdout': {
+ topic: function () {
+ stdMocks.use();
+ rawTransport.log('verbose', 'hello there');
+ }, 'should output json with message property': function () {
+ stdMocks.restore();
+ var output = stdMocks.flush();
+ assert.ok(output.stdout[0].indexOf('"message":"hello there"') > -1);
+ }
+ }
+ }
+}).addBatch({
+ "An instance of the Console Transport with no options": {
+ "should set stderrLevels to 'error' and 'debug' by default": helpers.assertStderrLevels(
+ defaultTransport,
+ ['error', 'debug']
+ ),
+ "should log only 'error' and 'debug' to stderr": helpers.testLoggingToStreams(
+ winston.config.npm.levels, defaultTransport, ['debug', 'error'], stdMocks
+ )
+ }
+}).addBatch({
+ "An instance of the Console Transport with debugStdout set": {
+ "should throw an Error if stderrLevels is set": helpers.assertOptionsThrow(
+ { debugStdout: true, stderrLevels: ['debug'] },
+ "Error: Cannot set debugStdout and stderrLevels together"
+ ),
+ "should set stderrLevels to 'error' by default": helpers.assertStderrLevels(
+ debugStdoutTransport,
+ ['error']
+ ),
+ "should log only the 'error' level to stderr": helpers.testLoggingToStreams(
+ winston.config.npm.levels, debugStdoutTransport, ['error'], stdMocks
+ )
+ }
+}).addBatch({
+ "An instance of the Console Transport with stderrLevels set": {
+ "should throw an Error if stderrLevels is set but not an Array": helpers.assertOptionsThrow(
+ { debugStdout: false, stderrLevels: new String('Not an Array') },
+ "Error: Cannot set stderrLevels to type other than Array"
+ ),
+ "should throw an Error if stderrLevels contains non-string elements": helpers.assertOptionsThrow(
+ { debugStdout: false, stderrLevels: ["good", /^invalid$/, "valid"] },
+ "Error: Cannot have non-string elements in stderrLevels Array"
+ ),
+ "should correctly set stderrLevels": helpers.assertStderrLevels(
+ stderrLevelsTransport,
+ ['info', 'warn']
+ ),
+ "should log only the levels in stderrLevels to stderr": helpers.testLoggingToStreams(
+ winston.config.npm.levels, stderrLevelsTransport, ['info', 'warn'], stdMocks
+ )
+ }
+}).addBatch({
+ "An instance of the Console Transport with stderrLevels set to an empty array": {
+ "should log only to stdout, and not to stderr": helpers.testLoggingToStreams(
+ winston.config.npm.levels, noStderrTransport, [], stdMocks
+ )
+ }
+}).addBatch({
+ "An instance of the Console Transport with custom levels and stderrLevels set": {
+ "should log only the levels in stderrLevels to stderr": helpers.testLoggingToStreams(
+ customLevels, customLevelsAndStderrTransport, ['delta', 'epsilon'], stdMocks
+ )
+ }
+}).export(module);
diff --git a/node_modules/winston/test/transports/file-archive-test.js b/node_modules/winston/test/transports/file-archive-test.js
new file mode 100644
index 0000000..d076ce0
--- /dev/null
+++ b/node_modules/winston/test/transports/file-archive-test.js
@@ -0,0 +1,83 @@
+/*
+ * file-archive-test.js: Tests for instances of the File transport setting the archive option,
+ *
+ * (C) 2015 Nimrod Becker
+ * MIT LICENSE
+ *
+ */
+
+var assert = require('assert'),
+ exec = require('child_process').exec,
+ fs = require('fs'),
+ path = require('path'),
+ vows = require('vows'),
+ winston = require('../../lib/winston'),
+ helpers = require('../helpers');
+
+var archiveTransport = new winston.transports.File({
+ timestamp: true,
+ json: false,
+ zippedArchive: true,
+ tailable: true,
+ filename: 'testarchive.log',
+ dirname: path.join(__dirname, '..', 'fixtures', 'logs'),
+ maxsize: 4096,
+ maxFiles: 3
+});
+
+function data(ch) {
+ return new Array(1018).join(String.fromCharCode(65 + ch));
+}
+
+function logKbytes(kbytes, txt) {
+ //
+ // With no timestamp and at the info level,
+ // winston adds exactly 7 characters:
+ // [info](4)[ :](2)[\n](1)
+ //
+ for (var i = 0; i < kbytes; i++) {
+ archiveTransport.log('info', data(txt), null, function() {});
+ }
+}
+
+vows.describe('winston/transports/file/zippedArchive').addBatch({
+ "An instance of the File Transport with tailable true": {
+ "when created archived files are rolled": {
+ topic: function() {
+ var that = this,
+ created = 0;
+
+ archiveTransport.on('logged', function() {
+ if (++created === 6) {
+ return that.callback();
+ }
+
+ logKbytes(4, created);
+ });
+
+ logKbytes(4, created);
+ },
+ "should be only 3 files called testarchive.log, testarchive1.log.gz and testarchive2.log.gz": function() {
+ //Give the archive a little time to settle
+ // setTimeout(function() {
+ for (var num = 0; num < 6; num++) {
+ var file = !num ? 'testarchive.log' : 'testarchive' + num + '.log.gz',
+ fullpath = path.join(__dirname, '..', 'fixtures', 'logs', file);
+
+ // There should be no files with that name
+ if (num >= 3) {
+ assert.throws(function() {
+ fs.statSync(fullpath);
+ }, Error);
+ } else {
+ // The other files should exist
+ assert.doesNotThrow(function() {
+ fs.statSync(fullpath);
+ }, Error);
+ }
+ }
+ //},5000);
+ },
+ }
+ },
+}).export(module);
diff --git a/node_modules/winston/test/transports/file-maxfiles-test.js b/node_modules/winston/test/transports/file-maxfiles-test.js
new file mode 100644
index 0000000..62564a2
--- /dev/null
+++ b/node_modules/winston/test/transports/file-maxfiles-test.js
@@ -0,0 +1,102 @@
+/*
+ * file-maxfiles-test.js: Tests for instances of the File transport setting the max file size,
+ * and setting a number for max files created.
+ * maxSize * maxFiles = total storage used by winston.
+ *
+ * (C) 2011 Daniel Aristizabal
+ * MIT LICENSE
+ *
+ */
+
+var assert = require('assert'),
+ exec = require('child_process').exec,
+ fs = require('fs'),
+ path = require('path'),
+ vows = require('vows'),
+ winston = require('../../lib/winston'),
+ helpers = require('../helpers');
+
+var maxfilesTransport = new winston.transports.File({
+ timestamp: false,
+ json: false,
+ filename: path.join(__dirname, '..', 'fixtures', 'logs', 'testmaxfiles.log'),
+ maxsize: 4096,
+ maxFiles: 3
+});
+
+vows.describe('winston/transports/file/maxfiles').addBatch({
+ "An instance of the File Transport": {
+ "when passed a valid filename": {
+ topic: maxfilesTransport,
+ "should be a valid transporter": function (transportTest) {
+ helpers.assertFile(transportTest);
+ },
+ "should set the maxFiles option correctly": function (transportTest) {
+ assert.isNumber(transportTest.maxFiles);
+ }
+ },
+ "when delete old test files": {
+ topic: function () {
+ exec('rm -rf ' + path.join(__dirname, '..', 'fixtures', 'logs', 'testmaxfiles*'), this.callback);
+ },
+ "and when passed more files than the maxFiles": {
+ topic: function () {
+ var that = this,
+ created = 0;
+
+ function data(ch) {
+ return new Array(1018).join(String.fromCharCode(65 + ch));
+ };
+
+ function logKbytes(kbytes, txt) {
+ //
+ // With no timestamp and at the info level,
+ // winston adds exactly 7 characters:
+ // [info](4)[ :](2)[\n](1)
+ //
+ for (var i = 0; i < kbytes; i++) {
+ maxfilesTransport.log('info', data(txt), null, function () { });
+ }
+ }
+
+ maxfilesTransport.on('logged', function () {
+ if (++created === 6) {
+ return that.callback();
+ }
+
+ logKbytes(4, created);
+ });
+
+ logKbytes(4, created);
+ },
+ "should be only 3 files called 5.log, 4.log and 3.log": function () {
+ for (var num = 0; num < 6; num++) {
+ var file = !num ? 'testmaxfiles.log' : 'testmaxfiles' + num + '.log',
+ fullpath = path.join(__dirname, '..', 'fixtures', 'logs', file);
+
+ // There should be no files with that name
+ if (num >= 0 && num < 3) {
+ assert.throws(function () {
+ fs.statSync(fullpath);
+ }, Error);
+ } else {
+ // The other files should be exist
+ assert.doesNotThrow(function () {
+ fs.statSync(fullpath);
+ }, Error);
+ }
+ }
+ },
+ "should have the correct content": function () {
+ ['D', 'E', 'F'].forEach(function (name, inx) {
+ var counter = inx + 3,
+ logsDir = path.join(__dirname, '..', 'fixtures', 'logs'),
+ content = fs.readFileSync(path.join(logsDir, 'testmaxfiles' + counter + '.log'), 'utf-8');
+ // The content minus the 7 characters added by winston
+ assert.lengthOf(content.match(new RegExp(name, 'g')), 4068);
+ });
+ }
+ }
+ }
+ }
+}).export(module);
diff --git a/node_modules/winston/test/transports/file-maxsize-test.js b/node_modules/winston/test/transports/file-maxsize-test.js
new file mode 100644
index 0000000..7d20e08
--- /dev/null
+++ b/node_modules/winston/test/transports/file-maxsize-test.js
@@ -0,0 +1,82 @@
+/*
+ * file-test.js: Tests for instances of the File transport
+ *
+ * (C) 2010 Charlie Robbins
+ * MIT LICENSE
+ *
+ */
+
+var assert = require('assert'),
+ exec = require('child_process').exec,
+ fs = require('fs'),
+ path = require('path'),
+ vows = require('vows'),
+ winston = require('../../lib/winston'),
+ helpers = require('../helpers');
+
+var maxsizeTransport = new winston.transports.File({
+ timestamp: false,
+ json: false,
+ filename: path.join(__dirname, '..', 'fixtures', 'logs', 'testmaxsize.log'),
+ maxsize: 4096
+});
+
+vows.describe('winston/transports/file/maxsize').addBatch({
+ "An instance of the File Transport": {
+ "when passed a valid filename": {
+ "the log() method": {
+ topic: function () {
+ exec('rm -rf ' + path.join(__dirname, '..', 'fixtures', 'logs', 'testmaxsize*'), this.callback);
+ },
+ "when passed more than the maxsize": {
+ topic: function () {
+ var that = this,
+ data = new Array(1018).join('-');
+
+ //
+ // Setup a list of files which we will later stat.
+ //
+ that.files = [];
+
+ function logKbytes (kbytes) {
+ //
+ // With no timestamp and at the info level,
+ // winston adds exactly 7 characters:
+ // [info](4)[ :](2)[\n](1)
+ //
+ for (var i = 0; i < kbytes; i++) {
+ maxsizeTransport.log('info', data, null, function () { });
+ }
+ }
+
+ maxsizeTransport.on('open', function (file) {
+ var match = file.match(/(\d+)\.log$/),
+ count = match ? match[1] : 0;
+
+ that.files.push(file);
+
+ if (that.files.length === 5) {
+ return that.callback();
+ }
+
+ logKbytes(4);
+ });
+
+ logKbytes(4);
+ },
+ "should create multiple files correctly": function () {
+ this.files.forEach(function (file) {
+ try {
+ var stats = fs.statSync(file);
+ assert.equal(stats.size, 4096);
+ }
+ catch (ex) {
+ assert.isNull(ex);
+ }
+ });
+ }
+ }
+ }
+ }
+ }
+}).export(module); \ No newline at end of file
diff --git a/node_modules/winston/test/transports/file-open-test.js b/node_modules/winston/test/transports/file-open-test.js
new file mode 100644
index 0000000..15427a0
--- /dev/null
+++ b/node_modules/winston/test/transports/file-open-test.js
@@ -0,0 +1,57 @@
+/*
+ * file-open-test.js: Tests for File transport "open" event
+ *
+ * (C) 2014 William Wong
+ * MIT LICENSE
+ *
+ */
+
+var assert = require('assert'),
+ fs = require('fs'),
+ os = require('os'),
+ path = require('path'),
+ vows = require('vows'),
+ winston = require('../../lib/winston');
+
+vows.describe('winston/transports/file').addBatch({
+ 'An instance of the File Transport': {
+ topic: function () {
+ var callback = this.callback.bind(this),
+ logPath = path.resolve(__dirname, '../fixtures/logs/file-open-test.log');
+
+ try {
+ fs.unlinkSync(logPath);
+ } catch (ex) {
+ if (ex && ex.code !== 'ENOENT') { return callback(ex); }
+ }
+
+ var fileTransport = new (winston.transports.File)({
+ filename: logPath
+ }),
+ logger = new (winston.Logger)({
+ transports: [fileTransport]
+ }),
+ timeline = {};
+
+ fileTransport.open(function () {
+ timeline.open = Date.now();
+
+ setTimeout(function () {
+ logger.info('Hello, World!', function () {
+ timeline.logged = Date.now();
+ });
+ }, 100);
+
+ setTimeout(function () {
+ callback(null, timeline);
+ }, 1000);
+ });
+ },
+ 'should fire "open" event': function (results) {
+ assert.isTrue(!!results.open);
+ },
+ 'should fire "logged" event': function (results) {
+ assert.isTrue(!!results.logged);
+ }
+ }
+}).export(module); \ No newline at end of file
diff --git a/node_modules/winston/test/transports/file-stress-test.js b/node_modules/winston/test/transports/file-stress-test.js
new file mode 100644
index 0000000..8c4dcb9
--- /dev/null
+++ b/node_modules/winston/test/transports/file-stress-test.js
@@ -0,0 +1,72 @@
+/*
+ * file-stress-test.js: Tests for stressing File transport
+ *
+ * (C) 2014 William Wong
+ * MIT LICENSE
+ *
+ */
+
+var assert = require('assert'),
+ fs = require('fs'),
+ os = require('os'),
+ path = require('path'),
+ vows = require('vows'),
+ winston = require('../../lib/winston');
+
+vows.describe('winston/transports/file').addBatch({
+ 'A stressed instance of the File Transport': {
+ topic: function () {
+ var callback = this.callback.bind(this),
+ logPath = path.resolve(__dirname, '../fixtures/logs/file-stress-test.log');
+
+ try {
+ fs.unlinkSync(logPath);
+ } catch (ex) {
+ if (ex && ex.code !== 'ENOENT') { return callback(ex); }
+ }
+
+ var fileTransport = new (winston.transports.File)({
+ filename: logPath
+ }),
+ logger = new (winston.Logger)({
+ transports: [fileTransport]
+ });
+
+ fileTransport.on('open', function () {
+ setTimeout(function () {
+ clearInterval(interval);
+
+ logger.query({ order: 'asc' }, function (err, results) {
+ callback(null, results);
+ });
+ }, 100);
+ });
+
+ var logIndex = 0,
+ interval = setInterval(function () {
+ logger.info(++logIndex);
+ stress(200);
+ }, 0);
+
+ logger.info(++logIndex);
+ stress(200);
+
+ function stress(duration) {
+ var startTime = Date.now();
+
+ while (Date.now() - startTime < duration) {
+ Math.sqrt(Math.PI);
+ }
+ }
+ },
+ 'should not skip any log lines': function (results) {
+ var testIndex = 0;
+
+ results.file.forEach(function (log) {
+ if (+log.message !== ++testIndex) {
+ throw new Error('Number skipped');
+ }
+ });
+ }
+ }
+}).export(module);
diff --git a/node_modules/winston/test/transports/file-tailrolling-test.js b/node_modules/winston/test/transports/file-tailrolling-test.js
new file mode 100644
index 0000000..60a0674
--- /dev/null
+++ b/node_modules/winston/test/transports/file-tailrolling-test.js
@@ -0,0 +1,92 @@
+var assert = require('assert'),
+ fs = require('fs'),
+ path = require('path'),
+ vows = require('vows'),
+ winston = require('../../lib/winston'),
+ helpers = require('../helpers');
+
+var maxfilesTransport = new winston.transports.File({
+ timestamp: false,
+ json: false,
+ filename: path.join(__dirname, '..', 'fixtures', 'logs', 'testtailrollingfiles.log'),
+ maxsize: 4096,
+ maxFiles: 3,
+ tailable: true
+});
+
+process.on('uncaughtException', function (err) {
+ console.log('caught exception');
+ console.error(err);
+});
+
+vows.describe('winston/transports/file/tailrolling').addBatch({
+ "An instance of the File Transport": {
+ "when delete old test files": {
+ topic: function () {
+ var logs = path.join(__dirname, '..', 'fixtures', 'logs');
+ fs.readdirSync(logs).forEach(function (file) {
+ if (~file.indexOf('testtailrollingfiles')) {
+ fs.unlinkSync(path.join(logs, file));
+ }
+ });
+
+ this.callback();
+ },
+ "and when passed more files than the maxFiles": {
+ topic: function () {
+ var that = this,
+ created = 0;
+
+ function data(ch) {
+ return new Array(1018).join(String.fromCharCode(65 + ch));
+ };
+
+ function logKbytes(kbytes, txt) {
+ //
+ // With no timestamp and at the info level,
+ // winston adds exactly 7 characters:
+ // [info](4)[ :](2)[\n](1)
+ //
+ for (var i = 0; i < kbytes; i++) {
+ maxfilesTransport.log('info', data(txt), null, function () { });
+ }
+ }
+
+ maxfilesTransport.on('logged', function () {
+ if (++created == 4) {
+ return that.callback();
+ }
+
+ logKbytes(4, created);
+ });
+
+ logKbytes(4, created);
+ },
+ "should be 3 log files, base to maxFiles - 1": function () {
+ var file, fullpath;
+ for (var num = 0; num < 4; num++) {
+ file = !num ? 'testtailrollingfiles.log' : 'testtailrollingfiles' + num + '.log';
+ fullpath = path.join(__dirname, '..', 'fixtures', 'logs', file);
+
+ if (num == 3) {
+ return assert.ok(!fs.existsSync(fullpath));
+ }
+
+ assert.ok(fs.existsSync(fullpath));
+ }
+
+ return false;
+ },
+ "should have files in correct order": function () {
+ var file, fullpath, content;
+ ['D', 'C', 'B'].forEach(function (letter, i) {
+ file = !i ? 'testtailrollingfiles.log' : 'testtailrollingfiles' + i + '.log';
+ content = fs.readFileSync(path.join(__dirname, '..', 'fixtures', 'logs', file), 'ascii');
+
+ assert.lengthOf(content.match(new RegExp(letter, 'g')), 4068);
+ });
+ }
+ }
+ }
+ }
+}).export(module); \ No newline at end of file
diff --git a/node_modules/winston/test/transports/file-test.js b/node_modules/winston/test/transports/file-test.js
new file mode 100644
index 0000000..e6f6b3a
--- /dev/null
+++ b/node_modules/winston/test/transports/file-test.js
@@ -0,0 +1,134 @@
+/*
+ * file-test.js: Tests for instances of the File transport
+ *
+ * (C) 2010 Charlie Robbins
+ * MIT LICENSE
+ *
+ */
+
+var path = require('path'),
+ vows = require('vows'),
+ fs = require('fs'),
+ assert = require('assert'),
+ winston = require('../../lib/winston'),
+ stdMocks = require('std-mocks'),
+ helpers = require('../helpers');
+
+var transport = require('./transport');
+
+var stream = fs.createWriteStream(
+ path.join(__dirname, '..', 'fixtures', 'logs', 'testfile.log')
+ ),
+ fileTransport = new (winston.transports.File)({
+ filename: path.join(__dirname, '..', 'fixtures', 'logs', 'testfilename.log')
+ }),
+ failedFileTransport = new (winston.transports.File)({
+ filename: path.join(__dirname, '..', 'fixtures', 'logs', 'dir404', 'testfile.log')
+ }),
+ streamTransport = new (winston.transports.File)({ stream: stream });
+
+vows.describe('winston/transports/file').addBatch({
+ "An instance of the File Transport": {
+ "when passed a valid filename": {
+ "should have the proper methods defined": function () {
+ helpers.assertFile(fileTransport);
+ },
+ "the log() method": helpers.testNpmLevels(fileTransport, "should respond with true", function (ign, err, logged) {
+ assert.isNull(err);
+ assert.isTrue(logged);
+ })
+ },
+ "when passed an invalid filename": {
+ "should have proper methods defined": function () {
+ helpers.assertFile(failedFileTransport);
+ },
+ "should enter noop failed state": function () {
+ helpers.assertFailedTransport(failedFileTransport);
+ }
+ },
+ "when passed a valid file stream": {
+ "should have the proper methods defined": function () {
+ helpers.assertFile(streamTransport);
+ },
+ "the log() method": helpers.testNpmLevels(streamTransport, "should respond with true", function (ign, err, logged) {
+ assert.isNull(err);
+ assert.isTrue(logged);
+ })
+ },
+ "streaming to stdout": {
+ topic: function () {
+ var transport = new (winston.transports.File)({
+ stream: process.stdout, timestamp: false, json: false
+ });
+ stdMocks.use();
+ return transport;
+ },
+ "with showLevel off": {
+ topic: function (stdoutStreamTransport) {
+ stdoutStreamTransport.showLevel = false;
+ stdoutStreamTransport.log('info', '', undefined, this.callback);
+ },
+ "should not have level prepended": function () {
+ var output = stdMocks.flush(),
+ line = output.stdout[0];
+
+ assert.equal(line, '\n');
+ }
+ },
+ // there would be a "with showLevel on" here but I think it's a bug in
+ // this version of vows. ugprading causes even more problems
+ teardown: function() {
+ stdMocks.restore();
+ }
+ }
+ }
+}).addBatch({
+ "These tests have a non-deterministic end": {
+ topic: function () {
+ setTimeout(this.callback, 200);
+ },
+ "and this should be fixed before releasing": function () {
+ assert.isTrue(true);
+ }
+ }
+}).addBatch({
+ "Error object in metadata #610": {
+ topic: function () {
+ var myErr = new Error("foo");
+
+ fileTransport.log('info', 'test message', myErr, this.callback.bind(this, null, myErr));
+ },
+ "should not be modified": function (err, myErr) {
+ assert.equal(myErr.message, "foo");
+ // Not sure if this is the best possible way to check if additional props appeared
+ assert.deepEqual(Object.getOwnPropertyNames(myErr), Object.getOwnPropertyNames(new Error("foo")));
+ }
+ }
+}).addBatch({
+ "Date object in metadata": {
+ topic: function () {
+ var obj = new Date(1000);
+
+ fileTransport.log('info', 'test message', obj, this.callback.bind(this, null, obj));
+ },
+ "should not be modified": function (err, obj) {
+ // Not sure if this is the best possible way to check if additional props appeared
+ assert.deepEqual(Object.getOwnPropertyNames(obj), Object.getOwnPropertyNames(new Date()));
+ }
+ }
+}).addBatch({
+ "Plain object in metadata": {
+ topic: function () {
+ var obj = { message: "foo" };
+
+ fileTransport.log('info', 'test message', obj, this.callback.bind(this, null, obj));
+ },
+ "should not be modified": function (err, obj) {
+ assert.deepEqual(obj, { message: "foo" });
+ }
+ }
+}).addBatch({
+ "An instance of the File Transport": transport(winston.transports.File, {
+ filename: path.join(__dirname, '..', 'fixtures', 'logs', 'testfile.log')
+ })
+}).export(module);
diff --git a/node_modules/winston/test/transports/http-test.js b/node_modules/winston/test/transports/http-test.js
new file mode 100644
index 0000000..65f3cc7
--- /dev/null
+++ b/node_modules/winston/test/transports/http-test.js
@@ -0,0 +1,70 @@
+/*
+ * http-test.js: Tests for instances of the HTTP transport
+ *
+ * MIT LICENSE
+ */
+
+var path = require('path'),
+ vows = require('vows'),
+ http = require('http'),
+ fs = require('fs'),
+ assert = require('assert'),
+ winston = require('../../lib/winston'),
+ helpers = require('../helpers'),
+ hock = require('hock');
+
+var transport = require('./transport');
+
+var host = '127.0.0.1';
+
+vows.describe('winston/transports/http').addBatch({
+ "When the HTTP endpoint": {
+ topic: function () {
+ var mock = this.mock = hock.createHock(),
+ self = this;
+
+ mock
+ .post('/log', {
+ "method":"collect",
+ "params":{
+ "level":"info",
+ "message":"hello",
+ "meta":{}
+ }
+ })
+ .min(1)
+ .max(1)
+ .reply(200);
+
+ var server = this.server = http.createServer(mock.handler);
+ server.listen(0, '0.0.0.0', this.callback);
+ },
+ "is running": function (err) {
+ assert.ifError(err);
+ },
+ "an instance of the Http transport": {
+ topic: function () {
+
+ var port = this.server.address().port;
+ var self = this,
+ httpTransport = new (winston.transports.Http)({
+ host: host,
+ port: port,
+ path: 'log'
+ });
+
+ httpTransport.log('info', 'hello', function (logErr, logged) {
+ self.mock.done(function (doneErr) {
+ self.callback(null, logErr, logged, doneErr);
+ });
+ });
+ },
+ "should log to the specified URL": function (_, err, logged, requested) {
+ assert.ifError(err);
+ assert.isTrue(logged);
+ assert.ifError(requested);
+ this.server.close();
+ }
+ }
+ }
+}).export(module);
diff --git a/node_modules/winston/test/transports/memory-test.js b/node_modules/winston/test/transports/memory-test.js
new file mode 100644
index 0000000..e8e1043
--- /dev/null
+++ b/node_modules/winston/test/transports/memory-test.js
@@ -0,0 +1,31 @@
+var path = require('path'),
+ vows = require('vows'),
+ assert = require('assert'),
+ winston = require('../../lib/winston'),
+ helpers = require('../helpers');
+
+var npmTransport = new (winston.transports.Memory)(),
+ syslogTransport = new (winston.transports.Memory)({ levels: winston.config.syslog.levels });
+
+vows.describe('winston/transports/memory').addBatch({
+ "An instance of the Memory Transport": {
+ "with npm levels": {
+ "should have the proper methods defined": function () {
+ helpers.assertMemory(npmTransport);
+ },
+ "the log() method": helpers.testNpmLevels(npmTransport, "should respond with true", function (ign, err, logged) {
+ assert.isNull(err);
+ assert.isTrue(logged);
+ })
+ },
+ "with syslog levels": {
+ "should have the proper methods defined": function () {
+ helpers.assertMemory(syslogTransport);
+ },
+ "the log() method": helpers.testSyslogLevels(syslogTransport, "should respond with true", function (ign, err, logged) {
+ assert.isNull(err);
+ assert.isTrue(logged);
+ })
+ }
+ }
+}).export(module); \ No newline at end of file
diff --git a/node_modules/winston/test/transports/transport.js b/node_modules/winston/test/transports/transport.js
new file mode 100644
index 0000000..0abf80a
--- /dev/null
+++ b/node_modules/winston/test/transports/transport.js
@@ -0,0 +1,212 @@
+var assert = require('assert'),
+ winston = require('../../lib/winston'),
+ helpers = require('../helpers');
+
+module.exports = function (transport, options) {
+ var logger = transport instanceof winston.Logger
+ ? transport
+ : new winston.Logger({
+ transports: [
+ new transport(options)
+ ]
+ });
+
+ // hack to fix transports that don't log
+ // any unit of time smaller than seconds
+ var common = require('../../lib/winston/common');
+ common.timestamp = function() {
+ return new Date().toISOString();
+ };
+
+ var transport = logger.transports[logger._names[0]];
+
+ var out = {
+ 'topic': logger,
+ 'when passed valid options': {
+ 'should have the proper methods defined': function () {
+ switch (transport.name) {
+ case 'console':
+ helpers.assertConsole(transport);
+ break;
+ case 'file':
+ helpers.assertFile(transport);
+ break;
+ case 'couchdb':
+ helpers.assertCouchdb(transport);
+ break;
+ }
+ assert.isFunction(transport.log);
+ }
+ },
+ 'the log() method': helpers.testNpmLevels(transport,
+ 'should respond with true', function (ign, err, logged) {
+ assert.isNull(err);
+ assert.isNotNull(logged);
+ }
+ ),
+ 'the stream() method': {
+ 'using no options': {
+ 'topic': function () {
+ if (!transport.stream) return;
+
+ logger.log('info', 'hello world', {});
+
+ var cb = this.callback,
+ j = 10,
+ i = 10,
+ results = [],
+ stream = logger.stream();
+
+ stream.on('log', function (log) {
+ results.push(log);
+ results.stream = stream;
+ if (!--j) cb(null, results);
+ });
+
+ stream.on('error', function (err) {
+ j = -1; //don't call the callback again
+ cb(err);
+ });
+
+ while (i--) logger.log('info', 'hello world ' + i, {});
+ },
+ 'should stream logs': function (err, results) {
+ if (!transport.stream) return;
+ assert.isNull(err);
+ results.forEach(function (log) {
+ assert.ok(log.message.indexOf('hello world') === 0
+ || log.message.indexOf('test message') === 0);
+ });
+ results.stream.destroy();
+ }
+ },
+ 'using the `start` option': {
+ 'topic': function () {
+ if (!transport.stream) return;
+
+ var cb = this.callback,
+ stream = logger.stream({ start: 0 });
+
+ stream.on('log', function (log) {
+ log.stream = stream;
+ if (cb) cb(null, log);
+ cb = null;
+ });
+ },
+ 'should stream logs': function (err, log) {
+ if (!transport.stream) return;
+ assert.isNull(err);
+ assert.isNotNull(log.message);
+ log.stream.destroy();
+ }
+ }
+ },
+ 'after the logs have flushed': {
+ topic: function () {
+ setTimeout(this.callback, 1000);
+ },
+ 'the query() method': {
+ 'using basic querying': {
+ 'topic': function () {
+ if (!transport.query) return;
+ var cb = this.callback;
+ logger.log('info', 'hello world', {}, function () {
+ logger.query(cb);
+ });
+ },
+ 'should return matching results': function (err, results) {
+ if (!transport.query) return;
+ assert.isNull(err);
+ results = results[transport.name];
+ while (!Array.isArray(results)) {
+ results = results[Object.keys(results).pop()];
+ }
+ var log = results.pop();
+ assert.ok(log.message.indexOf('hello world') === 0
+ || log.message.indexOf('test message') === 0);
+ }
+ },
+ 'using the `rows` option': {
+ 'topic': function () {
+ if (!transport.query) return;
+ var cb = this.callback;
+ logger.log('info', 'hello world', {}, function () {
+ logger.query({ rows: 1 }, cb);
+ });
+ },
+ 'should return one result': function (err, results) {
+ if (!transport.query) return;
+ assert.isNull(err);
+ results = results[transport.name];
+ while (!Array.isArray(results)) {
+ results = results[Object.keys(results).pop()];
+ }
+ assert.equal(results.length, 1);
+ }
+ },
+ 'using `fields` and `order` option': {
+ 'topic': function () {
+ if (!transport.query) return;
+ var cb = this.callback;
+ logger.log('info', 'hello world', {}, function () {
+ logger.query({ order: 'asc', fields: ['timestamp'] }, cb);
+ });
+ },
+ 'should return matching results': function (err, results) {
+ if (!transport.query) return;
+ assert.isNull(err);
+ results = results[transport.name];
+ while (!Array.isArray(results)) {
+ results = results[Object.keys(results).pop()];
+ }
+ assert.equal(Object.keys(results[0]).length, 1);
+ assert.ok(new Date(results.shift().timestamp)
+ < new Date(results.pop().timestamp));
+ }
+ },
+ 'using the `from` and `until` option': {
+ 'topic': function () {
+ if (!transport.query) return;
+ var cb = this.callback;
+ var start = Date.now() - (100 * 1000);
+ var end = Date.now() + (100 * 1000);
+ logger.query({ from: start, until: end }, cb);
+ },
+ 'should return matching results': function (err, results) {
+ if (!transport.query) return;
+ assert.isNull(err);
+ results = results[transport.name];
+ while (!Array.isArray(results)) {
+ results = results[Object.keys(results).pop()];
+ }
+ assert.ok(results.length >= 1);
+ }
+ },
+ 'using a bad `from` and `until` option': {
+ 'topic': function () {
+ if (!transport.query) return;
+ var cb = this.callback;
+ logger.log('info', 'bad from and until', {}, function () {
+ var now = Date.now() + 1000000;
+ logger.query({ from: now, until: now }, cb);
+ });
+ },
+ 'should return no results': function (err, results) {
+ if (!transport.query) return;
+ assert.isNull(err);
+ results = results[transport.name];
+ while (!Array.isArray(results)) {
+ results = results[Object.keys(results).pop()];
+ }
+ results = [results.filter(function(log) {
+ return log.message === 'bad from and until';
+ }).pop()];
+ assert.isUndefined(results[0]);
+ }
+ }
+ }
+ }
+ };
+
+ return out;
+};