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