Spaces:
Running
Running
; | |
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'); | |
} | |