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.
		
		
		
		
		
			
		
			
				
					44 lines
				
				1.4 KiB
			
		
		
			
		
	
	
					44 lines
				
				1.4 KiB
			| 
											3 years ago
										 | 'use strict'; | ||
|  | 
 | ||
|  | const get = require('../get'); | ||
|  | 
 | ||
|  | /*! | ||
|  |  * Like `schema.path()`, except with a document, because impossible to | ||
|  |  * determine path type without knowing the embedded discriminator key. | ||
|  |  */ | ||
|  | 
 | ||
|  | module.exports = function getEmbeddedDiscriminatorPath(doc, path, options) { | ||
|  |   options = options || {}; | ||
|  |   const typeOnly = options.typeOnly; | ||
|  |   const parts = path.split('.'); | ||
|  |   let schema = null; | ||
|  |   let type = 'adhocOrUndefined'; | ||
|  | 
 | ||
|  |   for (let i = 0; i < parts.length; ++i) { | ||
|  |     const subpath = parts.slice(0, i + 1).join('.'); | ||
|  |     schema = doc.schema.path(subpath); | ||
|  |     if (schema == null) { | ||
|  |       type = 'adhocOrUndefined'; | ||
|  |       continue; | ||
|  |     } | ||
|  |     if (schema.instance === 'Mixed') { | ||
|  |       return typeOnly ? 'real' : schema; | ||
|  |     } | ||
|  |     type = doc.schema.pathType(subpath); | ||
|  |     if ((schema.$isSingleNested || schema.$isMongooseDocumentArrayElement) && | ||
|  |         schema.schema.discriminators != null) { | ||
|  |       const discriminators = schema.schema.discriminators; | ||
|  |       const discriminatorKey = doc.get(subpath + '.' + | ||
|  |         get(schema, 'schema.options.discriminatorKey')); | ||
|  |       if (discriminatorKey == null || discriminators[discriminatorKey] == null) { | ||
|  |         continue; | ||
|  |       } | ||
|  |       const rest = parts.slice(i + 1).join('.'); | ||
|  |       return getEmbeddedDiscriminatorPath(doc.get(subpath), rest, options); | ||
|  |     } | ||
|  |   } | ||
|  | 
 | ||
|  |   // Are we getting the whole schema or just the type, 'real', 'nested', etc.
 | ||
|  |   return typeOnly ? type : schema; | ||
|  | }; |