Spaces:
Sleeping
Sleeping
; | |
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 | |
|| (it.opts.useDefaults == 'empty' | |
&& (data[prop] === null || data[prop] === ''))) | |
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); | |
} | |
}; | |