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