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.
		
		
		
		
		
			
		
			
				
					51 lines
				
				1.4 KiB
			
		
		
			
		
	
	
					51 lines
				
				1.4 KiB
			| 
											3 years ago
										 | import type {AddedKeywordDefinition} from "../types" | ||
|  | 
 | ||
|  | const _jsonTypes = ["string", "number", "integer", "boolean", "null", "object", "array"] as const | ||
|  | 
 | ||
|  | export type JSONType = typeof _jsonTypes[number] | ||
|  | 
 | ||
|  | const jsonTypes: Set<string> = new Set(_jsonTypes) | ||
|  | 
 | ||
|  | export function isJSONType(x: unknown): x is JSONType { | ||
|  |   return typeof x == "string" && jsonTypes.has(x) | ||
|  | } | ||
|  | 
 | ||
|  | type ValidationTypes = { | ||
|  |   [K in JSONType]: boolean | RuleGroup | undefined | ||
|  | } | ||
|  | 
 | ||
|  | export interface ValidationRules { | ||
|  |   rules: RuleGroup[] | ||
|  |   post: RuleGroup | ||
|  |   all: {[Key in string]?: boolean | Rule} // rules that have to be validated
 | ||
|  |   keywords: {[Key in string]?: boolean} // all known keywords (superset of "all")
 | ||
|  |   types: ValidationTypes | ||
|  | } | ||
|  | 
 | ||
|  | export interface RuleGroup { | ||
|  |   type?: JSONType | ||
|  |   rules: Rule[] | ||
|  | } | ||
|  | 
 | ||
|  | // This interface wraps KeywordDefinition because definition can have multiple keywords
 | ||
|  | export interface Rule { | ||
|  |   keyword: string | ||
|  |   definition: AddedKeywordDefinition | ||
|  | } | ||
|  | 
 | ||
|  | export function getRules(): ValidationRules { | ||
|  |   const groups: Record<"number" | "string" | "array" | "object", RuleGroup> = { | ||
|  |     number: {type: "number", rules: []}, | ||
|  |     string: {type: "string", rules: []}, | ||
|  |     array: {type: "array", rules: []}, | ||
|  |     object: {type: "object", rules: []}, | ||
|  |   } | ||
|  |   return { | ||
|  |     types: {...groups, integer: true, boolean: true, null: true}, | ||
|  |     rules: [{rules: []}, groups.number, groups.string, groups.array, groups.object], | ||
|  |     post: {rules: []}, | ||
|  |     all: {}, | ||
|  |     keywords: {}, | ||
|  |   } | ||
|  | } |