diff options
Diffstat (limited to 'node_modules/mongoose/lib/schema')
20 files changed, 0 insertions, 4545 deletions
diff --git a/node_modules/mongoose/lib/schema/SingleNestedPath.js b/node_modules/mongoose/lib/schema/SingleNestedPath.js deleted file mode 100644 index d0108ee..0000000 --- a/node_modules/mongoose/lib/schema/SingleNestedPath.js +++ /dev/null @@ -1,336 +0,0 @@ -'use strict'; - -/*! - * Module dependencies. - */ - -const CastError = require('../error/cast'); -const EventEmitter = require('events').EventEmitter; -const ObjectExpectedError = require('../error/objectExpected'); -const SchemaSingleNestedOptions = require('../options/SchemaSingleNestedOptions'); -const SchemaType = require('../schematype'); -const $exists = require('./operators/exists'); -const castToNumber = require('./operators/helpers').castToNumber; -const discriminator = require('../helpers/model/discriminator'); -const geospatial = require('./operators/geospatial'); -const get = require('../helpers/get'); -const getConstructor = require('../helpers/discriminator/getConstructor'); -const handleIdOption = require('../helpers/schema/handleIdOption'); -const internalToObjectOptions = require('../options').internalToObjectOptions; - -let Subdocument; - -module.exports = SingleNestedPath; - -/** - * Single nested subdocument SchemaType constructor. - * - * @param {Schema} schema - * @param {String} key - * @param {Object} options - * @inherits SchemaType - * @api public - */ - -function SingleNestedPath(schema, path, options) { - schema = handleIdOption(schema, options); - - this.caster = _createConstructor(schema); - this.caster.path = path; - this.caster.prototype.$basePath = path; - this.schema = schema; - this.$isSingleNested = true; - SchemaType.call(this, path, options, 'Embedded'); -} - -/*! - * ignore - */ - -SingleNestedPath.prototype = Object.create(SchemaType.prototype); -SingleNestedPath.prototype.constructor = SingleNestedPath; -SingleNestedPath.prototype.OptionsConstructor = SchemaSingleNestedOptions; - -/*! - * ignore - */ - -function _createConstructor(schema, baseClass) { - // lazy load - Subdocument || (Subdocument = require('../types/subdocument')); - - const _embedded = function SingleNested(value, path, parent) { - const _this = this; - - this.$parent = parent; - Subdocument.apply(this, arguments); - - this.$session(this.ownerDocument().$session()); - - if (parent) { - parent.on('save', function() { - _this.emit('save', _this); - _this.constructor.emit('save', _this); - }); - - parent.on('isNew', function(val) { - _this.isNew = val; - _this.emit('isNew', val); - _this.constructor.emit('isNew', val); - }); - } - }; - - const proto = baseClass != null ? baseClass.prototype : Subdocument.prototype; - _embedded.prototype = Object.create(proto); - _embedded.prototype.$__setSchema(schema); - _embedded.prototype.constructor = _embedded; - _embedded.schema = schema; - _embedded.$isSingleNested = true; - _embedded.events = new EventEmitter(); - _embedded.prototype.toBSON = function() { - return this.toObject(internalToObjectOptions); - }; - - // apply methods - for (const i in schema.methods) { - _embedded.prototype[i] = schema.methods[i]; - } - - // apply statics - for (const i in schema.statics) { - _embedded[i] = schema.statics[i]; - } - - for (const i in EventEmitter.prototype) { - _embedded[i] = EventEmitter.prototype[i]; - } - - return _embedded; -} - -/*! - * Special case for when users use a common location schema to represent - * locations for use with $geoWithin. - * https://docs.mongodb.org/manual/reference/operator/query/geoWithin/ - * - * @param {Object} val - * @api private - */ - -SingleNestedPath.prototype.$conditionalHandlers.$geoWithin = function handle$geoWithin(val) { - return { $geometry: this.castForQuery(val.$geometry) }; -}; - -/*! - * ignore - */ - -SingleNestedPath.prototype.$conditionalHandlers.$near = -SingleNestedPath.prototype.$conditionalHandlers.$nearSphere = geospatial.cast$near; - -SingleNestedPath.prototype.$conditionalHandlers.$within = -SingleNestedPath.prototype.$conditionalHandlers.$geoWithin = geospatial.cast$within; - -SingleNestedPath.prototype.$conditionalHandlers.$geoIntersects = - geospatial.cast$geoIntersects; - -SingleNestedPath.prototype.$conditionalHandlers.$minDistance = castToNumber; -SingleNestedPath.prototype.$conditionalHandlers.$maxDistance = castToNumber; - -SingleNestedPath.prototype.$conditionalHandlers.$exists = $exists; - -/** - * Casts contents - * - * @param {Object} value - * @api private - */ - -SingleNestedPath.prototype.cast = function(val, doc, init, priorVal) { - if (val && val.$isSingleNested && val.parent === doc) { - return val; - } - - if (val != null && (typeof val !== 'object' || Array.isArray(val))) { - throw new ObjectExpectedError(this.path, val); - } - - const Constructor = getConstructor(this.caster, val); - - let subdoc; - - // Only pull relevant selected paths and pull out the base path - const parentSelected = get(doc, '$__.selected', {}); - const path = this.path; - const selected = Object.keys(parentSelected).reduce((obj, key) => { - if (key.startsWith(path + '.')) { - obj[key.substr(path.length + 1)] = parentSelected[key]; - } - return obj; - }, {}); - - if (init) { - subdoc = new Constructor(void 0, selected, doc); - subdoc.init(val); - } else { - if (Object.keys(val).length === 0) { - return new Constructor({}, selected, doc, undefined, { priorDoc: priorVal }); - } - - return new Constructor(val, selected, doc, undefined, { priorDoc: priorVal }); - } - - return subdoc; -}; - -/** - * Casts contents for query - * - * @param {string} [$conditional] optional query operator (like `$eq` or `$in`) - * @param {any} value - * @api private - */ - -SingleNestedPath.prototype.castForQuery = function($conditional, val, options) { - let handler; - if (arguments.length === 2) { - handler = this.$conditionalHandlers[$conditional]; - if (!handler) { - throw new Error('Can\'t use ' + $conditional); - } - return handler.call(this, val); - } - val = $conditional; - if (val == null) { - return val; - } - - if (this.options.runSetters) { - val = this._applySetters(val); - } - - const Constructor = getConstructor(this.caster, val); - const overrideStrict = options != null && options.strict != null ? - options.strict : - void 0; - - try { - val = new Constructor(val, overrideStrict); - } catch (error) { - // Make sure we always wrap in a CastError (gh-6803) - if (!(error instanceof CastError)) { - throw new CastError('Embedded', val, this.path, error, this); - } - throw error; - } - return val; -}; - -/** - * Async validation on this single nested doc. - * - * @api private - */ - -SingleNestedPath.prototype.doValidate = function(value, fn, scope, options) { - const Constructor = getConstructor(this.caster, value); - - if (options && options.skipSchemaValidators) { - if (!(value instanceof Constructor)) { - value = new Constructor(value, null, scope); - } - return value.validate(fn); - } - - SchemaType.prototype.doValidate.call(this, value, function(error) { - if (error) { - return fn(error); - } - if (!value) { - return fn(null); - } - - value.validate(fn); - }, scope, options); -}; - -/** - * Synchronously validate this single nested doc - * - * @api private - */ - -SingleNestedPath.prototype.doValidateSync = function(value, scope, options) { - if (!options || !options.skipSchemaValidators) { - const schemaTypeError = SchemaType.prototype.doValidateSync.call(this, value, scope); - if (schemaTypeError) { - return schemaTypeError; - } - } - if (!value) { - return; - } - return value.validateSync(); -}; - -/** - * Adds a discriminator to this single nested subdocument. - * - * ####Example: - * const shapeSchema = Schema({ name: String }, { discriminatorKey: 'kind' }); - * const schema = Schema({ shape: shapeSchema }); - * - * const singleNestedPath = parentSchema.path('shape'); - * singleNestedPath.discriminator('Circle', Schema({ radius: Number })); - * - * @param {String} name - * @param {Schema} schema fields to add to the schema for instances of this sub-class - * @param {String} [value] the string stored in the `discriminatorKey` property. If not specified, Mongoose uses the `name` parameter. - * @return {Function} the constructor Mongoose will use for creating instances of this discriminator model - * @see discriminators /docs/discriminators.html - * @api public - */ - -SingleNestedPath.prototype.discriminator = function(name, schema, value) { - schema = discriminator(this.caster, name, schema, value); - - this.caster.discriminators[name] = _createConstructor(schema, this.caster); - - return this.caster.discriminators[name]; -}; - -/** - * Sets a default option for all SingleNestedPath instances. - * - * ####Example: - * - * // Make all numbers have option `min` equal to 0. - * mongoose.Schema.Embedded.set('required', true); - * - * @param {String} option - The option you'd like to set the value for - * @param {*} value - value for option - * @return {undefined} - * @function set - * @static - * @api public - */ - -SingleNestedPath.defaultOptions = {}; - -SingleNestedPath.set = SchemaType.set; - -/*! - * ignore - */ - -SingleNestedPath.prototype.clone = function() { - const options = Object.assign({}, this.options); - const schematype = new this.constructor(this.schema, this.path, options); - schematype.validators = this.validators.slice(); - if (this.requiredValidator !== undefined) { - schematype.requiredValidator = this.requiredValidator; - } - schematype.caster.discriminators = Object.assign({}, this.caster.discriminators); - return schematype; -}; diff --git a/node_modules/mongoose/lib/schema/array.js b/node_modules/mongoose/lib/schema/array.js deleted file mode 100644 index 828eb1b..0000000 --- a/node_modules/mongoose/lib/schema/array.js +++ /dev/null @@ -1,589 +0,0 @@ -'use strict'; - -/*! - * Module dependencies. - */ - -const $exists = require('./operators/exists'); -const $type = require('./operators/type'); -const MongooseError = require('../error/mongooseError'); -const SchemaArrayOptions = require('../options/SchemaArrayOptions'); -const SchemaType = require('../schematype'); -const CastError = SchemaType.CastError; -const Mixed = require('./mixed'); -const arrayDepth = require('../helpers/arrayDepth'); -const cast = require('../cast'); -const get = require('../helpers/get'); -const isOperator = require('../helpers/query/isOperator'); -const util = require('util'); -const utils = require('../utils'); -const castToNumber = require('./operators/helpers').castToNumber; -const geospatial = require('./operators/geospatial'); -const getDiscriminatorByValue = require('../helpers/discriminator/getDiscriminatorByValue'); - -let MongooseArray; -let EmbeddedDoc; - -const isNestedArraySymbol = Symbol('mongoose#isNestedArray'); - -/** - * Array SchemaType constructor - * - * @param {String} key - * @param {SchemaType} cast - * @param {Object} options - * @inherits SchemaType - * @api public - */ - -function SchemaArray(key, cast, options, schemaOptions) { - // lazy load - EmbeddedDoc || (EmbeddedDoc = require('../types').Embedded); - - let typeKey = 'type'; - if (schemaOptions && schemaOptions.typeKey) { - typeKey = schemaOptions.typeKey; - } - this.schemaOptions = schemaOptions; - - if (cast) { - let castOptions = {}; - - if (utils.isPOJO(cast)) { - if (cast[typeKey]) { - // support { type: Woot } - castOptions = utils.clone(cast); // do not alter user arguments - delete castOptions[typeKey]; - cast = cast[typeKey]; - } else { - cast = Mixed; - } - } - - if (cast === Object) { - cast = Mixed; - } - - // support { type: 'String' } - const name = typeof cast === 'string' - ? cast - : utils.getFunctionName(cast); - - const Types = require('./index.js'); - const caster = Types.hasOwnProperty(name) ? Types[name] : cast; - - this.casterConstructor = caster; - - if (this.casterConstructor instanceof SchemaArray) { - this.casterConstructor[isNestedArraySymbol] = true; - } - - if (typeof caster === 'function' && - !caster.$isArraySubdocument && - !caster.$isSchemaMap) { - this.caster = new caster(null, castOptions); - } else { - this.caster = caster; - } - - this.$embeddedSchemaType = this.caster; - - if (!(this.caster instanceof EmbeddedDoc)) { - this.caster.path = key; - } - } - - this.$isMongooseArray = true; - - SchemaType.call(this, key, options, 'Array'); - - let defaultArr; - let fn; - - if (this.defaultValue != null) { - defaultArr = this.defaultValue; - fn = typeof defaultArr === 'function'; - } - - if (!('defaultValue' in this) || this.defaultValue !== void 0) { - const defaultFn = function() { - let arr = []; - if (fn) { - arr = defaultArr.call(this); - } else if (defaultArr != null) { - arr = arr.concat(defaultArr); - } - // Leave it up to `cast()` to convert the array - return arr; - }; - defaultFn.$runBeforeSetters = !fn; - this.default(defaultFn); - } -} - -/** - * This schema type's name, to defend against minifiers that mangle - * function names. - * - * @api public - */ -SchemaArray.schemaName = 'Array'; - - -/** - * Options for all arrays. - * - * - `castNonArrays`: `true` by default. If `false`, Mongoose will throw a CastError when a value isn't an array. If `true`, Mongoose will wrap the provided value in an array before casting. - * - * @static options - * @api public - */ - -SchemaArray.options = { castNonArrays: true }; - -SchemaArray.defaultOptions = {}; - -/** - * Sets a default option for all Array instances. - * - * ####Example: - * - * // Make all Array instances have `required` of true by default. - * mongoose.Schema.Array.set('required', true); - * - * const User = mongoose.model('User', new Schema({ test: Array })); - * new User({ }).validateSync().errors.test.message; // Path `test` is required. - * - * @param {String} option - The option you'd like to set the value for - * @param {*} value - value for option - * @return {undefined} - * @function set - * @static - * @api public - */ -SchemaArray.set = SchemaType.set; - -/*! - * Inherits from SchemaType. - */ -SchemaArray.prototype = Object.create(SchemaType.prototype); -SchemaArray.prototype.constructor = SchemaArray; -SchemaArray.prototype.OptionsConstructor = SchemaArrayOptions; - -/*! - * ignore - */ - -SchemaArray._checkRequired = SchemaType.prototype.checkRequired; - -/** - * Override the function the required validator uses to check whether an array - * passes the `required` check. - * - * ####Example: - * - * // Require non-empty array to pass `required` check - * mongoose.Schema.Types.Array.checkRequired(v => Array.isArray(v) && v.length); - * - * const M = mongoose.model({ arr: { type: Array, required: true } }); - * new M({ arr: [] }).validateSync(); // `null`, validation fails! - * - * @param {Function} fn - * @return {Function} - * @function checkRequired - * @static - * @api public - */ - -SchemaArray.checkRequired = SchemaType.checkRequired; - -/** - * Check if the given value satisfies the `required` validator. - * - * @param {Any} value - * @param {Document} doc - * @return {Boolean} - * @api public - */ - -SchemaArray.prototype.checkRequired = function checkRequired(value, doc) { - if (SchemaType._isRef(this, value, doc, true)) { - return !!value; - } - - // `require('util').inherits()` does **not** copy static properties, and - // plugins like mongoose-float use `inherits()` for pre-ES6. - const _checkRequired = typeof this.constructor.checkRequired == 'function' ? - this.constructor.checkRequired() : - SchemaArray.checkRequired(); - - return _checkRequired(value); -}; - -/** - * Adds an enum validator if this is an array of strings or numbers. Equivalent to - * `SchemaString.prototype.enum()` or `SchemaNumber.prototype.enum()` - * - * @param {String|Object} [args...] enumeration values - * @return {SchemaArray} this - */ - -SchemaArray.prototype.enum = function() { - let arr = this; - while (true) { - const instance = get(arr, 'caster.instance'); - if (instance === 'Array') { - arr = arr.caster; - continue; - } - if (instance !== 'String' && instance !== 'Number') { - throw new Error('`enum` can only be set on an array of strings or numbers ' + - ', not ' + instance); - } - break; - } - arr.caster.enum.apply(arr.caster, arguments); - return this; -}; - -/** - * Overrides the getters application for the population special-case - * - * @param {Object} value - * @param {Object} scope - * @api private - */ - -SchemaArray.prototype.applyGetters = function(value, scope) { - if (this.caster.options && this.caster.options.ref) { - // means the object id was populated - return value; - } - - return SchemaType.prototype.applyGetters.call(this, value, scope); -}; - -SchemaArray.prototype._applySetters = function(value, scope, init, priorVal) { - if (this.casterConstructor instanceof SchemaArray && - SchemaArray.options.castNonArrays && - !this[isNestedArraySymbol]) { - // Check nesting levels and wrap in array if necessary - let depth = 0; - let arr = this; - while (arr != null && - arr instanceof SchemaArray && - !arr.$isMongooseDocumentArray) { - ++depth; - arr = arr.casterConstructor; - } - - // No need to wrap empty arrays - if (value != null && value.length > 0) { - const valueDepth = arrayDepth(value); - if (valueDepth.min === valueDepth.max && valueDepth.max < depth && valueDepth.containsNonArrayItem) { - for (let i = valueDepth.max; i < depth; ++i) { - value = [value]; - } - } - } - } - - return SchemaType.prototype._applySetters.call(this, value, scope, init, priorVal); -}; - -/** - * Casts values for set(). - * - * @param {Object} value - * @param {Document} doc document that triggers the casting - * @param {Boolean} init whether this is an initialization cast - * @api private - */ - -SchemaArray.prototype.cast = function(value, doc, init, prev, options) { - // lazy load - MongooseArray || (MongooseArray = require('../types').Array); - - let i; - let l; - - if (Array.isArray(value)) { - if (!value.length && doc) { - const indexes = doc.schema.indexedPaths(); - - const arrayPath = this.path; - for (i = 0, l = indexes.length; i < l; ++i) { - const pathIndex = indexes[i][0][arrayPath]; - if (pathIndex === '2dsphere' || pathIndex === '2d') { - return; - } - } - - // Special case: if this index is on the parent of what looks like - // GeoJSON, skip setting the default to empty array re: #1668, #3233 - const arrayGeojsonPath = this.path.endsWith('.coordinates') ? - this.path.substr(0, this.path.lastIndexOf('.')) : null; - if (arrayGeojsonPath != null) { - for (i = 0, l = indexes.length; i < l; ++i) { - const pathIndex = indexes[i][0][arrayGeojsonPath]; - if (pathIndex === '2dsphere') { - return; - } - } - } - } - - if (!(value && value.isMongooseArray)) { - value = new MongooseArray(value, this._arrayPath || this.path, doc); - } else if (value && value.isMongooseArray) { - // We need to create a new array, otherwise change tracking will - // update the old doc (gh-4449) - value = new MongooseArray(value, this._arrayPath || this.path, doc); - } - - const isPopulated = doc != null && doc.$__ != null && doc.populated(this.path); - if (isPopulated) { - return value; - } - - if (this.caster && this.casterConstructor !== Mixed) { - try { - for (i = 0, l = value.length; i < l; i++) { - // Special case: number arrays disallow undefined. - // Re: gh-840 - // See commit 1298fe92d2c790a90594bd08199e45a4a09162a6 - if (this.caster.instance === 'Number' && value[i] === void 0) { - throw new MongooseError('Mongoose number arrays disallow storing undefined'); - } - const opts = {}; - if (options != null && options.arrayPath != null) { - opts.arrayPath = options.arrayPath + '.' + i; - } else if (this.caster._arrayPath != null) { - opts.arrayPath = this.caster._arrayPath.slice(0, -2) + '.' + i; - } - value[i] = this.caster.cast(value[i], doc, init, void 0, opts); - } - } catch (e) { - // rethrow - throw new CastError('[' + e.kind + ']', util.inspect(value), this.path, e, this); - } - } - - return value; - } - - if (init || SchemaArray.options.castNonArrays) { - // gh-2442: if we're loading this from the db and its not an array, mark - // the whole array as modified. - if (!!doc && !!init) { - doc.markModified(this.path); - } - return this.cast([value], doc, init); - } - - throw new CastError('Array', util.inspect(value), this.path, null, this); -}; - -/*! - * Ignore - */ - -SchemaArray.prototype.discriminator = function(name, schema) { - let arr = this; // eslint-disable-line consistent-this - while (arr.$isMongooseArray && !arr.$isMongooseDocumentArray) { - arr = arr.casterConstructor; - if (arr == null || typeof arr === 'function') { - throw new MongooseError('You can only add an embedded discriminator on ' + - 'a document array, ' + this.path + ' is a plain array'); - } - } - return arr.discriminator(name, schema); -}; - -/*! - * ignore - */ - -SchemaArray.prototype.clone = function() { - const options = Object.assign({}, this.options); - const schematype = new this.constructor(this.path, this.caster, options, this.schemaOptions); - schematype.validators = this.validators.slice(); - if (this.requiredValidator !== undefined) { - schematype.requiredValidator = this.requiredValidator; - } - return schematype; -}; - -/** - * Casts values for queries. - * - * @param {String} $conditional - * @param {any} [value] - * @api private - */ - -SchemaArray.prototype.castForQuery = function($conditional, value) { - let handler; - let val; - - if (arguments.length === 2) { - handler = this.$conditionalHandlers[$conditional]; - - if (!handler) { - throw new Error('Can\'t use ' + $conditional + ' with Array.'); - } - - val = handler.call(this, value); - } else { - val = $conditional; - let Constructor = this.casterConstructor; - - if (val && - Constructor.discriminators && - Constructor.schema && - Constructor.schema.options && - Constructor.schema.options.discriminatorKey) { - if (typeof val[Constructor.schema.options.discriminatorKey] === 'string' && - Constructor.discriminators[val[Constructor.schema.options.discriminatorKey]]) { - Constructor = Constructor.discriminators[val[Constructor.schema.options.discriminatorKey]]; - } else { - const constructorByValue = getDiscriminatorByValue(Constructor, val[Constructor.schema.options.discriminatorKey]); - if (constructorByValue) { - Constructor = constructorByValue; - } - } - } - - const proto = this.casterConstructor.prototype; - let method = proto && (proto.castForQuery || proto.cast); - if (!method && Constructor.castForQuery) { - method = Constructor.castForQuery; - } - const caster = this.caster; - - if (Array.isArray(val)) { - this.setters.reverse().forEach(setter => { - val = setter.call(this, val, this); - }); - val = val.map(function(v) { - if (utils.isObject(v) && v.$elemMatch) { - return v; - } - if (method) { - v = method.call(caster, v); - return v; - } - if (v != null) { - v = new Constructor(v); - return v; - } - return v; - }); - } else if (method) { - val = method.call(caster, val); - } else if (val != null) { - val = new Constructor(val); - } - } - - return val; -}; - -function cast$all(val) { - if (!Array.isArray(val)) { - val = [val]; - } - - val = val.map(function(v) { - if (utils.isObject(v)) { - const o = {}; - o[this.path] = v; - return cast(this.casterConstructor.schema, o)[this.path]; - } - return v; - }, this); - - return this.castForQuery(val); -} - -function cast$elemMatch(val) { - const keys = Object.keys(val); - const numKeys = keys.length; - for (let i = 0; i < numKeys; ++i) { - const key = keys[i]; - const value = val[key]; - if (isOperator(key) && value != null) { - val[key] = this.castForQuery(key, value); - } - } - - // Is this an embedded discriminator and is the discriminator key set? - // If so, use the discriminator schema. See gh-7449 - const discriminatorKey = get(this, - 'casterConstructor.schema.options.discriminatorKey'); - const discriminators = get(this, 'casterConstructor.schema.discriminators', {}); - if (discriminatorKey != null && - val[discriminatorKey] != null && - discriminators[val[discriminatorKey]] != null) { - return cast(discriminators[val[discriminatorKey]], val); - } - - return cast(this.casterConstructor.schema, val); -} - -const handle = SchemaArray.prototype.$conditionalHandlers = {}; - -handle.$all = cast$all; -handle.$options = String; -handle.$elemMatch = cast$elemMatch; -handle.$geoIntersects = geospatial.cast$geoIntersects; -handle.$or = createLogicalQueryOperatorHandler('$or'); -handle.$and = createLogicalQueryOperatorHandler('$and'); -handle.$nor = createLogicalQueryOperatorHandler('$nor'); - -function createLogicalQueryOperatorHandler(op) { - return function logicalQueryOperatorHandler(val) { - if (!Array.isArray(val)) { - throw new TypeError('conditional ' + op + ' requires an array'); - } - - const ret = []; - for (const obj of val) { - ret.push(cast(this.casterConstructor.schema, obj)); - } - - return ret; - }; -} - -handle.$near = -handle.$nearSphere = geospatial.cast$near; - -handle.$within = -handle.$geoWithin = geospatial.cast$within; - -handle.$size = -handle.$minDistance = -handle.$maxDistance = castToNumber; - -handle.$exists = $exists; -handle.$type = $type; - -handle.$eq = -handle.$gt = -handle.$gte = -handle.$lt = -handle.$lte = -handle.$ne = -handle.$regex = SchemaArray.prototype.castForQuery; - -// `$in` is special because you can also include an empty array in the query -// like `$in: [1, []]`, see gh-5913 -handle.$nin = SchemaType.prototype.$conditionalHandlers.$nin; -handle.$in = SchemaType.prototype.$conditionalHandlers.$in; - -/*! - * Module exports. - */ - -module.exports = SchemaArray; diff --git a/node_modules/mongoose/lib/schema/boolean.js b/node_modules/mongoose/lib/schema/boolean.js deleted file mode 100644 index c264084..0000000 --- a/node_modules/mongoose/lib/schema/boolean.js +++ /dev/null @@ -1,258 +0,0 @@ -'use strict'; - -/*! - * Module dependencies. - */ - -const CastError = require('../error/cast'); -const SchemaType = require('../schematype'); -const castBoolean = require('../cast/boolean'); -const utils = require('../utils'); - -/** - * Boolean SchemaType constructor. - * - * @param {String} path - * @param {Object} options - * @inherits SchemaType - * @api public - */ - -function SchemaBoolean(path, options) { - SchemaType.call(this, path, options, 'Boolean'); -} - -/** - * This schema type's name, to defend against minifiers that mangle - * function names. - * - * @api public - */ -SchemaBoolean.schemaName = 'Boolean'; - -SchemaBoolean.defaultOptions = {}; - -/*! - * Inherits from SchemaType. - */ -SchemaBoolean.prototype = Object.create(SchemaType.prototype); -SchemaBoolean.prototype.constructor = SchemaBoolean; - -/*! - * ignore - */ - -SchemaBoolean._cast = castBoolean; - -/** - * Sets a default option for all Boolean instances. - * - * ####Example: - * - * // Make all booleans have `default` of false. - * mongoose.Schema.Boolean.set('default', false); - * - * const Order = mongoose.model('Order', new Schema({ isPaid: Boolean })); - * new Order({ }).isPaid; // false - * - * @param {String} option - The option you'd like to set the value for - * @param {*} value - value for option - * @return {undefined} - * @function set - * @static - * @api public - */ - -SchemaBoolean.set = SchemaType.set; - -/** - * Get/set the function used to cast arbitrary values to booleans. - * - * ####Example: - * - * // Make Mongoose cast empty string '' to false. - * const original = mongoose.Schema.Boolean.cast(); - * mongoose.Schema.Boolean.cast(v => { - * if (v === '') { - * return false; - * } - * return original(v); - * }); - * - * // Or disable casting entirely - * mongoose.Schema.Boolean.cast(false); - * - * @param {Function} caster - * @return {Function} - * @function get - * @static - * @api public - */ - -SchemaBoolean.cast = function cast(caster) { - if (arguments.length === 0) { - return this._cast; - } - if (caster === false) { - caster = v => { - if (v != null && typeof v !== 'boolean') { - throw new Error(); - } - return v; - }; - } - this._cast = caster; - - return this._cast; -}; - -/*! - * ignore - */ - -SchemaBoolean._checkRequired = v => v === true || v === false; - -/** - * Override the function the required validator uses to check whether a boolean - * passes the `required` check. - * - * @param {Function} fn - * @return {Function} - * @function checkRequired - * @static - * @api public - */ - -SchemaBoolean.checkRequired = SchemaType.checkRequired; - -/** - * Check if the given value satisfies a required validator. For a boolean - * to satisfy a required validator, it must be strictly equal to true or to - * false. - * - * @param {Any} value - * @return {Boolean} - * @api public - */ - -SchemaBoolean.prototype.checkRequired = function(value) { - return this.constructor._checkRequired(value); -}; - -/** - * Configure which values get casted to `true`. - * - * ####Example: - * - * const M = mongoose.model('Test', new Schema({ b: Boolean })); - * new M({ b: 'affirmative' }).b; // undefined - * mongoose.Schema.Boolean.convertToTrue.add('affirmative'); - * new M({ b: 'affirmative' }).b; // true - * - * @property convertToTrue - * @type Set - * @api public - */ - -Object.defineProperty(SchemaBoolean, 'convertToTrue', { - get: () => castBoolean.convertToTrue, - set: v => { castBoolean.convertToTrue = v; } -}); - -/** - * Configure which values get casted to `false`. - * - * ####Example: - * - * const M = mongoose.model('Test', new Schema({ b: Boolean })); - * new M({ b: 'nay' }).b; // undefined - * mongoose.Schema.Types.Boolean.convertToFalse.add('nay'); - * new M({ b: 'nay' }).b; // false - * - * @property convertToFalse - * @type Set - * @api public - */ - -Object.defineProperty(SchemaBoolean, 'convertToFalse', { - get: () => castBoolean.convertToFalse, - set: v => { castBoolean.convertToFalse = v; } -}); - -/** - * Casts to boolean - * - * @param {Object} value - * @param {Object} model - this value is optional - * @api private - */ - -SchemaBoolean.prototype.cast = function(value) { - const castBoolean = typeof this.constructor.cast === 'function' ? - this.constructor.cast() : - SchemaBoolean.cast(); - try { - return castBoolean(value); - } catch (error) { - throw new CastError('Boolean', value, this.path, error, this); - } -}; - -SchemaBoolean.$conditionalHandlers = - utils.options(SchemaType.prototype.$conditionalHandlers, {}); - -/** - * Casts contents for queries. - * - * @param {String} $conditional - * @param {any} val - * @api private - */ - -SchemaBoolean.prototype.castForQuery = function($conditional, val) { - let handler; - if (arguments.length === 2) { - handler = SchemaBoolean.$conditionalHandlers[$conditional]; - - if (handler) { - return handler.call(this, val); - } - - return this._castForQuery(val); - } - - return this._castForQuery($conditional); -}; - -/** - * - * @api private - */ - -SchemaBoolean.prototype._castNullish = function _castNullish(v) { - if (typeof v === 'undefined' && - this.$$context != null && - this.$$context._mongooseOptions != null && - this.$$context._mongooseOptions.omitUndefined) { - return v; - } - const castBoolean = typeof this.constructor.cast === 'function' ? - this.constructor.cast() : - SchemaBoolean.cast(); - if (castBoolean == null) { - return v; - } - if (castBoolean.convertToFalse instanceof Set && castBoolean.convertToFalse.has(v)) { - return false; - } - if (castBoolean.convertToTrue instanceof Set && castBoolean.convertToTrue.has(v)) { - return true; - } - return v; -}; - -/*! - * Module exports. - */ - -module.exports = SchemaBoolean; diff --git a/node_modules/mongoose/lib/schema/buffer.js b/node_modules/mongoose/lib/schema/buffer.js deleted file mode 100644 index c5b8cb7..0000000 --- a/node_modules/mongoose/lib/schema/buffer.js +++ /dev/null @@ -1,276 +0,0 @@ -/*! - * Module dependencies. - */ - -'use strict'; - -const MongooseBuffer = require('../types/buffer'); -const SchemaBufferOptions = require('../options/SchemaBufferOptions'); -const SchemaType = require('../schematype'); -const handleBitwiseOperator = require('./operators/bitwise'); -const utils = require('../utils'); - -const populateModelSymbol = require('../helpers/symbols').populateModelSymbol; - -const Binary = MongooseBuffer.Binary; -const CastError = SchemaType.CastError; -let Document; - -/** - * Buffer SchemaType constructor - * - * @param {String} key - * @param {Object} options - * @inherits SchemaType - * @api public - */ - -function SchemaBuffer(key, options) { - SchemaType.call(this, key, options, 'Buffer'); -} - -/** - * This schema type's name, to defend against minifiers that mangle - * function names. - * - * @api public - */ -SchemaBuffer.schemaName = 'Buffer'; - -SchemaBuffer.defaultOptions = {}; - -/*! - * Inherits from SchemaType. - */ -SchemaBuffer.prototype = Object.create(SchemaType.prototype); -SchemaBuffer.prototype.constructor = SchemaBuffer; -SchemaBuffer.prototype.OptionsConstructor = SchemaBufferOptions; - -/*! - * ignore - */ - -SchemaBuffer._checkRequired = v => !!(v && v.length); - -/** - * Sets a default option for all Buffer instances. - * - * ####Example: - * - * // Make all buffers have `required` of true by default. - * mongoose.Schema.Buffer.set('required', true); - * - * const User = mongoose.model('User', new Schema({ test: Buffer })); - * new User({ }).validateSync().errors.test.message; // Path `test` is required. - * - * @param {String} option - The option you'd like to set the value for - * @param {*} value - value for option - * @return {undefined} - * @function set - * @static - * @api public - */ - -SchemaBuffer.set = SchemaType.set; - -/** - * Override the function the required validator uses to check whether a string - * passes the `required` check. - * - * ####Example: - * - * // Allow empty strings to pass `required` check - * mongoose.Schema.Types.String.checkRequired(v => v != null); - * - * const M = mongoose.model({ buf: { type: Buffer, required: true } }); - * new M({ buf: Buffer.from('') }).validateSync(); // validation passes! - * - * @param {Function} fn - * @return {Function} - * @function checkRequired - * @static - * @api public - */ - -SchemaBuffer.checkRequired = SchemaType.checkRequired; - -/** - * Check if the given value satisfies a required validator. To satisfy a - * required validator, a buffer must not be null or undefined and have - * non-zero length. - * - * @param {Any} value - * @param {Document} doc - * @return {Boolean} - * @api public - */ - -SchemaBuffer.prototype.checkRequired = function(value, doc) { - if (SchemaType._isRef(this, value, doc, true)) { - return !!value; - } - return this.constructor._checkRequired(value); -}; - -/** - * Casts contents - * - * @param {Object} value - * @param {Document} doc document that triggers the casting - * @param {Boolean} init - * @api private - */ - -SchemaBuffer.prototype.cast = function(value, doc, init) { - let ret; - if (SchemaType._isRef(this, value, doc, init)) { - // wait! we may need to cast this to a document - - if (value === null || value === undefined) { - return value; - } - - // lazy load - Document || (Document = require('./../document')); - - if (value instanceof Document) { - value.$__.wasPopulated = true; - return value; - } - - // setting a populated path - if (Buffer.isBuffer(value)) { - return value; - } else if (!utils.isObject(value)) { - throw new CastError('Buffer', value, this.path, null, this); - } - - // Handle the case where user directly sets a populated - // path to a plain object; cast to the Model used in - // the population query. - const path = doc.$__fullPath(this.path); - const owner = doc.ownerDocument ? doc.ownerDocument() : doc; - const pop = owner.populated(path, true); - ret = new pop.options[populateModelSymbol](value); - ret.$__.wasPopulated = true; - return ret; - } - - // documents - if (value && value._id) { - value = value._id; - } - - if (value && value.isMongooseBuffer) { - return value; - } - - if (Buffer.isBuffer(value)) { - if (!value || !value.isMongooseBuffer) { - value = new MongooseBuffer(value, [this.path, doc]); - if (this.options.subtype != null) { - value._subtype = this.options.subtype; - } - } - return value; - } - - if (value instanceof Binary) { - ret = new MongooseBuffer(value.value(true), [this.path, doc]); - if (typeof value.sub_type !== 'number') { - throw new CastError('Buffer', value, this.path, null, this); - } - ret._subtype = value.sub_type; - return ret; - } - - if (value === null) { - return value; - } - - - const type = typeof value; - if ( - type === 'string' || type === 'number' || Array.isArray(value) || - (type === 'object' && value.type === 'Buffer' && Array.isArray(value.data)) // gh-6863 - ) { - if (type === 'number') { - value = [value]; - } - ret = new MongooseBuffer(value, [this.path, doc]); - if (this.options.subtype != null) { - ret._subtype = this.options.subtype; - } - return ret; - } - - throw new CastError('Buffer', value, this.path, null, this); -}; - -/** - * Sets the default [subtype](https://studio3t.com/whats-new/best-practices-uuid-mongodb/) - * for this buffer. You can find a [list of allowed subtypes here](http://api.mongodb.com/python/current/api/bson/binary.html). - * - * ####Example: - * - * const s = new Schema({ uuid: { type: Buffer, subtype: 4 }); - * const M = db.model('M', s); - * const m = new M({ uuid: 'test string' }); - * m.uuid._subtype; // 4 - * - * @param {Number} subtype the default subtype - * @return {SchemaType} this - * @api public - */ - -SchemaBuffer.prototype.subtype = function(subtype) { - this.options.subtype = subtype; - return this; -}; - -/*! - * ignore - */ -function handleSingle(val) { - return this.castForQuery(val); -} - -SchemaBuffer.prototype.$conditionalHandlers = - utils.options(SchemaType.prototype.$conditionalHandlers, { - $bitsAllClear: handleBitwiseOperator, - $bitsAnyClear: handleBitwiseOperator, - $bitsAllSet: handleBitwiseOperator, - $bitsAnySet: handleBitwiseOperator, - $gt: handleSingle, - $gte: handleSingle, - $lt: handleSingle, - $lte: handleSingle - }); - -/** - * Casts contents for queries. - * - * @param {String} $conditional - * @param {any} [value] - * @api private - */ - -SchemaBuffer.prototype.castForQuery = function($conditional, val) { - let handler; - if (arguments.length === 2) { - handler = this.$conditionalHandlers[$conditional]; - if (!handler) { - throw new Error('Can\'t use ' + $conditional + ' with Buffer.'); - } - return handler.call(this, val); - } - val = $conditional; - const casted = this._castForQuery(val); - return casted ? casted.toObject({ transform: false, virtuals: false }) : casted; -}; - -/*! - * Module exports. - */ - -module.exports = SchemaBuffer; diff --git a/node_modules/mongoose/lib/schema/date.js b/node_modules/mongoose/lib/schema/date.js deleted file mode 100644 index 4b9ad1c..0000000 --- a/node_modules/mongoose/lib/schema/date.js +++ /dev/null @@ -1,390 +0,0 @@ -/*! - * Module requirements. - */ - -'use strict'; - -const MongooseError = require('../error/index'); -const SchemaDateOptions = require('../options/SchemaDateOptions'); -const SchemaType = require('../schematype'); -const castDate = require('../cast/date'); -const utils = require('../utils'); - -const CastError = SchemaType.CastError; - -/** - * Date SchemaType constructor. - * - * @param {String} key - * @param {Object} options - * @inherits SchemaType - * @api public - */ - -function SchemaDate(key, options) { - SchemaType.call(this, key, options, 'Date'); -} - -/** - * This schema type's name, to defend against minifiers that mangle - * function names. - * - * @api public - */ -SchemaDate.schemaName = 'Date'; - -SchemaDate.defaultOptions = {}; - -/*! - * Inherits from SchemaType. - */ -SchemaDate.prototype = Object.create(SchemaType.prototype); -SchemaDate.prototype.constructor = SchemaDate; -SchemaDate.prototype.OptionsConstructor = SchemaDateOptions; - -/*! - * ignore - */ - -SchemaDate._cast = castDate; - -/** - * Sets a default option for all Date instances. - * - * ####Example: - * - * // Make all dates have `required` of true by default. - * mongoose.Schema.Date.set('required', true); - * - * const User = mongoose.model('User', new Schema({ test: Date })); - * new User({ }).validateSync().errors.test.message; // Path `test` is required. - * - * @param {String} option - The option you'd like to set the value for - * @param {*} value - value for option - * @return {undefined} - * @function set - * @static - * @api public - */ - -SchemaDate.set = SchemaType.set; - -/** - * Get/set the function used to cast arbitrary values to dates. - * - * ####Example: - * - * // Mongoose converts empty string '' into `null` for date types. You - * // can create a custom caster to disable it. - * const original = mongoose.Schema.Types.Date.cast(); - * mongoose.Schema.Types.Date.cast(v => { - * assert.ok(v !== ''); - * return original(v); - * }); - * - * // Or disable casting entirely - * mongoose.Schema.Types.Date.cast(false); - * - * @param {Function} caster - * @return {Function} - * @function get - * @static - * @api public - */ - -SchemaDate.cast = function cast(caster) { - if (arguments.length === 0) { - return this._cast; - } - if (caster === false) { - caster = v => { - if (v != null && !(v instanceof Date)) { - throw new Error(); - } - return v; - }; - } - this._cast = caster; - - return this._cast; -}; - -/** - * Declares a TTL index (rounded to the nearest second) for _Date_ types only. - * - * This sets the `expireAfterSeconds` index option available in MongoDB >= 2.1.2. - * This index type is only compatible with Date types. - * - * ####Example: - * - * // expire in 24 hours - * new Schema({ createdAt: { type: Date, expires: 60*60*24 }}); - * - * `expires` utilizes the `ms` module from [guille](https://github.com/guille/) allowing us to use a friendlier syntax: - * - * ####Example: - * - * // expire in 24 hours - * new Schema({ createdAt: { type: Date, expires: '24h' }}); - * - * // expire in 1.5 hours - * new Schema({ createdAt: { type: Date, expires: '1.5h' }}); - * - * // expire in 7 days - * const schema = new Schema({ createdAt: Date }); - * schema.path('createdAt').expires('7d'); - * - * @param {Number|String} when - * @added 3.0.0 - * @return {SchemaType} this - * @api public - */ - -SchemaDate.prototype.expires = function(when) { - if (!this._index || this._index.constructor.name !== 'Object') { - this._index = {}; - } - - this._index.expires = when; - utils.expires(this._index); - return this; -}; - -/*! - * ignore - */ - -SchemaDate._checkRequired = v => v instanceof Date; - -/** - * Override the function the required validator uses to check whether a string - * passes the `required` check. - * - * ####Example: - * - * // Allow empty strings to pass `required` check - * mongoose.Schema.Types.String.checkRequired(v => v != null); - * - * const M = mongoose.model({ str: { type: String, required: true } }); - * new M({ str: '' }).validateSync(); // `null`, validation passes! - * - * @param {Function} fn - * @return {Function} - * @function checkRequired - * @static - * @api public - */ - -SchemaDate.checkRequired = SchemaType.checkRequired; - -/** - * Check if the given value satisfies a required validator. To satisfy - * a required validator, the given value must be an instance of `Date`. - * - * @param {Any} value - * @param {Document} doc - * @return {Boolean} - * @api public - */ - -SchemaDate.prototype.checkRequired = function(value, doc) { - if (SchemaType._isRef(this, value, doc, true)) { - return !!value; - } - - // `require('util').inherits()` does **not** copy static properties, and - // plugins like mongoose-float use `inherits()` for pre-ES6. - const _checkRequired = typeof this.constructor.checkRequired == 'function' ? - this.constructor.checkRequired() : - SchemaDate.checkRequired(); - return _checkRequired(value); -}; - -/** - * Sets a minimum date validator. - * - * ####Example: - * - * const s = new Schema({ d: { type: Date, min: Date('1970-01-01') }) - * const M = db.model('M', s) - * const m = new M({ d: Date('1969-12-31') }) - * m.save(function (err) { - * console.error(err) // validator error - * m.d = Date('2014-12-08'); - * m.save() // success - * }) - * - * // custom error messages - * // We can also use the special {MIN} token which will be replaced with the invalid value - * const min = [Date('1970-01-01'), 'The value of path `{PATH}` ({VALUE}) is beneath the limit ({MIN}).']; - * const schema = new Schema({ d: { type: Date, min: min }) - * const M = mongoose.model('M', schema); - * const s= new M({ d: Date('1969-12-31') }); - * s.validate(function (err) { - * console.log(String(err)) // ValidationError: The value of path `d` (1969-12-31) is before the limit (1970-01-01). - * }) - * - * @param {Date} value minimum date - * @param {String} [message] optional custom error message - * @return {SchemaType} this - * @see Customized Error Messages #error_messages_MongooseError-messages - * @api public - */ - -SchemaDate.prototype.min = function(value, message) { - if (this.minValidator) { - this.validators = this.validators.filter(function(v) { - return v.validator !== this.minValidator; - }, this); - } - - if (value) { - let msg = message || MongooseError.messages.Date.min; - if (typeof msg === 'string') { - msg = msg.replace(/{MIN}/, (value === Date.now ? 'Date.now()' : value.toString())); - } - const _this = this; - this.validators.push({ - validator: this.minValidator = function(val) { - let _value = value; - if (typeof value === 'function' && value !== Date.now) { - _value = _value.call(this); - } - const min = (_value === Date.now ? _value() : _this.cast(_value)); - return val === null || val.valueOf() >= min.valueOf(); - }, - message: msg, - type: 'min', - min: value - }); - } - - return this; -}; - -/** - * Sets a maximum date validator. - * - * ####Example: - * - * const s = new Schema({ d: { type: Date, max: Date('2014-01-01') }) - * const M = db.model('M', s) - * const m = new M({ d: Date('2014-12-08') }) - * m.save(function (err) { - * console.error(err) // validator error - * m.d = Date('2013-12-31'); - * m.save() // success - * }) - * - * // custom error messages - * // We can also use the special {MAX} token which will be replaced with the invalid value - * const max = [Date('2014-01-01'), 'The value of path `{PATH}` ({VALUE}) exceeds the limit ({MAX}).']; - * const schema = new Schema({ d: { type: Date, max: max }) - * const M = mongoose.model('M', schema); - * const s= new M({ d: Date('2014-12-08') }); - * s.validate(function (err) { - * console.log(String(err)) // ValidationError: The value of path `d` (2014-12-08) exceeds the limit (2014-01-01). - * }) - * - * @param {Date} maximum date - * @param {String} [message] optional custom error message - * @return {SchemaType} this - * @see Customized Error Messages #error_messages_MongooseError-messages - * @api public - */ - -SchemaDate.prototype.max = function(value, message) { - if (this.maxValidator) { - this.validators = this.validators.filter(function(v) { - return v.validator !== this.maxValidator; - }, this); - } - - if (value) { - let msg = message || MongooseError.messages.Date.max; - if (typeof msg === 'string') { - msg = msg.replace(/{MAX}/, (value === Date.now ? 'Date.now()' : value.toString())); - } - const _this = this; - this.validators.push({ - validator: this.maxValidator = function(val) { - let _value = value; - if (typeof _value === 'function' && _value !== Date.now) { - _value = _value.call(this); - } - const max = (_value === Date.now ? _value() : _this.cast(_value)); - return val === null || val.valueOf() <= max.valueOf(); - }, - message: msg, - type: 'max', - max: value - }); - } - - return this; -}; - -/** - * Casts to date - * - * @param {Object} value to cast - * @api private - */ - -SchemaDate.prototype.cast = function(value) { - const castDate = typeof this.constructor.cast === 'function' ? - this.constructor.cast() : - SchemaDate.cast(); - try { - return castDate(value); - } catch (error) { - throw new CastError('date', value, this.path, error, this); - } -}; - -/*! - * Date Query casting. - * - * @api private - */ - -function handleSingle(val) { - return this.cast(val); -} - -SchemaDate.prototype.$conditionalHandlers = - utils.options(SchemaType.prototype.$conditionalHandlers, { - $gt: handleSingle, - $gte: handleSingle, - $lt: handleSingle, - $lte: handleSingle - }); - - -/** - * Casts contents for queries. - * - * @param {String} $conditional - * @param {any} [value] - * @api private - */ - -SchemaDate.prototype.castForQuery = function($conditional, val) { - if (arguments.length !== 2) { - return this._castForQuery($conditional); - } - - const handler = this.$conditionalHandlers[$conditional]; - - if (!handler) { - throw new Error('Can\'t use ' + $conditional + ' with Date.'); - } - - return handler.call(this, val); -}; - -/*! - * Module exports. - */ - -module.exports = SchemaDate; diff --git a/node_modules/mongoose/lib/schema/decimal128.js b/node_modules/mongoose/lib/schema/decimal128.js deleted file mode 100644 index ca9bcb4..0000000 --- a/node_modules/mongoose/lib/schema/decimal128.js +++ /dev/null @@ -1,235 +0,0 @@ -/*! - * Module dependencies. - */ - -'use strict'; - -const SchemaType = require('../schematype'); -const CastError = SchemaType.CastError; -const Decimal128Type = require('../types/decimal128'); -const castDecimal128 = require('../cast/decimal128'); -const utils = require('../utils'); - -const populateModelSymbol = require('../helpers/symbols').populateModelSymbol; - -let Document; - -/** - * Decimal128 SchemaType constructor. - * - * @param {String} key - * @param {Object} options - * @inherits SchemaType - * @api public - */ - -function Decimal128(key, options) { - SchemaType.call(this, key, options, 'Decimal128'); -} - -/** - * This schema type's name, to defend against minifiers that mangle - * function names. - * - * @api public - */ -Decimal128.schemaName = 'Decimal128'; - -Decimal128.defaultOptions = {}; - -/*! - * Inherits from SchemaType. - */ -Decimal128.prototype = Object.create(SchemaType.prototype); -Decimal128.prototype.constructor = Decimal128; - -/*! - * ignore - */ - -Decimal128._cast = castDecimal128; - -/** - * Sets a default option for all Decimal128 instances. - * - * ####Example: - * - * // Make all decimal 128s have `required` of true by default. - * mongoose.Schema.Decimal128.set('required', true); - * - * const User = mongoose.model('User', new Schema({ test: mongoose.Decimal128 })); - * new User({ }).validateSync().errors.test.message; // Path `test` is required. - * - * @param {String} option - The option you'd like to set the value for - * @param {*} value - value for option - * @return {undefined} - * @function set - * @static - * @api public - */ - -Decimal128.set = SchemaType.set; - -/** - * Get/set the function used to cast arbitrary values to decimals. - * - * ####Example: - * - * // Make Mongoose only refuse to cast numbers as decimal128 - * const original = mongoose.Schema.Types.Decimal128.cast(); - * mongoose.Decimal128.cast(v => { - * assert.ok(typeof v !== 'number'); - * return original(v); - * }); - * - * // Or disable casting entirely - * mongoose.Decimal128.cast(false); - * - * @param {Function} [caster] - * @return {Function} - * @function get - * @static - * @api public - */ - -Decimal128.cast = function cast(caster) { - if (arguments.length === 0) { - return this._cast; - } - if (caster === false) { - caster = v => { - if (v != null && !(v instanceof Decimal128Type)) { - throw new Error(); - } - return v; - }; - } - this._cast = caster; - - return this._cast; -}; - -/*! - * ignore - */ - -Decimal128._checkRequired = v => v instanceof Decimal128Type; - -/** - * Override the function the required validator uses to check whether a string - * passes the `required` check. - * - * @param {Function} fn - * @return {Function} - * @function checkRequired - * @static - * @api public - */ - -Decimal128.checkRequired = SchemaType.checkRequired; - -/** - * Check if the given value satisfies a required validator. - * - * @param {Any} value - * @param {Document} doc - * @return {Boolean} - * @api public - */ - -Decimal128.prototype.checkRequired = function checkRequired(value, doc) { - if (SchemaType._isRef(this, value, doc, true)) { - return !!value; - } - - // `require('util').inherits()` does **not** copy static properties, and - // plugins like mongoose-float use `inherits()` for pre-ES6. - const _checkRequired = typeof this.constructor.checkRequired == 'function' ? - this.constructor.checkRequired() : - Decimal128.checkRequired(); - - return _checkRequired(value); -}; - -/** - * Casts to Decimal128 - * - * @param {Object} value - * @param {Object} doc - * @param {Boolean} init whether this is an initialization cast - * @api private - */ - -Decimal128.prototype.cast = function(value, doc, init) { - if (SchemaType._isRef(this, value, doc, init)) { - // wait! we may need to cast this to a document - - if (value === null || value === undefined) { - return value; - } - - // lazy load - Document || (Document = require('./../document')); - - if (value instanceof Document) { - value.$__.wasPopulated = true; - return value; - } - - // setting a populated path - if (value instanceof Decimal128Type) { - return value; - } else if (Buffer.isBuffer(value) || !utils.isObject(value)) { - throw new CastError('Decimal128', value, this.path, null, this); - } - - // Handle the case where user directly sets a populated - // path to a plain object; cast to the Model used in - // the population query. - const path = doc.$__fullPath(this.path); - const owner = doc.ownerDocument ? doc.ownerDocument() : doc; - const pop = owner.populated(path, true); - let ret = value; - if (!doc.$__.populated || - !doc.$__.populated[path] || - !doc.$__.populated[path].options || - !doc.$__.populated[path].options.options || - !doc.$__.populated[path].options.options.lean) { - ret = new pop.options[populateModelSymbol](value); - ret.$__.wasPopulated = true; - } - - return ret; - } - - const castDecimal128 = typeof this.constructor.cast === 'function' ? - this.constructor.cast() : - Decimal128.cast(); - try { - return castDecimal128(value); - } catch (error) { - throw new CastError('Decimal128', value, this.path, error, this); - } -}; - -/*! - * ignore - */ - -function handleSingle(val) { - return this.cast(val); -} - -Decimal128.prototype.$conditionalHandlers = - utils.options(SchemaType.prototype.$conditionalHandlers, { - $gt: handleSingle, - $gte: handleSingle, - $lt: handleSingle, - $lte: handleSingle - }); - -/*! - * Module exports. - */ - -module.exports = Decimal128; diff --git a/node_modules/mongoose/lib/schema/documentarray.js b/node_modules/mongoose/lib/schema/documentarray.js deleted file mode 100644 index ac88560..0000000 --- a/node_modules/mongoose/lib/schema/documentarray.js +++ /dev/null @@ -1,546 +0,0 @@ -'use strict'; - -/*! - * Module dependencies. - */ - -const ArrayType = require('./array'); -const CastError = require('../error/cast'); -const EventEmitter = require('events').EventEmitter; -const SchemaDocumentArrayOptions = - require('../options/SchemaDocumentArrayOptions'); -const SchemaType = require('../schematype'); -const ValidationError = require('../error/validation'); -const discriminator = require('../helpers/model/discriminator'); -const get = require('../helpers/get'); -const handleIdOption = require('../helpers/schema/handleIdOption'); -const util = require('util'); -const utils = require('../utils'); -const getConstructor = require('../helpers/discriminator/getConstructor'); - -const arrayPathSymbol = require('../helpers/symbols').arrayPathSymbol; -const documentArrayParent = require('../helpers/symbols').documentArrayParent; - -let MongooseDocumentArray; -let Subdocument; - -/** - * SubdocsArray SchemaType constructor - * - * @param {String} key - * @param {Schema} schema - * @param {Object} options - * @inherits SchemaArray - * @api public - */ - -function DocumentArrayPath(key, schema, options, schemaOptions) { - if (schemaOptions != null && schemaOptions._id != null) { - schema = handleIdOption(schema, schemaOptions); - } else if (options != null && options._id != null) { - schema = handleIdOption(schema, options); - } - - const EmbeddedDocument = _createConstructor(schema, options); - EmbeddedDocument.prototype.$basePath = key; - - ArrayType.call(this, key, EmbeddedDocument, options); - - this.schema = schema; - this.schemaOptions = schemaOptions || {}; - this.$isMongooseDocumentArray = true; - this.Constructor = EmbeddedDocument; - - EmbeddedDocument.base = schema.base; - - const fn = this.defaultValue; - - if (!('defaultValue' in this) || fn !== void 0) { - this.default(function() { - let arr = fn.call(this); - if (!Array.isArray(arr)) { - arr = [arr]; - } - // Leave it up to `cast()` to convert this to a documentarray - return arr; - }); - } - - const parentSchemaType = this; - this.$embeddedSchemaType = new SchemaType(key + '.$', { - required: get(this, 'schemaOptions.required', false) - }); - this.$embeddedSchemaType.cast = function(value, doc, init) { - return parentSchemaType.cast(value, doc, init)[0]; - }; - this.$embeddedSchemaType.$isMongooseDocumentArrayElement = true; - this.$embeddedSchemaType.caster = this.Constructor; - this.$embeddedSchemaType.schema = this.schema; -} - -/** - * This schema type's name, to defend against minifiers that mangle - * function names. - * - * @api public - */ -DocumentArrayPath.schemaName = 'DocumentArray'; - -/** - * Options for all document arrays. - * - * - `castNonArrays`: `true` by default. If `false`, Mongoose will throw a CastError when a value isn't an array. If `true`, Mongoose will wrap the provided value in an array before casting. - * - * @api public - */ - -DocumentArrayPath.options = { castNonArrays: true }; - -/*! - * Inherits from ArrayType. - */ -DocumentArrayPath.prototype = Object.create(ArrayType.prototype); -DocumentArrayPath.prototype.constructor = DocumentArrayPath; -DocumentArrayPath.prototype.OptionsConstructor = SchemaDocumentArrayOptions; - -/*! - * Ignore - */ - -function _createConstructor(schema, options, baseClass) { - Subdocument || (Subdocument = require('../types/embedded')); - - // compile an embedded document for this schema - function EmbeddedDocument() { - Subdocument.apply(this, arguments); - - this.$session(this.ownerDocument().$session()); - } - - const proto = baseClass != null ? baseClass.prototype : Subdocument.prototype; - EmbeddedDocument.prototype = Object.create(proto); - EmbeddedDocument.prototype.$__setSchema(schema); - EmbeddedDocument.schema = schema; - EmbeddedDocument.prototype.constructor = EmbeddedDocument; - EmbeddedDocument.$isArraySubdocument = true; - EmbeddedDocument.events = new EventEmitter(); - - // apply methods - for (const i in schema.methods) { - EmbeddedDocument.prototype[i] = schema.methods[i]; - } - - // apply statics - for (const i in schema.statics) { - EmbeddedDocument[i] = schema.statics[i]; - } - - for (const i in EventEmitter.prototype) { - EmbeddedDocument[i] = EventEmitter.prototype[i]; - } - - EmbeddedDocument.options = options; - - return EmbeddedDocument; -} - -/** - * Adds a discriminator to this document array. - * - * ####Example: - * const shapeSchema = Schema({ name: String }, { discriminatorKey: 'kind' }); - * const schema = Schema({ shapes: [shapeSchema] }); - * - * const docArrayPath = parentSchema.path('shapes'); - * docArrayPath.discriminator('Circle', Schema({ radius: Number })); - * - * @param {String} name - * @param {Schema} schema fields to add to the schema for instances of this sub-class - * @param {String} [value] the string stored in the `discriminatorKey` property. If not specified, Mongoose uses the `name` parameter. - * @see discriminators /docs/discriminators.html - * @return {Function} the constructor Mongoose will use for creating instances of this discriminator model - * @api public - */ - -DocumentArrayPath.prototype.discriminator = function(name, schema, tiedValue) { - if (typeof name === 'function') { - name = utils.getFunctionName(name); - } - - schema = discriminator(this.casterConstructor, name, schema, tiedValue); - - const EmbeddedDocument = _createConstructor(schema, null, this.casterConstructor); - EmbeddedDocument.baseCasterConstructor = this.casterConstructor; - - try { - Object.defineProperty(EmbeddedDocument, 'name', { - value: name - }); - } catch (error) { - // Ignore error, only happens on old versions of node - } - - this.casterConstructor.discriminators[name] = EmbeddedDocument; - - return this.casterConstructor.discriminators[name]; -}; - -/** - * Performs local validations first, then validations on each embedded doc - * - * @api private - */ - -DocumentArrayPath.prototype.doValidate = function(array, fn, scope, options) { - // lazy load - MongooseDocumentArray || (MongooseDocumentArray = require('../types/documentarray')); - - const _this = this; - try { - SchemaType.prototype.doValidate.call(this, array, cb, scope); - } catch (err) { - err.$isArrayValidatorError = true; - return fn(err); - } - - function cb(err) { - if (err) { - err.$isArrayValidatorError = true; - return fn(err); - } - - let count = array && array.length; - let error; - - if (!count) { - return fn(); - } - if (options && options.updateValidator) { - return fn(); - } - if (!array.isMongooseDocumentArray) { - array = new MongooseDocumentArray(array, _this.path, scope); - } - - // handle sparse arrays, do not use array.forEach which does not - // iterate over sparse elements yet reports array.length including - // them :( - - function callback(err) { - if (err != null) { - error = err; - if (!(error instanceof ValidationError)) { - error.$isArrayValidatorError = true; - } - } - --count || fn(error); - } - - for (let i = 0, len = count; i < len; ++i) { - // sidestep sparse entries - let doc = array[i]; - if (doc == null) { - --count || fn(error); - continue; - } - - // If you set the array index directly, the doc might not yet be - // a full fledged mongoose subdoc, so make it into one. - if (!(doc instanceof Subdocument)) { - const Constructor = getConstructor(_this.casterConstructor, array[i]); - doc = array[i] = new Constructor(doc, array, undefined, undefined, i); - } - - doc.$__validate(callback); - } - } -}; - -/** - * Performs local validations first, then validations on each embedded doc. - * - * ####Note: - * - * This method ignores the asynchronous validators. - * - * @return {MongooseError|undefined} - * @api private - */ - -DocumentArrayPath.prototype.doValidateSync = function(array, scope) { - const schemaTypeError = SchemaType.prototype.doValidateSync.call(this, array, scope); - if (schemaTypeError != null) { - schemaTypeError.$isArrayValidatorError = true; - return schemaTypeError; - } - - const count = array && array.length; - let resultError = null; - - if (!count) { - return; - } - - // handle sparse arrays, do not use array.forEach which does not - // iterate over sparse elements yet reports array.length including - // them :( - - for (let i = 0, len = count; i < len; ++i) { - // sidestep sparse entries - let doc = array[i]; - if (!doc) { - continue; - } - - // If you set the array index directly, the doc might not yet be - // a full fledged mongoose subdoc, so make it into one. - if (!(doc instanceof Subdocument)) { - const Constructor = getConstructor(this.casterConstructor, array[i]); - doc = array[i] = new Constructor(doc, array, undefined, undefined, i); - } - - const subdocValidateError = doc.validateSync(); - - if (subdocValidateError && resultError == null) { - resultError = subdocValidateError; - } - } - - return resultError; -}; - -/*! - * ignore - */ - -DocumentArrayPath.prototype.getDefault = function(scope) { - let ret = typeof this.defaultValue === 'function' - ? this.defaultValue.call(scope) - : this.defaultValue; - - if (ret == null) { - return ret; - } - - // lazy load - MongooseDocumentArray || (MongooseDocumentArray = require('../types/documentarray')); - - if (!Array.isArray(ret)) { - ret = [ret]; - } - - ret = new MongooseDocumentArray(ret, this.path, scope); - - for (let i = 0; i < ret.length; ++i) { - const Constructor = getConstructor(this.casterConstructor, ret[i]); - const _subdoc = new Constructor({}, ret, undefined, - undefined, i); - _subdoc.init(ret[i]); - _subdoc.isNew = true; - - // Make sure all paths in the subdoc are set to `default` instead - // of `init` since we used `init`. - Object.assign(_subdoc.$__.activePaths.default, _subdoc.$__.activePaths.init); - _subdoc.$__.activePaths.init = {}; - - ret[i] = _subdoc; - } - - return ret; -}; - -/** - * Casts contents - * - * @param {Object} value - * @param {Document} document that triggers the casting - * @api private - */ - -DocumentArrayPath.prototype.cast = function(value, doc, init, prev, options) { - // lazy load - MongooseDocumentArray || (MongooseDocumentArray = require('../types/documentarray')); - - // Skip casting if `value` is the same as the previous value, no need to cast. See gh-9266 - if (value != null && value[arrayPathSymbol] != null && value === prev) { - return value; - } - - let selected; - let subdoc; - const _opts = { transform: false, virtuals: false }; - options = options || {}; - - if (!Array.isArray(value)) { - if (!init && !DocumentArrayPath.options.castNonArrays) { - throw new CastError('DocumentArray', util.inspect(value), this.path, null, this); - } - // gh-2442 mark whole array as modified if we're initializing a doc from - // the db and the path isn't an array in the document - if (!!doc && init) { - doc.markModified(this.path); - } - return this.cast([value], doc, init, prev, options); - } - - if (!(value && value.isMongooseDocumentArray) && - !options.skipDocumentArrayCast) { - value = new MongooseDocumentArray(value, this.path, doc); - } else if (value && value.isMongooseDocumentArray) { - // We need to create a new array, otherwise change tracking will - // update the old doc (gh-4449) - value = new MongooseDocumentArray(value, this.path, doc); - } - - if (options.arrayPath != null) { - value[arrayPathSymbol] = options.arrayPath; - } - - const len = value.length; - const initDocumentOptions = { skipId: true, willInit: true }; - - for (let i = 0; i < len; ++i) { - if (!value[i]) { - continue; - } - - const Constructor = getConstructor(this.casterConstructor, value[i]); - - // Check if the document has a different schema (re gh-3701) - if ((value[i].$__) && - (!(value[i] instanceof Constructor) || value[i][documentArrayParent] !== doc)) { - value[i] = value[i].toObject({ - transform: false, - // Special case: if different model, but same schema, apply virtuals - // re: gh-7898 - virtuals: value[i].schema === Constructor.schema - }); - } - - if (value[i] instanceof Subdocument) { - // Might not have the correct index yet, so ensure it does. - if (value[i].__index == null) { - value[i].$setIndex(i); - } - } else if (value[i] != null) { - if (init) { - if (doc) { - selected || (selected = scopePaths(this, doc.$__.selected, init)); - } else { - selected = true; - } - - subdoc = new Constructor(null, value, initDocumentOptions, selected, i); - value[i] = subdoc.init(value[i]); - } else { - if (prev && typeof prev.id === 'function') { - subdoc = prev.id(value[i]._id); - } - - if (prev && subdoc && utils.deepEqual(subdoc.toObject(_opts), value[i])) { - // handle resetting doc with existing id and same data - subdoc.set(value[i]); - // if set() is hooked it will have no return value - // see gh-746 - value[i] = subdoc; - } else { - try { - subdoc = new Constructor(value[i], value, undefined, - undefined, i); - // if set() is hooked it will have no return value - // see gh-746 - value[i] = subdoc; - } catch (error) { - const valueInErrorMessage = util.inspect(value[i]); - throw new CastError('embedded', valueInErrorMessage, - value[arrayPathSymbol], error, this); - } - } - } - } - } - - return value; -}; - -/*! - * ignore - */ - -DocumentArrayPath.prototype.clone = function() { - const options = Object.assign({}, this.options); - const schematype = new this.constructor(this.path, this.schema, options, this.schemaOptions); - schematype.validators = this.validators.slice(); - if (this.requiredValidator !== undefined) { - schematype.requiredValidator = this.requiredValidator; - } - schematype.Constructor.discriminators = Object.assign({}, - this.Constructor.discriminators); - return schematype; -}; - -/*! - * Scopes paths selected in a query to this array. - * Necessary for proper default application of subdocument values. - * - * @param {DocumentArrayPath} array - the array to scope `fields` paths - * @param {Object|undefined} fields - the root fields selected in the query - * @param {Boolean|undefined} init - if we are being created part of a query result - */ - -function scopePaths(array, fields, init) { - if (!(init && fields)) { - return undefined; - } - - const path = array.path + '.'; - const keys = Object.keys(fields); - let i = keys.length; - const selected = {}; - let hasKeys; - let key; - let sub; - - while (i--) { - key = keys[i]; - if (key.startsWith(path)) { - sub = key.substring(path.length); - if (sub === '$') { - continue; - } - if (sub.startsWith('$.')) { - sub = sub.substr(2); - } - hasKeys || (hasKeys = true); - selected[sub] = fields[key]; - } - } - - return hasKeys && selected || undefined; -} - -/** - * Sets a default option for all DocumentArray instances. - * - * ####Example: - * - * // Make all numbers have option `min` equal to 0. - * mongoose.Schema.DocumentArray.set('_id', false); - * - * @param {String} option - The option you'd like to set the value for - * @param {*} value - value for option - * @return {undefined} - * @function set - * @static - * @api public - */ - -DocumentArrayPath.defaultOptions = {}; - -DocumentArrayPath.set = SchemaType.set; - -/*! - * Module exports. - */ - -module.exports = DocumentArrayPath; diff --git a/node_modules/mongoose/lib/schema/index.js b/node_modules/mongoose/lib/schema/index.js deleted file mode 100644 index f33b084..0000000 --- a/node_modules/mongoose/lib/schema/index.js +++ /dev/null @@ -1,37 +0,0 @@ - -/*! - * Module exports. - */ - -'use strict'; - -exports.String = require('./string'); - -exports.Number = require('./number'); - -exports.Boolean = require('./boolean'); - -exports.DocumentArray = require('./documentarray'); - -exports.Embedded = require('./SingleNestedPath'); - -exports.Array = require('./array'); - -exports.Buffer = require('./buffer'); - -exports.Date = require('./date'); - -exports.ObjectId = require('./objectid'); - -exports.Mixed = require('./mixed'); - -exports.Decimal128 = exports.Decimal = require('./decimal128'); - -exports.Map = require('./map'); - -// alias - -exports.Oid = exports.ObjectId; -exports.Object = exports.Mixed; -exports.Bool = exports.Boolean; -exports.ObjectID = exports.ObjectId; diff --git a/node_modules/mongoose/lib/schema/map.js b/node_modules/mongoose/lib/schema/map.js deleted file mode 100644 index 468faea..0000000 --- a/node_modules/mongoose/lib/schema/map.js +++ /dev/null @@ -1,62 +0,0 @@ -'use strict'; - -/*! - * ignore - */ - -const MongooseMap = require('../types/map'); -const SchemaMapOptions = require('../options/SchemaMapOptions'); -const SchemaType = require('../schematype'); -/*! - * ignore - */ - -class Map extends SchemaType { - constructor(key, options) { - super(key, options, 'Map'); - this.$isSchemaMap = true; - } - - set(option, value) { - return SchemaType.set(option, value); - } - - cast(val, doc, init) { - if (val instanceof MongooseMap) { - return val; - } - - if (init) { - const map = new MongooseMap({}, this.path, doc, this.$__schemaType); - - if (val instanceof global.Map) { - for (const key of val.keys()) { - map.$init(key, map.$__schemaType.cast(val.get(key), doc, true)); - } - } else { - for (const key of Object.keys(val)) { - map.$init(key, map.$__schemaType.cast(val[key], doc, true)); - } - } - - return map; - } - - return new MongooseMap(val, this.path, doc, this.$__schemaType); - } - - clone() { - const schematype = super.clone(); - - if (this.$__schemaType != null) { - schematype.$__schemaType = this.$__schemaType.clone(); - } - return schematype; - } -} - -Map.prototype.OptionsConstructor = SchemaMapOptions; - -Map.defaultOptions = {}; - -module.exports = Map; diff --git a/node_modules/mongoose/lib/schema/mixed.js b/node_modules/mongoose/lib/schema/mixed.js deleted file mode 100644 index 88e4db6..0000000 --- a/node_modules/mongoose/lib/schema/mixed.js +++ /dev/null @@ -1,128 +0,0 @@ -/*! - * Module dependencies. - */ - -'use strict'; - -const SchemaType = require('../schematype'); -const symbols = require('./symbols'); -const isObject = require('../helpers/isObject'); - -/** - * Mixed SchemaType constructor. - * - * @param {String} path - * @param {Object} options - * @inherits SchemaType - * @api public - */ - -function Mixed(path, options) { - if (options && options.default) { - const def = options.default; - if (Array.isArray(def) && def.length === 0) { - // make sure empty array defaults are handled - options.default = Array; - } else if (!options.shared && isObject(def) && Object.keys(def).length === 0) { - // prevent odd "shared" objects between documents - options.default = function() { - return {}; - }; - } - } - - SchemaType.call(this, path, options, 'Mixed'); - - this[symbols.schemaMixedSymbol] = true; -} - -/** - * This schema type's name, to defend against minifiers that mangle - * function names. - * - * @api public - */ -Mixed.schemaName = 'Mixed'; - -Mixed.defaultOptions = {}; - -/*! - * Inherits from SchemaType. - */ -Mixed.prototype = Object.create(SchemaType.prototype); -Mixed.prototype.constructor = Mixed; - -/** - * Attaches a getter for all Mixed paths. - * - * ####Example: - * - * // Hide the 'hidden' path - * mongoose.Schema.Mixed.get(v => Object.assign({}, v, { hidden: null })); - * - * const Model = mongoose.model('Test', new Schema({ test: {} })); - * new Model({ test: { hidden: 'Secret!' } }).test.hidden; // null - * - * @param {Function} getter - * @return {this} - * @function get - * @static - * @api public - */ - -Mixed.get = SchemaType.get; - -/** - * Sets a default option for all Mixed instances. - * - * ####Example: - * - * // Make all mixed instances have `required` of true by default. - * mongoose.Schema.Mixed.set('required', true); - * - * const User = mongoose.model('User', new Schema({ test: mongoose.Mixed })); - * new User({ }).validateSync().errors.test.message; // Path `test` is required. - * - * @param {String} option - The option you'd like to set the value for - * @param {*} value - value for option - * @return {undefined} - * @function set - * @static - * @api public - */ - -Mixed.set = SchemaType.set; - -/** - * Casts `val` for Mixed. - * - * _this is a no-op_ - * - * @param {Object} value to cast - * @api private - */ - -Mixed.prototype.cast = function(val) { - return val; -}; - -/** - * Casts contents for queries. - * - * @param {String} $cond - * @param {any} [val] - * @api private - */ - -Mixed.prototype.castForQuery = function($cond, val) { - if (arguments.length === 2) { - return val; - } - return $cond; -}; - -/*! - * Module exports. - */ - -module.exports = Mixed; diff --git a/node_modules/mongoose/lib/schema/number.js b/node_modules/mongoose/lib/schema/number.js deleted file mode 100644 index 719a1aa..0000000 --- a/node_modules/mongoose/lib/schema/number.js +++ /dev/null @@ -1,444 +0,0 @@ -'use strict'; - -/*! - * Module requirements. - */ - -const MongooseError = require('../error/index'); -const SchemaNumberOptions = require('../options/SchemaNumberOptions'); -const SchemaType = require('../schematype'); -const castNumber = require('../cast/number'); -const handleBitwiseOperator = require('./operators/bitwise'); -const utils = require('../utils'); - -const populateModelSymbol = require('../helpers/symbols').populateModelSymbol; - -const CastError = SchemaType.CastError; -let Document; - -/** - * Number SchemaType constructor. - * - * @param {String} key - * @param {Object} options - * @inherits SchemaType - * @api public - */ - -function SchemaNumber(key, options) { - SchemaType.call(this, key, options, 'Number'); -} - -/** - * Attaches a getter for all Number instances. - * - * ####Example: - * - * // Make all numbers round down - * mongoose.Number.get(function(v) { return Math.floor(v); }); - * - * const Model = mongoose.model('Test', new Schema({ test: Number })); - * new Model({ test: 3.14 }).test; // 3 - * - * @param {Function} getter - * @return {this} - * @function get - * @static - * @api public - */ - -SchemaNumber.get = SchemaType.get; - -/** - * Sets a default option for all Number instances. - * - * ####Example: - * - * // Make all numbers have option `min` equal to 0. - * mongoose.Schema.Number.set('min', 0); - * - * const Order = mongoose.model('Order', new Schema({ amount: Number })); - * new Order({ amount: -10 }).validateSync().errors.amount.message; // Path `amount` must be larger than 0. - * - * @param {String} option - The option you'd like to set the value for - * @param {*} value - value for option - * @return {undefined} - * @function set - * @static - * @api public - */ - -SchemaNumber.set = SchemaType.set; - -/*! - * ignore - */ - -SchemaNumber._cast = castNumber; - -/** - * Get/set the function used to cast arbitrary values to numbers. - * - * ####Example: - * - * // Make Mongoose cast empty strings '' to 0 for paths declared as numbers - * const original = mongoose.Number.cast(); - * mongoose.Number.cast(v => { - * if (v === '') { return 0; } - * return original(v); - * }); - * - * // Or disable casting entirely - * mongoose.Number.cast(false); - * - * @param {Function} caster - * @return {Function} - * @function get - * @static - * @api public - */ - -SchemaNumber.cast = function cast(caster) { - if (arguments.length === 0) { - return this._cast; - } - if (caster === false) { - caster = v => { - if (typeof v !== 'number') { - throw new Error(); - } - return v; - }; - } - this._cast = caster; - - return this._cast; -}; - -/** - * This schema type's name, to defend against minifiers that mangle - * function names. - * - * @api public - */ -SchemaNumber.schemaName = 'Number'; - -SchemaNumber.defaultOptions = {}; - -/*! - * Inherits from SchemaType. - */ -SchemaNumber.prototype = Object.create(SchemaType.prototype); -SchemaNumber.prototype.constructor = SchemaNumber; -SchemaNumber.prototype.OptionsConstructor = SchemaNumberOptions; - -/*! - * ignore - */ - -SchemaNumber._checkRequired = v => typeof v === 'number' || v instanceof Number; - -/** - * Override the function the required validator uses to check whether a string - * passes the `required` check. - * - * @param {Function} fn - * @return {Function} - * @function checkRequired - * @static - * @api public - */ - -SchemaNumber.checkRequired = SchemaType.checkRequired; - -/** - * Check if the given value satisfies a required validator. - * - * @param {Any} value - * @param {Document} doc - * @return {Boolean} - * @api public - */ - -SchemaNumber.prototype.checkRequired = function checkRequired(value, doc) { - if (SchemaType._isRef(this, value, doc, true)) { - return !!value; - } - - // `require('util').inherits()` does **not** copy static properties, and - // plugins like mongoose-float use `inherits()` for pre-ES6. - const _checkRequired = typeof this.constructor.checkRequired == 'function' ? - this.constructor.checkRequired() : - SchemaNumber.checkRequired(); - - return _checkRequired(value); -}; - -/** - * Sets a minimum number validator. - * - * ####Example: - * - * const s = new Schema({ n: { type: Number, min: 10 }) - * const M = db.model('M', s) - * const m = new M({ n: 9 }) - * m.save(function (err) { - * console.error(err) // validator error - * m.n = 10; - * m.save() // success - * }) - * - * // custom error messages - * // We can also use the special {MIN} token which will be replaced with the invalid value - * const min = [10, 'The value of path `{PATH}` ({VALUE}) is beneath the limit ({MIN}).']; - * const schema = new Schema({ n: { type: Number, min: min }) - * const M = mongoose.model('Measurement', schema); - * const s= new M({ n: 4 }); - * s.validate(function (err) { - * console.log(String(err)) // ValidationError: The value of path `n` (4) is beneath the limit (10). - * }) - * - * @param {Number} value minimum number - * @param {String} [message] optional custom error message - * @return {SchemaType} this - * @see Customized Error Messages #error_messages_MongooseError-messages - * @api public - */ - -SchemaNumber.prototype.min = function(value, message) { - if (this.minValidator) { - this.validators = this.validators.filter(function(v) { - return v.validator !== this.minValidator; - }, this); - } - - if (value !== null && value !== undefined) { - let msg = message || MongooseError.messages.Number.min; - msg = msg.replace(/{MIN}/, value); - this.validators.push({ - validator: this.minValidator = function(v) { - return v == null || v >= value; - }, - message: msg, - type: 'min', - min: value - }); - } - - return this; -}; - -/** - * Sets a maximum number validator. - * - * ####Example: - * - * const s = new Schema({ n: { type: Number, max: 10 }) - * const M = db.model('M', s) - * const m = new M({ n: 11 }) - * m.save(function (err) { - * console.error(err) // validator error - * m.n = 10; - * m.save() // success - * }) - * - * // custom error messages - * // We can also use the special {MAX} token which will be replaced with the invalid value - * const max = [10, 'The value of path `{PATH}` ({VALUE}) exceeds the limit ({MAX}).']; - * const schema = new Schema({ n: { type: Number, max: max }) - * const M = mongoose.model('Measurement', schema); - * const s= new M({ n: 4 }); - * s.validate(function (err) { - * console.log(String(err)) // ValidationError: The value of path `n` (4) exceeds the limit (10). - * }) - * - * @param {Number} maximum number - * @param {String} [message] optional custom error message - * @return {SchemaType} this - * @see Customized Error Messages #error_messages_MongooseError-messages - * @api public - */ - -SchemaNumber.prototype.max = function(value, message) { - if (this.maxValidator) { - this.validators = this.validators.filter(function(v) { - return v.validator !== this.maxValidator; - }, this); - } - - if (value !== null && value !== undefined) { - let msg = message || MongooseError.messages.Number.max; - msg = msg.replace(/{MAX}/, value); - this.validators.push({ - validator: this.maxValidator = function(v) { - return v == null || v <= value; - }, - message: msg, - type: 'max', - max: value - }); - } - - return this; -}; - -/** - * Sets a enum validator - * - * ####Example: - * - * const s = new Schema({ n: { type: Number, enum: [1, 2, 3] }); - * const M = db.model('M', s); - * - * const m = new M({ n: 4 }); - * await m.save(); // throws validation error - * - * m.n = 3; - * await m.save(); // succeeds - * - * @param {Array} values allowed values - * @param {String} [message] optional custom error message - * @return {SchemaType} this - * @see Customized Error Messages #error_messages_MongooseError-messages - * @api public - */ - -SchemaNumber.prototype.enum = function(values, message) { - if (this.enumValidator) { - this.validators = this.validators.filter(function(v) { - return v.validator !== this.enumValidator; - }, this); - } - - if (!Array.isArray(values)) { - values = Array.prototype.slice.call(arguments); - message = MongooseError.messages.Number.enum; - } - - message = message == null ? MongooseError.messages.Number.enum : message; - - this.enumValidator = v => v == null || values.indexOf(v) !== -1; - this.validators.push({ - validator: this.enumValidator, - message: message, - type: 'enum', - enumValues: values - }); - - return this; -}; - -/** - * Casts to number - * - * @param {Object} value value to cast - * @param {Document} doc document that triggers the casting - * @param {Boolean} init - * @api private - */ - -SchemaNumber.prototype.cast = function(value, doc, init) { - if (SchemaType._isRef(this, value, doc, init)) { - // wait! we may need to cast this to a document - - if (value === null || value === undefined) { - return value; - } - - // lazy load - Document || (Document = require('./../document')); - - if (value instanceof Document) { - value.$__.wasPopulated = true; - return value; - } - - // setting a populated path - if (typeof value === 'number') { - return value; - } else if (Buffer.isBuffer(value) || !utils.isObject(value)) { - throw new CastError('Number', value, this.path, null, this); - } - - // Handle the case where user directly sets a populated - // path to a plain object; cast to the Model used in - // the population query. - const path = doc.$__fullPath(this.path); - const owner = doc.ownerDocument ? doc.ownerDocument() : doc; - const pop = owner.populated(path, true); - const ret = new pop.options[populateModelSymbol](value); - ret.$__.wasPopulated = true; - return ret; - } - - const val = value && typeof value._id !== 'undefined' ? - value._id : // documents - value; - - const castNumber = typeof this.constructor.cast === 'function' ? - this.constructor.cast() : - SchemaNumber.cast(); - try { - return castNumber(val); - } catch (err) { - throw new CastError('Number', val, this.path, err, this); - } -}; - -/*! - * ignore - */ - -function handleSingle(val) { - return this.cast(val); -} - -function handleArray(val) { - const _this = this; - if (!Array.isArray(val)) { - return [this.cast(val)]; - } - return val.map(function(m) { - return _this.cast(m); - }); -} - -SchemaNumber.prototype.$conditionalHandlers = - utils.options(SchemaType.prototype.$conditionalHandlers, { - $bitsAllClear: handleBitwiseOperator, - $bitsAnyClear: handleBitwiseOperator, - $bitsAllSet: handleBitwiseOperator, - $bitsAnySet: handleBitwiseOperator, - $gt: handleSingle, - $gte: handleSingle, - $lt: handleSingle, - $lte: handleSingle, - $mod: handleArray - }); - -/** - * Casts contents for queries. - * - * @param {String} $conditional - * @param {any} [value] - * @api private - */ - -SchemaNumber.prototype.castForQuery = function($conditional, val) { - let handler; - if (arguments.length === 2) { - handler = this.$conditionalHandlers[$conditional]; - if (!handler) { - throw new CastError('number', val, this.path, null, this); - } - return handler.call(this, val); - } - val = this._castForQuery($conditional); - return val; -}; - -/*! - * Module exports. - */ - -module.exports = SchemaNumber; diff --git a/node_modules/mongoose/lib/schema/objectid.js b/node_modules/mongoose/lib/schema/objectid.js deleted file mode 100644 index ee27f2e..0000000 --- a/node_modules/mongoose/lib/schema/objectid.js +++ /dev/null @@ -1,319 +0,0 @@ -/*! - * Module dependencies. - */ - -'use strict'; - -const SchemaObjectIdOptions = require('../options/SchemaObjectIdOptions'); -const SchemaType = require('../schematype'); -const castObjectId = require('../cast/objectid'); -const oid = require('../types/objectid'); -const utils = require('../utils'); - -const populateModelSymbol = require('../helpers/symbols').populateModelSymbol; - -const CastError = SchemaType.CastError; -let Document; - -/** - * ObjectId SchemaType constructor. - * - * @param {String} key - * @param {Object} options - * @inherits SchemaType - * @api public - */ - -function ObjectId(key, options) { - const isKeyHexStr = typeof key === 'string' && key.length === 24 && /^[a-f0-9]+$/i.test(key); - const suppressWarning = options && options.suppressWarning; - if ((isKeyHexStr || typeof key === 'undefined') && !suppressWarning) { - console.warn('mongoose: To create a new ObjectId please try ' + - '`Mongoose.Types.ObjectId` instead of using ' + - '`Mongoose.Schema.ObjectId`. Set the `suppressWarning` option if ' + - 'you\'re trying to create a hex char path in your schema.'); - console.trace(); - } - SchemaType.call(this, key, options, 'ObjectID'); -} - -/** - * This schema type's name, to defend against minifiers that mangle - * function names. - * - * @api public - */ -ObjectId.schemaName = 'ObjectId'; - -ObjectId.defaultOptions = {}; - -/*! - * Inherits from SchemaType. - */ -ObjectId.prototype = Object.create(SchemaType.prototype); -ObjectId.prototype.constructor = ObjectId; -ObjectId.prototype.OptionsConstructor = SchemaObjectIdOptions; - -/** - * Attaches a getter for all ObjectId instances - * - * ####Example: - * - * // Always convert to string when getting an ObjectId - * mongoose.ObjectId.get(v => v.toString()); - * - * const Model = mongoose.model('Test', new Schema({})); - * typeof (new Model({})._id); // 'string' - * - * @param {Function} getter - * @return {this} - * @function get - * @static - * @api public - */ - -ObjectId.get = SchemaType.get; - -/** - * Sets a default option for all ObjectId instances. - * - * ####Example: - * - * // Make all object ids have option `required` equal to true. - * mongoose.Schema.ObjectId.set('required', true); - * - * const Order = mongoose.model('Order', new Schema({ userId: ObjectId })); - * new Order({ }).validateSync().errors.userId.message; // Path `userId` is required. - * - * @param {String} option - The option you'd like to set the value for - * @param {*} value - value for option - * @return {undefined} - * @function set - * @static - * @api public - */ - -ObjectId.set = SchemaType.set; - -/** - * Adds an auto-generated ObjectId default if turnOn is true. - * @param {Boolean} turnOn auto generated ObjectId defaults - * @api public - * @return {SchemaType} this - */ - -ObjectId.prototype.auto = function(turnOn) { - if (turnOn) { - this.default(defaultId); - this.set(resetId); - } - - return this; -}; - -/*! - * ignore - */ - -ObjectId._checkRequired = v => v instanceof oid; - -/*! - * ignore - */ - -ObjectId._cast = castObjectId; - -/** - * Get/set the function used to cast arbitrary values to objectids. - * - * ####Example: - * - * // Make Mongoose only try to cast length 24 strings. By default, any 12 - * // char string is a valid ObjectId. - * const original = mongoose.ObjectId.cast(); - * mongoose.ObjectId.cast(v => { - * assert.ok(typeof v !== 'string' || v.length === 24); - * return original(v); - * }); - * - * // Or disable casting entirely - * mongoose.ObjectId.cast(false); - * - * @param {Function} caster - * @return {Function} - * @function get - * @static - * @api public - */ - -ObjectId.cast = function cast(caster) { - if (arguments.length === 0) { - return this._cast; - } - if (caster === false) { - caster = v => { - if (!(v instanceof oid)) { - throw new Error(v + ' is not an instance of ObjectId'); - } - return v; - }; - } - this._cast = caster; - - return this._cast; -}; - -/** - * Override the function the required validator uses to check whether a string - * passes the `required` check. - * - * ####Example: - * - * // Allow empty strings to pass `required` check - * mongoose.Schema.Types.String.checkRequired(v => v != null); - * - * const M = mongoose.model({ str: { type: String, required: true } }); - * new M({ str: '' }).validateSync(); // `null`, validation passes! - * - * @param {Function} fn - * @return {Function} - * @function checkRequired - * @static - * @api public - */ - -ObjectId.checkRequired = SchemaType.checkRequired; - -/** - * Check if the given value satisfies a required validator. - * - * @param {Any} value - * @param {Document} doc - * @return {Boolean} - * @api public - */ - -ObjectId.prototype.checkRequired = function checkRequired(value, doc) { - if (SchemaType._isRef(this, value, doc, true)) { - return !!value; - } - - // `require('util').inherits()` does **not** copy static properties, and - // plugins like mongoose-float use `inherits()` for pre-ES6. - const _checkRequired = typeof this.constructor.checkRequired == 'function' ? - this.constructor.checkRequired() : - ObjectId.checkRequired(); - - return _checkRequired(value); -}; - -/** - * Casts to ObjectId - * - * @param {Object} value - * @param {Object} doc - * @param {Boolean} init whether this is an initialization cast - * @api private - */ - -ObjectId.prototype.cast = function(value, doc, init) { - if (SchemaType._isRef(this, value, doc, init)) { - // wait! we may need to cast this to a document - - if (value === null || value === undefined) { - return value; - } - - // lazy load - Document || (Document = require('./../document')); - - if (value instanceof Document) { - value.$__.wasPopulated = true; - return value; - } - - // setting a populated path - if (value instanceof oid) { - return value; - } else if ((value.constructor.name || '').toLowerCase() === 'objectid') { - return new oid(value.toHexString()); - } else if (Buffer.isBuffer(value) || !utils.isObject(value)) { - throw new CastError('ObjectId', value, this.path, null, this); - } - - // Handle the case where user directly sets a populated - // path to a plain object; cast to the Model used in - // the population query. - const path = doc.$__fullPath(this.path); - const owner = doc.ownerDocument ? doc.ownerDocument() : doc; - const pop = owner.populated(path, true); - let ret = value; - if (!doc.$__.populated || - !doc.$__.populated[path] || - !doc.$__.populated[path].options || - !doc.$__.populated[path].options.options || - !doc.$__.populated[path].options.options.lean) { - ret = new pop.options[populateModelSymbol](value); - ret.$__.wasPopulated = true; - } - - return ret; - } - - const castObjectId = typeof this.constructor.cast === 'function' ? - this.constructor.cast() : - ObjectId.cast(); - try { - return castObjectId(value); - } catch (error) { - throw new CastError('ObjectId', value, this.path, error, this); - } -}; - -/*! - * ignore - */ - -function handleSingle(val) { - return this.cast(val); -} - -ObjectId.prototype.$conditionalHandlers = - utils.options(SchemaType.prototype.$conditionalHandlers, { - $gt: handleSingle, - $gte: handleSingle, - $lt: handleSingle, - $lte: handleSingle - }); - -/*! - * ignore - */ - -function defaultId() { - return new oid(); -} - -defaultId.$runBeforeSetters = true; - -function resetId(v) { - Document || (Document = require('./../document')); - - if (this instanceof Document) { - if (v === void 0) { - const _v = new oid; - this.$__._id = _v; - return _v; - } - - this.$__._id = v; - } - - return v; -} - -/*! - * Module exports. - */ - -module.exports = ObjectId; diff --git a/node_modules/mongoose/lib/schema/operators/bitwise.js b/node_modules/mongoose/lib/schema/operators/bitwise.js deleted file mode 100644 index 07e18cd..0000000 --- a/node_modules/mongoose/lib/schema/operators/bitwise.js +++ /dev/null @@ -1,38 +0,0 @@ -/*! - * Module requirements. - */ - -'use strict'; - -const CastError = require('../../error/cast'); - -/*! - * ignore - */ - -function handleBitwiseOperator(val) { - const _this = this; - if (Array.isArray(val)) { - return val.map(function(v) { - return _castNumber(_this.path, v); - }); - } else if (Buffer.isBuffer(val)) { - return val; - } - // Assume trying to cast to number - return _castNumber(_this.path, val); -} - -/*! - * ignore - */ - -function _castNumber(path, num) { - const v = Number(num); - if (isNaN(v)) { - throw new CastError('number', num, path); - } - return v; -} - -module.exports = handleBitwiseOperator; diff --git a/node_modules/mongoose/lib/schema/operators/exists.js b/node_modules/mongoose/lib/schema/operators/exists.js deleted file mode 100644 index 916b4cb..0000000 --- a/node_modules/mongoose/lib/schema/operators/exists.js +++ /dev/null @@ -1,12 +0,0 @@ -'use strict'; - -const castBoolean = require('../../cast/boolean'); - -/*! - * ignore - */ - -module.exports = function(val) { - const path = this != null ? this.path : null; - return castBoolean(val, path); -}; diff --git a/node_modules/mongoose/lib/schema/operators/geospatial.js b/node_modules/mongoose/lib/schema/operators/geospatial.js deleted file mode 100644 index 80a6052..0000000 --- a/node_modules/mongoose/lib/schema/operators/geospatial.js +++ /dev/null @@ -1,107 +0,0 @@ -/*! - * Module requirements. - */ - -'use strict'; - -const castArraysOfNumbers = require('./helpers').castArraysOfNumbers; -const castToNumber = require('./helpers').castToNumber; - -/*! - * ignore - */ - -exports.cast$geoIntersects = cast$geoIntersects; -exports.cast$near = cast$near; -exports.cast$within = cast$within; - -function cast$near(val) { - const SchemaArray = require('../array'); - - if (Array.isArray(val)) { - castArraysOfNumbers(val, this); - return val; - } - - _castMinMaxDistance(this, val); - - if (val && val.$geometry) { - return cast$geometry(val, this); - } - - if (!Array.isArray(val)) { - throw new TypeError('$near must be either an array or an object ' + - 'with a $geometry property'); - } - - return SchemaArray.prototype.castForQuery.call(this, val); -} - -function cast$geometry(val, self) { - switch (val.$geometry.type) { - case 'Polygon': - case 'LineString': - case 'Point': - castArraysOfNumbers(val.$geometry.coordinates, self); - break; - default: - // ignore unknowns - break; - } - - _castMinMaxDistance(self, val); - - return val; -} - -function cast$within(val) { - _castMinMaxDistance(this, val); - - if (val.$box || val.$polygon) { - const type = val.$box ? '$box' : '$polygon'; - val[type].forEach(arr => { - if (!Array.isArray(arr)) { - const msg = 'Invalid $within $box argument. ' - + 'Expected an array, received ' + arr; - throw new TypeError(msg); - } - arr.forEach((v, i) => { - arr[i] = castToNumber.call(this, v); - }); - }); - } else if (val.$center || val.$centerSphere) { - const type = val.$center ? '$center' : '$centerSphere'; - val[type].forEach((item, i) => { - if (Array.isArray(item)) { - item.forEach((v, j) => { - item[j] = castToNumber.call(this, v); - }); - } else { - val[type][i] = castToNumber.call(this, item); - } - }); - } else if (val.$geometry) { - cast$geometry(val, this); - } - - return val; -} - -function cast$geoIntersects(val) { - const geo = val.$geometry; - if (!geo) { - return; - } - - cast$geometry(val, this); - return val; -} - -function _castMinMaxDistance(self, val) { - if (val.$maxDistance) { - val.$maxDistance = castToNumber.call(self, val.$maxDistance); - } - if (val.$minDistance) { - val.$minDistance = castToNumber.call(self, val.$minDistance); - } -} diff --git a/node_modules/mongoose/lib/schema/operators/helpers.js b/node_modules/mongoose/lib/schema/operators/helpers.js deleted file mode 100644 index a17951c..0000000 --- a/node_modules/mongoose/lib/schema/operators/helpers.js +++ /dev/null @@ -1,32 +0,0 @@ -'use strict'; - -/*! - * Module requirements. - */ - -const SchemaNumber = require('../number'); - -/*! - * @ignore - */ - -exports.castToNumber = castToNumber; -exports.castArraysOfNumbers = castArraysOfNumbers; - -/*! - * @ignore - */ - -function castToNumber(val) { - return SchemaNumber.cast()(val); -} - -function castArraysOfNumbers(arr, self) { - arr.forEach(function(v, i) { - if (Array.isArray(v)) { - castArraysOfNumbers(v, self); - } else { - arr[i] = castToNumber.call(self, v); - } - }); -} diff --git a/node_modules/mongoose/lib/schema/operators/text.js b/node_modules/mongoose/lib/schema/operators/text.js deleted file mode 100644 index 4b95916..0000000 --- a/node_modules/mongoose/lib/schema/operators/text.js +++ /dev/null @@ -1,39 +0,0 @@ -'use strict'; - -const CastError = require('../../error/cast'); -const castBoolean = require('../../cast/boolean'); -const castString = require('../../cast/string'); - -/*! - * Casts val to an object suitable for `$text`. Throws an error if the object - * can't be casted. - * - * @param {Any} val value to cast - * @param {String} [path] path to associate with any errors that occured - * @return {Object} casted object - * @see https://docs.mongodb.com/manual/reference/operator/query/text/ - * @api private - */ - -module.exports = function(val, path) { - if (val == null || typeof val !== 'object') { - throw new CastError('$text', val, path); - } - - if (val.$search != null) { - val.$search = castString(val.$search, path + '.$search'); - } - if (val.$language != null) { - val.$language = castString(val.$language, path + '.$language'); - } - if (val.$caseSensitive != null) { - val.$caseSensitive = castBoolean(val.$caseSensitive, - path + '.$castSensitive'); - } - if (val.$diacriticSensitive != null) { - val.$diacriticSensitive = castBoolean(val.$diacriticSensitive, - path + '.$diacriticSensitive'); - } - - return val; -}; diff --git a/node_modules/mongoose/lib/schema/operators/type.js b/node_modules/mongoose/lib/schema/operators/type.js deleted file mode 100644 index c8e391a..0000000 --- a/node_modules/mongoose/lib/schema/operators/type.js +++ /dev/null @@ -1,13 +0,0 @@ -'use strict'; - -/*! - * ignore - */ - -module.exports = function(val) { - if (typeof val !== 'number' && typeof val !== 'string') { - throw new Error('$type parameter must be number or string'); - } - - return val; -}; diff --git a/node_modules/mongoose/lib/schema/string.js b/node_modules/mongoose/lib/schema/string.js deleted file mode 100644 index a3bfaf4..0000000 --- a/node_modules/mongoose/lib/schema/string.js +++ /dev/null @@ -1,679 +0,0 @@ -'use strict'; - -/*! - * Module dependencies. - */ - -const SchemaType = require('../schematype'); -const MongooseError = require('../error/index'); -const SchemaStringOptions = require('../options/SchemaStringOptions'); -const castString = require('../cast/string'); -const utils = require('../utils'); - -const populateModelSymbol = require('../helpers/symbols').populateModelSymbol; - -const CastError = SchemaType.CastError; -let Document; - -/** - * String SchemaType constructor. - * - * @param {String} key - * @param {Object} options - * @inherits SchemaType - * @api public - */ - -function SchemaString(key, options) { - this.enumValues = []; - this.regExp = null; - SchemaType.call(this, key, options, 'String'); -} - -/** - * This schema type's name, to defend against minifiers that mangle - * function names. - * - * @api public - */ -SchemaString.schemaName = 'String'; - -SchemaString.defaultOptions = {}; - -/*! - * Inherits from SchemaType. - */ -SchemaString.prototype = Object.create(SchemaType.prototype); -SchemaString.prototype.constructor = SchemaString; -Object.defineProperty(SchemaString.prototype, 'OptionsConstructor', { - configurable: false, - enumerable: false, - writable: false, - value: SchemaStringOptions -}); - -/*! - * ignore - */ - -SchemaString._cast = castString; - -/** - * Get/set the function used to cast arbitrary values to strings. - * - * ####Example: - * - * // Throw an error if you pass in an object. Normally, Mongoose allows - * // objects with custom `toString()` functions. - * const original = mongoose.Schema.Types.String.cast(); - * mongoose.Schema.Types.String.cast(v => { - * assert.ok(v == null || typeof v !== 'object'); - * return original(v); - * }); - * - * // Or disable casting entirely - * mongoose.Schema.Types.String.cast(false); - * - * @param {Function} caster - * @return {Function} - * @function get - * @static - * @api public - */ - -SchemaString.cast = function cast(caster) { - if (arguments.length === 0) { - return this._cast; - } - if (caster === false) { - caster = v => { - if (v != null && typeof v !== 'string') { - throw new Error(); - } - return v; - }; - } - this._cast = caster; - - return this._cast; -}; - -/** - * Attaches a getter for all String instances. - * - * ####Example: - * - * // Make all numbers round down - * mongoose.Schema.String.get(v => v.toLowerCase()); - * - * const Model = mongoose.model('Test', new Schema({ test: String })); - * new Model({ test: 'FOO' }).test; // 'foo' - * - * @param {Function} getter - * @return {this} - * @function get - * @static - * @api public - */ - -SchemaString.get = SchemaType.get; - -/** - * Sets a default option for all String instances. - * - * ####Example: - * - * // Make all strings have option `trim` equal to true. - * mongoose.Schema.String.set('trim', true); - * - * const User = mongoose.model('User', new Schema({ name: String })); - * new User({ name: ' John Doe ' }).name; // 'John Doe' - * - * @param {String} option - The option you'd like to set the value for - * @param {*} value - value for option - * @return {undefined} - * @function set - * @static - * @api public - */ - -SchemaString.set = SchemaType.set; - -/*! - * ignore - */ - -SchemaString._checkRequired = v => (v instanceof String || typeof v === 'string') && v.length; - -/** - * Override the function the required validator uses to check whether a string - * passes the `required` check. - * - * ####Example: - * - * // Allow empty strings to pass `required` check - * mongoose.Schema.Types.String.checkRequired(v => v != null); - * - * const M = mongoose.model({ str: { type: String, required: true } }); - * new M({ str: '' }).validateSync(); // `null`, validation passes! - * - * @param {Function} fn - * @return {Function} - * @function checkRequired - * @static - * @api public - */ - -SchemaString.checkRequired = SchemaType.checkRequired; - -/** - * Adds an enum validator - * - * ####Example: - * - * const states = ['opening', 'open', 'closing', 'closed'] - * const s = new Schema({ state: { type: String, enum: states }}) - * const M = db.model('M', s) - * const m = new M({ state: 'invalid' }) - * m.save(function (err) { - * console.error(String(err)) // ValidationError: `invalid` is not a valid enum value for path `state`. - * m.state = 'open' - * m.save(callback) // success - * }) - * - * // or with custom error messages - * const enum = { - * values: ['opening', 'open', 'closing', 'closed'], - * message: 'enum validator failed for path `{PATH}` with value `{VALUE}`' - * } - * const s = new Schema({ state: { type: String, enum: enum }) - * const M = db.model('M', s) - * const m = new M({ state: 'invalid' }) - * m.save(function (err) { - * console.error(String(err)) // ValidationError: enum validator failed for path `state` with value `invalid` - * m.state = 'open' - * m.save(callback) // success - * }) - * - * @param {String|Object} [args...] enumeration values - * @return {SchemaType} this - * @see Customized Error Messages #error_messages_MongooseError-messages - * @api public - */ - -SchemaString.prototype.enum = function() { - if (this.enumValidator) { - this.validators = this.validators.filter(function(v) { - return v.validator !== this.enumValidator; - }, this); - this.enumValidator = false; - } - - if (arguments[0] === void 0 || arguments[0] === false) { - return this; - } - - let values; - let errorMessage; - - if (utils.isObject(arguments[0])) { - values = arguments[0].values; - errorMessage = arguments[0].message; - } else { - values = arguments; - errorMessage = MongooseError.messages.String.enum; - } - - for (const value of values) { - if (value !== undefined) { - this.enumValues.push(this.cast(value)); - } - } - - const vals = this.enumValues; - this.enumValidator = function(v) { - return undefined === v || ~vals.indexOf(v); - }; - this.validators.push({ - validator: this.enumValidator, - message: errorMessage, - type: 'enum', - enumValues: vals - }); - - return this; -}; - -/** - * Adds a lowercase [setter](http://mongoosejs.com/docs/api.html#schematype_SchemaType-set). - * - * ####Example: - * - * const s = new Schema({ email: { type: String, lowercase: true }}) - * const M = db.model('M', s); - * const m = new M({ email: 'SomeEmail@example.COM' }); - * console.log(m.email) // someemail@example.com - * M.find({ email: 'SomeEmail@example.com' }); // Queries by 'someemail@example.com' - * - * Note that `lowercase` does **not** affect regular expression queries: - * - * ####Example: - * // Still queries for documents whose `email` matches the regular - * // expression /SomeEmail/. Mongoose does **not** convert the RegExp - * // to lowercase. - * M.find({ email: /SomeEmail/ }); - * - * @api public - * @return {SchemaType} this - */ - -SchemaString.prototype.lowercase = function(shouldApply) { - if (arguments.length > 0 && !shouldApply) { - return this; - } - return this.set(function(v, self) { - if (typeof v !== 'string') { - v = self.cast(v); - } - if (v) { - return v.toLowerCase(); - } - return v; - }); -}; - -/** - * Adds an uppercase [setter](http://mongoosejs.com/docs/api.html#schematype_SchemaType-set). - * - * ####Example: - * - * const s = new Schema({ caps: { type: String, uppercase: true }}) - * const M = db.model('M', s); - * const m = new M({ caps: 'an example' }); - * console.log(m.caps) // AN EXAMPLE - * M.find({ caps: 'an example' }) // Matches documents where caps = 'AN EXAMPLE' - * - * Note that `uppercase` does **not** affect regular expression queries: - * - * ####Example: - * // Mongoose does **not** convert the RegExp to uppercase. - * M.find({ email: /an example/ }); - * - * @api public - * @return {SchemaType} this - */ - -SchemaString.prototype.uppercase = function(shouldApply) { - if (arguments.length > 0 && !shouldApply) { - return this; - } - return this.set(function(v, self) { - if (typeof v !== 'string') { - v = self.cast(v); - } - if (v) { - return v.toUpperCase(); - } - return v; - }); -}; - -/** - * Adds a trim [setter](http://mongoosejs.com/docs/api.html#schematype_SchemaType-set). - * - * The string value will be trimmed when set. - * - * ####Example: - * - * const s = new Schema({ name: { type: String, trim: true }}); - * const M = db.model('M', s); - * const string = ' some name '; - * console.log(string.length); // 11 - * const m = new M({ name: string }); - * console.log(m.name.length); // 9 - * - * // Equivalent to `findOne({ name: string.trim() })` - * M.findOne({ name: string }); - * - * Note that `trim` does **not** affect regular expression queries: - * - * ####Example: - * // Mongoose does **not** trim whitespace from the RegExp. - * M.find({ name: / some name / }); - * - * @api public - * @return {SchemaType} this - */ - -SchemaString.prototype.trim = function(shouldTrim) { - if (arguments.length > 0 && !shouldTrim) { - return this; - } - return this.set(function(v, self) { - if (typeof v !== 'string') { - v = self.cast(v); - } - if (v) { - return v.trim(); - } - return v; - }); -}; - -/** - * Sets a minimum length validator. - * - * ####Example: - * - * const schema = new Schema({ postalCode: { type: String, minlength: 5 }) - * const Address = db.model('Address', schema) - * const address = new Address({ postalCode: '9512' }) - * address.save(function (err) { - * console.error(err) // validator error - * address.postalCode = '95125'; - * address.save() // success - * }) - * - * // custom error messages - * // We can also use the special {MINLENGTH} token which will be replaced with the minimum allowed length - * const minlength = [5, 'The value of path `{PATH}` (`{VALUE}`) is shorter than the minimum allowed length ({MINLENGTH}).']; - * const schema = new Schema({ postalCode: { type: String, minlength: minlength }) - * const Address = mongoose.model('Address', schema); - * const address = new Address({ postalCode: '9512' }); - * address.validate(function (err) { - * console.log(String(err)) // ValidationError: The value of path `postalCode` (`9512`) is shorter than the minimum length (5). - * }) - * - * @param {Number} value minimum string length - * @param {String} [message] optional custom error message - * @return {SchemaType} this - * @see Customized Error Messages #error_messages_MongooseError-messages - * @api public - */ - -SchemaString.prototype.minlength = function(value, message) { - if (this.minlengthValidator) { - this.validators = this.validators.filter(function(v) { - return v.validator !== this.minlengthValidator; - }, this); - } - - if (value !== null && value !== undefined) { - let msg = message || MongooseError.messages.String.minlength; - msg = msg.replace(/{MINLENGTH}/, value); - this.validators.push({ - validator: this.minlengthValidator = function(v) { - return v === null || v.length >= value; - }, - message: msg, - type: 'minlength', - minlength: value - }); - } - - return this; -}; - -/** - * Sets a maximum length validator. - * - * ####Example: - * - * const schema = new Schema({ postalCode: { type: String, maxlength: 9 }) - * const Address = db.model('Address', schema) - * const address = new Address({ postalCode: '9512512345' }) - * address.save(function (err) { - * console.error(err) // validator error - * address.postalCode = '95125'; - * address.save() // success - * }) - * - * // custom error messages - * // We can also use the special {MAXLENGTH} token which will be replaced with the maximum allowed length - * const maxlength = [9, 'The value of path `{PATH}` (`{VALUE}`) exceeds the maximum allowed length ({MAXLENGTH}).']; - * const schema = new Schema({ postalCode: { type: String, maxlength: maxlength }) - * const Address = mongoose.model('Address', schema); - * const address = new Address({ postalCode: '9512512345' }); - * address.validate(function (err) { - * console.log(String(err)) // ValidationError: The value of path `postalCode` (`9512512345`) exceeds the maximum allowed length (9). - * }) - * - * @param {Number} value maximum string length - * @param {String} [message] optional custom error message - * @return {SchemaType} this - * @see Customized Error Messages #error_messages_MongooseError-messages - * @api public - */ - -SchemaString.prototype.maxlength = function(value, message) { - if (this.maxlengthValidator) { - this.validators = this.validators.filter(function(v) { - return v.validator !== this.maxlengthValidator; - }, this); - } - - if (value !== null && value !== undefined) { - let msg = message || MongooseError.messages.String.maxlength; - msg = msg.replace(/{MAXLENGTH}/, value); - this.validators.push({ - validator: this.maxlengthValidator = function(v) { - return v === null || v.length <= value; - }, - message: msg, - type: 'maxlength', - maxlength: value - }); - } - - return this; -}; - -/** - * Sets a regexp validator. - * - * Any value that does not pass `regExp`.test(val) will fail validation. - * - * ####Example: - * - * const s = new Schema({ name: { type: String, match: /^a/ }}) - * const M = db.model('M', s) - * const m = new M({ name: 'I am invalid' }) - * m.validate(function (err) { - * console.error(String(err)) // "ValidationError: Path `name` is invalid (I am invalid)." - * m.name = 'apples' - * m.validate(function (err) { - * assert.ok(err) // success - * }) - * }) - * - * // using a custom error message - * const match = [ /\.html$/, "That file doesn't end in .html ({VALUE})" ]; - * const s = new Schema({ file: { type: String, match: match }}) - * const M = db.model('M', s); - * const m = new M({ file: 'invalid' }); - * m.validate(function (err) { - * console.log(String(err)) // "ValidationError: That file doesn't end in .html (invalid)" - * }) - * - * Empty strings, `undefined`, and `null` values always pass the match validator. If you require these values, enable the `required` validator also. - * - * const s = new Schema({ name: { type: String, match: /^a/, required: true }}) - * - * @param {RegExp} regExp regular expression to test against - * @param {String} [message] optional custom error message - * @return {SchemaType} this - * @see Customized Error Messages #error_messages_MongooseError-messages - * @api public - */ - -SchemaString.prototype.match = function match(regExp, message) { - // yes, we allow multiple match validators - - const msg = message || MongooseError.messages.String.match; - - const matchValidator = function(v) { - if (!regExp) { - return false; - } - - // In case RegExp happens to have `/g` flag set, we need to reset the - // `lastIndex`, otherwise `match` will intermittently fail. - regExp.lastIndex = 0; - - const ret = ((v != null && v !== '') - ? regExp.test(v) - : true); - return ret; - }; - - this.validators.push({ - validator: matchValidator, - message: msg, - type: 'regexp', - regexp: regExp - }); - return this; -}; - -/** - * Check if the given value satisfies the `required` validator. The value is - * considered valid if it is a string (that is, not `null` or `undefined`) and - * has positive length. The `required` validator **will** fail for empty - * strings. - * - * @param {Any} value - * @param {Document} doc - * @return {Boolean} - * @api public - */ - -SchemaString.prototype.checkRequired = function checkRequired(value, doc) { - if (SchemaType._isRef(this, value, doc, true)) { - return !!value; - } - - // `require('util').inherits()` does **not** copy static properties, and - // plugins like mongoose-float use `inherits()` for pre-ES6. - const _checkRequired = typeof this.constructor.checkRequired == 'function' ? - this.constructor.checkRequired() : - SchemaString.checkRequired(); - - return _checkRequired(value); -}; - -/** - * Casts to String - * - * @api private - */ - -SchemaString.prototype.cast = function(value, doc, init) { - if (SchemaType._isRef(this, value, doc, init)) { - // wait! we may need to cast this to a document - - if (value === null || value === undefined) { - return value; - } - - // lazy load - Document || (Document = require('./../document')); - - if (value instanceof Document) { - value.$__.wasPopulated = true; - return value; - } - - // setting a populated path - if (typeof value === 'string') { - return value; - } else if (Buffer.isBuffer(value) || !utils.isObject(value)) { - throw new CastError('string', value, this.path, null, this); - } - - // Handle the case where user directly sets a populated - // path to a plain object; cast to the Model used in - // the population query. - const path = doc.$__fullPath(this.path); - const owner = doc.ownerDocument ? doc.ownerDocument() : doc; - const pop = owner.populated(path, true); - const ret = new pop.options[populateModelSymbol](value); - ret.$__.wasPopulated = true; - return ret; - } - - const castString = typeof this.constructor.cast === 'function' ? - this.constructor.cast() : - SchemaString.cast(); - try { - return castString(value); - } catch (error) { - throw new CastError('string', value, this.path, null, this); - } -}; - -/*! - * ignore - */ - -function handleSingle(val) { - return this.castForQuery(val); -} - -function handleArray(val) { - const _this = this; - if (!Array.isArray(val)) { - return [this.castForQuery(val)]; - } - return val.map(function(m) { - return _this.castForQuery(m); - }); -} - -const $conditionalHandlers = utils.options(SchemaType.prototype.$conditionalHandlers, { - $all: handleArray, - $gt: handleSingle, - $gte: handleSingle, - $lt: handleSingle, - $lte: handleSingle, - $options: String, - $regex: handleSingle, - $not: handleSingle -}); - -Object.defineProperty(SchemaString.prototype, '$conditionalHandlers', { - configurable: false, - enumerable: false, - writable: false, - value: Object.freeze($conditionalHandlers) -}); - -/** - * Casts contents for queries. - * - * @param {String} $conditional - * @param {any} [val] - * @api private - */ - -SchemaString.prototype.castForQuery = function($conditional, val) { - let handler; - if (arguments.length === 2) { - handler = this.$conditionalHandlers[$conditional]; - if (!handler) { - throw new Error('Can\'t use ' + $conditional + ' with String.'); - } - return handler.call(this, val); - } - val = $conditional; - if (Object.prototype.toString.call(val) === '[object RegExp]') { - return val; - } - - return this._castForQuery(val); -}; - -/*! - * Module exports. - */ - -module.exports = SchemaString; diff --git a/node_modules/mongoose/lib/schema/symbols.js b/node_modules/mongoose/lib/schema/symbols.js deleted file mode 100644 index 08d1d27..0000000 --- a/node_modules/mongoose/lib/schema/symbols.js +++ /dev/null @@ -1,5 +0,0 @@ -'use strict'; - -exports.schemaMixedSymbol = Symbol.for('mongoose:schema_mixed'); - -exports.builtInMiddleware = Symbol.for('mongoose:built-in-middleware');
\ No newline at end of file |