import type { AnyEntity, EntityMetadata, EntityName, PopulateOptions } from '../typings.js';
/**
 * Helper that allows to keep track of where we are currently at when serializing complex entity graph with cycles.
 * Before we process a property, we call `visit` that checks if it is not a cycle path (but allows to pass cycles that
 * are defined in populate hint). If not, we proceed and call `leave` afterwards.
 */
export declare class SerializationContext<T extends object> {
    #private;
    readonly path: [EntityName, string][];
    readonly visited: Set<AnyEntity>;
    constructor(populate?: PopulateOptions<T>[], fields?: Set<string>, exclude?: readonly string[]);
    /**
     * Returns true when there is a cycle detected.
     */
    visit(entityName: EntityName, prop: string): boolean;
    /** Removes the last entry from the visit path after processing a property. */
    leave(entityName: EntityName, prop: string): void;
    /** Cleans up the serialization context by removing root references from all tracked entities. */
    close(): void;
    /**
     * When initializing new context, we need to propagate it to the whole entity graph recursively.
     */
    static propagate(root: SerializationContext<any>, entity: AnyEntity, isVisible: (meta: EntityMetadata, prop: string) => boolean): void;
    /** Checks whether a property is explicitly listed in the populate hints for the current path. */
    isMarkedAsPopulated(entityName: EntityName, prop: string): boolean;
    /** Checks whether a property is excluded from serialization via the exclude list. */
    isExcluded(entityName: EntityName, prop: string): boolean;
    /** Checks whether a property is included in the partial fields selection for the current path. */
    isPartiallyLoaded(entityName: EntityName, prop: string): boolean;
    private register;
}
