import { IncomingMessage } from "http";
import { Options as HttpProxyOptions } from "http-proxy-middleware";
export declare enum APP_STATUS {
    RUNNING = "running",
    STOP = "stop"
}
/**
 * APP 状态 PreProxyServer 的状态
 */
export type APP_STATUS_TYPE = APP_STATUS;
/**
 * 环境 和 devServer 的主键
 */
export type KeyObj = {
    name: string;
    port?: number | string;
};
/**
 * 开发服务器配置项
 */
export type DevServerItem = {
    /**
     * 开发服务器的唯一标识名称，作为主键使用
     */
    name: string;
    /**
     * 开发服务器的地址，指定了开发服务器的访问路径
     *
     * @example
     * ```txt
     * http://127.0.0.1:5173
     * ```
     */
    target: string;
};
/**
 * 环境配置项
 */
export type EnvItem = {
    /**
     * 环境的唯一标识名称，作为主键使用
     */
    name: string;
    /**
     * 本地启动后前端服务所在的端口号。
     *
     * 当多个环境共用一个端口时，各个服务会自动互斥。
     */
    port: number;
    /**
     * 目标 API 服务器的地址，请求将被转发到该地址
     */
    target: string;
    /**
     * 当前环境的首页地址，会覆盖全局配置中的首页地址。
     *
     * @default '/'
     */
    indexPage?: string;
    /**
     * 是否启用 前置代理的 cookie 换成替换,
     * 前置代理的 cookie 缓存替换，是为了解决，浏览器中登录时，同主机不同端口的cookie会共享的问题
     *
     * @default true
     */
    isEnableCookieProxy?: boolean;
    /**
     * 当前环境使用的开发服务器名称。
     *
     * 若未提供，则默认使用开发服务器列表 {@link EnvmConfig.devServerList `Config.devServerList` } 中的第一个。
     */
    devServerName?: string;
    /**
     * 路由转发函数，用于根据请求和当前环境信息动态确定转发目标。
     *
     * 提供了此配置之后，会覆盖 {@link EnvItem.target `EnvItem.target`}
     *
     * 规则同 {@link https://www.npmjs.com/package/http-proxy-middleware#router-objectfunction `http-proxy-middleware router`}，
     * 但不支持对象形式，且增加了第二个参数用于传递当前环境相关信息。
     *
     *
     * @example
     * ```js
     * ...
     *   router: async (req, env) => {
     *     return 'http://127.0.0.1:3000';
     *   }
     * ...
     * ```
     */
    router?: RouterFunction;
};
/**
 * 转发路由配置函数类型
 *
 * @param {IncomingMessage} req - HTTP 请求对象，包含了客户端发送的请求信息，如请求方法、请求头、请求路径等。
 * @param {EnvItem} env - 当前环境的配置项，包含了环境名称、端口、目标 API 服务器地址等信息。
 * @returns {Promise<HttpProxyOptions["target"]>} - 返回一个 Promise，该 Promise 解析为代理目标的地址，用于指定请求要转发到的目标服务器。
 */
type RouterFunction = (req: IncomingMessage, env: EnvItem) => Promise<HttpProxyOptions["target"]>;
/**
 * 应用配置
 */
export interface EnvmConfig {
    /**
     * 后置转发端口，开发服务器将请求转发到该端口对应的地址。
     *
     * @default 3099
     */
    port: number;
    /**
     * 管理页面相关接口的基础路径。
     *
     * 若与业务路径冲突，可通过此配置进行调整。
     *
     * @default '/dev-manage-api'
     */
    basePath: string;
    /**
     * 应用的首页地址。
     *
     * @default '/'
     */
    indexPage: string;
    /**
     * 是否启用 前置代理的 cookie 缓存,
     * 前置代理的 cookie 缓存替换，是为了解决，浏览器中登录时，同主机不同端口的cookie会共享的问题
     *
     * @default true
     */
    isEnableCookieProxy?: boolean;
    /**
     * cookie 后缀，cookie name 的一些特殊前缀有作用，左翼使用后缀
     * 由于同主机不同端口 cookie 共享，会将登录不同端口的 cookie 区分端口再次存储，此字段作为后缀，在代理时，重新复写cookie
     *
     * @default 'envm'
     */
    cookieSuffix?: string;
    /**
     * 开发服务器列表，包含多个开发服务器的配置信息
     */
    devServerList: Array<DevServerItem>;
    /**
     * 开发环境列表，包含多个开发环境的配置信息
     */
    envList: Array<EnvItem>;
}
/**
 * 应用启动配置
 */
export interface Options {
    /**
     * 配置文件的地址，指定了应用启动时加载的配置文件路径。
     *
     * @default 'envm.config.[m/c]js'
     */
    config?: string;
}
export {};
