"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.BabelTransform = void 0;
/* eslint-disable no-new-func */
const core_1 = require("@babel/core");
function BabelTransform(code, options = {}) {
    var _a, _b, _c;
    const { IIFE = false } = options;
    /**
     * 如果 trim 完为空
     * 则原样不用再编译了
     */
    if (!((_a = code === null || code === void 0 ? void 0 : code.trim) === null || _a === void 0 ? void 0 : _a.call(code))) {
        return code;
    }
    try {
        /**
         * 如果是基础字面量的话
         * 可以直接使用原值，不用过babel
         */
        if (typeof code === 'string' && JSON.parse((_b = code === null || code === void 0 ? void 0 : code.trim) === null || _b === void 0 ? void 0 : _b.call(code))) {
            return code;
        }
    }
    catch (e) { }
    try {
        const simpleWrapped = `(\n${code || 'undefined'}\n)`;
        const { code: expression } = (0, core_1.transformSync)(IIFE ? `(()=>${simpleWrapped})()` : simpleWrapped, {
            cwd: __dirname,
            sourceType: 'script',
            comments: false,
            // minified: true,
            presets: [
                [
                    '@babel/preset-env',
                    {
                        targets: {
                            /**
                             * 支持 proxy 的版本
                             * 低于这个版本完全无法支持
                             */
                            // browsers: ['chrome >= 49', 'iOS >= 10', 'safari >= 10'],
                            /**
                             * 一个相对较高的版本，包涵解构赋值，这样不用注入太多 polifill
                             * 但是不包涵 options chain
                             * 基本上是 es2019
                             */
                            browsers: ['chrome >= 67', 'iOS >= 12', 'safari >= 12'],
                        },
                        include: [
                            // es2015
                            '@babel/plugin-transform-arrow-functions',
                        ],
                    },
                ],
            ],
        }) || {};
        const res = ((_c = expression === null || expression === void 0 ? void 0 : expression.replace) === null || _c === void 0 ? void 0 : _c.call(expression, /;$/, '')) || code;
        if (expression) {
            new Function(`return (\n${res}\n)`);
        }
        return res;
    }
    catch (e) {
        console.error(`transform [${code}] fail:`, e === null || e === void 0 ? void 0 : e.message);
        return code;
    }
}
exports.BabelTransform = BabelTransform;
