UNPKG

7 kBPlain TextView Raw
1import type {CodeGen, Code, Name, ScopeValueSets, ValueScopeName} from "../compile/codegen"
2import type {SchemaEnv, SchemaCxt, SchemaObjCxt} from "../compile"
3import type {JSONType} from "../compile/rules"
4import type {KeywordCxt} from "../compile/validate"
5import type Ajv from "../core"
6
7interface _SchemaObject {
8 id?: string
9 $id?: string
10 $schema?: string
11 [x: string]: any // TODO
12}
13
14export interface SchemaObject extends _SchemaObject {
15 id?: string
16 $id?: string
17 $schema?: string
18 $async?: false
19 [x: string]: any // TODO
20}
21
22export interface AsyncSchema extends _SchemaObject {
23 $async: true
24}
25
26export type AnySchemaObject = SchemaObject | AsyncSchema
27
28export type Schema = SchemaObject | boolean
29
30export type AnySchema = Schema | AsyncSchema
31
32export type SchemaMap = {[Key in string]?: AnySchema}
33
34export interface SourceCode {
35 validateName: ValueScopeName
36 validateCode: string
37 scopeValues: ScopeValueSets
38 evaluated?: Code
39}
40
41export interface DataValidationCxt<T extends string | number = string | number> {
42 instancePath: string
43 parentData: {[K in T]: any} // object or array
44 parentDataProperty: T // string or number
45 rootData: Record<string, any> | any[]
46 dynamicAnchors: {[Ref in string]?: ValidateFunction}
47}
48
49export interface ValidateFunction<T = unknown> {
50 (this: Ajv | any, data: any, dataCxt?: DataValidationCxt): data is T
51 errors?: null | ErrorObject[]
52 evaluated?: Evaluated
53 schema: AnySchema
54 schemaEnv: SchemaEnv
55 source?: SourceCode
56}
57
58export interface JTDParser<T = unknown> {
59 (json: string): T | undefined
60 message?: string
61 position?: number
62}
63
64export type EvaluatedProperties = {[K in string]?: true} | true
65
66export type EvaluatedItems = number | true
67
68export interface Evaluated {
69 // determined at compile time if staticProps/Items is true
70 props?: EvaluatedProperties
71 items?: EvaluatedItems
72 // whether props/items determined at compile time
73 dynamicProps: boolean
74 dynamicItems: boolean
75}
76
77export interface AsyncValidateFunction<T = unknown> extends ValidateFunction<T> {
78 (...args: Parameters<ValidateFunction<T>>): Promise<T>
79 $async: true
80}
81
82export type AnyValidateFunction<T = any> = ValidateFunction<T> | AsyncValidateFunction<T>
83
84export interface ErrorObject<K extends string = string, P = Record<string, any>, S = unknown> {
85 keyword: K
86 instancePath: string
87 schemaPath: string
88 params: P
89 // Added to validation errors of "propertyNames" keyword schema
90 propertyName?: string
91 // Excluded if option `messages` set to false.
92 message?: string
93 // These are added with the `verbose` option.
94 schema?: S
95 parentSchema?: AnySchemaObject
96 data?: unknown
97}
98
99export type ErrorNoParams<K extends string, S = unknown> = ErrorObject<K, Record<string, never>, S>
100
101interface _KeywordDef {
102 keyword: string | string[]
103 type?: JSONType | JSONType[] // data types that keyword applies to
104 schemaType?: JSONType | JSONType[] // allowed type(s) of keyword value in the schema
105 allowUndefined?: boolean // used for keywords that can be invoked by other keywords, not being present in the schema
106 $data?: boolean // keyword supports [$data reference](../../docs/guide/combining-schemas.md#data-reference)
107 implements?: string[] // other schema keywords that this keyword implements
108 before?: string // keyword should be executed before this keyword (should be applicable to the same type)
109 post?: boolean // keyword should be executed after other keywords without post flag
110 metaSchema?: AnySchemaObject // meta-schema for keyword schema value - it is better to use schemaType where applicable
111 validateSchema?: AnyValidateFunction // compiled keyword metaSchema - should not be passed
112 dependencies?: string[] // keywords that must be present in the same schema
113 error?: KeywordErrorDefinition
114 $dataError?: KeywordErrorDefinition
115}
116
117export interface CodeKeywordDefinition extends _KeywordDef {
118 code: (cxt: KeywordCxt, ruleType?: string) => void
119 trackErrors?: boolean
120}
121
122export type MacroKeywordFunc = (
123 schema: any,
124 parentSchema: AnySchemaObject,
125 it: SchemaCxt
126) => AnySchema
127
128export type CompileKeywordFunc = (
129 schema: any,
130 parentSchema: AnySchemaObject,
131 it: SchemaObjCxt
132) => DataValidateFunction
133
134export interface DataValidateFunction {
135 (...args: Parameters<ValidateFunction>): boolean | Promise<any>
136 errors?: Partial<ErrorObject>[]
137}
138
139export interface SchemaValidateFunction {
140 (schema: any, data: any, parentSchema?: AnySchemaObject, dataCxt?: DataValidationCxt):
141 | boolean
142 | Promise<any>
143 errors?: Partial<ErrorObject>[]
144}
145
146export interface FuncKeywordDefinition extends _KeywordDef {
147 validate?: SchemaValidateFunction | DataValidateFunction
148 compile?: CompileKeywordFunc
149 // schema: false makes validate not to expect schema (DataValidateFunction)
150 schema?: boolean // requires "validate"
151 modifying?: boolean
152 async?: boolean
153 valid?: boolean
154 errors?: boolean | "full"
155}
156
157export interface MacroKeywordDefinition extends FuncKeywordDefinition {
158 macro: MacroKeywordFunc
159}
160
161export type KeywordDefinition =
162 | CodeKeywordDefinition
163 | FuncKeywordDefinition
164 | MacroKeywordDefinition
165
166export type AddedKeywordDefinition = KeywordDefinition & {
167 type: JSONType[]
168 schemaType: JSONType[]
169}
170
171export interface KeywordErrorDefinition {
172 message: string | Code | ((cxt: KeywordErrorCxt) => string | Code)
173 params?: Code | ((cxt: KeywordErrorCxt) => Code)
174}
175
176export type Vocabulary = (KeywordDefinition | string)[]
177
178export interface KeywordErrorCxt {
179 gen: CodeGen
180 keyword: string
181 data: Name
182 $data?: string | false
183 schema: any // TODO
184 parentSchema?: AnySchemaObject
185 schemaCode: Code | number | boolean
186 schemaValue: Code | number | boolean
187 schemaType?: JSONType[]
188 errsCount?: Name
189 params: KeywordCxtParams
190 it: SchemaCxt
191}
192
193export type KeywordCxtParams = {[P in string]?: Code | string | number}
194
195export type FormatValidator<T extends string | number> = (data: T) => boolean
196
197export type FormatCompare<T extends string | number> = (data1: T, data2: T) => number | undefined
198
199export type AsyncFormatValidator<T extends string | number> = (data: T) => Promise<boolean>
200
201export interface FormatDefinition<T extends string | number> {
202 type?: T extends string ? "string" | undefined : "number"
203 validate: FormatValidator<T> | (T extends string ? string | RegExp : never)
204 async?: false | undefined
205 compare?: FormatCompare<T>
206}
207
208export interface AsyncFormatDefinition<T extends string | number> {
209 type?: T extends string ? "string" | undefined : "number"
210 validate: AsyncFormatValidator<T>
211 async: true
212 compare?: FormatCompare<T>
213}
214
215export type AddedFormat =
216 | true
217 | RegExp
218 | FormatValidator<string>
219 | FormatDefinition<string>
220 | FormatDefinition<number>
221 | AsyncFormatDefinition<string>
222 | AsyncFormatDefinition<number>
223
224export type Format = AddedFormat | string
225
226export interface RegExpEngine {
227 (pattern: string, u: string): RegExpLike
228 code: string
229}
230
231export interface RegExpLike {
232 test: (s: string) => boolean
233}