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