58 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			58 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | '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, '~'); | ||
|  | } |