| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 | 
							- var inherits = require('inherits');
 
- function Reporter(options) {
 
-   this._reporterState = {
 
-     obj: null,
 
-     path: [],
 
-     options: options || {},
 
-     errors: []
 
-   };
 
- }
 
- exports.Reporter = Reporter;
 
- Reporter.prototype.isError = function isError(obj) {
 
-   return obj instanceof ReporterError;
 
- };
 
- Reporter.prototype.save = function save() {
 
-   var state = this._reporterState;
 
-   return { obj: state.obj, pathLen: state.path.length };
 
- };
 
- Reporter.prototype.restore = function restore(data) {
 
-   var state = this._reporterState;
 
-   state.obj = data.obj;
 
-   state.path = state.path.slice(0, data.pathLen);
 
- };
 
- Reporter.prototype.enterKey = function enterKey(key) {
 
-   return this._reporterState.path.push(key);
 
- };
 
- Reporter.prototype.exitKey = function exitKey(index) {
 
-   var state = this._reporterState;
 
-   state.path = state.path.slice(0, index - 1);
 
- };
 
- Reporter.prototype.leaveKey = function leaveKey(index, key, value) {
 
-   var state = this._reporterState;
 
-   this.exitKey(index);
 
-   if (state.obj !== null)
 
-     state.obj[key] = value;
 
- };
 
- Reporter.prototype.path = function path() {
 
-   return this._reporterState.path.join('/');
 
- };
 
- Reporter.prototype.enterObject = function enterObject() {
 
-   var state = this._reporterState;
 
-   var prev = state.obj;
 
-   state.obj = {};
 
-   return prev;
 
- };
 
- Reporter.prototype.leaveObject = function leaveObject(prev) {
 
-   var state = this._reporterState;
 
-   var now = state.obj;
 
-   state.obj = prev;
 
-   return now;
 
- };
 
- Reporter.prototype.error = function error(msg) {
 
-   var err;
 
-   var state = this._reporterState;
 
-   var inherited = msg instanceof ReporterError;
 
-   if (inherited) {
 
-     err = msg;
 
-   } else {
 
-     err = new ReporterError(state.path.map(function(elem) {
 
-       return '[' + JSON.stringify(elem) + ']';
 
-     }).join(''), msg.message || msg, msg.stack);
 
-   }
 
-   if (!state.options.partial)
 
-     throw err;
 
-   if (!inherited)
 
-     state.errors.push(err);
 
-   return err;
 
- };
 
- Reporter.prototype.wrapResult = function wrapResult(result) {
 
-   var state = this._reporterState;
 
-   if (!state.options.partial)
 
-     return result;
 
-   return {
 
-     result: this.isError(result) ? null : result,
 
-     errors: state.errors
 
-   };
 
- };
 
- function ReporterError(path, msg) {
 
-   this.path = path;
 
-   this.rethrow(msg);
 
- };
 
- inherits(ReporterError, Error);
 
- ReporterError.prototype.rethrow = function rethrow(msg) {
 
-   this.message = msg + ' at: ' + (this.path || '(shallow)');
 
-   if (Error.captureStackTrace)
 
-     Error.captureStackTrace(this, ReporterError);
 
-   if (!this.stack) {
 
-     try {
 
-       // IE only adds stack when thrown
 
-       throw new Error(this.message);
 
-     } catch (e) {
 
-       this.stack = e.stack;
 
-     }
 
-   }
 
-   return this;
 
- };
 
 
  |