--- /dev/null
+'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();
+ }
+};