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) data[prop] = funcs[prop]();
|
40 | return true;
|
41 | }
|
42 |
|
43 | function noop() { return true; }
|
44 | },
|
45 | DEFAULTS: DEFAULTS,
|
46 | metaSchema: {
|
47 | type: 'object',
|
48 | additionalProperties: {
|
49 | type: ['string', 'object'],
|
50 | additionalProperties: false,
|
51 | required: ['func', 'args'],
|
52 | properties: {
|
53 | func: { type: 'string' },
|
54 | args: { type: 'object' }
|
55 | }
|
56 | }
|
57 | }
|
58 | };
|
59 |
|
60 | ajv.addKeyword('dynamicDefaults', defFunc.definition);
|
61 | return ajv;
|
62 |
|
63 | function getDefault(d) {
|
64 | var def = DEFAULTS[d];
|
65 | if (def) return def;
|
66 | throw new Error('invalid "dynamicDefaults" keyword property value: ' + d);
|
67 | }
|
68 | };
|