You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
2.0 KiB
72 lines
2.0 KiB
'use strict'; |
|
|
|
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); |
|
} |
|
};
|
|
|