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.
232 lines
5.6 KiB
232 lines
5.6 KiB
4 years ago
|
'use strict';
|
||
|
|
||
|
const clone = require('../helpers/clone');
|
||
|
|
||
|
/**
|
||
|
* The options defined on a schematype.
|
||
|
*
|
||
|
* ####Example:
|
||
|
*
|
||
|
* const schema = new Schema({ name: String });
|
||
|
* schema.path('name').options instanceof mongoose.SchemaTypeOptions; // true
|
||
|
*
|
||
|
* @api public
|
||
|
* @constructor SchemaTypeOptions
|
||
|
*/
|
||
|
|
||
|
class SchemaTypeOptions {
|
||
|
constructor(obj) {
|
||
|
if (obj == null) {
|
||
|
return this;
|
||
|
}
|
||
|
Object.assign(this, clone(obj));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
const opts = require('./propertyOptions');
|
||
|
|
||
|
/**
|
||
|
* The type to cast this path to.
|
||
|
*
|
||
|
* @api public
|
||
|
* @property type
|
||
|
* @memberOf SchemaTypeOptions
|
||
|
* @type Function|String|Object
|
||
|
* @instance
|
||
|
*/
|
||
|
|
||
|
Object.defineProperty(SchemaTypeOptions.prototype, 'type', opts);
|
||
|
|
||
|
/**
|
||
|
* Function or object describing how to validate this schematype.
|
||
|
*
|
||
|
* @api public
|
||
|
* @property validate
|
||
|
* @memberOf SchemaTypeOptions
|
||
|
* @type Function|Object
|
||
|
* @instance
|
||
|
*/
|
||
|
|
||
|
Object.defineProperty(SchemaTypeOptions.prototype, 'validate', opts);
|
||
|
|
||
|
/**
|
||
|
* Allows overriding casting logic for this individual path. If a string, the
|
||
|
* given string overwrites Mongoose's default cast error message.
|
||
|
*
|
||
|
* ####Example:
|
||
|
*
|
||
|
* const schema = new Schema({
|
||
|
* num: {
|
||
|
* type: Number,
|
||
|
* cast: '{VALUE} is not a valid number'
|
||
|
* }
|
||
|
* });
|
||
|
*
|
||
|
* // Throws 'CastError: "bad" is not a valid number'
|
||
|
* schema.path('num').cast('bad');
|
||
|
*
|
||
|
* const Model = mongoose.model('Test', schema);
|
||
|
* const doc = new Model({ num: 'fail' });
|
||
|
* const err = doc.validateSync();
|
||
|
*
|
||
|
* err.errors['num']; // 'CastError: "fail" is not a valid number'
|
||
|
*
|
||
|
* @api public
|
||
|
* @property cast
|
||
|
* @memberOf SchemaTypeOptions
|
||
|
* @type String
|
||
|
* @instance
|
||
|
*/
|
||
|
|
||
|
Object.defineProperty(SchemaTypeOptions.prototype, 'cast', opts);
|
||
|
|
||
|
/**
|
||
|
* If true, attach a required validator to this path, which ensures this path
|
||
|
* path cannot be set to a nullish value. If a function, Mongoose calls the
|
||
|
* function and only checks for nullish values if the function returns a truthy value.
|
||
|
*
|
||
|
* @api public
|
||
|
* @property required
|
||
|
* @memberOf SchemaTypeOptions
|
||
|
* @type Function|Boolean
|
||
|
* @instance
|
||
|
*/
|
||
|
|
||
|
Object.defineProperty(SchemaTypeOptions.prototype, 'required', opts);
|
||
|
|
||
|
/**
|
||
|
* The default value for this path. If a function, Mongoose executes the function
|
||
|
* and uses the return value as the default.
|
||
|
*
|
||
|
* @api public
|
||
|
* @property default
|
||
|
* @memberOf SchemaTypeOptions
|
||
|
* @type Function|Any
|
||
|
* @instance
|
||
|
*/
|
||
|
|
||
|
Object.defineProperty(SchemaTypeOptions.prototype, 'default', opts);
|
||
|
|
||
|
/**
|
||
|
* The model that `populate()` should use if populating this path.
|
||
|
*
|
||
|
* @api public
|
||
|
* @property ref
|
||
|
* @memberOf SchemaTypeOptions
|
||
|
* @type Function|String
|
||
|
* @instance
|
||
|
*/
|
||
|
|
||
|
Object.defineProperty(SchemaTypeOptions.prototype, 'ref', opts);
|
||
|
|
||
|
/**
|
||
|
* Whether to include or exclude this path by default when loading documents
|
||
|
* using `find()`, `findOne()`, etc.
|
||
|
*
|
||
|
* @api public
|
||
|
* @property select
|
||
|
* @memberOf SchemaTypeOptions
|
||
|
* @type Boolean|Number
|
||
|
* @instance
|
||
|
*/
|
||
|
|
||
|
Object.defineProperty(SchemaTypeOptions.prototype, 'select', opts);
|
||
|
|
||
|
/**
|
||
|
* If [truthy](https://masteringjs.io/tutorials/fundamentals/truthy), Mongoose will
|
||
|
* build an index on this path when the model is
|
||
|
* compiled.
|
||
|
*
|
||
|
* @api public
|
||
|
* @property index
|
||
|
* @memberOf SchemaTypeOptions
|
||
|
* @type Boolean|Number|Object
|
||
|
* @instance
|
||
|
*/
|
||
|
|
||
|
Object.defineProperty(SchemaTypeOptions.prototype, 'index', opts);
|
||
|
|
||
|
/**
|
||
|
* If [truthy](https://masteringjs.io/tutorials/fundamentals/truthy), Mongoose
|
||
|
* will build a unique index on this path when the
|
||
|
* model is compiled. [The `unique` option is **not** a validator](/docs/validation.html#the-unique-option-is-not-a-validator).
|
||
|
*
|
||
|
* @api public
|
||
|
* @property unique
|
||
|
* @memberOf SchemaTypeOptions
|
||
|
* @type Boolean|Number
|
||
|
* @instance
|
||
|
*/
|
||
|
|
||
|
Object.defineProperty(SchemaTypeOptions.prototype, 'unique', opts);
|
||
|
|
||
|
/**
|
||
|
* If [truthy](https://masteringjs.io/tutorials/fundamentals/truthy), Mongoose will
|
||
|
* disallow changes to this path once the document
|
||
|
* is saved to the database for the first time. Read more about [immutability in Mongoose here](http://thecodebarbarian.com/whats-new-in-mongoose-5-6-immutable-properties.html).
|
||
|
*
|
||
|
* @api public
|
||
|
* @property immutable
|
||
|
* @memberOf SchemaTypeOptions
|
||
|
* @type Function|Boolean
|
||
|
* @instance
|
||
|
*/
|
||
|
|
||
|
Object.defineProperty(SchemaTypeOptions.prototype, 'immutable', opts);
|
||
|
|
||
|
/**
|
||
|
* If [truthy](https://masteringjs.io/tutorials/fundamentals/truthy), Mongoose will
|
||
|
* build a sparse index on this path.
|
||
|
*
|
||
|
* @api public
|
||
|
* @property sparse
|
||
|
* @memberOf SchemaTypeOptions
|
||
|
* @type Boolean|Number
|
||
|
* @instance
|
||
|
*/
|
||
|
|
||
|
Object.defineProperty(SchemaTypeOptions.prototype, 'sparse', opts);
|
||
|
|
||
|
/**
|
||
|
* If [truthy](https://masteringjs.io/tutorials/fundamentals/truthy), Mongoose
|
||
|
* will build a text index on this path.
|
||
|
*
|
||
|
* @api public
|
||
|
* @property text
|
||
|
* @memberOf SchemaTypeOptions
|
||
|
* @type Boolean|Number|Object
|
||
|
* @instance
|
||
|
*/
|
||
|
|
||
|
Object.defineProperty(SchemaTypeOptions.prototype, 'text', opts);
|
||
|
|
||
|
/**
|
||
|
* Define a transform function for this individual schema type.
|
||
|
* Only called when calling `toJSON()` or `toObject()`.
|
||
|
*
|
||
|
* ####Example:
|
||
|
*
|
||
|
* const schema = Schema({
|
||
|
* myDate: {
|
||
|
* type: Date,
|
||
|
* transform: v => v.getFullYear()
|
||
|
* }
|
||
|
* });
|
||
|
* const Model = mongoose.model('Test', schema);
|
||
|
*
|
||
|
* const doc = new Model({ myDate: new Date('2019/06/01') });
|
||
|
* doc.myDate instanceof Date; // true
|
||
|
*
|
||
|
* const res = doc.toObject({ transform: true });
|
||
|
* res.myDate; // 2019
|
||
|
*
|
||
|
* @api public
|
||
|
* @property transform
|
||
|
* @memberOf SchemaTypeOptions
|
||
|
* @type Function
|
||
|
* @instance
|
||
|
*/
|
||
|
|
||
|
Object.defineProperty(SchemaTypeOptions.prototype, 'transform', opts);
|
||
|
|
||
|
module.exports = SchemaTypeOptions;
|