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