Blame view

node_modules/ajv-keywords/keywords/dynamicDefaults.js 1.83 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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
  'use strict';
  
  var sequences = {};
  
  var DEFAULTS = {
    timestamp: function() { return Date.now(); },
    datetime: function() { return (new Date).toISOString(); },
    date: function() { return (new Date).toISOString().slice(0, 10); },
    time: function() { return (new Date).toISOString().slice(11); },
    random: function() { return Math.random(); },
    randomint: function (args) {
      var limit = args && args.max || 2;
      return function() { return Math.floor(Math.random() * limit); };
    },
    seq: function (args) {
      var name = args && args.name || '';
      sequences[name] = sequences[name] || 0;
      return function() { return sequences[name]++; };
    }
  };
  
  module.exports = function defFunc(ajv) {
    defFunc.definition = {
      compile: function (schema, parentSchema, it) {
        var funcs = {};
  
        for (var key in schema) {
          var d = schema[key];
          var func = getDefault(typeof d == 'string' ? d : d.func);
          funcs[key] = func.length ? func(d.args) : func;
        }
  
        return it.opts.useDefaults && !it.compositeRule
                ? assignDefaults
                : noop;
  
        function assignDefaults(data) {
          for (var prop in schema)
            if (data[prop] === undefined) data[prop] = funcs[prop]();
          return true;
        }
  
        function noop() { return true; }
      },
      DEFAULTS: DEFAULTS,
      metaSchema: {
        type: 'object',
        additionalProperties: {
          type: ['string', 'object'],
          additionalProperties: false,
          required: ['func', 'args'],
          properties: {
            func: { type: 'string' },
            args: { type: 'object' }
          }
        }
      }
    };
  
    ajv.addKeyword('dynamicDefaults', defFunc.definition);
    return ajv;
  
    function getDefault(d) {
      var def = DEFAULTS[d];
      if (def) return def;
      throw new Error('invalid "dynamicDefaults" keyword property value: ' + d);
    }
  };