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.
89 lines
2.3 KiB
89 lines
2.3 KiB
'use strict'; |
|
|
|
var traverse = module.exports = function (schema, opts, cb) { |
|
// Legacy support for v0.3.1 and earlier. |
|
if (typeof opts == 'function') { |
|
cb = opts; |
|
opts = {}; |
|
} |
|
|
|
cb = opts.cb || cb; |
|
var pre = (typeof cb == 'function') ? cb : cb.pre || function() {}; |
|
var post = cb.post || function() {}; |
|
|
|
_traverse(opts, pre, post, schema, '', schema); |
|
}; |
|
|
|
|
|
traverse.keywords = { |
|
additionalItems: true, |
|
items: true, |
|
contains: true, |
|
additionalProperties: true, |
|
propertyNames: true, |
|
not: true |
|
}; |
|
|
|
traverse.arrayKeywords = { |
|
items: true, |
|
allOf: true, |
|
anyOf: true, |
|
oneOf: true |
|
}; |
|
|
|
traverse.propsKeywords = { |
|
definitions: true, |
|
properties: true, |
|
patternProperties: true, |
|
dependencies: true |
|
}; |
|
|
|
traverse.skipKeywords = { |
|
default: true, |
|
enum: true, |
|
const: true, |
|
required: true, |
|
maximum: true, |
|
minimum: true, |
|
exclusiveMaximum: true, |
|
exclusiveMinimum: true, |
|
multipleOf: true, |
|
maxLength: true, |
|
minLength: true, |
|
pattern: true, |
|
format: true, |
|
maxItems: true, |
|
minItems: true, |
|
uniqueItems: true, |
|
maxProperties: true, |
|
minProperties: true |
|
}; |
|
|
|
|
|
function _traverse(opts, pre, post, schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex) { |
|
if (schema && typeof schema == 'object' && !Array.isArray(schema)) { |
|
pre(schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex); |
|
for (var key in schema) { |
|
var sch = schema[key]; |
|
if (Array.isArray(sch)) { |
|
if (key in traverse.arrayKeywords) { |
|
for (var i=0; i<sch.length; i++) |
|
_traverse(opts, pre, post, sch[i], jsonPtr + '/' + key + '/' + i, rootSchema, jsonPtr, key, schema, i); |
|
} |
|
} else if (key in traverse.propsKeywords) { |
|
if (sch && typeof sch == 'object') { |
|
for (var prop in sch) |
|
_traverse(opts, pre, post, sch[prop], jsonPtr + '/' + key + '/' + escapeJsonPtr(prop), rootSchema, jsonPtr, key, schema, prop); |
|
} |
|
} else if (key in traverse.keywords || (opts.allKeys && !(key in traverse.skipKeywords))) { |
|
_traverse(opts, pre, post, sch, jsonPtr + '/' + key, rootSchema, jsonPtr, key, schema); |
|
} |
|
} |
|
post(schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex); |
|
} |
|
} |
|
|
|
|
|
function escapeJsonPtr(str) { |
|
return str.replace(/~/g, '~0').replace(/\//g, '~1'); |
|
}
|
|
|