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