55 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			55 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | 'use strict'; | ||
|  | 
 | ||
|  | var util = require('./_util'); | ||
|  | 
 | ||
|  | module.exports = function defFunc(ajv) { | ||
|  |   defFunc.definition = { | ||
|  |     type: 'object', | ||
|  |     macro: function (schema) { | ||
|  |       var schemas = []; | ||
|  |       for (var pointer in schema) | ||
|  |         schemas.push(getSchema(pointer, schema[pointer])); | ||
|  |       return {'allOf': schemas}; | ||
|  |     }, | ||
|  |     metaSchema: { | ||
|  |       type: 'object', | ||
|  |       propertyNames: { | ||
|  |         type: 'string', | ||
|  |         format: 'json-pointer' | ||
|  |       }, | ||
|  |       additionalProperties: util.metaSchemaRef(ajv) | ||
|  |     } | ||
|  |   }; | ||
|  | 
 | ||
|  |   ajv.addKeyword('deepProperties', defFunc.definition); | ||
|  |   return ajv; | ||
|  | }; | ||
|  | 
 | ||
|  | 
 | ||
|  | function getSchema(jsonPointer, schema) { | ||
|  |   var segments = jsonPointer.split('/'); | ||
|  |   var rootSchema = {}; | ||
|  |   var pointerSchema = rootSchema; | ||
|  |   for (var i=1; i<segments.length; i++) { | ||
|  |     var segment = segments[i]; | ||
|  |     var isLast = i == segments.length - 1; | ||
|  |     segment = unescapeJsonPointer(segment); | ||
|  |     var properties = pointerSchema.properties = {}; | ||
|  |     var items = undefined; | ||
|  |     if (/[0-9]+/.test(segment)) { | ||
|  |       var count = +segment; | ||
|  |       items = pointerSchema.items = []; | ||
|  |       while (count--) items.push({}); | ||
|  |     } | ||
|  |     pointerSchema = isLast ? schema : {}; | ||
|  |     properties[segment] = pointerSchema; | ||
|  |     if (items) items.push(pointerSchema); | ||
|  |   } | ||
|  |   return rootSchema; | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | function unescapeJsonPointer(str) { | ||
|  |   return str.replace(/~1/g, '/').replace(/~0/g, '~'); | ||
|  | } |