interface JsonApiHydratedDataInterface {
    jsonApi: any;
    included: any[];
    allData?: any[];
}

interface ApiDataInterface {
    get included(): any[];
    get type(): string;
    get id(): string;
    get createdAt(): Date;
    get updatedAt(): Date;
    get self(): string | undefined;
    get jsonApi(): any;
    generateApiUrl(params?: any): string;
    dehydrate(): JsonApiHydratedDataInterface;
    rehydrate(data: JsonApiHydratedDataInterface): this;
    createJsonApi(data: any): any;
}

type GetterKeys<T> = {
    [K in keyof T]: T[K] extends () => any ? never : K;
}[keyof T];
type FieldSelector<T> = {
    type: string;
    fields: ReadonlyArray<GetterKeys<T>>;
};
declare function createJsonApiInclusion<T>(dataType: string, fields: ReadonlyArray<GetterKeys<T>>): FieldSelector<T>;

type ApiRequestDataTypeInterface = {
    name: string;
    cache?: string;
    inclusions?: Record<string, {
        types?: string[];
        fields?: FieldSelector<any>[];
    }>;
    model: new () => any;
};

export { type ApiDataInterface as A, type FieldSelector as F, type GetterKeys as G, type JsonApiHydratedDataInterface as J, type ApiRequestDataTypeInterface as a, createJsonApiInclusion as c };
