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.
59 lines
1.8 KiB
59 lines
1.8 KiB
'use strict'; |
|
|
|
var SCALAR_TYPES = ['number', 'integer', 'string', 'boolean', 'null']; |
|
|
|
module.exports = function defFunc(ajv) { |
|
defFunc.definition = { |
|
type: 'array', |
|
compile: function(keys, parentSchema, it) { |
|
var equal = it.util.equal; |
|
var scalar = getScalarKeys(keys, parentSchema); |
|
|
|
return function(data) { |
|
if (data.length > 1) { |
|
for (var k=0; k < keys.length; k++) { |
|
var i, key = keys[k]; |
|
if (scalar[k]) { |
|
var hash = {}; |
|
for (i = data.length; i--;) { |
|
if (!data[i] || typeof data[i] != 'object') continue; |
|
var prop = data[i][key]; |
|
if (prop && typeof prop == 'object') continue; |
|
if (typeof prop == 'string') prop = '"' + prop; |
|
if (hash[prop]) return false; |
|
hash[prop] = true; |
|
} |
|
} else { |
|
for (i = data.length; i--;) { |
|
if (!data[i] || typeof data[i] != 'object') continue; |
|
for (var j = i; j--;) { |
|
if (data[j] && typeof data[j] == 'object' && equal(data[i][key], data[j][key])) |
|
return false; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
return true; |
|
}; |
|
}, |
|
metaSchema: { |
|
type: 'array', |
|
items: {type: 'string'} |
|
} |
|
}; |
|
|
|
ajv.addKeyword('uniqueItemProperties', defFunc.definition); |
|
return ajv; |
|
}; |
|
|
|
|
|
function getScalarKeys(keys, schema) { |
|
return keys.map(function(key) { |
|
var properties = schema.items && schema.items.properties; |
|
var propType = properties && properties[key] && properties[key].type; |
|
return Array.isArray(propType) |
|
? propType.indexOf('object') < 0 && propType.indexOf('array') < 0 |
|
: SCALAR_TYPES.indexOf(propType) >= 0; |
|
}); |
|
}
|
|
|