import _ from "lodash"; import { VALIDATION_TYPES, ValidationResponse, ValidationType, Validator, } from "constants/WidgetValidation"; import moment from "moment"; import { WIDGET_TYPE_VALIDATION_ERROR } from "constants/messages"; export const VALIDATORS: Record = { [VALIDATION_TYPES.TEXT]: (value: any): ValidationResponse => { let parsed = value; if (_.isUndefined(value)) { return { isValid: false, parsed: "", message: `${WIDGET_TYPE_VALIDATION_ERROR}: text`, }; } if (_.isObject(value)) { return { isValid: false, parsed: JSON.stringify(value, null, 2), message: `${WIDGET_TYPE_VALIDATION_ERROR}: text`, }; } let isValid = _.isString(value); if (!isValid) { try { parsed = _.toString(value); isValid = true; } catch (e) { console.error(`Error when parsing ${value} to string`); console.error(e); return { isValid: false, parsed: "", message: `${WIDGET_TYPE_VALIDATION_ERROR}: text`, }; } } return { isValid, parsed }; }, [VALIDATION_TYPES.NUMBER]: (value: any): ValidationResponse => { let parsed = value; if (_.isUndefined(value)) { return { isValid: false, parsed: 0, message: `${WIDGET_TYPE_VALIDATION_ERROR}: number`, }; } let isValid = _.isNumber(value); if (!isValid) { try { parsed = _.toNumber(value); isValid = true; } catch (e) { console.error(`Error when parsing ${value} to number`); console.error(e); return { isValid: false, parsed: 0, message: `${WIDGET_TYPE_VALIDATION_ERROR}: number`, }; } } return { isValid, parsed }; }, [VALIDATION_TYPES.BOOLEAN]: (value: any): ValidationResponse => { let parsed = value; if (_.isUndefined(value)) { return { isValid: false, parsed: false, message: `${WIDGET_TYPE_VALIDATION_ERROR}: boolean`, }; } let isValid = _.isBoolean(value); if (!isValid) { try { parsed = !!value; isValid = true; } catch (e) { console.error(`Error when parsing ${value} to boolean`); console.error(e); return { isValid: false, parsed: false, message: `${WIDGET_TYPE_VALIDATION_ERROR}: boolean`, }; } } return { isValid, parsed }; }, [VALIDATION_TYPES.OBJECT]: (value: any): ValidationResponse => { let parsed = value; if (_.isUndefined(value)) { return { isValid: false, parsed: {}, message: `${WIDGET_TYPE_VALIDATION_ERROR}: Object`, }; } let isValid = _.isObject(value); if (!isValid) { try { parsed = JSON.parse(value); isValid = true; } catch (e) { console.error(`Error when parsing ${value} to object`); console.error(e); return { isValid: false, parsed: {}, message: `${WIDGET_TYPE_VALIDATION_ERROR}: Object`, }; } } return { isValid, parsed }; }, [VALIDATION_TYPES.ARRAY]: (value: any): ValidationResponse => { let parsed = value; try { if (_.isUndefined(value)) { return { isValid: false, parsed: [], message: `${WIDGET_TYPE_VALIDATION_ERROR}: Array/List`, }; } if (_.isString(value)) { parsed = JSON.parse(parsed as string); } if (!Array.isArray(parsed)) { return { isValid: false, parsed: [], message: `${WIDGET_TYPE_VALIDATION_ERROR}: Array/List`, }; } return { isValid: true, parsed }; } catch (e) { console.error(e); return { isValid: false, parsed: [], message: `${WIDGET_TYPE_VALIDATION_ERROR}: Array/List`, }; } }, [VALIDATION_TYPES.TABLE_DATA]: (value: any): ValidationResponse => { const { isValid, parsed } = VALIDATORS[VALIDATION_TYPES.ARRAY](value); if (!isValid) { return { isValid, parsed, message: `${WIDGET_TYPE_VALIDATION_ERROR}: Table Data`, }; } else if (!_.every(parsed, datum => _.isObject(datum))) { return { isValid: false, parsed: [], message: `${WIDGET_TYPE_VALIDATION_ERROR}: Table Data`, }; } return { isValid, parsed }; }, [VALIDATION_TYPES.DATE]: (value: any): ValidationResponse => { const isValid = moment(value).isValid(); const parsed = isValid ? moment(value).toDate() : new Date(); return { isValid, parsed, message: isValid ? "" : `${WIDGET_TYPE_VALIDATION_ERROR}: Date`, }; }, };