import { Request as ExpressRequest } from 'express';
import { PartialDeep } from 'type-fest';
import { AssetInfo } from 'webpack';
import { BootConfig, Bootstrap, InitAppConfig, InitImaConfig } from './Bootstrap';
import { HttpAgentRequestOptions } from './http/HttpAgent';
import { HttpAgentImplCacheOptions } from './http/HttpAgentImpl';
import { ObjectContainer } from './oc/ObjectContainer';
import { RouteAction } from './router/Router';
import { GlobalImaObject } from './types';
export interface ManifestAsset extends AssetInfo {
    name: string;
}
export interface Manifest {
    assets: Record<string, ManifestAsset>;
    assetsByCompiler: Record<'server' | 'client' | 'client.es', Record<string, ManifestAsset>>;
    publicPath: string;
}
export type Resource = string | [
    string,
    {
        [attribute: string]: unknown;
        fallback: boolean;
    }
];
export interface Resources {
    styles: Resource[];
    scripts: Resource[];
    esScripts: Resource[];
}
/**
 * App environment for single env key.
 */
export interface Environment {
    [key: string]: unknown;
    $Debug: GlobalImaObject['$Debug'];
    $Language: Record<string, string>;
    $Version: GlobalImaObject['$Version'];
    $App?: GlobalImaObject['$App'];
    $Resources?: (response: unknown, manifest: Manifest, defaultResources: Resources) => Resources;
    $Server: {
        protocol?: GlobalImaObject['$Protocol'] | (({ environment, protocol, req, }: {
            environment: Environment;
            protocol: string;
            req: ExpressRequest;
        }) => GlobalImaObject['$Protocol']);
        host?: string | (({ environment, host, req, }: {
            environment: Environment;
            host: string;
            req: ExpressRequest;
        }) => string);
        port: number;
        staticPath: string;
        concurrency: number;
        staticConcurrency: number;
        overloadConcurrency: number;
        clusters: null | number;
        serveSPA: {
            allow: boolean;
            blackList?: (userAgent: string) => boolean;
        };
        cache: {
            enabled: boolean | ((req: ExpressRequest) => boolean);
            cacheKeyGenerator?: (req: ExpressRequest) => string;
            entryTtl: number;
            unusedEntryTtl: number;
            maxEntries: number;
        };
        logger: {
            formatting: 'simple' | 'dev' | 'JSON';
        };
    };
}
/**
 * App Environment structure, used in ./server/config/environment.js
 */
export interface AppEnvironment {
    prod: Environment;
    dev?: PartialDeep<Environment>;
    test?: PartialDeep<Environment>;
    regression?: PartialDeep<Environment>;
}
export interface PageRendererSettings {
    batchResolve?: boolean;
    batchResolveNoTransaction?: boolean;
    masterElementId: string;
    documentView: unknown;
    managedRootView?: unknown;
    viewAdapter?: unknown;
}
/**
 * App settings for single env key.
 */
export interface Settings {
    $Http: {
        defaultRequestOptions: Omit<HttpAgentRequestOptions, 'abortController'>;
        cacheOptions: HttpAgentImplCacheOptions;
    };
    $Router?: {
        middlewareTimeout?: number;
        isSPARouted?: (url: string, action?: RouteAction) => boolean;
    };
    $Cache?: {
        ttl?: number;
        enabled?: boolean;
    };
    $Page: {
        $Render: PageRendererSettings;
    };
    $Observable?: {
        maxHistoryLength?: number;
    };
}
/**
 * App settings function, used in ./app/config/settings.js
 */
export type AppSettings = {
    prod: Settings;
    dev?: PartialDeep<Settings>;
    test?: PartialDeep<Settings>;
    regression?: PartialDeep<Settings>;
};
export declare function getInitialImaConfigFunctions(): InitImaConfig;
export declare function getInitialPluginConfig(): {
    plugins: {
        name: string;
        plugin: import("./Bootstrap").InitPluginConfig;
    }[];
};
export declare function _getRoot(): typeof globalThis;
export declare function _isClient(): boolean;
export declare function createImaApp(): {
    oc: ObjectContainer;
    bootstrap: Bootstrap;
};
export declare function getClientBootConfig(initialAppConfigFunctions: InitAppConfig): BootConfig;
export declare function bootClientApp(app: {
    bootstrap: Bootstrap;
    oc: ObjectContainer;
}, bootConfig: BootConfig): {
    bootstrap: Bootstrap;
    oc: ObjectContainer;
};
export declare function routeClientApp(app: {
    bootstrap: Bootstrap;
    oc: ObjectContainer;
}): Promise<void | import("./types").UnknownParameters>;
export declare function reviveClientApp(initialAppConfigFunctions: InitAppConfig): Promise<import("./types").UnknownParameters & {
    app: {
        oc: ObjectContainer;
        bootstrap: Bootstrap;
    };
    bootConfig: BootConfig;
}>;
export declare function onLoad(): Promise<unknown>;
//# sourceMappingURL=boot.d.ts.map