| 
									
										
										
										
											2016-09-09 00:42:26 +08:00
										 |  |  | /* | 
					
						
							|  |  |  | 	MIT License http://www.opensource.org/licenses/mit-license.php
 | 
					
						
							|  |  |  | 	Author Gajus Kuizinas @gajus | 
					
						
							|  |  |  | */ | 
					
						
							| 
									
										
										
										
											2017-01-07 10:36:33 +08:00
										 |  |  | "use strict"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const Ajv = require("ajv"); | 
					
						
							|  |  |  | const ajv = new Ajv({ | 
					
						
							| 
									
										
										
										
											2016-09-19 06:54:35 +08:00
										 |  |  | 	errorDataPath: "configuration", | 
					
						
							|  |  |  | 	allErrors: true, | 
					
						
							| 
									
										
										
										
											2017-02-02 19:54:20 +08:00
										 |  |  | 	verbose: true | 
					
						
							| 
									
										
										
										
											2016-09-19 06:54:35 +08:00
										 |  |  | }); | 
					
						
							| 
									
										
										
										
											2016-12-24 00:57:37 +08:00
										 |  |  | require("ajv-keywords")(ajv, ["instanceof"]); | 
					
						
							| 
									
										
										
										
											2017-02-02 17:13:37 +08:00
										 |  |  | require("../schemas/ajv.absolutePath")(ajv); | 
					
						
							| 
									
										
										
										
											2016-09-19 06:54:35 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | const validateSchema = (schema, options) => { | 
					
						
							| 
									
										
										
										
											2016-09-19 06:54:35 +08:00
										 |  |  | 	if(Array.isArray(options)) { | 
					
						
							| 
									
										
										
										
											2017-01-07 10:36:33 +08:00
										 |  |  | 		const errors = options.map((options) => validateObject(schema, options)); | 
					
						
							|  |  |  | 		errors.forEach((list, idx) => { | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | 			const applyPrefix = err => { | 
					
						
							| 
									
										
										
										
											2017-01-22 01:43:11 +08:00
										 |  |  | 				err.dataPath = `[${idx}]${err.dataPath}`; | 
					
						
							| 
									
										
										
										
											2016-09-19 06:54:35 +08:00
										 |  |  | 				if(err.children) { | 
					
						
							|  |  |  | 					err.children.forEach(applyPrefix); | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | 			}; | 
					
						
							|  |  |  | 			list.forEach(applyPrefix); | 
					
						
							| 
									
										
										
										
											2016-09-19 06:54:35 +08:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2017-01-07 10:36:33 +08:00
										 |  |  | 		return errors.reduce((arr, items) => { | 
					
						
							| 
									
										
										
										
											2016-09-19 06:54:35 +08:00
										 |  |  | 			return arr.concat(items); | 
					
						
							|  |  |  | 		}, []); | 
					
						
							|  |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											2016-11-02 06:38:54 +08:00
										 |  |  | 		return validateObject(schema, options); | 
					
						
							| 
									
										
										
										
											2016-09-19 06:54:35 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2016-09-19 06:54:35 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | const validateObject = (schema, options) => { | 
					
						
							| 
									
										
										
										
											2017-01-07 10:36:33 +08:00
										 |  |  | 	const validate = ajv.compile(schema); | 
					
						
							|  |  |  | 	const valid = validate(options); | 
					
						
							| 
									
										
										
										
											2016-09-19 06:54:35 +08:00
										 |  |  | 	return valid ? [] : filterErrors(validate.errors); | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2016-09-19 06:54:35 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | const filterErrors = errors => { | 
					
						
							| 
									
										
										
										
											2017-01-07 10:36:33 +08:00
										 |  |  | 	let newErrors = []; | 
					
						
							|  |  |  | 	errors.forEach((err) => { | 
					
						
							|  |  |  | 		const dataPath = err.dataPath; | 
					
						
							|  |  |  | 		let children = []; | 
					
						
							|  |  |  | 		newErrors = newErrors.filter((oldError) => { | 
					
						
							|  |  |  | 			if(oldError.dataPath.includes(dataPath)) { | 
					
						
							| 
									
										
										
										
											2016-12-14 18:34:31 +08:00
										 |  |  | 				if(oldError.children) { | 
					
						
							| 
									
										
										
										
											2017-01-22 01:43:11 +08:00
										 |  |  | 					children = children.concat(oldError.children.slice(0)); | 
					
						
							| 
									
										
										
										
											2016-12-14 18:34:31 +08:00
										 |  |  | 				} | 
					
						
							|  |  |  | 				oldError.children = undefined; | 
					
						
							| 
									
										
										
										
											2016-09-19 06:54:35 +08:00
										 |  |  | 				children.push(oldError); | 
					
						
							| 
									
										
										
										
											2016-12-14 18:34:31 +08:00
										 |  |  | 				return false; | 
					
						
							| 
									
										
										
										
											2016-09-19 06:54:35 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2016-12-14 18:34:31 +08:00
										 |  |  | 			return true; | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 		if(children.length) { | 
					
						
							|  |  |  | 			err.children = children; | 
					
						
							| 
									
										
										
										
											2016-09-19 06:54:35 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		newErrors.push(err); | 
					
						
							|  |  |  | 	}); | 
					
						
							| 
									
										
										
										
											2017-01-07 10:36:33 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-19 06:54:35 +08:00
										 |  |  | 	return newErrors; | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2016-09-19 06:54:35 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-03 21:52:09 +08:00
										 |  |  | module.exports = validateSchema; |