Spaces:
Sleeping
Sleeping
; | |
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(); | |
} | |
}; | |