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