Files
hoppscotch/packages/hoppscotch-cli/src/handlers/error.ts

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);
}
};