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