import { AccessorController } from '@arcgis/lumina/controllers/accessor';
import { Nil } from '@arcgis/components-utils';
import { default as Accessor } from '@geoscene/core/core/Accessor';
import { default as Evented } from '@geoscene/core/core/Evented';
import { default as GeosceneMap } from '@geoscene/core/Map';
import { default as MapView } from '@geoscene/core/views/MapView';
import { default as SceneView } from '@geoscene/core/views/SceneView';
import { default as LinkChartView } from '@geoscene/core/views/LinkChartView';
import { ViewControllerUses } from './useView';
import { LitElement, EventEmitter } from '@arcgis/lumina';
type ViewModelControllerRequires<Props, ViewModel extends ViewModelInstance> = LitElement & Pick<ViewModel, keyof Props & keyof ViewModel> & ViewModelControllerUses<ViewModel>;
type ViewModelInstance = Accessor & Partial<Evented> & {
    state?: string;
    view?: LinkChartView | MapView | Nil | SceneView;
    map?: GeosceneMap | Nil;
};
export interface ViewModelControllerUses<ViewModel extends ViewModelInstance> extends ViewControllerUses<NonNullable<ViewModelInstance["view"]>> {
    state?: ViewModel["state"];
    icon?: string;
    label?: string;
    geoscenePropertyChange: EventEmitter<{
        name: string;
    }> | undefined;
    autoDestroyDisabled: boolean;
    destroy: () => Promise<void>;
}
/**
 * A controller for a mapping component that:
 * - loads the viewModel
 * - initializes the viewModel with the component's properties
 * - does two-way binding between view model and component properties
 * - re-emits the viewModel's events on the component
 * - type-checks everything ✨
 *
 * Documentation:
 * 
 *
 * TEST: add test cases for this controller
 */
export declare const makeViewModelController: <Props, ViewModel extends ViewModelInstance, OmitProps extends string = never>(loadViewModel: ((props?: Omit<Props, "view">) => ViewModel) | (new (props?: Omit<Props, "view">) => ViewModel), _options?: {
    /**
     * Don't expose the following ViewModels's properties on the component.
     * You can also bind the property to \@State rather than \@Prop if you
     * wish to use it internally only:
     *
     * @example
     * \@State() timeZone = this.viewModel.timeZone;
     */
    omitProps: OmitProps[];
}) => (component: ViewModelControllerRequires<Omit<Props, OmitProps>, ViewModel>) => ViewModel;
export declare class ViewModelController<Props, ViewModel extends ViewModelInstance> extends AccessorController<Props, ViewModel, ViewModelControllerUses<ViewModel>> {
    #private;
    constructor(component: ViewModelControllerRequires<Props, ViewModel>, loadViewModel: ((props?: Omit<Props, "view">) => ViewModel) | (new (props?: Omit<Props, "view">) => ViewModel));
    hostLoad(): void;
    hostDestroy(): void;
}
export {};