Blame view

node_modules/ajv-keywords/keywords/transform.js 2.21 KB
aaac7fed   liuqimichale   add
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
  'use strict';
  
  module.exports = function defFunc (ajv) {
    defFunc.definition = {
      type: 'string',
      errors: false,
      modifying: true,
      valid: true,
      compile: function (schema, parentSchema) {
  
        // build hash table to enum values
        var hashtable = {};
  
        if (schema.indexOf('toEnumCase') !== -1) {
          // 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 (hashtable[k])
              throw new Error('Invalid enum uniqueness. To use `transform:["toEnumCase"]`, all values must be unique when case insensitive.');
            hashtable[k] = v;
          }
        }
  
        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) {
            return hashtable[makeHashTableKey(value)] || value;
          }
        };
  
        return function (value, objectKey, object, key) {
          // skip if value only
          if (!object) return;
  
          // apply transform in order provided
          for (var j = 0, l = schema.length; j < l; j++) {
            if (typeof object[key] !== 'string') continue;
            object[key] = transform[schema[j]](object[key]);
          }
        };
      },
      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();
    }
  };