You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
100 lines
2.0 KiB
JavaScript
100 lines
2.0 KiB
JavaScript
/*!
|
|
* Module dependencies.
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
const MongooseError = require('./');
|
|
|
|
|
|
class ValidatorError extends MongooseError {
|
|
/**
|
|
* Schema validator error
|
|
*
|
|
* @param {Object} properties
|
|
* @param {Document} doc
|
|
* @api private
|
|
*/
|
|
constructor(properties, doc) {
|
|
let msg = properties.message;
|
|
if (!msg) {
|
|
msg = MongooseError.messages.general.default;
|
|
}
|
|
|
|
const message = formatMessage(msg, properties, doc);
|
|
super(message);
|
|
|
|
properties = Object.assign({}, properties, { message: message });
|
|
this.properties = properties;
|
|
this.kind = properties.type;
|
|
this.path = properties.path;
|
|
this.value = properties.value;
|
|
this.reason = properties.reason;
|
|
}
|
|
|
|
/**
|
|
* toString helper
|
|
* TODO remove? This defaults to `${this.name}: ${this.message}`
|
|
* @api private
|
|
*/
|
|
toString() {
|
|
return this.message;
|
|
}
|
|
|
|
/**
|
|
* Ensure `name` and `message` show up in toJSON output re: gh-9296
|
|
* @api private
|
|
*/
|
|
|
|
toJSON() {
|
|
return Object.assign({ name: this.name, message: this.message }, this);
|
|
}
|
|
}
|
|
|
|
|
|
Object.defineProperty(ValidatorError.prototype, 'name', {
|
|
value: 'ValidatorError'
|
|
});
|
|
|
|
/**
|
|
* The object used to define this validator. Not enumerable to hide
|
|
* it from `require('util').inspect()` output re: gh-3925
|
|
* @api private
|
|
*/
|
|
|
|
Object.defineProperty(ValidatorError.prototype, 'properties', {
|
|
enumerable: false,
|
|
writable: true,
|
|
value: null
|
|
});
|
|
|
|
// Exposed for testing
|
|
ValidatorError.prototype.formatMessage = formatMessage;
|
|
|
|
/**
|
|
* Formats error messages
|
|
* @api private
|
|
*/
|
|
|
|
function formatMessage(msg, properties, doc) {
|
|
if (typeof msg === 'function') {
|
|
return msg(properties, doc);
|
|
}
|
|
|
|
const propertyNames = Object.keys(properties);
|
|
for (const propertyName of propertyNames) {
|
|
if (propertyName === 'message') {
|
|
continue;
|
|
}
|
|
msg = msg.replace('{' + propertyName.toUpperCase() + '}', properties[propertyName]);
|
|
}
|
|
|
|
return msg;
|
|
}
|
|
|
|
/*!
|
|
* exports
|
|
*/
|
|
|
|
module.exports = ValidatorError;
|