"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());
    });
};
var __generator = (this && this.__generator) || function (thisArg, body) {
    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
    function verb(n) { return function (v) { return step([n, v]); }; }
    function step(op) {
        if (f) throw new TypeError("Generator is already executing.");
        while (_) try {
            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
            if (y = 0, t) op = [op[0] & 2, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                    if (t[2]) _.ops.pop();
                    _.trys.pop(); continue;
            }
            op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
    }
};
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
require("v8-compile-cache");
var commander_1 = __importDefault(require("commander"));
var child_process_1 = require("child_process");
var utils_1 = require("./utils");
var static_variable_1 = require("./constants/static-variable");
var checkAndReturnTemplateFile = utils_1.common.checkAndReturnTemplateFile;
var registerCommandChecker = utils_1.registerAction.registerCommandChecker, recordCommandHistory = utils_1.registerAction.recordCommandHistory, registerExecCommand = utils_1.registerAction.registerExecCommand, registerCustomerCommand = utils_1.registerAction.registerCustomerCommand, registerUniversalCommand = utils_1.registerAction.registerUniversalCommand;
var getConfig = utils_1.configSet.getConfig, setConfig = utils_1.configSet.setConfig;
function getRegistry() {
    var registry = getConfig('registry');
    if (!registry) {
        registry = static_variable_1.DEFAULT_REGIRSTRY;
        setConfig('registry', registry);
    }
    return registry;
}
function setSpecialCommand() {
    return __awaiter(this, void 0, void 0, function () {
        var templateFile;
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    templateFile = checkAndReturnTemplateFile();
                    if (!templateFile) return [3 /*break*/, 3];
                    process.env[static_variable_1.PROCESS_ENV_TEMPLATE_NAME] = templateFile;
                    if (!!['init', 'config', 'set', 'exec', 'cli'].includes(process.argv[2])) return [3 /*break*/, 3];
                    return [4 /*yield*/, registerCustomerCommand(commander_1.default, templateFile)];
                case 1:
                    _a.sent(); // Add user-defined commands
                    return [4 /*yield*/, registerUniversalCommand(commander_1.default, templateFile)];
                case 2:
                    _a.sent(); // Register pan instruction
                    _a.label = 3;
                case 3: return [2 /*return*/];
            }
        });
    });
}
function setExecCommand() {
    return __awaiter(this, void 0, void 0, function () {
        var templateFile;
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    templateFile = checkAndReturnTemplateFile();
                    process.env[static_variable_1.PROCESS_ENV_TEMPLATE_NAME] = templateFile;
                    return [4 /*yield*/, registerExecCommand(commander_1.default, templateFile)];
                case 1:
                    _a.sent();
                    return [2 /*return*/];
            }
        });
    });
}
function globalParameterProcessing() {
    return __awaiter(this, void 0, void 0, function () {
        var tempGlobal, i;
        return __generator(this, function (_a) {
            tempGlobal = ['skip-extends', 'verbose'];
            for (i = 0; i < tempGlobal.length; i++) {
                process.env[tempGlobal[i]] = 'false';
                if (process.argv.includes('--' + tempGlobal[i])) {
                    process.env[tempGlobal[i]] = 'true';
                    process.argv.splice(process.argv.indexOf('--' + tempGlobal[i]), 1);
                }
            }
            return [2 /*return*/];
        });
    });
}
function versionCheck() {
    var pkg = require('../package.json');
    var result = child_process_1.execSync('npm view @serverless-devs/s versions');
    var versions = result.toString().replace(/\'/g, '').replace(/\[/g, '').replace(/\]/g, '').split(',');
    var lastVersion = versions[versions.length - 1].replace(/\n/g, '').replace(/\s/g, '');
    utils_1.logger.log("local version : " + pkg.version);
    utils_1.logger.log("remote version : " + lastVersion);
}
var description = "  _________                               .__\n /   _____/ ______________  __ ___________|  |   ____   ______ ______\n \\_____  \\_/ __ \\_  __ \\  \\/ // __ \\_  __ \\  | _/ __ \\ /  ___//  ___/\n /        \\  ___/|  | \\/\\   /\\  ___/|  | \\/  |_\\  ___/ \\___ \\ \\___ \\\n/_______  /\\___  >__|    \\_/  \\___  >__|  |____/\\___  >____  >____  >\n        \\/     \\/                 \\/                \\/     \\/     \\/\n\n" + utils_1.i18n.__('Welcome to the Serverless Devs Tool.') + "\n" + utils_1.i18n.__('You can use the corresponding function through the following instructions.') + "\n" + utils_1.i18n.__('Documents:https://www.github.com/serverless-devs/docs') + "\n" + utils_1.i18n.__("Current Registry is " + getRegistry()) + "\n";
(function () { return __awaiter(void 0, void 0, void 0, function () {
    var system_command;
    return __generator(this, function (_a) {
        switch (_a.label) {
            case 0:
                registerCommandChecker(commander_1.default);
                system_command = commander_1.default
                    .version('', '-v, --version', utils_1.i18n.__('Output the version number'))
                    .description(description)
                    .helpOption('-h, --help', utils_1.i18n.__('Display help for command'))
                    .command('config', utils_1.i18n.__('Configure cloud service account.'))
                    .command('init', utils_1.i18n.__('Initializing a project.'))
                    .command('set', utils_1.i18n.__('Settings for the tool.'))
                    .command('cli', utils_1.i18n.__('Command line operation through yaml free mode.'))
                    .option('--skip-actions', utils_1.i18n.__('Skip the extends section'))
                    .option('--debug', utils_1.i18n.__('Debug model'))
                    .addHelpCommand(false);
                return [4 /*yield*/, globalParameterProcessing()];
            case 1:
                _a.sent(); // global parameter processing
                return [4 /*yield*/, setExecCommand()];
            case 2:
                _a.sent(); // regist exec command
                return [4 /*yield*/, setSpecialCommand()];
            case 3:
                _a.sent(); // universal instruction processing
                recordCommandHistory(process.argv); // add history record
                system_command.exitOverride(function (error) { return __awaiter(void 0, void 0, void 0, function () {
                    return __generator(this, function (_a) {
                        if (error.code === 'commander.help') {
                            process.exit(commander_1.default.args.length > 0 ? 1 : 0);
                        }
                        if (error.code === 'commander.executeSubCommandAsync' || error.code === 'commander.helpDisplayed') {
                            process.exit(0);
                        }
                        versionCheck();
                        return [2 /*return*/];
                    });
                }); });
                system_command.parse(process.argv);
                return [2 /*return*/];
        }
    });
}); })();
//# sourceMappingURL=data:application/json;base64, 