diff options
| author | Florian Dold <florian.dold@gmail.com> | 2017-08-14 05:01:11 +0200 |
|---|---|---|
| committer | Florian Dold <florian.dold@gmail.com> | 2017-08-14 05:02:09 +0200 |
| commit | 363723fc84f7b8477592e0105aeb331ec9a017af (patch) | |
| tree | 29f92724f34131bac64d6a318dd7e30612e631c7 /node_modules/ajv-keywords/keywords | |
| parent | 5634e77ad96bfe1818f6b6ee70b7379652e5487f (diff) | |
node_modules
Diffstat (limited to 'node_modules/ajv-keywords/keywords')
17 files changed, 184 insertions, 108 deletions
diff --git a/node_modules/ajv-keywords/keywords/_formatLimit.js b/node_modules/ajv-keywords/keywords/_formatLimit.js index 96541dd64..2ae8e007c 100644 --- a/node_modules/ajv-keywords/keywords/_formatLimit.js +++ b/node_modules/ajv-keywords/keywords/_formatLimit.js @@ -12,9 +12,6 @@ var COMPARE_FORMATS = { module.exports = function (minMax) { var keyword = 'format' + minMax; return function defFunc(ajv) { - if (ajv.RULES.keywords[keyword]) - return console.warn('Keyword', keyword, 'is already defined'); - defFunc.definition = { type: 'string', inline: require('./dotjs/_formatLimit'), @@ -53,7 +50,8 @@ function extendFormats(ajv) { var formats = ajv._formats; for (var name in COMPARE_FORMATS) { var format = formats[name]; - if (typeof format != 'object') + // the last condition is needed if it's RegExp from another window + if (typeof format != 'object' || format instanceof RegExp || !format.validate) format = formats[name] = { validate: format }; if (!format.compare) format.compare = COMPARE_FORMATS[name]; diff --git a/node_modules/ajv-keywords/keywords/_util.js b/node_modules/ajv-keywords/keywords/_util.js new file mode 100644 index 000000000..eebd07aad --- /dev/null +++ b/node_modules/ajv-keywords/keywords/_util.js @@ -0,0 +1,15 @@ +'use strict'; + +module.exports = { + metaSchemaRef: metaSchemaRef +}; + +var META_SCHEMA_ID = 'http://json-schema.org/draft-06/schema'; + +function metaSchemaRef(ajv) { + var defaultMeta = ajv._opts.defaultMeta; + if (typeof defaultMeta == 'string') return { $ref: defaultMeta }; + if (ajv.getSchema(META_SCHEMA_ID)) return { $ref: META_SCHEMA_ID }; + console.warn('meta schema not defined'); + return {}; +} diff --git a/node_modules/ajv-keywords/keywords/deepProperties.js b/node_modules/ajv-keywords/keywords/deepProperties.js index daa87426a..3dac5fb55 100644 --- a/node_modules/ajv-keywords/keywords/deepProperties.js +++ b/node_modules/ajv-keywords/keywords/deepProperties.js @@ -1,5 +1,7 @@ 'use strict'; +var util = require('./_util'); + module.exports = function defFunc(ajv) { defFunc.definition = { type: 'object', @@ -11,14 +13,11 @@ module.exports = function defFunc(ajv) { }, metaSchema: { type: 'object', - patternProperties: { - '^(\\/([^~\\/]|~0|~1)*)*(\\/)?$': { - $ref: ajv._opts.v5 - ? 'https://raw.githubusercontent.com/epoberezkin/ajv/master/lib/refs/json-schema-v5.json#' - : 'http://json-schema.org/draft-04/schema#' - } + propertyNames: { + type: 'string', + format: 'json-pointer' }, - additionalProperties: false + additionalProperties: util.metaSchemaRef(ajv) } }; diff --git a/node_modules/ajv-keywords/keywords/dot/_formatLimit.jst b/node_modules/ajv-keywords/keywords/dot/_formatLimit.jst index af16b88d8..f74096551 100644 --- a/node_modules/ajv-keywords/keywords/dot/_formatLimit.jst +++ b/node_modules/ajv-keywords/keywords/dot/_formatLimit.jst @@ -33,7 +33,7 @@ var {{=$valid}} = undefined; {{ var $schemaFormat = it.schema.format - , $isDataFormat = it.opts.v5 && $schemaFormat.$data + , $isDataFormat = it.opts.$data && $schemaFormat.$data , $closingBraces = ''; }} @@ -58,7 +58,7 @@ var {{=$valid}} = undefined; var $isMax = $keyword == 'formatMaximum' , $exclusiveKeyword = 'formatExclusive' + ($isMax ? 'Maximum' : 'Minimum') , $schemaExcl = it.schema[$exclusiveKeyword] - , $isDataExcl = it.opts.v5 && $schemaExcl && $schemaExcl.$data + , $isDataExcl = it.opts.$data && $schemaExcl && $schemaExcl.$data , $op = $isMax ? '<' : '>' , $result = 'result' + $lvl; }} diff --git a/node_modules/ajv-keywords/keywords/dot/patternRequired.jst b/node_modules/ajv-keywords/keywords/dot/patternRequired.jst index 9af2cdc9d..6f82f6265 100644 --- a/node_modules/ajv-keywords/keywords/dot/patternRequired.jst +++ b/node_modules/ajv-keywords/keywords/dot/patternRequired.jst @@ -4,16 +4,21 @@ {{ var $key = 'key' + $lvl + , $idx = 'idx' + $lvl , $matched = 'patternMatched' + $lvl + , $dataProperties = 'dataProperties' + $lvl , $closingBraces = '' , $ownProperties = it.opts.ownProperties; }} var {{=$valid}} = true; +{{? $ownProperties }} + var {{=$dataProperties}} = undefined; +{{?}} + {{~ $schema:$pProperty }} var {{=$matched}} = false; - for (var {{=$key}} in {{=$data}}) { - {{# def.checkOwnProperty }} + {{# def.iterateProperties }} {{=$matched}} = {{= it.usePattern($pProperty) }}.test({{=$key}}); if ({{=$matched}}) break; } diff --git a/node_modules/ajv-keywords/keywords/dot/switch.jst b/node_modules/ajv-keywords/keywords/dot/switch.jst index 7b2906a60..389678e34 100644 --- a/node_modules/ajv-keywords/keywords/dot/switch.jst +++ b/node_modules/ajv-keywords/keywords/dot/switch.jst @@ -10,7 +10,7 @@ {{# def._validateSwitchRule:if }} {{ $it.createErrors = true; }} {{# def.resetCompositeRule }} - {{=$ifPassed}} = valid{{=$it.level}}; + {{=$ifPassed}} = {{=$nextValid}}; #}} {{## def.validateThen: @@ -18,7 +18,7 @@ {{? $sch.then === false }} {{# def.error:'switch' }} {{?}} - var valid{{=$it.level}} = {{= $sch.then }}; + var {{=$nextValid}} = {{= $sch.then }}; {{??}} {{# def._validateSwitchRule:then }} {{?}} @@ -68,6 +68,6 @@ var {{=$ifPassed}}; {{= $closingBraces }} -var {{=$valid}} = valid{{=$it.level}}; +var {{=$valid}} = {{=$nextValid}}; {{# def.cleanUp }} diff --git a/node_modules/ajv-keywords/keywords/dotjs/_formatLimit.js b/node_modules/ajv-keywords/keywords/dotjs/_formatLimit.js index b2c5093df..fc56e2064 100644 --- a/node_modules/ajv-keywords/keywords/dotjs/_formatLimit.js +++ b/node_modules/ajv-keywords/keywords/dotjs/_formatLimit.js @@ -1,5 +1,5 @@ 'use strict'; -module.exports = function generate__formatLimit(it, $keyword) { +module.exports = function generate__formatLimit(it, $keyword, $ruleType) { var out = ' '; var $lvl = it.level; var $dataLvl = it.dataLevel; @@ -16,7 +16,7 @@ module.exports = function generate__formatLimit(it, $keyword) { return out; } var $schemaFormat = it.schema.format, - $isDataFormat = it.opts.v5 && $schemaFormat.$data, + $isDataFormat = it.opts.$data && $schemaFormat.$data, $closingBraces = ''; if ($isDataFormat) { var $schemaValueFormat = it.util.getData($schemaFormat.$data, $dataLvl, it.dataPathArr), @@ -34,7 +34,7 @@ module.exports = function generate__formatLimit(it, $keyword) { var $isMax = $keyword == 'formatMaximum', $exclusiveKeyword = 'formatExclusive' + ($isMax ? 'Maximum' : 'Minimum'), $schemaExcl = it.schema[$exclusiveKeyword], - $isDataExcl = it.opts.v5 && $schemaExcl && $schemaExcl.$data, + $isDataExcl = it.opts.$data && $schemaExcl && $schemaExcl.$data, $op = $isMax ? '<' : '>', $result = 'result' + $lvl; var $isData = it.opts.$data && $schema && $schema.$data, diff --git a/node_modules/ajv-keywords/keywords/dotjs/patternRequired.js b/node_modules/ajv-keywords/keywords/dotjs/patternRequired.js index e20df98ca..31bd0b683 100644 --- a/node_modules/ajv-keywords/keywords/dotjs/patternRequired.js +++ b/node_modules/ajv-keywords/keywords/dotjs/patternRequired.js @@ -1,5 +1,5 @@ 'use strict'; -module.exports = function generate_patternRequired(it, $keyword) { +module.exports = function generate_patternRequired(it, $keyword, $ruleType) { var out = ' '; var $lvl = it.level; var $dataLvl = it.dataLevel; @@ -7,29 +7,35 @@ module.exports = function generate_patternRequired(it, $keyword) { var $schemaPath = it.schemaPath + it.util.getProperty($keyword); var $errSchemaPath = it.errSchemaPath + '/' + $keyword; var $breakOnError = !it.opts.allErrors; - var $errorKeyword; var $data = 'data' + ($dataLvl || ''); var $valid = 'valid' + $lvl; var $key = 'key' + $lvl, + $idx = 'idx' + $lvl, $matched = 'patternMatched' + $lvl, + $dataProperties = 'dataProperties' + $lvl, $closingBraces = '', $ownProperties = it.opts.ownProperties; out += 'var ' + ($valid) + ' = true;'; + if ($ownProperties) { + out += ' var ' + ($dataProperties) + ' = undefined;'; + } var arr1 = $schema; if (arr1) { var $pProperty, i1 = -1, l1 = arr1.length - 1; while (i1 < l1) { $pProperty = arr1[i1 += 1]; - out += ' var ' + ($matched) + ' = false; for (var ' + ($key) + ' in ' + ($data) + ') { '; + out += ' var ' + ($matched) + ' = false; '; if ($ownProperties) { - out += ' if (!Object.prototype.hasOwnProperty.call(' + ($data) + ', ' + ($key) + ')) continue; '; + out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; '; + } else { + out += ' for (var ' + ($key) + ' in ' + ($data) + ') { '; } out += ' ' + ($matched) + ' = ' + (it.usePattern($pProperty)) + '.test(' + ($key) + '); if (' + ($matched) + ') break; } '; var $missingPattern = it.util.escapeQuotes($pProperty); out += ' if (!' + ($matched) + ') { ' + ($valid) + ' = false; var err = '; /* istanbul ignore else */ if (it.createErrors !== false) { - out += ' { keyword: \'' + ($errorKeyword || 'patternRequired') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingPattern: \'' + ($missingPattern) + '\' } '; + out += ' { keyword: \'' + ('patternRequired') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingPattern: \'' + ($missingPattern) + '\' } '; if (it.opts.messages !== false) { out += ' , message: \'should have property matching pattern \\\'' + ($missingPattern) + '\\\'\' '; } diff --git a/node_modules/ajv-keywords/keywords/dotjs/switch.js b/node_modules/ajv-keywords/keywords/dotjs/switch.js index f0e843fe0..d6de28bf9 100644 --- a/node_modules/ajv-keywords/keywords/dotjs/switch.js +++ b/node_modules/ajv-keywords/keywords/dotjs/switch.js @@ -1,5 +1,5 @@ 'use strict'; -module.exports = function generate_switch(it, $keyword) { +module.exports = function generate_switch(it, $keyword, $ruleType) { var out = ' '; var $lvl = it.level; var $dataLvl = it.dataLevel; @@ -7,7 +7,6 @@ module.exports = function generate_switch(it, $keyword) { var $schemaPath = it.schemaPath + it.util.getProperty($keyword); var $errSchemaPath = it.errSchemaPath + '/' + $keyword; var $breakOnError = !it.opts.allErrors; - var $errorKeyword; var $data = 'data' + ($dataLvl || ''); var $valid = 'valid' + $lvl; var $errs = 'errs__' + $lvl; @@ -41,14 +40,14 @@ module.exports = function generate_switch(it, $keyword) { $it.baseId = $currentBaseId; $it.createErrors = true; it.compositeRule = $it.compositeRule = $wasComposite; - out += ' ' + ($ifPassed) + ' = valid' + ($it.level) + '; if (' + ($ifPassed) + ') { '; + out += ' ' + ($ifPassed) + ' = ' + ($nextValid) + '; if (' + ($ifPassed) + ') { '; if (typeof $sch.then == 'boolean') { if ($sch.then === false) { var $$outStack = $$outStack || []; $$outStack.push(out); out = ''; /* istanbul ignore else */ if (it.createErrors !== false) { - out += ' { keyword: \'' + ($errorKeyword || 'switch') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { caseIndex: ' + ($caseIndex) + ' } '; + out += ' { keyword: \'' + ('switch') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { caseIndex: ' + ($caseIndex) + ' } '; if (it.opts.messages !== false) { out += ' , message: \'should pass "switch" keyword validation\' '; } @@ -71,7 +70,7 @@ module.exports = function generate_switch(it, $keyword) { out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; } } - out += ' var valid' + ($it.level) + ' = ' + ($sch.then) + '; '; + out += ' var ' + ($nextValid) + ' = ' + ($sch.then) + '; '; } else { $it.schema = $sch.then; $it.schemaPath = $schemaPath + '[' + $caseIndex + '].then'; @@ -88,7 +87,7 @@ module.exports = function generate_switch(it, $keyword) { $$outStack.push(out); out = ''; /* istanbul ignore else */ if (it.createErrors !== false) { - out += ' { keyword: \'' + ($errorKeyword || 'switch') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { caseIndex: ' + ($caseIndex) + ' } '; + out += ' { keyword: \'' + ('switch') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { caseIndex: ' + ($caseIndex) + ' } '; if (it.opts.messages !== false) { out += ' , message: \'should pass "switch" keyword validation\' '; } @@ -111,7 +110,7 @@ module.exports = function generate_switch(it, $keyword) { out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; } } - out += ' var valid' + ($it.level) + ' = ' + ($sch.then) + '; '; + out += ' var ' + ($nextValid) + ' = ' + ($sch.then) + '; '; } else { $it.schema = $sch.then; $it.schemaPath = $schemaPath + '[' + $caseIndex + '].then'; @@ -123,7 +122,7 @@ module.exports = function generate_switch(it, $keyword) { $shouldContinue = $sch.continue } } - out += '' + ($closingBraces) + 'var ' + ($valid) + ' = valid' + ($it.level) + '; '; + out += '' + ($closingBraces) + 'var ' + ($valid) + ' = ' + ($nextValid) + '; '; out = it.util.cleanUpCode(out); return out; } diff --git a/node_modules/ajv-keywords/keywords/if.js b/node_modules/ajv-keywords/keywords/if.js index 014b0dc0b..8a8fc95ee 100644 --- a/node_modules/ajv-keywords/keywords/if.js +++ b/node_modules/ajv-keywords/keywords/if.js @@ -1,7 +1,7 @@ 'use strict'; module.exports = function defFunc(ajv) { - if (!ajv._opts.v5) console.warn('keywords if/then/else require v5 option'); + if (!ajv.RULES.keywords.switch) require('./switch')(ajv); defFunc.definition = { macro: function (schema, parentSchema) { diff --git a/node_modules/ajv-keywords/keywords/index.js b/node_modules/ajv-keywords/keywords/index.js index 931aa6ad3..06b68b776 100644 --- a/node_modules/ajv-keywords/keywords/index.js +++ b/node_modules/ajv-keywords/keywords/index.js @@ -2,17 +2,18 @@ module.exports = { 'instanceof': require('./instanceof'), - propertyNames: require('./propertyNames'), range: require('./range'), regexp: require('./regexp'), 'typeof': require('./typeof'), dynamicDefaults: require('./dynamicDefaults'), 'if': require('./if'), prohibited: require('./prohibited'), + uniqueItemProperties: require('./uniqueItemProperties'), deepProperties: require('./deepProperties'), - deepRequired: require('./deepRequired') - // formatMinimum: require('./formatMinimum'), - // formatMaximum: require('./formatMaximum'), - // patternRequired: require('./patternRequired'), - // 'switch': require('./switch') + deepRequired: require('./deepRequired'), + formatMinimum: require('./formatMinimum'), + formatMaximum: require('./formatMaximum'), + patternRequired: require('./patternRequired'), + 'switch': require('./switch'), + select: require('./select') }; diff --git a/node_modules/ajv-keywords/keywords/patternRequired.js b/node_modules/ajv-keywords/keywords/patternRequired.js index f3f4ee903..046f313fd 100644 --- a/node_modules/ajv-keywords/keywords/patternRequired.js +++ b/node_modules/ajv-keywords/keywords/patternRequired.js @@ -1,9 +1,6 @@ 'use strict'; module.exports = function defFunc(ajv) { - if (ajv.RULES.keywords.patternRequired) - return console.warn('Keyword patternRequired is already defined'); - defFunc.definition = { type: 'object', inline: require('./dotjs/patternRequired'), diff --git a/node_modules/ajv-keywords/keywords/propertyNames.js b/node_modules/ajv-keywords/keywords/propertyNames.js deleted file mode 100644 index 987f236c0..000000000 --- a/node_modules/ajv-keywords/keywords/propertyNames.js +++ /dev/null @@ -1,51 +0,0 @@ -'use strict'; - -module.exports = function defFunc(ajv) { - defFunc.definition = { - type: 'object', - compile: function(schema) { - var validate = ajv.compile(schema); - return ajv._opts.allErrors ? vAllErrors : vBreakOnError; - - function vBreakOnError(data) { - for (var prop in data) { - if (!validate(prop)) { - vBreakOnError.errors = validate.errors; - addPropertyNameError(vBreakOnError.errors, prop); - return false; - } - } - return true; - } - - function vAllErrors(data) { - var errors = []; - for (var prop in data) { - if (!validate(prop)) { - errors = errors.concat(validate.errors); - addPropertyNameError(errors, prop); - } - } - if (errors.length) vAllErrors.errors = errors; - return errors.length == 0; - } - - function addPropertyNameError(errors, propName) { - errors.push({ - keyword: 'propertyNames', - params: { propertyName: propName }, - message: 'should have valid property name of "' + propName + '"' - }); - } - }, - metaSchema: { - $ref: ajv._opts.v5 - ? 'https://raw.githubusercontent.com/epoberezkin/ajv/master/lib/refs/json-schema-v5.json#' - : 'http://json-schema.org/draft-04/schema#' - }, - errors: true - }; - - ajv.addKeyword('propertyNames', defFunc.definition); - return ajv; -}; diff --git a/node_modules/ajv-keywords/keywords/range.js b/node_modules/ajv-keywords/keywords/range.js index 3f25ac24f..9c1fd3ffd 100644 --- a/node_modules/ajv-keywords/keywords/range.js +++ b/node_modules/ajv-keywords/keywords/range.js @@ -10,12 +10,9 @@ module.exports = function defFunc(ajv) { validateRangeSchema(min, max, exclusive); - return { - minimum: min, - exclusiveMinimum: exclusive, - maximum: max, - exclusiveMaximum: exclusive - }; + return exclusive === true + ? {exclusiveMinimum: min, exclusiveMaximum: max} + : {minimum: min, maximum: max}; }, metaSchema: { type: 'array', diff --git a/node_modules/ajv-keywords/keywords/select.js b/node_modules/ajv-keywords/keywords/select.js new file mode 100644 index 000000000..f79c6c7a0 --- /dev/null +++ b/node_modules/ajv-keywords/keywords/select.js @@ -0,0 +1,79 @@ +'use strict'; + +var util = require('./_util'); + +module.exports = function defFunc(ajv) { + if (!ajv._opts.$data) { + console.warn('keyword select requires $data option'); + return ajv; + } + var metaSchemaRef = util.metaSchemaRef(ajv); + var compiledCaseSchemas = []; + + defFunc.definition = { + validate: function v(schema, data, parentSchema) { + if (parentSchema.selectCases === undefined) + throw new Error('keyword "selectCases" is absent'); + var compiled = getCompiledSchemas(parentSchema, false); + var validate = compiled.cases[schema]; + if (validate === undefined) validate = compiled.default; + if (typeof validate == 'boolean') return validate; + var valid = validate(data); + if (!valid) v.errors = validate.errors; + return valid; + }, + $data: true, + metaSchema: { type: ['string', 'number', 'boolean', 'null'] } + }; + + ajv.addKeyword('select', defFunc.definition); + ajv.addKeyword('selectCases', { + compile: function (schemas, parentSchema) { + var compiled = getCompiledSchemas(parentSchema); + for (var value in schemas) + compiled.cases[value] = compileOrBoolean(schemas[value]); + return function() { return true; }; + }, + valid: true, + metaSchema: { + type: 'object', + additionalProperties: metaSchemaRef + } + }); + ajv.addKeyword('selectDefault', { + compile: function (schema, parentSchema) { + var compiled = getCompiledSchemas(parentSchema); + compiled.default = compileOrBoolean(schema); + return function() { return true; }; + }, + valid: true, + metaSchema: metaSchemaRef + }); + return ajv; + + + function getCompiledSchemas(parentSchema, create) { + var compiled; + compiledCaseSchemas.some(function (c) { + if (c.parentSchema === parentSchema) { + compiled = c; + return true; + } + }); + if (!compiled && create !== false) { + compiled = { + parentSchema: parentSchema, + cases: {}, + default: true + }; + compiledCaseSchemas.push(compiled); + } + return compiled; + } + + function compileOrBoolean(schema) { + return typeof schema == 'boolean' + ? schema + : ajv.compile(schema); + } +}; diff --git a/node_modules/ajv-keywords/keywords/switch.js b/node_modules/ajv-keywords/keywords/switch.js index 8c22bf8b9..5b0f3f830 100644 --- a/node_modules/ajv-keywords/keywords/switch.js +++ b/node_modules/ajv-keywords/keywords/switch.js @@ -1,12 +1,11 @@ 'use strict'; +var util = require('./_util'); + module.exports = function defFunc(ajv) { - if (ajv.RULES.keywords.switch) - return console.warn('Keyword switch is already defined'); + if (ajv.RULES.keywords.switch && ajv.RULES.keywords.if) return; - var metaSchemaUri = ajv._opts.v5 - ? 'https://raw.githubusercontent.com/epoberezkin/ajv/master/lib/refs/json-schema-v5.json#' - : 'http://json-schema.org/draft-04/schema#'; + var metaSchemaRef = util.metaSchemaRef(ajv); defFunc.definition = { inline: require('./dotjs/switch'), @@ -17,11 +16,11 @@ module.exports = function defFunc(ajv) { items: { required: [ 'then' ], properties: { - 'if': { $ref: metaSchemaUri }, + 'if': metaSchemaRef, 'then': { anyOf: [ { type: 'boolean' }, - { $ref: metaSchemaUri } + metaSchemaRef ] }, 'continue': { type: 'boolean' } diff --git a/node_modules/ajv-keywords/keywords/uniqueItemProperties.js b/node_modules/ajv-keywords/keywords/uniqueItemProperties.js new file mode 100644 index 000000000..2a8e7e841 --- /dev/null +++ b/node_modules/ajv-keywords/keywords/uniqueItemProperties.js @@ -0,0 +1,32 @@ +'use strict'; + +module.exports = function defFunc(ajv) { + defFunc.definition = { + type: 'array', + compile: function(keys, parentSchema, it) { + var equal = it.util.equal; + return function(data) { + if (data.length > 1) { + for (var k=0; k < keys.length; k++) { + var key = keys[k]; + for (var i = data.length; i--;) { + if (typeof data[i] != 'object') continue; + for (var j = i; j--;) { + if (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; +}; |
