81 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
'use strict';
 | 
						|
 | 
						|
module.exports = function defFunc (ajv) {
 | 
						|
  var transform = {
 | 
						|
    trimLeft: function (value) {
 | 
						|
      return value.replace(/^[\s]+/, '');
 | 
						|
    },
 | 
						|
    trimRight: function (value) {
 | 
						|
      return value.replace(/[\s]+$/, '');
 | 
						|
    },
 | 
						|
    trim: function (value) {
 | 
						|
      return value.trim();
 | 
						|
    },
 | 
						|
    toLowerCase: function (value) {
 | 
						|
      return value.toLowerCase();
 | 
						|
    },
 | 
						|
    toUpperCase: function (value) {
 | 
						|
      return value.toUpperCase();
 | 
						|
    },
 | 
						|
    toEnumCase: function (value, cfg) {
 | 
						|
      return cfg.hash[makeHashTableKey(value)] || value;
 | 
						|
    }
 | 
						|
  };
 | 
						|
 | 
						|
  defFunc.definition = {
 | 
						|
    type: 'string',
 | 
						|
    errors: false,
 | 
						|
    modifying: true,
 | 
						|
    valid: true,
 | 
						|
    compile: function (schema, parentSchema) {
 | 
						|
      var cfg;
 | 
						|
 | 
						|
      if (schema.indexOf('toEnumCase') !== -1) {
 | 
						|
        // build hash table to enum values
 | 
						|
        cfg = {hash: {}};
 | 
						|
 | 
						|
        // requires `enum` in schema
 | 
						|
        if (!parentSchema.enum)
 | 
						|
          throw new Error('Missing enum. To use `transform:["toEnumCase"]`, `enum:[...]` is required.');
 | 
						|
        for (var i = parentSchema.enum.length; i--; i) {
 | 
						|
          var v = parentSchema.enum[i];
 | 
						|
          if (typeof v !== 'string') continue;
 | 
						|
          var k = makeHashTableKey(v);
 | 
						|
          // requires all `enum` values have unique keys
 | 
						|
          if (cfg.hash[k])
 | 
						|
            throw new Error('Invalid enum uniqueness. To use `transform:["toEnumCase"]`, all values must be unique when case insensitive.');
 | 
						|
          cfg.hash[k] = v;
 | 
						|
        }
 | 
						|
      }
 | 
						|
 | 
						|
      return function (data, dataPath, object, key) {
 | 
						|
        // skip if value only
 | 
						|
        if (!object) return;
 | 
						|
 | 
						|
        // apply transform in order provided
 | 
						|
        for (var j = 0, l = schema.length; j < l; j++)
 | 
						|
          data = transform[schema[j]](data, cfg);
 | 
						|
 | 
						|
        object[key] = data;
 | 
						|
      };
 | 
						|
    },
 | 
						|
    metaSchema: {
 | 
						|
      type: 'array',
 | 
						|
      items: {
 | 
						|
        type: 'string',
 | 
						|
        enum: [
 | 
						|
          'trimLeft', 'trimRight', 'trim',
 | 
						|
          'toLowerCase', 'toUpperCase', 'toEnumCase'
 | 
						|
        ]
 | 
						|
      }
 | 
						|
    }
 | 
						|
  };
 | 
						|
 | 
						|
  ajv.addKeyword('transform', defFunc.definition);
 | 
						|
  return ajv;
 | 
						|
 | 
						|
  function makeHashTableKey (value) {
 | 
						|
    return value.toLowerCase();
 | 
						|
  }
 | 
						|
};
 |