import type { RelatorOptions } from "../interfaces/relator.interface";
import type { SerializerOptions } from "../interfaces/serializer.interface";
import type Link from "../models/link.model";
import type Meta from "../models/meta.model";
import Relationship from "../models/relationship.model";
import type Resource from "../models/resource.model";
import type ResourceIdentifier from "../models/resource-identifier.model";
import type { Dictionary, nullish } from "../types/global.types";
import type { Helpers } from "../utils/serializer.utils";
import Serializer from "./serializer";
/**
 * The {@link Relator} class is used to generate top-level [included data](https://jsonapi.org/format/#document-top-level)
 * as well as resource-level [relationships](https://jsonapi.org/format/#document-resource-object-relationships).
 *
 * Example:
 * ```typescript
 * [[include:relator.example.ts]]
 * ```
 */
export default class Relator<PrimaryType, RelatedType extends Dictionary<any> = any> {
    /**
     * Default options. Can be edited to change default options globally.
     */
    static defaultOptions: {
        linkers: {};
    };
    /**
     * Options for relator.
     */
    private options;
    relatedName: string;
    private internalSerializer;
    private _serializer;
    /**
     * Creates a {@link Relator}.
     *
     * @param fetch - Fetches related data from primary data.
     * @param serializer - The `Serializer` to use for related data.
     * @param options - Options for the relator.
     */
    constructor(fetch: (data: PrimaryType) => Promise<RelatedType | RelatedType[] | nullish>, serializer: Serializer<RelatedType>, options?: Partial<RelatorOptions<PrimaryType, RelatedType>>);
    /**
     * Creates a {@link Relator}.
     *
     * @param fetch - Fetches related data from primary data.
     * @param serializer - A getter for the `Serializer` to use for related data.
     * @param options - Options for the relator, a `relatedName` is required
     *  as it cannot always be loaded from the serializer.
     */
    constructor(fetch: (data: PrimaryType) => Promise<RelatedType | RelatedType[] | nullish>, serializer: () => Serializer<RelatedType>, options: Partial<RelatorOptions<PrimaryType, RelatedType>> & Required<Pick<RelatorOptions<PrimaryType, RelatedType>, "relatedName">>);
    get serializer(): Serializer<RelatedType>;
    /** @internal Gets related data from primary data. */
    getRelatedData: (data: PrimaryType) => Promise<RelatedType | RelatedType[] | nullish>;
    /** @internal Gets related relators */
    getRelatedRelators(): Record<string, Relator<RelatedType, any>> | undefined;
    /** @internal Creates related identifiers */
    getRelatedIdentifier(data: RelatedType, options?: SerializerOptions<RelatedType> | undefined): ResourceIdentifier;
    /** @internal Creates related resources */
    getRelatedResource(data: RelatedType, options?: Partial<SerializerOptions<RelatedType>>, helpers?: Helpers<RelatedType>, relatorDataCache?: Map<Relator<any>, Dictionary<any>[]>): Promise<Resource<RelatedType>>;
    /** @internal Gets related links from primary data and related data */
    getRelatedLinks(data: PrimaryType, relatedData: RelatedType | RelatedType[] | nullish): Dictionary<nullish | Link> | undefined;
    /** @internal Gets related meta from primary data and related data */
    getRelatedMeta(data: PrimaryType, relatedData: RelatedType | RelatedType[] | nullish): Meta | undefined;
    /** @internal Creates a {@link Relationship}. */
    getRelationship(data: PrimaryType, relatedDataCache?: Dictionary<any>[]): Promise<Relationship | undefined>;
}
//# sourceMappingURL=relator.d.ts.map