fix: Fix mismatch between errors in debugger and evaluated value popup (#7752)

This commit is contained in:
akash-codemonk 2021-09-29 17:33:11 +05:30 committed by GitHub
parent c3724d5df2
commit 48f2c584ab
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
17 changed files with 240 additions and 178 deletions

View File

@ -116,8 +116,8 @@
"currentRowWithIdOutside": "#{{currentRow.email}}",
"currentRowWithIdInside": "{{\"#\" + currentRow.email}}",
"defaultdataBinding": "{'Test','This'}",
"dropdownErrorMsg": "This value does not evaluate to type \"Array<{ \"label\": \"string\", \"value\": \"string\" }>\".",
"tableWidgetErrorMsg": "This value does not evaluate to type \"Array<Object>\".",
"dropdownErrorMsg": "This value does not evaluate to type Array<{ \"label\": \"string\", \"value\": \"string\" }>",
"tableWidgetErrorMsg": "This value does not evaluate to type Array<Object>",
"bindingDataPoint": "{{JSON.stringify(Chart1.selectedDataPoint)}}",
"bindingSeriesTitle": "{{Chart1.selectedDataPoint.seriesTitle",
"bindChartData": "{{Chart1.selectedDataPoint",

View File

@ -61,9 +61,7 @@ describe("DatePicker Widget Property pane tests with js bindings", function() {
it("Datepicker default date validation message", function() {
cy.openPropertyPane("datepickerwidget2");
cy.testJsontext("defaultdate", "24-12-2021");
cy.evaluateErrorMessage(
`This value does not evaluate to type "ISO 8601 date string".`,
);
cy.evaluateErrorMessage("Value does not match: ISO 8601 date string");
cy.closePropertyPane();
});

View File

@ -21,10 +21,7 @@ import { IPopoverSharedProps } from "@blueprintjs/core";
import { ReactComponent as CopyIcon } from "assets/icons/menu/copy-snippet.svg";
import copy from "copy-to-clipboard";
import {
EvaluationError,
PropertyEvaluationErrorType,
} from "utils/DynamicBindingUtils";
import { EvaluationError } from "utils/DynamicBindingUtils";
import * as Sentry from "@sentry/react";
import { Severity } from "@sentry/react";
import { CodeEditorExpected } from "components/editorComponents/CodeEditor/index";
@ -387,9 +384,9 @@ function PopoverContent(props: PopoverContentProps) {
{hasError && error && (
<ErrorText>
<span className="t--evaluatedPopup-error">
{error.errorType === PropertyEvaluationErrorType.VALIDATION
? `This value does not evaluate to type "${expected?.type}".`
: error.errorMessage}
{/* errorMessage could be an empty string */}
{error.errorMessage ||
`This value does not evaluate to type "${expected?.type}".`}
</span>
<EvaluatedValueDebugButton
entity={props.entity}

View File

@ -20,7 +20,7 @@ export enum ValidationTypes {
export type ValidationResponse = {
isValid: boolean;
parsed: any;
message?: string;
messages?: string[];
transformed?: any;
};

View File

@ -463,12 +463,14 @@ export function* evaluateArgumentSaga(action: any) {
if (workerResponse.result) {
const validation = validate({ type }, workerResponse.result, {});
if (!validation.isValid)
lintErrors.unshift({
...validation,
...{
errorType: PropertyEvaluationErrorType.VALIDATION,
errorMessage: validation.message,
},
validation.messages?.map((message) => {
lintErrors.unshift({
...validation,
...{
errorType: PropertyEvaluationErrorType.VALIDATION,
errorMessage: message,
},
});
});
}
yield put(

View File

@ -57,7 +57,7 @@ function defaultSelectedValuesValidation(
return {
isValid: false,
parsed: values,
message: messages.join(" "),
messages,
};
}

View File

@ -24,14 +24,14 @@ function defaultDateValidation(
return {
isValid: true,
parsed: "",
message: "",
messages: [""],
};
}
if (value === undefined) {
return {
isValid: false,
parsed: "",
message: `This value does not evaluate to type: Date ${dateFormat}`,
messages: [`This value does not evaluate to type: Date ${dateFormat}`],
};
}
@ -40,10 +40,10 @@ function defaultDateValidation(
return {
isValid,
parsed: isValid ? value : "",
message:
messages:
isValid === false
? `Value does not match ISO 8601 standard date string`
: "",
? [`Value does not match ISO 8601 standard date string`]
: [""],
};
}
@ -58,8 +58,9 @@ function minDateValidation(
return {
isValid: false,
parsed: "",
message:
messages: [
`Value does not match: Date String ` + (dateFormat ? dateFormat : ""),
],
};
}
const parsedMinDate = moment(value as string, dateFormat);
@ -69,7 +70,7 @@ function minDateValidation(
return {
isValid: isValid,
parsed: value,
message: "",
messages: [""],
};
}
const parsedDefaultDate = moment(props.defaultDate, dateFormat);
@ -85,14 +86,15 @@ function minDateValidation(
return {
isValid: isValid,
parsed: "",
message:
messages: [
`Value does not match: Date String ` + (dateFormat ? dateFormat : ""),
],
};
}
return {
isValid: isValid,
parsed: value,
message: "",
messages: [""],
};
}
@ -107,9 +109,10 @@ function maxDateValidation(
return {
isValid: false,
parsed: "",
message:
messages: [
`Value does not match type: Date String ` +
(dateFormat ? dateFormat : ""),
(dateFormat ? dateFormat : ""),
],
};
}
const parsedMaxDate = moment(value as string, dateFormat);
@ -118,7 +121,7 @@ function maxDateValidation(
return {
isValid: isValid,
parsed: value,
message: "",
messages: [""],
};
}
const parsedDefaultDate = moment(props.defaultDate, dateFormat);
@ -134,15 +137,16 @@ function maxDateValidation(
return {
isValid: isValid,
parsed: "",
message:
messages: [
`Value does not match type: Date String ` +
(dateFormat ? dateFormat : ""),
(dateFormat ? dateFormat : ""),
],
};
}
return {
isValid: isValid,
parsed: value,
message: "",
messages: [""],
};
}
class DatePickerWidget extends BaseWidget<DatePickerWidgetProps, WidgetState> {

View File

@ -18,7 +18,7 @@ function defaultOptionValueValidation(value: unknown): ValidationResponse {
return {
isValid: false,
parsed: "",
message: "This value does not evaluate to type: string",
messages: ["This value does not evaluate to type: string"],
};
return { isValid: true, parsed: value };
}

View File

@ -37,24 +37,24 @@ describe("#defaultValueValidation", () => {
"abcd",
];
const expectedOutputs = [
{ isValid: true, parsed: undefined, message: "" },
{ isValid: true, parsed: undefined, message: "" },
{ isValid: true, parsed: 0, message: "" },
{ isValid: true, parsed: 123, message: "" },
{ isValid: true, parsed: -23, message: "" },
{ isValid: true, parsed: 0.000001, message: "" },
{ isValid: true, parsed: -23, message: "" },
{ isValid: true, parsed: 0, message: "" },
{ isValid: true, parsed: 100, message: "" },
{ isValid: true, parsed: undefined, messages: [""] },
{ isValid: true, parsed: undefined, messages: [""] },
{ isValid: true, parsed: 0, messages: [""] },
{ isValid: true, parsed: 123, messages: [""] },
{ isValid: true, parsed: -23, messages: [""] },
{ isValid: true, parsed: 0.000001, messages: [""] },
{ isValid: true, parsed: -23, messages: [""] },
{ isValid: true, parsed: 0, messages: [""] },
{ isValid: true, parsed: 100, messages: [""] },
{
isValid: false,
parsed: undefined,
message: "This value must be a number",
messages: ["This value must be a number"],
},
{
isValid: false,
parsed: undefined,
message: "This value must be a number",
messages: ["This value must be a number"],
},
];

View File

@ -43,7 +43,7 @@ export function defaultValueValidation(
return {
isValid: true,
parsed: undefined,
message: "",
messages: [""],
};
}
@ -51,7 +51,7 @@ export function defaultValueValidation(
return {
isValid: false,
parsed: undefined,
message: "This value must be a number",
messages: ["This value must be a number"],
};
}
}
@ -59,14 +59,14 @@ export function defaultValueValidation(
return {
isValid: true,
parsed,
message: "",
messages: [""],
};
}
if (_.isObject(value)) {
return {
isValid: false,
parsed: JSON.stringify(value, null, 2),
message: "This value must be string",
messages: ["This value must be string"],
};
}
let parsed = value;
@ -78,14 +78,14 @@ export function defaultValueValidation(
return {
isValid: false,
parsed: "",
message: "This value must be string",
messages: ["This value must be string"],
};
}
}
return {
isValid,
parsed: parsed,
message: "",
messages: [""],
};
}

View File

@ -29,7 +29,7 @@ function validateDefaultRate(value: unknown, props: any, _: any) {
return {
isValid: false,
parsed: 0,
message: `Value must be a number`,
messages: [`Value must be a number`],
};
}
}
@ -43,7 +43,7 @@ function validateDefaultRate(value: unknown, props: any, _: any) {
return {
isValid: false,
parsed,
message: `This value must be less than or equal to max count`,
messages: [`This value must be less than or equal to max count`],
};
}
@ -52,7 +52,7 @@ function validateDefaultRate(value: unknown, props: any, _: any) {
return {
isValid: false,
parsed,
message: `This value can be a decimal only if 'Allow half' is true`,
messages: [`This value can be a decimal only if 'Allow half' is true`],
};
}
@ -61,7 +61,7 @@ function validateDefaultRate(value: unknown, props: any, _: any) {
return {
isValid: false,
parsed: value,
message: `Could not validate `,
messages: [`Could not validate `],
};
}
}

View File

@ -21,7 +21,7 @@ function defaultOptionValueValidation(value: unknown): ValidationResponse {
return {
isValid: false,
parsed: "",
message: "This value does not evaluate to type: string",
messages: ["This value does not evaluate to type: string"],
};
return { isValid: true, parsed: value };
}

View File

@ -25,7 +25,7 @@ export function selectedTabValidation(
return {
isValid: value === "" ? true : tabNames.includes(value as string),
parsed: value,
message: `Tab name ${value} does not exist`,
messages: [`Tab name ${value} does not exist`],
};
}
class TabsWidget extends BaseWidget<

View File

@ -2,6 +2,7 @@ import {
DependencyMap,
EvalError,
EvalErrorTypes,
EvaluationError,
getDynamicBindings,
getEntityDynamicBindingPathList,
getEvalErrorPath,
@ -731,7 +732,7 @@ export default class DataTreeEvaluator {
}
const validation = widget.validationPaths[propertyPath];
const { isValid, message, parsed, transformed } = validateWidgetProperty(
const { isValid, messages, parsed, transformed } = validateWidgetProperty(
validation,
valueToValidate,
widget,
@ -749,18 +750,16 @@ export default class DataTreeEvaluator {
safeEvaluatedValue,
);
if (!isValid) {
addErrorToEntityProperty(
[
{
const evalErrors: EvaluationError[] =
messages?.map((message) => {
return {
raw: unEvalPropertyValue,
errorMessage: message || "",
errorType: PropertyEvaluationErrorType.VALIDATION,
severity: Severity.ERROR,
},
],
currentTree,
fullPropertyPath,
);
};
}) ?? [];
addErrorToEntityProperty(evalErrors, currentTree, fullPropertyPath);
}
if (isPathADynamicTrigger(widget, propertyPath)) {

View File

@ -357,7 +357,7 @@ export function getValidatedTree(tree: DataTree) {
Object.entries(entity.validationPaths).forEach(([property, validation]) => {
const value = _.get(entity, property);
// Pass it through parse
const { isValid, message, parsed, transformed } = validateWidgetProperty(
const { isValid, messages, parsed, transformed } = validateWidgetProperty(
validation,
value,
entity,
@ -375,15 +375,15 @@ export function getValidatedTree(tree: DataTree) {
safeEvaluatedValue,
);
if (!isValid) {
const evalErrors: EvaluationError[] =
messages?.map((message) => ({
errorType: PropertyEvaluationErrorType.VALIDATION,
errorMessage: message,
severity: Severity.ERROR,
raw: value,
})) ?? [];
addErrorToEntityProperty(
[
{
errorType: PropertyEvaluationErrorType.VALIDATION,
errorMessage: message || "",
severity: Severity.ERROR,
raw: value,
},
],
evalErrors,
tree,
getEvalErrorPath(`${entityKey}.${property}`, false),
);

View File

@ -38,27 +38,35 @@ describe("Validate Validators", () => {
{
isValid: false,
parsed: "abc",
message: "Value is not allowed",
messages: ["Value is not allowed"],
},
{
isValid: false,
parsed: "abc",
message: `${WIDGET_TYPE_VALIDATION_ERROR} string ( abc | 123 | mno | test )`,
messages: [
`${WIDGET_TYPE_VALIDATION_ERROR} string ( abc | 123 | mno | test )`,
],
},
{
isValid: false,
parsed: "abc",
message: `${WIDGET_TYPE_VALIDATION_ERROR} string ( abc | 123 | mno | test )`,
messages: [
`${WIDGET_TYPE_VALIDATION_ERROR} string ( abc | 123 | mno | test )`,
],
},
{
isValid: false,
parsed: "{}",
message: `${WIDGET_TYPE_VALIDATION_ERROR} string ( abc | 123 | mno | test )`,
messages: [
`${WIDGET_TYPE_VALIDATION_ERROR} string ( abc | 123 | mno | test )`,
],
},
{
isValid: false,
parsed: "[]",
message: `${WIDGET_TYPE_VALIDATION_ERROR} string ( abc | 123 | mno | test )`,
messages: [
`${WIDGET_TYPE_VALIDATION_ERROR} string ( abc | 123 | mno | test )`,
],
},
{
isValid: true,
@ -115,12 +123,14 @@ describe("Validate Validators", () => {
{
isValid: false,
parsed: "abc",
message: "Value is not allowed",
messages: ["Value is not allowed"],
},
{
isValid: false,
parsed: "abc",
message: `${WIDGET_TYPE_VALIDATION_ERROR} string ( abc | 123 | mno | test )`,
messages: [
`${WIDGET_TYPE_VALIDATION_ERROR} string ( abc | 123 | mno | test )`,
],
},
];
inputs.forEach((input, index) => {
@ -166,7 +176,9 @@ describe("Validate Validators", () => {
isValid: false,
parsed:
"https://cdn.dribbble.com/users/1787323/screenshots/4563995/dribbbe_hammer-01.png",
message: `${WIDGET_TYPE_VALIDATION_ERROR}: base64 encoded image | data uri | image url`,
messages: [
`${WIDGET_TYPE_VALIDATION_ERROR}: base64 encoded image | data uri | image url`,
],
},
];
@ -195,27 +207,31 @@ describe("Validate Validators", () => {
{
isValid: false,
parsed: 90,
message: "Minimum allowed value: 100",
messages: ["Minimum allowed value: 100"],
},
{
isValid: false,
parsed: 220,
message: "Maximum allowed value: 200",
messages: ["Maximum allowed value: 200"],
},
{
isValid: false,
parsed: 150,
message: "This value is required",
messages: ["This value is required"],
},
{
isValid: false,
parsed: 150,
message: `${WIDGET_TYPE_VALIDATION_ERROR} number Min: 100 Max: 200 Required`,
messages: [
`${WIDGET_TYPE_VALIDATION_ERROR} number Min: 100 Max: 200 Required`,
],
},
{
isValid: false,
parsed: 150,
message: `${WIDGET_TYPE_VALIDATION_ERROR} number Min: 100 Max: 200 Required`,
messages: [
`${WIDGET_TYPE_VALIDATION_ERROR} number Min: 100 Max: 200 Required`,
],
},
{
isValid: true,
@ -224,7 +240,7 @@ describe("Validate Validators", () => {
{
isValid: false,
parsed: 150,
message: "This value is required",
messages: ["This value is required"],
},
];
inputs.forEach((input, index) => {
@ -267,12 +283,12 @@ describe("Validate Validators", () => {
const expected = [
{
isValid: false,
message: `${WIDGET_TYPE_VALIDATION_ERROR} boolean`,
messages: [`${WIDGET_TYPE_VALIDATION_ERROR} boolean`],
parsed: false,
},
{
isValid: false,
message: `${WIDGET_TYPE_VALIDATION_ERROR} boolean`,
messages: [`${WIDGET_TYPE_VALIDATION_ERROR} boolean`],
parsed: false,
},
{
@ -285,12 +301,12 @@ describe("Validate Validators", () => {
},
{
isValid: false,
message: `${WIDGET_TYPE_VALIDATION_ERROR} boolean`,
messages: [`${WIDGET_TYPE_VALIDATION_ERROR} boolean`],
parsed: false,
},
{
isValid: false,
message: `${WIDGET_TYPE_VALIDATION_ERROR} boolean`,
messages: [`${WIDGET_TYPE_VALIDATION_ERROR} boolean`],
parsed: false,
},
{
@ -304,7 +320,7 @@ describe("Validate Validators", () => {
{
isValid: false,
parsed: false,
message: "This value does not evaluate to type boolean",
messages: ["This value does not evaluate to type boolean"],
},
];
@ -388,27 +404,35 @@ describe("Validate Validators", () => {
{
isValid: false,
parsed: { key1: 120, key2: "abc" },
message: `${WIDGET_TYPE_VALIDATION_ERROR}: { \"key1\": \"number Required\", \"key2\": \"string ( abc | mnop )\" }`,
messages: [
`${WIDGET_TYPE_VALIDATION_ERROR}: { \"key1\": \"number Required\", \"key2\": \"string ( abc | mnop )\" }`,
],
},
{
isValid: false,
parsed: { key1: 120, key2: "abc" },
message: `${WIDGET_TYPE_VALIDATION_ERROR}: { \"key1\": \"number Required\", \"key2\": \"string ( abc | mnop )\" }`,
messages: [
`${WIDGET_TYPE_VALIDATION_ERROR}: { \"key1\": \"number Required\", \"key2\": \"string ( abc | mnop )\" }`,
],
},
{
isValid: false,
parsed: { key1: 120, key2: "abc" },
message: `Value of key: key1 is invalid: This value does not evaluate to type number Required`,
messages: [
`Value of key: key1 is invalid: This value does not evaluate to type number Required`,
],
},
{
isValid: false,
parsed: { key1: 120, key2: "abc" },
message: `Value of key: key2 is invalid: This value does not evaluate to type string ( abc | mnop )`,
messages: [
`Value of key: key2 is invalid: This value does not evaluate to type string ( abc | mnop )`,
],
},
{
isValid: false,
parsed: { key1: 120, key2: "abc" },
message: `Missing required key: key1`,
messages: [`Missing required key: key1`],
},
];
inputs.forEach((input, index) => {
@ -451,73 +475,79 @@ describe("Validate Validators", () => {
{
isValid: true,
parsed: ["a", "b", "c"],
message: "",
messages: [],
},
{
isValid: true,
parsed: ["m", "n", "b"],
message: "",
messages: [],
},
{
isValid: false,
parsed: [],
message: "Invalid entry at index: 2. Value is not allowed",
messages: ["Invalid entry at index: 2. Value is not allowed"],
},
{
isValid: true,
parsed: [],
message: "",
messages: [],
},
{
isValid: false,
parsed: [],
message:
messages: [
"This value does not evaluate to type Array<string ( a | b | c | n | m | p | r )>",
],
},
{
isValid: false,
parsed: [],
message:
messages: [
"This property is required for the widget to function correctly",
],
},
{
isValid: false,
parsed: [],
message:
messages: [
"This property is required for the widget to function correctly",
],
},
{
isValid: false,
parsed: [],
message:
messages: [
"This value does not evaluate to type Array<string ( a | b | c | n | m | p | r )>",
],
},
{
isValid: true,
parsed: ["a", "b", "c"],
message: "",
messages: [],
},
{
isValid: false,
parsed: [],
message:
messages: [
"This value does not evaluate to type Array<string ( a | b | c | n | m | p | r )>",
],
},
{
isValid: false,
parsed: [],
message: "Array must be unique. Duplicate values found",
messages: ["Array must be unique. Duplicate values found"],
},
{
isValid: false,
parsed: [],
message:
messages: [
"This property is required for the widget to function correctly",
],
},
{
isValid: true,
parsed: [],
message: "",
messages: [],
},
];
inputs.forEach((input, index) => {
@ -594,39 +624,44 @@ describe("Validate Validators", () => {
{
isValid: true,
parsed: [{ label: 123, value: 234 }],
message: "",
messages: [],
},
{
isValid: true,
parsed: [{ label: 123, value: 234 }],
message: "",
messages: [],
},
{
isValid: false,
parsed: [],
message: "Invalid entry at index: 0. Missing required key: label",
messages: ["Invalid entry at index: 0. Missing required key: label"],
},
{
isValid: false,
parsed: [],
message: `Invalid entry at index: 0. Value of key: label is invalid: This value does not evaluate to type number Required`,
messages: [
`Invalid entry at index: 0. Value of key: label is invalid: This value does not evaluate to type number Required`,
],
},
{
isValid: false,
parsed: [],
message:
"Invalid entry at index: 0. Missing required key: label Missing required key: value",
messages: [
"Invalid entry at index: 0. Missing required key: label",
"Invalid entry at index: 0. Missing required key: value",
],
},
{
isValid: true,
parsed: [],
message: "",
messages: [],
},
{
isValid: false,
parsed: [],
message:
messages: [
"This property is required for the widget to function correctly",
],
},
];
inputs.forEach((input, index) => {
@ -711,16 +746,16 @@ describe("Validate Validators", () => {
{
isValid: false,
parsed: defaultDate,
message: "Value does not match: ISO 8601 date string",
messages: ["Value does not match: ISO 8601 date string"],
},
{
isValid: false,
parsed: defaultDate,
message: "Value does not match: ISO 8601 date string",
messages: ["Value does not match: ISO 8601 date string"],
},
{
isValid: false,
message: "Value does not match: ISO 8601 date string",
messages: ["Value does not match: ISO 8601 date string"],
parsed: defaultDate,
},
];
@ -800,52 +835,52 @@ describe("Validate Validators", () => {
{
isValid: false,
parsed: [{ id: 1, name: "alpha" }],
message: "This value does not evaluate to type Array<Object>",
messages: ["This value does not evaluate to type Array<Object>"],
},
{
isValid: false,
parsed: [{ id: 1, name: "alpha" }],
message: "This value does not evaluate to type Array<Object>",
messages: ["This value does not evaluate to type Array<Object>"],
},
{
isValid: false,
parsed: [{ id: 1, name: "alpha" }],
message: "This value does not evaluate to type Array<Object>",
messages: ["This value does not evaluate to type Array<Object>"],
},
{
isValid: false,
parsed: [{ id: 1, name: "alpha" }],
message: "This value does not evaluate to type Array<Object>",
messages: ["This value does not evaluate to type Array<Object>"],
},
{
isValid: false,
parsed: [{ id: 1, name: "alpha" }],
message: "This value does not evaluate to type Array<Object>",
messages: ["This value does not evaluate to type Array<Object>"],
},
{
isValid: false,
parsed: [{ id: 1, name: "alpha" }],
message: "This value does not evaluate to type Array<Object>",
messages: ["This value does not evaluate to type Array<Object>"],
},
{
isValid: false,
parsed: [{ id: 1, name: "alpha" }],
message: "Invalid object at index 0",
messages: ["Invalid object at index 0"],
},
{
isValid: false,
parsed: [{ id: 1, name: "alpha" }],
message: "Invalid object at index 1",
messages: ["Invalid object at index 1"],
},
{
isValid: false,
parsed: [{ id: 1, name: "alpha" }],
message: "Invalid object at index 1",
messages: ["Invalid object at index 1"],
},
{
isValid: false,
parsed: [{ id: 1, name: "alpha" }],
message: "This value does not evaluate to type Array<Object>",
messages: ["This value does not evaluate to type Array<Object>"],
},
];
@ -928,12 +963,12 @@ describe("Validate Validators", () => {
},
{
isValid: false,
message: `${WIDGET_TYPE_VALIDATION_ERROR}: URL`,
messages: [`${WIDGET_TYPE_VALIDATION_ERROR}: URL`],
parsed: "https://wikipedia.org",
},
{
isValid: false,
message: `${WIDGET_TYPE_VALIDATION_ERROR}: URL`,
messages: [`${WIDGET_TYPE_VALIDATION_ERROR}: URL`],
parsed: "https://wikipedia.org",
},
];

View File

@ -59,7 +59,7 @@ function validatePlainObject(
const entryName = getPropertyEntry(value, entry.name, ignoreCase);
if (value.hasOwnProperty(entryName)) {
const { isValid, message, parsed } = validate(
const { isValid, messages, parsed } = validate(
entry,
value[entryName],
props,
@ -67,8 +67,12 @@ function validatePlainObject(
if (!isValid) {
value[entryName] = parsed;
_valid = isValid;
message &&
_messages.push(`Value of key: ${entryName} is invalid: ${message}`);
messages &&
messages.map((message) => {
_messages.push(
`Value of key: ${entryName} is invalid: ${message}`,
);
});
}
} else if (entry.params?.required) {
_valid = false;
@ -84,7 +88,7 @@ function validatePlainObject(
return {
isValid: false,
parsed: config.params?.default || value,
message: _messages.join(" "),
messages: _messages,
};
}
return {
@ -107,7 +111,7 @@ function validateArray(
return {
isValid: false,
parsed: value,
message: `Disallowed value: ${entry}`,
messages: [`Disallowed value: ${entry}`],
};
}
});
@ -170,8 +174,8 @@ function validateArray(
const validation = validate(children, entry, props);
if (!validation.isValid) {
_isValid = false;
_messages.push(
`Invalid entry at index: ${index}. ${validation.message}`,
validation.messages?.map((message) =>
_messages.push(`Invalid entry at index: ${index}. ${message}`),
);
}
});
@ -185,7 +189,7 @@ function validateArray(
if (uniq(shouldBeUnique).length !== value.length) {
_isValid = false;
_messages.push(
`Array entry path:${param} must be unique. Duplicate values found`,
`path:${param} must be unique. Duplicate values found`,
);
break;
}
@ -201,7 +205,7 @@ function validateArray(
return {
isValid: _isValid,
parsed: _isValid ? value : config.params?.default || [],
message: _messages.join(" "),
messages: _messages,
};
}
@ -296,7 +300,9 @@ export const VALIDATORS: Record<ValidationTypes, Validator> = {
return {
isValid: false,
parsed: config.params?.default || "",
message: `${WIDGET_TYPE_VALIDATION_ERROR} ${getExpectedType(config)}`,
messages: [
`${WIDGET_TYPE_VALIDATION_ERROR} ${getExpectedType(config)}`,
],
};
}
@ -311,7 +317,9 @@ export const VALIDATORS: Record<ValidationTypes, Validator> = {
return {
isValid: false,
parsed: JSON.stringify(value, null, 2),
message: `${WIDGET_TYPE_VALIDATION_ERROR} ${getExpectedType(config)}`,
messages: [
`${WIDGET_TYPE_VALIDATION_ERROR} ${getExpectedType(config)}`,
],
};
}
@ -319,7 +327,7 @@ export const VALIDATORS: Record<ValidationTypes, Validator> = {
const stringValidationError = {
isValid: false,
parsed: config.params?.default || "",
message: `${WIDGET_TYPE_VALIDATION_ERROR} ${getExpectedType(config)}`,
messages: [`${WIDGET_TYPE_VALIDATION_ERROR} ${getExpectedType(config)}`],
};
if (!isValid) {
try {
@ -335,7 +343,7 @@ export const VALIDATORS: Record<ValidationTypes, Validator> = {
if (!config.params?.allowedValues.includes((parsed as string).trim())) {
return {
parsed: config.params?.default || "",
message: "Value is not allowed",
messages: ["Value is not allowed"],
isValid: false,
};
}
@ -348,7 +356,9 @@ export const VALIDATORS: Record<ValidationTypes, Validator> = {
) {
return {
parsed: config.params?.default || "",
message: `Value does not match expected regex: ${config.params?.regex.source}`,
messages: [
`Value does not match expected regex: ${config.params?.regex.source}`,
],
isValid: false,
};
}
@ -364,7 +374,7 @@ export const VALIDATORS: Record<ValidationTypes, Validator> = {
value: unknown,
props: Record<string, unknown>,
): ValidationResponse => {
const { isValid, message, parsed } = VALIDATORS[ValidationTypes.TEXT](
const { isValid, messages, parsed } = VALIDATORS[ValidationTypes.TEXT](
config,
value,
props,
@ -374,11 +384,13 @@ export const VALIDATORS: Record<ValidationTypes, Validator> = {
return {
isValid: false,
parsed: new RegExp(parsed),
message: `${WIDGET_TYPE_VALIDATION_ERROR} ${getExpectedType(config)}`,
messages: [
`${WIDGET_TYPE_VALIDATION_ERROR} ${getExpectedType(config)}`,
],
};
}
return { isValid, parsed, message };
return { isValid, parsed, messages };
},
[ValidationTypes.NUMBER]: (
config: ValidationConfig,
@ -390,7 +402,7 @@ export const VALIDATORS: Record<ValidationTypes, Validator> = {
return {
isValid: false,
parsed: config.params?.default || 0,
message: "This value is required",
messages: ["This value is required"],
};
}
@ -410,7 +422,9 @@ export const VALIDATORS: Record<ValidationTypes, Validator> = {
return {
isValid: false,
parsed: config.params?.default || 0,
message: `${WIDGET_TYPE_VALIDATION_ERROR} ${getExpectedType(config)}`,
messages: [
`${WIDGET_TYPE_VALIDATION_ERROR} ${getExpectedType(config)}`,
],
};
}
@ -423,7 +437,9 @@ export const VALIDATORS: Record<ValidationTypes, Validator> = {
return {
isValid: false,
parsed: config.params?.default || 0,
message: `${WIDGET_TYPE_VALIDATION_ERROR} ${getExpectedType(config)}`,
messages: [
`${WIDGET_TYPE_VALIDATION_ERROR} ${getExpectedType(config)}`,
],
};
}
}
@ -436,7 +452,7 @@ export const VALIDATORS: Record<ValidationTypes, Validator> = {
return {
isValid: false,
parsed,
message: `Minimum allowed value: ${config.params.min}`,
messages: [`Minimum allowed value: ${config.params.min}`],
};
}
}
@ -449,7 +465,7 @@ export const VALIDATORS: Record<ValidationTypes, Validator> = {
return {
isValid: false,
parsed,
message: `Maximum allowed value: ${config.params.max}`,
messages: [`Maximum allowed value: ${config.params.max}`],
};
}
}
@ -457,7 +473,7 @@ export const VALIDATORS: Record<ValidationTypes, Validator> = {
return {
isValid: false,
parsed,
message: `Value should be a positive integer`,
messages: [`Value should be a positive integer`],
};
}
@ -476,7 +492,9 @@ export const VALIDATORS: Record<ValidationTypes, Validator> = {
return {
isValid: false,
parsed: !!config.params?.default,
message: `${WIDGET_TYPE_VALIDATION_ERROR} ${getExpectedType(config)}`,
messages: [
`${WIDGET_TYPE_VALIDATION_ERROR} ${getExpectedType(config)}`,
],
};
}
@ -500,7 +518,9 @@ export const VALIDATORS: Record<ValidationTypes, Validator> = {
return {
isValid: false,
parsed: config.params?.default || false,
message: `${WIDGET_TYPE_VALIDATION_ERROR} ${getExpectedType(config)}`,
messages: [
`${WIDGET_TYPE_VALIDATION_ERROR} ${getExpectedType(config)}`,
],
};
}
@ -520,9 +540,9 @@ export const VALIDATORS: Record<ValidationTypes, Validator> = {
return {
isValid: false,
parsed: config.params?.default || {},
message: `${WIDGET_TYPE_VALIDATION_ERROR}: ${getExpectedType(
config,
)}`,
messages: [
`${WIDGET_TYPE_VALIDATION_ERROR}: ${getExpectedType(config)}`,
],
};
}
return {
@ -547,13 +567,17 @@ export const VALIDATORS: Record<ValidationTypes, Validator> = {
return {
isValid: false,
parsed: config.params?.default || {},
message: `${WIDGET_TYPE_VALIDATION_ERROR}: ${getExpectedType(config)}`,
messages: [
`${WIDGET_TYPE_VALIDATION_ERROR}: ${getExpectedType(config)}`,
],
};
} catch (e) {
return {
isValid: false,
parsed: config.params?.default || {},
message: `${WIDGET_TYPE_VALIDATION_ERROR}: ${getExpectedType(config)}`,
messages: [
`${WIDGET_TYPE_VALIDATION_ERROR}: ${getExpectedType(config)}`,
],
};
}
},
@ -565,7 +589,7 @@ export const VALIDATORS: Record<ValidationTypes, Validator> = {
const invalidResponse = {
isValid: false,
parsed: config.params?.default || [],
message: `${WIDGET_TYPE_VALIDATION_ERROR} ${getExpectedType(config)}`,
messages: [`${WIDGET_TYPE_VALIDATION_ERROR} ${getExpectedType(config)}`],
};
if (value === undefined || value === null || value === "") {
if (
@ -573,8 +597,9 @@ export const VALIDATORS: Record<ValidationTypes, Validator> = {
config.params.required &&
!isArray(config.params.default)
) {
invalidResponse.message =
"This property is required for the widget to function correctly";
invalidResponse.messages = [
"This property is required for the widget to function correctly",
];
return invalidResponse;
}
if (value === "") {
@ -622,7 +647,7 @@ export const VALIDATORS: Record<ValidationTypes, Validator> = {
const invalidResponse = {
isValid: false,
parsed: config.params?.default || [{}],
message: `${WIDGET_TYPE_VALIDATION_ERROR} ${getExpectedType(config)}`,
messages: [`${WIDGET_TYPE_VALIDATION_ERROR} ${getExpectedType(config)}`],
};
if (value === undefined || value === null || value === "") {
if (config.params?.required) return invalidResponse;
@ -666,7 +691,7 @@ export const VALIDATORS: Record<ValidationTypes, Validator> = {
if (!isPlainObject(parsedEntry)) {
return {
...invalidResponse,
message: `Invalid object at index ${index}`,
messages: [`Invalid object at index ${index}`],
};
}
}
@ -683,7 +708,7 @@ export const VALIDATORS: Record<ValidationTypes, Validator> = {
let response: ValidationResponse = {
isValid: false,
parsed: config.params?.default || [],
message: `${WIDGET_TYPE_VALIDATION_ERROR} ${getExpectedType(config)}`,
messages: [`${WIDGET_TYPE_VALIDATION_ERROR} ${getExpectedType(config)}`],
};
response = VALIDATORS.ARRAY(config, value, props);
@ -702,7 +727,9 @@ export const VALIDATORS: Record<ValidationTypes, Validator> = {
response = {
...response,
isValid: false,
message: `Array entry path:${param} must be unique. Duplicate values found`,
messages: [
`path:${param} must be unique. Duplicate values found`,
],
};
}
}
@ -718,7 +745,7 @@ export const VALIDATORS: Record<ValidationTypes, Validator> = {
const invalidResponse = {
isValid: false,
parsed: config.params?.default || moment().toISOString(true),
message: `Value does not match: ${getExpectedType(config)}`,
messages: [`Value does not match: ${getExpectedType(config)}`],
};
if (value === undefined || value === null || !isString(value)) {
if (!config.params?.required) {
@ -761,7 +788,7 @@ export const VALIDATORS: Record<ValidationTypes, Validator> = {
const invalidResponse = {
isValid: false,
parsed: undefined,
message: "Failed to validate",
messages: ["Failed to validate"],
};
if (config.params?.fnString && isString(config.params?.fnString)) {
try {
@ -786,7 +813,7 @@ export const VALIDATORS: Record<ValidationTypes, Validator> = {
const invalidResponse = {
isValid: false,
parsed: config.params?.default || "",
message: `${WIDGET_TYPE_VALIDATION_ERROR}: ${getExpectedType(config)}`,
messages: [`${WIDGET_TYPE_VALIDATION_ERROR}: ${getExpectedType(config)}`],
};
const base64Regex = /^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/;
const base64ImageRegex = /^data:image\/.*;base64/;
@ -822,7 +849,7 @@ export const VALIDATORS: Record<ValidationTypes, Validator> = {
const invalidResponse = {
isValid: false,
parsed: config?.params?.default || "",
message: `${WIDGET_TYPE_VALIDATION_ERROR}: ${getExpectedType(config)}`,
messages: [`${WIDGET_TYPE_VALIDATION_ERROR}: ${getExpectedType(config)}`],
};
if (typeof value === "string" && getIsSafeURL(value)) {