"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 });
exports.HandleError = exports.HumanWarning = exports.HumanError = exports.ServerlessError = exports.InitError = exports.ConfigGetError = exports.ConfigError = exports.ConfigDeleteError = exports.CommandError = void 0;
/** @format */
var utils_1 = require("../utils");
var core_1 = __importDefault(require("../utils/core"));
var colors = core_1.default.colors, report = core_1.default.report, isDebugMode = core_1.default.isDebugMode, makeUnderLine = core_1.default.makeUnderLine;
var command_error_1 = require("./command-error");
Object.defineProperty(exports, "CommandError", { enumerable: true, get: function () { return command_error_1.CommandError; } });
var config_delete_error_1 = require("./config-delete-error");
Object.defineProperty(exports, "ConfigDeleteError", { enumerable: true, get: function () { return config_delete_error_1.ConfigDeleteError; } });
var config_error_1 = require("./config-error");
Object.defineProperty(exports, "ConfigError", { enumerable: true, get: function () { return config_error_1.ConfigError; } });
var config_get_error_1 = require("./config-get-error");
Object.defineProperty(exports, "ConfigGetError", { enumerable: true, get: function () { return config_get_error_1.ConfigGetError; } });
var init_error_1 = require("./init-error");
Object.defineProperty(exports, "InitError", { enumerable: true, get: function () { return init_error_1.InitError; } });
var serverless_error_1 = require("./serverless-error");
Object.defineProperty(exports, "ServerlessError", { enumerable: true, get: function () { return serverless_error_1.ServerlessError; } });
var human_error_1 = require("./human-error");
Object.defineProperty(exports, "HumanError", { enumerable: true, get: function () { return human_error_1.HumanError; } });
var human_warning_1 = require("./human-warning");
Object.defineProperty(exports, "HumanWarning", { enumerable: true, get: function () { return human_warning_1.HumanWarning; } });
function underline(prefix, link) {
    return "".concat(colors.gray(prefix)).concat(colors.gray.underline(link));
}
var HandleError = function (error) { return __awaiter(void 0, void 0, void 0, function () {
    var defaultPrefix, configOption, tmpError, analysis, message, jsonMsg, messageStr, tipsStr;
    return __generator(this, function (_a) {
        switch (_a.label) {
            case 0:
                defaultPrefix = 'Message:';
                configOption = { traceId: '', catchableError: false };
                tmpError = error;
                analysis = (0, utils_1.getConfig)('analysis');
                if (analysis !== 'disable') {
                    configOption.traceId = "".concat((0, utils_1.getPid)()).concat(Date.now());
                }
                message = error.message ? error.message : '';
                try {
                    jsonMsg = JSON.parse(message);
                }
                catch (error) { }
                if (!(jsonMsg && jsonMsg.tips)) return [3 /*break*/, 1];
                messageStr = jsonMsg.message ? "Message: ".concat(jsonMsg.message, "\n") : '';
                tipsStr = jsonMsg.tips ? "* ".concat(makeUnderLine(jsonMsg.tips.replace(/\n/, '\n* '))) : '';
                utils_1.logger.log("\n".concat(colors.hex('#000').bgYellow('WARNING:'), "\n======================\n").concat(tipsStr, "\n"), 'yellow');
                isDebugMode() ? console.log(error.stack) : console.log(colors.grey(messageStr));
                configOption.catchableError = true;
                tmpError = jsonMsg;
                return [3 /*break*/, 5];
            case 1:
                if (!(jsonMsg && jsonMsg.code)) return [3 /*break*/, 3];
                console.log((0, utils_1.red)("\u2716 ".concat(jsonMsg.prefix || defaultPrefix, "\n")));
                console.log("".concat((0, utils_1.bgRed)('ERROR:'), "\n"));
                isDebugMode() ? console.log("".concat(jsonMsg.stack, "\n")) : console.log("".concat(jsonMsg.message, "\n"));
                return [4 /*yield*/, (0, utils_1.aiRequest)(jsonMsg.message)];
            case 2:
                _a.sent();
                tmpError = jsonMsg;
                return [3 /*break*/, 5];
            case 3:
                console.log((0, utils_1.red)("\u2716 ".concat(defaultPrefix, "\n")));
                console.log("".concat((0, utils_1.bgRed)('ERROR:'), "\n"));
                console.log(isDebugMode() ? error.stack : "".concat(message, "\n"));
                return [4 /*yield*/, (0, utils_1.aiRequest)(message)];
            case 4:
                _a.sent();
                _a.label = 5;
            case 5:
                if (!configOption.catchableError) {
                    if (configOption.traceId) {
                        console.log(colors.gray("TraceId:     ".concat(configOption.traceId)));
                    }
                    console.log(colors.gray("Environment: ".concat((0, utils_1.getVersion)())));
                    console.log(underline('Documents:   ', 'https://www.serverless-devs.com'));
                    console.log(underline('Discussions: ', 'https://github.com/Serverless-Devs/Serverless-Devs/discussions'));
                    console.log(underline('Issues:      ', 'https://github.com/Serverless-Devs/Serverless-Devs/issues\n'));
                    if (configOption.traceId) {
                        console.log(colors.gray("Please copy traceId: ".concat(configOption.traceId, " and join Dingding group: 33947367 for consultation.")));
                    }
                }
                console.log(colors.gray("You can run 's clean --all' to clean Serverless devs."));
                if (!(configOption.traceId && !configOption.catchableError)) return [3 /*break*/, 7];
                return [4 /*yield*/, report({
                        type: 'jsError',
                        content: "".concat(tmpError.message, "||").concat(tmpError.stack),
                        traceId: configOption.traceId,
                    })];
            case 6:
                _a.sent();
                _a.label = 7;
            case 7:
                process.exit(tmpError.code || 1);
                return [2 /*return*/];
        }
    });
}); };
exports.HandleError = HandleError;
//# sourceMappingURL=data:application/json;base64, 