Blame view

node_modules/ajv-keywords/keywords/deepProperties.js 1.33 KB
aaac7fed   liuqimichale   add
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
  '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, '~');
  }