Projekt

Obecné

Profil

Stáhnout (1.96 KB) Statistiky
| Větev: | Revize:
1
'use strict';
2

    
3
var sequences = {};
4

    
5
var DEFAULTS = {
6
  timestamp: function() { return Date.now(); },
7
  datetime: function() { return (new Date).toISOString(); },
8
  date: function() { return (new Date).toISOString().slice(0, 10); },
9
  time: function() { return (new Date).toISOString().slice(11); },
10
  random: function() { return Math.random(); },
11
  randomint: function (args) {
12
    var limit = args && args.max || 2;
13
    return function() { return Math.floor(Math.random() * limit); };
14
  },
15
  seq: function (args) {
16
    var name = args && args.name || '';
17
    sequences[name] = sequences[name] || 0;
18
    return function() { return sequences[name]++; };
19
  }
20
};
21

    
22
module.exports = function defFunc(ajv) {
23
  defFunc.definition = {
24
    compile: function (schema, parentSchema, it) {
25
      var funcs = {};
26

    
27
      for (var key in schema) {
28
        var d = schema[key];
29
        var func = getDefault(typeof d == 'string' ? d : d.func);
30
        funcs[key] = func.length ? func(d.args) : func;
31
      }
32

    
33
      return it.opts.useDefaults && !it.compositeRule
34
              ? assignDefaults
35
              : noop;
36

    
37
      function assignDefaults(data) {
38
        for (var prop in schema){
39
          if (data[prop] === undefined
40
            || (it.opts.useDefaults == 'empty'
41
            && (data[prop] === null || data[prop] === '')))
42
            data[prop] = funcs[prop]();
43
        }
44
        return true;
45
      }
46

    
47
      function noop() { return true; }
48
    },
49
    DEFAULTS: DEFAULTS,
50
    metaSchema: {
51
      type: 'object',
52
      additionalProperties: {
53
        type: ['string', 'object'],
54
        additionalProperties: false,
55
        required: ['func', 'args'],
56
        properties: {
57
          func: { type: 'string' },
58
          args: { type: 'object' }
59
        }
60
      }
61
    }
62
  };
63

    
64
  ajv.addKeyword('dynamicDefaults', defFunc.definition);
65
  return ajv;
66

    
67
  function getDefault(d) {
68
    var def = DEFAULTS[d];
69
    if (def) return def;
70
    throw new Error('invalid "dynamicDefaults" keyword property value: ' + d);
71
  }
72
};
(7-7/21)