import type { JSONSchema4Type } from "./json-schema";
export type AST_TYPE = AST["type"];
export type AST = TAny | TArray | TBoolean | TEnum | TInterface | TNamedInterface | TIntersection | TLiteral | TNever | TNumber | TNull | TObject | TReference | TString | TTuple | TUnion | TUnknown | TCustomType;
export interface AbstractAST {
    comment?: string;
    keyName?: string;
    standaloneName?: string;
    type: AST_TYPE;
    deprecated?: boolean;
}
export type ASTWithComment = AST & {
    comment: string;
};
export type ASTWithName = AST & {
    keyName: string;
};
export type ASTWithStandaloneName = AST & {
    standaloneName: string;
};
export declare function hasComment(ast: AST): ast is ASTWithComment;
export declare function hasStandaloneName(ast: AST): ast is ASTWithStandaloneName;
export interface TAny extends AbstractAST {
    type: "ANY";
}
export interface TArray extends AbstractAST {
    type: "ARRAY";
    params: AST;
}
export interface TBoolean extends AbstractAST {
    type: "BOOLEAN";
}
export interface TEnum extends AbstractAST {
    standaloneName: string;
    type: "ENUM";
    params: TEnumParam[];
}
export interface TEnumParam {
    ast: AST;
    keyName: string;
}
export interface TInterface extends AbstractAST {
    type: "INTERFACE";
    params: TInterfaceParam[];
    superTypes: TNamedInterface[];
}
export interface TNamedInterface extends AbstractAST {
    standaloneName: string;
    type: "INTERFACE";
    params: TInterfaceParam[];
    superTypes: TNamedInterface[];
}
export interface TNever extends AbstractAST {
    type: "NEVER";
}
export interface TInterfaceParam {
    ast: AST;
    keyName: string;
    isRequired: boolean;
    isPatternProperty: boolean;
    isUnreachableDefinition: boolean;
}
export interface TIntersection extends AbstractAST {
    type: "INTERSECTION";
    params: AST[];
}
export interface TLiteral extends AbstractAST {
    params: JSONSchema4Type;
    type: "LITERAL";
}
export interface TNumber extends AbstractAST {
    type: "NUMBER";
}
export interface TNull extends AbstractAST {
    type: "NULL";
}
export interface TObject extends AbstractAST {
    type: "OBJECT";
}
export interface TReference extends AbstractAST {
    type: "REFERENCE";
    params: string;
}
export interface TString extends AbstractAST {
    type: "STRING";
}
export interface TTuple extends AbstractAST {
    type: "TUPLE";
    params: AST[];
    spreadParam?: AST;
    minItems: number;
    maxItems?: number;
}
export interface TUnion extends AbstractAST {
    type: "UNION";
    params: AST[];
}
export interface TUnknown extends AbstractAST {
    type: "UNKNOWN";
}
export interface TCustomType extends AbstractAST {
    type: "CUSTOM_TYPE";
    params: string;
}
export declare const T_ANY: TAny;
export declare const T_ANY_ADDITIONAL_PROPERTIES: TAny & ASTWithName;
export declare const T_UNKNOWN: TUnknown;
export declare const T_UNKNOWN_ADDITIONAL_PROPERTIES: TUnknown & ASTWithName;
//# sourceMappingURL=AST.d.ts.map