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