[6a3a178] | 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 | };
|
---|