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