import { ApiEdgeDefinition } from "./edge/ApiEdgeDefinition";
import { ApiEdgeMetadata } from "./edge/ApiEdgeMetadata";
import { ApiRequest, ApiRequestType } from "./request/ApiRequest";
import { ApiQuery, ApiQueryScope } from "./query/ApiQuery";
import { ApiEdgeRelation, ExportedApiEdgeRelation } from "./relations/ApiEdgeRelation";
import { ApiAction, ApiActionTriggerKind } from "./query/ApiAction";
import { ApiResolver } from "./resolver/ApiResolver";
export interface ApiInfo {
    title: string;
    description?: string;
    termsOfService?: string;
    contact?: {
        name?: string;
        url?: string;
        email?: string;
    };
    license?: {
        name: string;
        url?: string;
    };
}
export interface ApiMetadata {
    info: ApiInfo;
    version: string;
    edges: ApiEdgeMetadata[];
    relations: ExportedApiEdgeRelation[];
    services: ApiService[];
}
export interface ApiService {
    name: string;
    version: string;
}
export declare class Api {
    static defaultIdPostfix: string;
    static defaultIdField: string;
    url?: string;
    info?: ApiInfo;
    service: ApiService;
    edges: ApiEdgeDefinition[];
    relations: ApiEdgeRelation[];
    actions: ApiAction[];
    private parser;
    private queryBuilder;
    resolver: ApiResolver;
    constructor(service: ApiService, ...edges: ApiEdgeDefinition[]);
    findEdge: (name: string, plural?: boolean) => Promise<ApiEdgeDefinition | undefined>;
    findRelation(name: string): Promise<ApiEdgeRelation | undefined>;
    findRelationOfEdge(edge: string | ApiEdgeDefinition, name: string): Promise<ApiEdgeRelation | undefined>;
    findRelationTo(edge: string | ApiEdgeDefinition, name: string): Promise<ApiEdgeRelation | undefined>;
    findRelationFrom(edge: string | ApiEdgeDefinition, name: string): Promise<ApiEdgeRelation | undefined>;
    parseRequest: (requestParts: string[], type?: ApiRequestType | null) => Promise<ApiRequest>;
    buildQuery: (request: ApiRequest) => ApiQuery;
    edge(edge: ApiEdgeDefinition): this;
    relation(relation: ApiEdgeRelation): this;
    use: (action: ApiAction) => this;
    action: (name: string, execute: (scope: ApiQueryScope) => Promise<ApiQueryScope>, triggerKind?: ApiActionTriggerKind) => Api;
    metadata: () => ApiMetadata;
    static fromMetadata(metadata: ApiMetadata): Promise<Api>;
    prepare(): Promise<void>;
    private extension;
    get: (key: string) => any;
    set: (key: string, value: any) => any;
}
