import { ExposedEntityKind } from '../models/kinds.js';
import type { ApiModel } from './ApiModel.js';
import type { AccessRule, ApiAction, AssociationTarget, ExposeOptions, ExposeParentRef, RateLimitingConfiguration, ExposedEntitySchema } from './types.js';
/**
 * A class that specializes in representing an exposed Data Entity within an API Model.
 *
 * @fires change - Emitted when the exposed entity has changed.
 */
export declare class ExposedEntity extends EventTarget {
    #private;
    /**
     * The exposed entity kind recognizable by the ecosystem.
     */
    kind: typeof ExposedEntityKind;
    /**
     * The unique key of the exposed entity.
     * This is a stable identifier that does not change across versions.
     */
    key: string;
    /**
     * A pointer to a Data Entity from the Data Domain.
     */
    accessor entity: AssociationTarget;
    /**
     * Indicates whether this exposure has a collection endpoint.
     * A collection endpoint is optional for nested exposures where the association is 1:1
     * and the schema is embedded directly under the parent resource.
     *
     * Note that this property is not observed for changes as it is immutable after creation.
     */
    hasCollection: boolean;
    /**
     * Path to the collection endpoint for this exposure.
     * Starts with '/'. Not set for 1:1 nested exposures where collection does not exist.
     */
    accessor collectionPath: string | undefined;
    /**
     * Path to the resource endpoint for this exposure.
     * Starts with '/'. For 1:1 nested exposures the resource path typically does not include an id segment.
     */
    accessor resourcePath: string;
    /**
     * Whether this exposure is a root exposure (top-level collection).
     * If this is set then the `parent` reference must be populated.
     *
     * Note that this property is not observed for changes as it is immutable after creation.
     */
    isRoot?: boolean;
    /**
     * Parent reference when this exposure was created via following an association.
     *
     * Note that this property is not observed for changes as it is immutable after creation.
     */
    parent?: ExposeParentRef;
    /**
     * Expose-time config used to create this exposure (persisted for auditing/UI).
     * This is only populated for the root exposure. All children exposures inherit this config.
     *
     * Note that this property is not observed for changes as it is immutable after creation.
     */
    exposeOptions?: ExposeOptions;
    /**
     * The list of enabled API actions for this exposure (List/Read/Create/etc.)
     */
    accessor actions: ApiAction[];
    /**
     * Optional array of access rules that define the access control policies for this exposure.
     */
    accessor accessRule: AccessRule[] | undefined;
    /**
     * Optional configuration for rate limiting for this exposure.
     */
    accessor rateLimiting: RateLimitingConfiguration | undefined;
    /**
     * When true, generation for this exposure hit configured limits
     *
     * Note that this property is not observed for changes as it is immutable after creation.
     */
    truncated?: boolean;
    /**
     * A reference to the parent API Model instance.
     */
    api: ApiModel;
    static createSchema(input?: Partial<ExposedEntitySchema>): ExposedEntitySchema;
    constructor(model: ApiModel, state?: Partial<ExposedEntitySchema>);
    notifyChange(): void;
    toJSON(): ExposedEntitySchema;
    /**
     * Sets a new collection path for this exposed entity.
     *
     * It:
     * - updates the collectionPath property
     * - updates the absoluteCollectionPath property accordingly
     * - updates the resourcePath accordingly.
     * @param path The new path to set.
     */
    setCollectionPath(path: string): void;
    /**
     * Sets a new resource path for this exposed entity.
     *
     * Rules:
     * - Must start with '/'.
     * - If this exposure has a collection, the path must be exactly the collection path plus a single
     *   parameter segment (e.g. `/products/{productId}`) and only the parameter name may vary.
     * - If this exposure does NOT have a collection, the path can be any two segments (e.g. `/profile/{id}` or `/a/b`).
     */
    setResourcePath(path: string): void;
    /**
     * Computes the absolute path for this exposure's resource endpoint by
     * walking up the exposure tree using `parent.key` until reaching a root exposure.
     * The absolute path is composed by concatenating each ancestor's resource path
     * with this exposure's resource path.
     */
    getAbsoluteResourcePath(): string;
    /**
     * Computes the absolute path for this exposure's collection endpoint (if any)
     * by walking up the exposure tree using `parent.key` until reaching a root exposure.
     * The absolute path is composed by concatenating each ancestor's resource path
     * with this exposure's collection path.
     * Returns undefined if this exposure has no collection.
     */
    getAbsoluteCollectionPath(): string | undefined;
}
//# sourceMappingURL=ExposedEntity.d.ts.map