You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					57 lines
				
				1.7 KiB
			
		
		
			
		
	
	
					57 lines
				
				1.7 KiB
			| 
											3 years ago
										 | 'use strict'; | ||
|  | 
 | ||
|  | const get = require('../get'); | ||
|  | 
 | ||
|  | /*! | ||
|  |  * Register methods for this model | ||
|  |  * | ||
|  |  * @param {Model} model | ||
|  |  * @param {Schema} schema | ||
|  |  */ | ||
|  | 
 | ||
|  | module.exports = function applyMethods(model, schema) { | ||
|  |   function apply(method, schema) { | ||
|  |     Object.defineProperty(model.prototype, method, { | ||
|  |       get: function() { | ||
|  |         const h = {}; | ||
|  |         for (const k in schema.methods[method]) { | ||
|  |           h[k] = schema.methods[method][k].bind(this); | ||
|  |         } | ||
|  |         return h; | ||
|  |       }, | ||
|  |       configurable: true | ||
|  |     }); | ||
|  |   } | ||
|  |   for (const method of Object.keys(schema.methods)) { | ||
|  |     const fn = schema.methods[method]; | ||
|  |     if (schema.tree.hasOwnProperty(method)) { | ||
|  |       throw new Error('You have a method and a property in your schema both ' + | ||
|  |         'named "' + method + '"'); | ||
|  |     } | ||
|  |     if (schema.reserved[method] && | ||
|  |         !get(schema, `methodOptions.${method}.suppressWarning`, false)) { | ||
|  |       console.warn(`mongoose: the method name "${method}" is used by mongoose ` + | ||
|  |         'internally, overwriting it may cause bugs. If you\'re sure you know ' + | ||
|  |         'what you\'re doing, you can suppress this error by using ' + | ||
|  |         `\`schema.method('${method}', fn, { suppressWarning: true })\`.`); | ||
|  |     } | ||
|  |     if (typeof fn === 'function') { | ||
|  |       model.prototype[method] = fn; | ||
|  |     } else { | ||
|  |       apply(method, schema); | ||
|  |     } | ||
|  |   } | ||
|  | 
 | ||
|  |   // Recursively call `applyMethods()` on child schemas
 | ||
|  |   model.$appliedMethods = true; | ||
|  |   for (const key of Object.keys(schema.paths)) { | ||
|  |     const type = schema.paths[key]; | ||
|  |     if (type.$isSingleNested && !type.caster.$appliedMethods) { | ||
|  |       applyMethods(type.caster, type.schema); | ||
|  |     } | ||
|  |     if (type.$isMongooseDocumentArray && !type.Constructor.$appliedMethods) { | ||
|  |       applyMethods(type.Constructor, type.schema); | ||
|  |     } | ||
|  |   } | ||
|  | }; |