import Collection from "@arcgis/core/core/Collection";
import type FeatureLayer from "@arcgis/core/layers/FeatureLayer";
import type PortalItem from "@arcgis/core/portal/PortalItem";
import type { RendererUnion } from "@arcgis/core/renderers/types.js";
import type { Attachment, AttachmentProperties } from "../data/Attachment.js";
import type { Feature } from "../data/Feature.js";
import type { FeatureWriteOptions } from "../data/FeatureSource.js";
import type { Schema } from "../data/Schema.js";
import type { Relationship } from "../data/_Relationship.js";
import type { PropertyDefs } from "../support/Serializable.js";
import type { FeatureLayerBaseProperties, FeatureLayerExtensionBaseProperties } from "./FeatureLayerExtensionBase.js";
import { FeatureLayerExtensionBase } from "./FeatureLayerExtensionBase.js";
/**
 * Properties that can be passed into the constructor for
 * {@link FeatureLayerExtension}.
 */
export interface FeatureLayerExtensionProperties extends FeatureLayerExtensionBaseProperties {
    /**
     * A list of the valid file MIME types that can be uploaded as attachments.
     * For list of supported attachment types, see:
     * https://developers.arcgis.com/rest/services-reference/enterprise/query-attachments-feature-service-layer-.htm.
     */
    attachmentTypes?: string[];
    /**
     * The Esri FeatureLayer object being extended.
     */
    layer?: FeatureLayer | FeatureLayerProperties;
    /**
     * See {@link FeatureLayerExtension.enableClientSideData}.
     */
    enableClientSideData?: boolean;
}
/**
 * Properties that can be specified for the
 * {@link FeatureLayerExtensionProperties.layer} property.
 */
export interface FeatureLayerProperties extends FeatureLayerBaseProperties {
    /**
     * URL to an offline file geodatabase for this layer. Not supported in the
     * TypeScript API.
     */
    $fileGeodatabaseUrl?: string;
    /**
     * The sub type of the layer. E.g "ArcGISAnnotationLayer". Not supported in
     * the Typescript API.
     */
    $layerSubType?: string;
}
/**
 * Extends the capabilities of an Esri `FeatureLayer` object backed by a feature
 * service.
 */
export declare class FeatureLayerExtension<TProperties extends FeatureLayerExtensionProperties = FeatureLayerExtensionProperties> extends FeatureLayerExtensionBase<TProperties> {
    /**
     * A list of the valid file MIME types that can be uploaded as attachments.
     */
    attachmentTypes: string[];
    /**
     * Indicates that the layer's data should be available client-side, within
     * the graphics that render on the map. Client-side data allows for fast
     * identify operations to be performed, as no external queries are
     * necessary; however, this can cause the map's load time to increase. When
     * enabled, all fields that are configured in the layer's PopupTemplate will
     * load client-side. The default is false.
     */
    get enableClientSideData(): boolean;
    set enableClientSideData(isEnabled: boolean);
    get renderer(): RendererUnion;
    get canChangeLabels(): boolean;
    private _enableClientSideData;
    protected _addAttachment(feature: Feature, attachment: Attachment | AttachmentProperties | File): Promise<Attachment>;
    protected _deleteAttachments(feature: Feature, attachments: (Attachment | string)[]): Promise<void>;
    protected _getSerializableProperties(): PropertyDefs<TProperties>;
    protected _isSupportedLayer(layer: FeatureLayer): boolean;
    protected _getAttachments(feature: Feature): Promise<Attachment[]>;
    protected _addFeatures(features: Iterable<Feature>, options?: FeatureWriteOptions): Promise<void>;
    protected _updateFeatures(features: Iterable<Feature>, options?: FeatureWriteOptions): Promise<void>;
    protected _deleteFeatures(ids: string[], options?: FeatureWriteOptions): Promise<void>;
    protected _createRelationships(): Collection<Relationship>;
    protected _createSchema(): Schema;
    protected _onInitialize(): Promise<void>;
    protected _applyLayerProperties(properties: FeatureLayerProperties, layer: FeatureLayer): Promise<void>;
    protected _applyPortalItemProperties(portalItem: PortalItem): Promise<void>;
    private _addSubtypeDomains;
    private _updateClientSideFields;
}
