"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
Object.defineProperty(exports, "__esModule", { value: true });
const app_builder_1 = require("app-builder");
const compiler_1 = require("./compiler");
exports.NexeCompiler = compiler_1.NexeCompiler;
const options_1 = require("./options");
const resource_1 = require("./steps/resource");
const clean_1 = require("./steps/clean");
const cli_1 = require("./steps/cli");
const bundle_1 = require("./steps/bundle");
const download_1 = require("./steps/download");
const shim_1 = require("./steps/shim");
const artifacts_1 = require("./steps/artifacts");
const patches_1 = require("./patches");
function compile(compilerOptions, callback) {
    return __awaiter(this, void 0, void 0, function* () {
        let error = null, options = null, compiler = null;
        try {
            options = options_1.normalizeOptions(compilerOptions);
            compiler = new compiler_1.NexeCompiler(options);
            yield app_builder_1.compose(clean_1.default, resource_1.default, cli_1.default, bundle_1.default, shim_1.default, download_1.default, options.build ? [artifacts_1.default, ...patches_1.default, ...options.patches] : [], options.plugins)(compiler);
        }
        catch (e) {
            error = e;
        }
        if (error) {
            compiler && compiler.quit(error);
            if (callback)
                return callback(error);
            return Promise.reject(error);
        }
        if (callback)
            callback(null);
    });
}
exports.compile = compile;
var options_2 = require("./options");
exports.argv = options_2.argv;
exports.version = options_2.version;
exports.help = options_2.help;
