/**
 * JavaScript 代码压缩工具
 * 用于压缩 patch 脚本和内联代码
 */
import { minify as terserMinify } from 'terser';
/**
 * 压缩 JavaScript 代码
 * @param code - 原始 JavaScript 代码
 * @param options - 压缩选项
 * @returns 压缩后的代码
 */
export async function minifyJS(code, options) {
    const { removeComments = true, mangle = true, compress = true, module: isModule = false, } = options || {};
    try {
        const result = await terserMinify(code, {
            module: isModule,
            compress: compress ? {
                dead_code: true,
                drop_console: false,
                drop_debugger: true,
                passes: 3,
            } : false,
            mangle: mangle ? {
                toplevel: true,
            } : false,
            format: {
                comments: removeComments ? false : 'some',
            },
        });
        return result.code || code;
    }
    catch (error) {
        console.warn('[minifyJS] 压缩失败，返回原始代码:', error);
        return code;
    }
}
/**
 * 同步版本的压缩（使用预压缩的代码）
 * 注意：这个函数用于需要同步返回的场景，实际压缩应在构建时完成
 */
export function minifyJSSync(code) {
    // 简单的压缩：移除多余空白和注释
    return code
        // 移除单行注释（但保留 URL 中的 //）
        .replace(/(?<!:)\/\/.*$/gm, '')
        // 移除多行注释
        .replace(/\/\*[\s\S]*?\*\//g, '')
        // 压缩空白
        .replace(/\s+/g, ' ')
        // 移除语句间多余空格
        .replace(/\s*([{};,:])\s*/g, '$1')
        // 移除括号周围空格
        .replace(/\s*([()])\s*/g, '$1')
        // 修复一些被过度压缩的地方
        .replace(/}([a-zA-Z])/g, '} $1')
        .replace(/;([a-zA-Z])/g, ';$1')
        .trim();
}
// 缓存已压缩的 patch 文件
const minifiedCache = new Map();
/**
 * 读取并压缩 patch 文件（带缓存）
 * @param patchCode - patch 文件内容
 * @param cacheKey - 缓存键（通常是文件名）
 * @returns 压缩后的代码
 */
export async function minifyPatchCode(patchCode, cacheKey) {
    if (cacheKey && minifiedCache.has(cacheKey)) {
        return minifiedCache.get(cacheKey);
    }
    const minified = await minifyJS(patchCode);
    if (cacheKey) {
        minifiedCache.set(cacheKey, minified);
    }
    return minified;
}
/**
 * 清除压缩缓存
 */
export function clearMinifyCache() {
    minifiedCache.clear();
}
