text: /*!
   * Module requirements
   */
  
  'use strict';
  
  const MongooseError = require('./mongooseError');
  const getConstructorName = require('../helpers/getConstructorName');
  const util = require('util');
  
  class ValidationError extends MongooseError {
    /**
     * Document Validation Error
     *
     * @api private
     * @param {Document} [instance]
     * @inherits MongooseError
     */
    constructor(instance) {
      let _message;
      if (getConstructorName(instance) === 'model') {
        _message = instance.constructor.modelName + ' validation failed';
      } else {
        _message = 'Validation failed';
      }
  
      super(_message);
  
      this.errors = {};
      this._message = _message;
  
      if (instance) {
        instance.$errors = this.errors;
      }
    }
  
    /**
     * Console.log helper
     */
    toString() {
      return this.name + ': ' + _generateMessage(this);
    }
  
    /*!
     * inspect helper
     */
    inspect() {
      return Object.assign(new Error(this.message), this);
    }
  
    /*!
    * add message
    */
    addError(path, error) {
      this.errors[path] = error;
      this.message = this._message + ': ' + _generateMessage(this);
    }
  }
  
  
  if (util.inspect.custom) {
    /*!
    * Avoid Node deprecation warning DEP0079
    */
  
    ValidationError.prototype[util.inspect.custom] = ValidationError.prototype.inspect;
  }
  
  /*!
   * Helper for JSON.stringify
   * Ensure `name` and `message` show up in toJSON output re: gh-9847
   */
  Object.defineProperty(ValidationError.prototype, 'toJSON', {
    enumerable: false,
    writable: false,
    configurable: true,
    value: function() {
      return Object.assign({}, this, { name: this.name, message: this.message });
    }
  });
  
  
  Object.defineProperty(ValidationError.prototype, 'name', {
    value: 'ValidationError'
  });
  
  /*!
   * ignore
   */
  
  function _generateMessage(err) {
    const keys = Object.keys(err.errors || {});
    const len = keys.length;
    const msgs = [];
    let key;
  
    for (let i = 0; i < len; ++i) {
      key = keys[i];
      if (err === err.errors[key]) {
        continue;
      }
      msgs.push(key + ': ' + err.errors[key].message);
    }
  
    return msgs.join(', ');
  }
  
  /*!
   * Module exports
   */
  
  module.exports = ValidationError;
  