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
						
					
					
				| '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);
 | |
|     }
 | |
|   }
 | |
| };
 |