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