100 lines
3.0 KiB
TypeScript
100 lines
3.0 KiB
TypeScript
import * as S from "fp-ts/string";
|
|
import { HoppError, HoppErrorCode } from "../types/errors";
|
|
import { hasProperty, isSafeCommanderError } from "../utils/checks";
|
|
import { parseErrorMessage } from "../utils/mutators";
|
|
import { exceptionColors } from "../utils/getters";
|
|
const { BG_FAIL } = exceptionColors;
|
|
|
|
/**
|
|
* Parses unknown error data and narrows it to get information related to
|
|
* error in string format.
|
|
* @param e Error data to parse.
|
|
* @returns Information in string format appropriately parsed, based on error type.
|
|
*/
|
|
const parseErrorData = (e: unknown) => {
|
|
let parsedMsg: string;
|
|
|
|
if (!!e && typeof e === "object") {
|
|
if (hasProperty(e, "message") && S.isString(e.message)) {
|
|
parsedMsg = e.message;
|
|
} else if (hasProperty(e, "data") && S.isString(e.data)) {
|
|
parsedMsg = e.data;
|
|
} else {
|
|
parsedMsg = JSON.stringify(e);
|
|
}
|
|
} else if (S.isString(e)) {
|
|
parsedMsg = e;
|
|
} else {
|
|
parsedMsg = JSON.stringify(e);
|
|
}
|
|
|
|
return parsedMsg;
|
|
};
|
|
|
|
/**
|
|
* Handles HoppError to generate error messages based on data related
|
|
* to error code and exits program with exit code 1.
|
|
* @param error Error object with code of type HoppErrorCode.
|
|
*/
|
|
export const handleError = <T extends HoppErrorCode>(error: HoppError<T>) => {
|
|
const ERROR_CODE = BG_FAIL(error.code);
|
|
let ERROR_MSG;
|
|
|
|
switch (error.code) {
|
|
case "FILE_NOT_FOUND":
|
|
ERROR_MSG = `File doesn't exist: ${error.path}`;
|
|
break;
|
|
case "UNKNOWN_COMMAND":
|
|
ERROR_MSG = `Unavailable command: ${error.command}`;
|
|
break;
|
|
case "MALFORMED_ENV_FILE":
|
|
ERROR_MSG = `The environment file is not of the correct format.`;
|
|
break;
|
|
case "BULK_ENV_FILE":
|
|
ERROR_MSG = `CLI doesn't support bulk environments export.`;
|
|
break;
|
|
case "MALFORMED_COLLECTION":
|
|
ERROR_MSG = `${error.path}\n${parseErrorData(error.data)}`;
|
|
break;
|
|
case "NO_FILE_PATH":
|
|
ERROR_MSG = `Please provide a hoppscotch-collection file path.`;
|
|
break;
|
|
case "PARSING_ERROR":
|
|
ERROR_MSG = `Unable to parse -\n${error.data}`;
|
|
break;
|
|
case "INVALID_FILE_TYPE":
|
|
ERROR_MSG = `Please provide file of extension type: ${error.data}`;
|
|
break;
|
|
case "REQUEST_ERROR":
|
|
case "TEST_SCRIPT_ERROR":
|
|
case "PRE_REQUEST_SCRIPT_ERROR":
|
|
ERROR_MSG = parseErrorData(error.data);
|
|
break;
|
|
case "INVALID_ARGUMENT":
|
|
case "UNKNOWN_ERROR":
|
|
case "SYNTAX_ERROR":
|
|
if (isSafeCommanderError(error.data)) {
|
|
ERROR_MSG = S.empty;
|
|
} else {
|
|
ERROR_MSG = parseErrorMessage(error.data);
|
|
}
|
|
break;
|
|
case "TESTS_FAILING":
|
|
ERROR_MSG = error.data;
|
|
break;
|
|
case "TOKEN_EXPIRED":
|
|
ERROR_MSG = `Token is expired: ${error.data}`;
|
|
break;
|
|
case "TOKEN_INVALID":
|
|
ERROR_MSG = `Token is invalid/removed: ${error.data}`;
|
|
break;
|
|
case "INVALID_ID":
|
|
ERROR_MSG = `The collection/environment is not valid/not accessible to the user: ${error.data}`;
|
|
break;
|
|
}
|
|
|
|
if (!S.isEmpty(ERROR_MSG)) {
|
|
console.error(ERROR_CODE, ERROR_MSG);
|
|
}
|
|
};
|