You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			90 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
		
		
			
		
	
	
			90 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
| 
											9 months ago
										 | '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'); | ||
|  | } |