You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			73 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
		
		
			
		
	
	
			73 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
| 
											9 months ago
										 | '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); | ||
|  |   } | ||
|  | }; |