[6a3a178] | 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 | };
|
---|