import * as esbuild from "esbuild";
/**
 * BuildCompiler — 生产编译器（Phase 2A）
 *
 * 将用户项目 src/ 下的 TypeScript/JavaScript 源码通过 esbuild 全量编译为
 * CJS JavaScript，输出到 dist/ 目录。编译完成后，`vext start` 检测到 dist/
 * 存在时直接用 `node` 运行，不再依赖 tsx 运行时。
 *
 * 与 DevCompiler 的关系：
 *
 * ```
 * DevCompiler（vext dev）              BuildCompiler（vext build）
 * ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 * 输入:  src/                          输入:  src/
 * 输出:  .vext/dev/ (临时，gitignore)   输出:  dist/ (持久，可部署)
 * 格式:  CJS（方便 cache 清除）          格式:  CJS（Node.js 稳定运行）
 * 增量:  ctx.rebuild() + 单文件编译     增量:  无（每次全量编译）
 * 目标:  快速迭代（~23ms 热替换）       目标:  生产部署（一次性编译）
 * map:   inline source map              map:   外部 .js.map 文件
 * ```
 *
 * 两者共享 `createBaseEsbuildConfig()` 的基础配置（platform / target / format /
 * bundle / treeShaking / keepNames / charset / loader），在此基础上叠加各自选项。
 *
 * 编译产物结构（保持目录映射）：
 *   src/routes/user.ts      →  dist/routes/user.js      + dist/routes/user.js.map
 *   src/services/auth.ts    →  dist/services/auth.js     + dist/services/auth.js.map
 *   src/config/default.ts   →  dist/config/default.js    + dist/config/default.js.map
 *
 * 排除规则（在 SOURCE_IGNORE 基础上追加生产特有的排除）：
 *   - config/development.{ts,js} — 开发配置，生产无意义
 *   - config/local.{ts,js} — 本地覆盖，永远不部署
 *   - config/test.{ts,js} — 测试配置，生产不需要
 *
 * @module lib/build/build-compiler
 * @see 09a-build.md §2（编译策略）
 * @see 11a-dev-compiler.md §3（DevCompiler — 对比参照）
 * @see IMPLEMENTATION-PLAN.md 任务 2.5
 */
/**
 * BuildCompiler 构造选项
 */
export interface BuildCompilerOptions {
    /** 项目根目录（绝对路径） */
    rootDir: string;
    /** 源码目录（绝对路径），通常是 `<rootDir>/src` */
    srcDir: string;
    /** 输出目录（绝对路径），默认 `<rootDir>/dist` */
    outDir: string;
    /**
     * 是否生成外部 source map（默认 true）
     *
     * 生成 `.js.map` 文件，用于：
     *   - 错误堆栈映射回原始 TypeScript 行号
     *   - APM/Sentry 等工具源码定位
     *   - 调试（`node --enable-source-maps`）
     */
    sourcemap?: boolean;
    /**
     * 是否压缩代码（默认 false）
     *
     * 生产可选开启，减小产物体积。
     * 注意：keepNames 始终为 true（保留函数名可读性）。
     */
    minify?: boolean;
}
/**
 * BuildCompiler 编译结果
 *
 * 包含编译统计信息，用于 CLI 输出编译报告。
 */
export interface BuildResult {
    /** 编译是否成功（无错误） */
    success: boolean;
    /** 输出的 JS 文件数量 */
    fileCount: number;
    /** 输入的源文件总数 */
    totalFiles: number;
    /** 编译耗时（毫秒） */
    elapsed: number;
    /** 输出目录 */
    outDir: string;
    /** esbuild 警告信息 */
    warnings: esbuild.Message[];
    /** esbuild 错误信息 */
    errors: esbuild.Message[];
    /** esbuild 编译元信息（文件大小等），仅编译成功时有值 */
    metafile?: esbuild.Metafile;
}
export declare class BuildCompiler {
    private readonly options;
    constructor(options: BuildCompilerOptions);
    /**
     * build — 执行全量编译
     *
     * 流程：
     *   1. 扫描 src/ 下所有源文件（排除 .d.ts / 测试 / 开发配置）
     *   2. 构建 esbuild 配置（基础配置 + 生产特有选项）
     *   3. 调用 esbuild.build() 执行一次性全量编译
     *   4. 统计编译结果（文件数、耗时、警告、错误）
     *
     * 与 DevCompiler.start() 的区别：
     *   - 不创建 esbuild.context（无增量编译需求）
     *   - sourcemap 使用 'external'（生成 .js.map 文件）
     *   - 追加 define: { 'process.env.NODE_ENV': '"production"' }
     *   - 追加生产排除规则（config/development / local / test）
     *   - 启用 metafile（输出编译元信息）
     *
     * @returns 编译结果统计
     * @throws 当 src/ 目录为空（无源文件）时抛出错误
     */
    build(): Promise<BuildResult>;
    private buildProjectPreloads;
    /**
     * scanEntryPoints — 扫描 src/ 下所有可编译源文件
     *
     * 使用 fast-glob 扫描，返回相对于 srcDir 的路径列表。
     *
     * 排除规则（两层）：
     *   1. SOURCE_IGNORE — 共享排除（.d.ts / 测试文件 / __tests__/）
     *   2. BUILD_EXTRA_IGNORE — 生产特有排除（config/development / local / test）
     *
     * @returns 相对于 srcDir 的源文件路径列表
     */
    scanEntryPoints(): Promise<string[]>;
    /** 获取源码目录 */
    getSrcDir(): string;
    /** 获取输出目录 */
    getOutDir(): string;
    /** 获取项目根目录 */
    getRootDir(): string;
}
