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
|
};
|