import type { Client } from "../../abstract/Client";
import type { Cluster } from "../../abstract/Cluster";
import type { Schema } from "../../abstract/Schema";
import type { FieldOfIDType, Table, UniqueKey } from "../../types";
import { Configuration } from "../Configuration";
import { Inverse } from "../Inverse";
import { type ShardAffinity } from "../ShardAffinity";
import { ShardLocator } from "../ShardLocator";
import { Triggers } from "../Triggers";
import { Validation } from "../Validation";
export interface ConfigInstance {
}
export interface ConfigClass<TTable extends Table, TUniqueKey extends UniqueKey<TTable>, TClient extends Client> {
    /**
     * Some Ent parameters need to be configured lazily, on the 1st access,
     * because there could be cyclic references between Ent classes (e.g. in their
     * privacy rules). So configure() is called on some later stage, at the moment
     * of actual Ent operations (like loading, creation etc.). There is no static
     * abstract methods in TS yet, so making it non-abstract.
     */
    configure(): Configuration<TTable>;
    /**
     * A helper class to work-around TS weakness in return value type inference:
     * https://github.com/Microsoft/TypeScript/issues/31273. It could've been just
     * a function, but having a class is a little more natural.
     */
    readonly Configuration: new (cfg: Configuration<TTable>) => Configuration<TTable>;
    /**
     * A Cluster where this Ent lives.
     */
    readonly CLUSTER: Cluster<TClient>;
    /**
     * A schema which represents this Ent.
     */
    readonly SCHEMA: Schema<TTable, TUniqueKey>;
    /**
     * Defines how to find the right Shard during Ent insertion.
     */
    readonly SHARD_AFFINITY: ShardAffinity<FieldOfIDType<TTable>>;
    /**
     * Shard locator for this Ent, responsible for resolving IDs into Shard objects.
     */
    readonly SHARD_LOCATOR: ShardLocator<TClient, TTable, FieldOfIDType<TTable>>;
    /**
     * Privacy rules for this Ent class.
     */
    readonly VALIDATION: Validation<TTable>;
    /**
     * Triggers for this Ent class.
     */
    readonly TRIGGERS: Triggers<TTable>;
    /**
     * Inverse assoc managers for fields.
     */
    readonly INVERSES: Array<Inverse<TClient, TTable>>;
    /**
     * TS requires us to have a public constructor to infer instance types in
     * various places. We make this constructor throw if it's called.
     */
    new (): ConfigInstance;
}
/**
 * Modifies the passed class adding support for Ent configuration (such as:
 * Cluster, table schema, privacy rules, triggers etc.).
 */
export declare function ConfigMixin<TTable extends Table, TUniqueKey extends UniqueKey<TTable>, TClient extends Client>(Base: new () => {}, cluster: Cluster<TClient>, schema: Schema<TTable, TUniqueKey>): ConfigClass<TTable, TUniqueKey, TClient>;
//# sourceMappingURL=ConfigMixin.d.ts.map