UNPKG

ajv

Version:

Another JSON Schema Validator

184 lines (183 loc) 6.38 kB
import { URIComponent } from "fast-uri"; import type { CodeGen, Code, Name, ScopeValueSets, ValueScopeName } from "../compile/codegen"; import type { SchemaEnv, SchemaCxt, SchemaObjCxt } from "../compile"; import type { JSONType } from "../compile/rules"; import type { KeywordCxt } from "../compile/validate"; import type Ajv from "../core"; interface _SchemaObject { id?: string; $id?: string; $schema?: string; [x: string]: any; } export interface SchemaObject extends _SchemaObject { id?: string; $id?: string; $schema?: string; $async?: false; [x: string]: any; } export interface AsyncSchema extends _SchemaObject { $async: true; } export type AnySchemaObject = SchemaObject | AsyncSchema; export type Schema = SchemaObject | boolean; export type AnySchema = Schema | AsyncSchema; export type SchemaMap = { [Key in string]?: AnySchema; }; export interface SourceCode { validateName: ValueScopeName; validateCode: string; scopeValues: ScopeValueSets; evaluated?: Code; } export interface DataValidationCxt<T extends string | number = string | number> { instancePath: string; parentData: { [K in T]: any; }; parentDataProperty: T; rootData: Record<string, any> | any[]; dynamicAnchors: { [Ref in string]?: ValidateFunction; }; } export interface ValidateFunction<T = unknown> { (this: Ajv | any, data: any, dataCxt?: DataValidationCxt): data is T; errors?: null | ErrorObject[]; evaluated?: Evaluated; schema: AnySchema; schemaEnv: SchemaEnv; source?: SourceCode; } export interface JTDParser<T = unknown> { (json: string): T | undefined; message?: string; position?: number; } export type EvaluatedProperties = { [K in string]?: true; } | true; export type EvaluatedItems = number | true; export interface Evaluated { props?: EvaluatedProperties; items?: EvaluatedItems; dynamicProps: boolean; dynamicItems: boolean; } export interface AsyncValidateFunction<T = unknown> extends ValidateFunction<T> { (...args: Parameters<ValidateFunction<T>>): Promise<T>; $async: true; } export type AnyValidateFunction<T = any> = ValidateFunction<T> | AsyncValidateFunction<T>; export interface ErrorObject<K extends string = string, P = Record<string, any>, S = unknown> { keyword: K; instancePath: string; schemaPath: string; params: P; propertyName?: string; message?: string; schema?: S; parentSchema?: AnySchemaObject; data?: unknown; } export type ErrorNoParams<K extends string, S = unknown> = ErrorObject<K, Record<string, never>, S>; interface _KeywordDef { keyword: string | string[]; type?: JSONType | JSONType[]; schemaType?: JSONType | JSONType[]; allowUndefined?: boolean; $data?: boolean; implements?: string[]; before?: string; post?: boolean; metaSchema?: AnySchemaObject; validateSchema?: AnyValidateFunction; dependencies?: string[]; error?: KeywordErrorDefinition; $dataError?: KeywordErrorDefinition; } export interface CodeKeywordDefinition extends _KeywordDef { code: (cxt: KeywordCxt, ruleType?: string) => void; trackErrors?: boolean; } export type MacroKeywordFunc = (schema: any, parentSchema: AnySchemaObject, it: SchemaCxt) => AnySchema; export type CompileKeywordFunc = (schema: any, parentSchema: AnySchemaObject, it: SchemaObjCxt) => DataValidateFunction; export interface DataValidateFunction { (...args: Parameters<ValidateFunction>): boolean | Promise<any>; errors?: Partial<ErrorObject>[]; } export interface SchemaValidateFunction { (schema: any, data: any, parentSchema?: AnySchemaObject, dataCxt?: DataValidationCxt): boolean | Promise<any>; errors?: Partial<ErrorObject>[]; } export interface FuncKeywordDefinition extends _KeywordDef { validate?: SchemaValidateFunction | DataValidateFunction; compile?: CompileKeywordFunc; schema?: boolean; modifying?: boolean; async?: boolean; valid?: boolean; errors?: boolean | "full"; } export interface MacroKeywordDefinition extends FuncKeywordDefinition { macro: MacroKeywordFunc; } export type KeywordDefinition = CodeKeywordDefinition | FuncKeywordDefinition | MacroKeywordDefinition; export type AddedKeywordDefinition = KeywordDefinition & { type: JSONType[]; schemaType: JSONType[]; }; export interface KeywordErrorDefinition { message: string | Code | ((cxt: KeywordErrorCxt) => string | Code); params?: Code | ((cxt: KeywordErrorCxt) => Code); } export type Vocabulary = (KeywordDefinition | string)[]; export interface KeywordErrorCxt { gen: CodeGen; keyword: string; data: Name; $data?: string | false; schema: any; parentSchema?: AnySchemaObject; schemaCode: Code | number | boolean; schemaValue: Code | number | boolean; schemaType?: JSONType[]; errsCount?: Name; params: KeywordCxtParams; it: SchemaCxt; } export type KeywordCxtParams = { [P in string]?: Code | string | number; }; export type FormatValidator<T extends string | number> = (data: T) => boolean; export type FormatCompare<T extends string | number> = (data1: T, data2: T) => number | undefined; export type AsyncFormatValidator<T extends string | number> = (data: T) => Promise<boolean>; export interface FormatDefinition<T extends string | number> { type?: T extends string ? "string" | undefined : "number"; validate: FormatValidator<T> | (T extends string ? string | RegExp : never); async?: false | undefined; compare?: FormatCompare<T>; } export interface AsyncFormatDefinition<T extends string | number> { type?: T extends string ? "string" | undefined : "number"; validate: AsyncFormatValidator<T>; async: true; compare?: FormatCompare<T>; } export type AddedFormat = true | RegExp | FormatValidator<string> | FormatDefinition<string> | FormatDefinition<number> | AsyncFormatDefinition<string> | AsyncFormatDefinition<number>; export type Format = AddedFormat | string; export interface RegExpEngine { (pattern: string, u: string): RegExpLike; code: string; } export interface RegExpLike { test: (s: string) => boolean; } export interface UriResolver { parse(uri: string): URIComponent; resolve(base: string, path: string): string; serialize(component: URIComponent): string; } export {};