You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
2.1 KiB
80 lines
2.1 KiB
'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(); |
|
} |
|
};
|
|
|