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