| 'use strict'; |
| |
| module.exports = function defFunc(ajv) { |
| defFunc.definition = { |
| type: 'object', |
| inline: function (it, keyword, schema) { |
| var expr = ''; |
| for (var i=0; i<schema.length; i++) { |
| if (i) expr += ' && '; |
| expr += '(' + getData(schema[i], it.dataLevel) + ' !== undefined)'; |
| } |
| return expr; |
| }, |
| metaSchema: { |
| type: 'array', |
| items: { |
| type: 'string', |
| format: 'json-pointer' |
| } |
| } |
| }; |
| |
| ajv.addKeyword('deepRequired', defFunc.definition); |
| return ajv; |
| }; |
| |
| |
| function getData(jsonPointer, lvl) { |
| var data = 'data' + (lvl || ''); |
| if (!jsonPointer) return data; |
| |
| var expr = data; |
| var segments = jsonPointer.split('/'); |
| for (var i=1; i<segments.length; i++) { |
| var segment = segments[i]; |
| data += getProperty(unescapeJsonPointer(segment)); |
| expr += ' && ' + data; |
| } |
| return expr; |
| } |
| |
| |
| var IDENTIFIER = /^[a-z$_][a-z$_0-9]*$/i; |
| var INTEGER = /^[0-9]+$/; |
| var SINGLE_QUOTE = /'|\\/g; |
| function getProperty(key) { |
| return INTEGER.test(key) |
| ? '[' + key + ']' |
| : IDENTIFIER.test(key) |
| ? '.' + key |
| : "['" + key.replace(SINGLE_QUOTE, '\\$&') + "']"; |
| } |
| |
| |
| function unescapeJsonPointer(str) { |
| return str.replace(/~1/g, '/').replace(/~0/g, '~'); |
| } |