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.
38 lines
995 B
JavaScript
38 lines
995 B
JavaScript
12 months ago
|
'use strict';
|
||
|
|
||
|
const CastError = require('../error/cast');
|
||
|
|
||
|
/**
|
||
|
* Given a value, cast it to a string, or throw a `CastError` if the value
|
||
|
* cannot be casted. `null` and `undefined` are considered valid.
|
||
|
*
|
||
|
* @param {Any} value
|
||
|
* @param {String} [path] optional the path to set on the CastError
|
||
|
* @return {string|null|undefined}
|
||
|
* @throws {CastError}
|
||
|
* @api private
|
||
|
*/
|
||
|
|
||
|
module.exports = function castString(value, path) {
|
||
|
// If null or undefined
|
||
|
if (value == null) {
|
||
|
return value;
|
||
|
}
|
||
|
|
||
|
// handle documents being passed
|
||
|
if (value._id && typeof value._id === 'string') {
|
||
|
return value._id;
|
||
|
}
|
||
|
|
||
|
// Re: gh-647 and gh-3030, we're ok with casting using `toString()`
|
||
|
// **unless** its the default Object.toString, because "[object Object]"
|
||
|
// doesn't really qualify as useful data
|
||
|
if (value.toString &&
|
||
|
value.toString !== Object.prototype.toString &&
|
||
|
!Array.isArray(value)) {
|
||
|
return value.toString();
|
||
|
}
|
||
|
|
||
|
throw new CastError('string', value, path);
|
||
|
};
|