import { Logger } from './utils/logger.js';
import { Dictionary } from './dict.js';
export type GetterFunction<T> = ((object: T) => any) & {
    getterFromString?: string;
};
export type Getter<T> = GetterFunction<T> | keyof T;
export type LookupRefFunction<T> = ((object: LookupValue<T>) => LookupValue<T> | null | undefined) & {
    getterFromString?: string;
};
export type LookupValue<T> = T | string | number;
export type MarkerConfigGetterKeys = 'ref' | 'title';
export type MarkerConfigArrayGetter = 'refs' | 'lookupRefs';
export type ObjectMarkerConfig<T = object> = Partial<{
    annotateScalars: boolean;
    refs: Getter<T>[];
    lookupRefs: LookupRefFunction<T>[];
    page: string;
    ref: Getter<T>;
    title: Getter<T>;
}>;
export type NormalizedObjectMarkerConfig<T> = {
    name: string;
    indexRefs: GetterFunction<T>[];
    lookupRefs: LookupRefFunction<T>[];
    annotateScalars: boolean;
    page: string | null;
    getRef: GetterFunction<T> | null;
    getTitle: GetterFunction<T>;
};
export type ObjectMarkerDescriptor<T> = {
    type: string;
    object: T;
    ref: any;
    title: string;
    href: string | null;
};
export type ObjectMarker<T> = {
    name: string;
    page: string | null;
    mark(value: T): void;
    lookup(value: unknown, useAnnotateScalars?: boolean): ObjectMarkerDescriptor<T> | null;
    reset(): void;
};
export declare class ObjectMarkerManager extends Dictionary<ObjectMarker<object>> {
    #private;
    private logger;
    constructor(logger: Logger);
    lock(): void;
    define<T>(name: string, config: ObjectMarkerConfig<T>): Readonly<ObjectMarker<any>>;
    reset(): void;
    markerMap(): {
        [k: string]: (value: object) => void;
    };
    lookup(value: unknown, marker?: string): ObjectMarkerDescriptor<object> | null;
    lookupAll(value: unknown): ObjectMarkerDescriptor<object>[];
}
