import { Excluded, Type } from '@deepkit/type';
import { ClassType, TypeAnnotation } from '@deepkit/core';
import { Injector } from '@angular/core';
import { Router } from '@angular/router';
/**
 * If this type decorator is used then the property is not persisted in localStorage,
 * but in the URL instead and recovered from the URL when reloaded.
 *
 * @example
 * ```typescript
 * class State extends EfficientState {
 *    shop: number & PartOfUrl = 0;
 * }
 * ```
 */
export type PartOfUrl = TypeAnnotation<'partOfUrl'>;
export type FilterActions<T> = {
    [name in keyof T]: T[name] extends (a: infer A extends [...a: any[]], ...args: any[]) => infer R ? (...args: A) => R : never;
};
/**
 * EfficientState is a base class for all states that are used in the frontend.
 *
 * @example
 * ```typescript
 * //state that won't be persisted is used as `VolatileState & Excluded`
 * class VolatileState {
 *     shops: Shop[] = [];
 *
 *     user?: User;
 * }
 *
 * export class State extends EfficientState {
 *     shop: number & PartOfUrl = 0;
 *     sidebarVisible: boolean = true;
 *     searchQuery: string = '';
 *
 *     volatile: VolatileState & Excluded = new VolatileState();
 *
 *     //normal methods are supported
 *     getShop(): Shop | undefined {
 *         return this.volatile.getShop(this.shop);
 *     }
 *
 *     //actions have access to Angular's DI container
 *     async authenticated([user]: [FrontendUser], client: ControllerClient) {
 *         this.volatile.shops = await client.shop.getShops();
 *         this.volatile.user = user;
 *     }
 * }
 * ```
 */
export declare class EfficientState {
    call: FilterActions<this> & Excluded;
    constructor(injector?: Injector);
}
export declare function findPartsOfUrl(stateClass: ClassType): string[];
export declare function getQueryObject(state: EfficientState): any;
export declare function findPartsOfUrlForType(type: Type, paths?: string[], prefix?: string, state?: any[]): void;
/**
 * Angular provider factory for the state class.
 *
 * @example
 * ```typescript
 *
 * @Injectable()
 * export class State extends EfficientState {
 *    //events
 *    fileAdded = new EventToken('file.added');
 *
 *    //persisted state
 *    shop: number = 0;
 *    sidebarVisible: boolean = true;
 * }
 *
 * @NgModule({
 *     providers: [
 *         provideState(State),
 *     ]
 * })
 * class AppModule {}
 * ```
 */
export declare function provideState(stateClass: ClassType, localStorageKey?: string): {
    provide: ClassType<any>;
    deps: (typeof Router | typeof Injector)[];
    useFactory: (router: Router, injector: Injector) => any;
};
export declare type __ΩPartOfUrl = any[];
export declare type __ΩFilterActions = any[];
