| '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(); |
| } |
| }; |