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; | ||
|  | }; |