You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
54 lines
1.3 KiB
54 lines
1.3 KiB
'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, '~'); |
|
}
|
|
|