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