You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					124 lines
				
				2.6 KiB
			
		
		
			
		
	
	
					124 lines
				
				2.6 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								'use strict';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const 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() {
							 | 
						||
| 
								 | 
							
								  const state = this._reporterState;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return { obj: state.obj, pathLen: state.path.length };
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Reporter.prototype.restore = function restore(data) {
							 | 
						||
| 
								 | 
							
								  const 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) {
							 | 
						||
| 
								 | 
							
								  const state = this._reporterState;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  state.path = state.path.slice(0, index - 1);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Reporter.prototype.leaveKey = function leaveKey(index, key, value) {
							 | 
						||
| 
								 | 
							
								  const 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() {
							 | 
						||
| 
								 | 
							
								  const state = this._reporterState;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const prev = state.obj;
							 | 
						||
| 
								 | 
							
								  state.obj = {};
							 | 
						||
| 
								 | 
							
								  return prev;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Reporter.prototype.leaveObject = function leaveObject(prev) {
							 | 
						||
| 
								 | 
							
								  const state = this._reporterState;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const now = state.obj;
							 | 
						||
| 
								 | 
							
								  state.obj = prev;
							 | 
						||
| 
								 | 
							
								  return now;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Reporter.prototype.error = function error(msg) {
							 | 
						||
| 
								 | 
							
								  let err;
							 | 
						||
| 
								 | 
							
								  const state = this._reporterState;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const 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) {
							 | 
						||
| 
								 | 
							
								  const 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;
							 | 
						||
| 
								 | 
							
								};
							 |