import type { AddedKeywordDefinition } from "../types" ; const _jsonTypes = [ "string" , "number" , "integer" , "boolean" , "null" , "object" , "array" ] as const ; export type JSONType = typeof _jsonTypes [ number ] ; const jsonTypes = new Set ( _jsonTypes ) ; export function isJSONType ( x ) { 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 ; } ; keywords : { [ Key in string ] ? : boolean ; } ; types : ValidationTypes ; } export interface RuleGroup { type ? : JSONType ; rules : Rule [ ] ; } export interface Rule { keyword : string ; definition : AddedKeywordDefinition ; } export function getRules ( ) { const groups = { 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 : { } , } ; }