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 |
|
35 | cfg = {hash: {}};
|
36 |
|
37 |
|
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 |
|
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 |
|
53 | if (!object) return;
|
54 |
|
55 |
|
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 | };
|