73 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
'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);
 | 
						|
  }
 | 
						|
};
 |