nox-validation 1.2.0 → 1.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/constant.js +6 -0
- package/lib/helpers.js +162 -140
- package/lib/validate.js +95 -10
- package/package.json +1 -1
package/lib/constant.js
CHANGED
|
@@ -161,6 +161,7 @@ const LANGUAGES = Object.freeze({
|
|
|
161
161
|
});
|
|
162
162
|
|
|
163
163
|
const LOCALE_NL_MESSAGES = Object.freeze({
|
|
164
|
+
ADD_CHOICE: `Voeg minstens één optie toe voor {field}.`,
|
|
164
165
|
INVALID_VALUE: `{field} bevat een ongeldige waarde.`,
|
|
165
166
|
EMPTY: `{field} moet leeg zijn.`,
|
|
166
167
|
NOT_EMPTY: `{field} mag niet leeg zijn.`,
|
|
@@ -205,6 +206,7 @@ const LOCALE_NL_MESSAGES = Object.freeze({
|
|
|
205
206
|
});
|
|
206
207
|
|
|
207
208
|
const LOCALE_EN_MESSAGES = Object.freeze({
|
|
209
|
+
ADD_CHOICE:`Please add at least one choice for {field}.`,
|
|
208
210
|
INVALID_VALUE: `{field} contains invalid value.`,
|
|
209
211
|
EMPTY: `{field} should be empty.`,
|
|
210
212
|
NOT_EMPTY: `{field} should not be empty.`,
|
|
@@ -249,6 +251,7 @@ const LOCALE_EN_MESSAGES = Object.freeze({
|
|
|
249
251
|
});
|
|
250
252
|
|
|
251
253
|
const LOCALE_LV_MESSAGES = Object.freeze({
|
|
254
|
+
ADD_CHOICE: `Lūdzu, pievienojiet vismaz vienu izvēli laukam {field}.`,
|
|
252
255
|
INVALID_VALUE: `{field} satur nederīgu vērtību.`,
|
|
253
256
|
EMPTY: `{field} jābūt tukšam.`,
|
|
254
257
|
NOT_EMPTY: `{field} nedrīkst būt tukšs.`,
|
|
@@ -293,6 +296,7 @@ const LOCALE_LV_MESSAGES = Object.freeze({
|
|
|
293
296
|
});
|
|
294
297
|
|
|
295
298
|
const LOCALE_PL_MESSAGES = Object.freeze({
|
|
299
|
+
ADD_CHOICE: `Proszę dodać co najmniej jedną opcję dla {field}.`,
|
|
296
300
|
INVALID_VALUE: `{field} zawiera nieprawidłową wartość.`,
|
|
297
301
|
EMPTY: `{field} powinno być puste.`,
|
|
298
302
|
NOT_EMPTY: `{field} nie powinno być puste.`,
|
|
@@ -337,6 +341,7 @@ const LOCALE_PL_MESSAGES = Object.freeze({
|
|
|
337
341
|
});
|
|
338
342
|
|
|
339
343
|
const LOCALE_RO_MESSAGES = Object.freeze({
|
|
344
|
+
ADD_CHOICE: `Vă rugăm să adăugați cel puțin o opțiune pentru {field}.`,
|
|
340
345
|
INVALID_VALUE: `{field} conține o valoare invalidă.`,
|
|
341
346
|
EMPTY: `{field} trebuie să fie gol.`,
|
|
342
347
|
NOT_EMPTY: `{field} nu trebuie să fie gol.`,
|
|
@@ -381,6 +386,7 @@ const LOCALE_RO_MESSAGES = Object.freeze({
|
|
|
381
386
|
});
|
|
382
387
|
|
|
383
388
|
const LOCALE_RU_MESSAGES = Object.freeze({
|
|
389
|
+
ADD_CHOICE: `Пожалуйста, добавьте хотя бы один вариант для {field}.`,
|
|
384
390
|
INVALID_VALUE: `{field} содержит недопустимое значение.`,
|
|
385
391
|
EMPTY: `{field} должно быть пустым.`,
|
|
386
392
|
NOT_EMPTY: `{field} не должно быть пустым.`,
|
package/lib/helpers.js
CHANGED
|
@@ -355,7 +355,14 @@ const convertTypesV1 = (field) => {
|
|
|
355
355
|
return { type, array_type, find_relations };
|
|
356
356
|
};
|
|
357
357
|
|
|
358
|
-
const generateField = (
|
|
358
|
+
const generateField = (
|
|
359
|
+
name,
|
|
360
|
+
path,
|
|
361
|
+
schema_definition_type,
|
|
362
|
+
type,
|
|
363
|
+
childrenFields = [],
|
|
364
|
+
relationType = "none"
|
|
365
|
+
) => {
|
|
359
366
|
childrenFields = childrenFields?.map((child) => {
|
|
360
367
|
return {
|
|
361
368
|
...child,
|
|
@@ -375,7 +382,7 @@ const generateField = (name, path, schema_definition_type, type, childrenFields
|
|
|
375
382
|
required: false,
|
|
376
383
|
nullable: false,
|
|
377
384
|
hidden: false,
|
|
378
|
-
interface:relationType
|
|
385
|
+
interface: relationType,
|
|
379
386
|
},
|
|
380
387
|
validations: [],
|
|
381
388
|
schema_definition: {
|
|
@@ -398,7 +405,7 @@ const createChildrenFieldsFiles = (key) => {
|
|
|
398
405
|
constants.types.ARRAY
|
|
399
406
|
);
|
|
400
407
|
return [existingField, deleteField];
|
|
401
|
-
}
|
|
408
|
+
};
|
|
402
409
|
|
|
403
410
|
const generateRelationalFieldV1 = (key = "", collectionFields = [], relationType) => {
|
|
404
411
|
if (relationType === constants.interfaces.MANY_TO_ANY) {
|
|
@@ -581,7 +588,7 @@ const getForeignCollectionDetails = ({
|
|
|
581
588
|
this_collection: mainTable.one_collection_id,
|
|
582
589
|
this_field: "_id",
|
|
583
590
|
foreign_collection:
|
|
584
|
-
iFace === constants.interfaces.MANY_TO_MANY
|
|
591
|
+
iFace === constants.interfaces.MANY_TO_MANY
|
|
585
592
|
? relational?.one_collection_id
|
|
586
593
|
: iFace === constants.interfaces.MANY_TO_ANY
|
|
587
594
|
? relational?.one_allowed_collections_id
|
|
@@ -667,8 +674,7 @@ const getCachedOrFetchFields = (schemaId, allFields, relational_fields) => {
|
|
|
667
674
|
return fields;
|
|
668
675
|
};
|
|
669
676
|
|
|
670
|
-
const getChildFields = (relationDetail, allFields, relational_fields, isTranslation,name) => {
|
|
671
|
-
|
|
677
|
+
const getChildFields = (relationDetail, allFields, relational_fields, isTranslation, name) => {
|
|
672
678
|
let key = isTranslation
|
|
673
679
|
? [
|
|
674
680
|
...(Array.isArray(relationDetail.junction_collection)
|
|
@@ -723,16 +729,16 @@ const buildNestedStructure = ({
|
|
|
723
729
|
schemaFields.forEach((item) => {
|
|
724
730
|
const pathParts = item.path.split(".");
|
|
725
731
|
const key = pathParts.join(".");
|
|
726
|
-
const isV2File =
|
|
727
|
-
constants.
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
732
|
+
const isV2File =
|
|
733
|
+
apiVersion === constants.API_VERSION.V2 &&
|
|
734
|
+
[
|
|
735
|
+
constants.interfaces.FILES,
|
|
736
|
+
constants.interfaces.FILE,
|
|
737
|
+
constants.interfaces.FILE_IMAGE,
|
|
738
|
+
].includes(item?.meta?.interface);
|
|
731
739
|
|
|
732
740
|
const currentDepth = currentDepthMap.get(isRoot ? item.path : rootPath) || 0;
|
|
733
741
|
|
|
734
|
-
// if (currentDepth >= maxLevel) return;
|
|
735
|
-
|
|
736
742
|
let childFields;
|
|
737
743
|
|
|
738
744
|
let definedType = generateType(item, apiVersion);
|
|
@@ -752,7 +758,8 @@ const buildNestedStructure = ({
|
|
|
752
758
|
relationDetail,
|
|
753
759
|
allFields,
|
|
754
760
|
relational_fields,
|
|
755
|
-
item?.meta?.interface === constants.interfaces.TRANSLATIONS,
|
|
761
|
+
item?.meta?.interface === constants.interfaces.TRANSLATIONS,
|
|
762
|
+
key
|
|
756
763
|
);
|
|
757
764
|
} else {
|
|
758
765
|
childFields = getCachedFields(relationDetail, relational_fields);
|
|
@@ -776,7 +783,7 @@ const buildNestedStructure = ({
|
|
|
776
783
|
}
|
|
777
784
|
}
|
|
778
785
|
|
|
779
|
-
if(isV2File){
|
|
786
|
+
if (isV2File) {
|
|
780
787
|
definedType.array_type = constants.types.OBJECT;
|
|
781
788
|
definedType.type = constants.types.OBJECT;
|
|
782
789
|
childFields = createChildrenFieldsFiles(key);
|
|
@@ -794,15 +801,14 @@ const buildNestedStructure = ({
|
|
|
794
801
|
nullable: item.meta?.nullable || false,
|
|
795
802
|
hidden: item.meta?.hidden || false,
|
|
796
803
|
},
|
|
797
|
-
validations:
|
|
798
|
-
item?.meta?.validations?.rules?.length > 0
|
|
799
|
-
? generateModifiedRules(item?.meta, item?.meta?.validations?.validation_msg)
|
|
800
|
-
: [],
|
|
804
|
+
validations: generateModifiedRules(item?.meta, item?.meta?.validations?.validation_msg),
|
|
801
805
|
custom_error_message: item?.meta?.validations?.validation_msg,
|
|
802
806
|
children:
|
|
803
807
|
childFields?.length > 0
|
|
804
|
-
? isV2File
|
|
805
|
-
|
|
808
|
+
? isV2File
|
|
809
|
+
? childFields
|
|
810
|
+
: apiVersion === constants.API_VERSION.V1 &&
|
|
811
|
+
item.meta?.interface !== constants.interfaces.TRANSLATIONS
|
|
806
812
|
? generateRelationalFieldV1(key, childFields, item.meta?.interface)
|
|
807
813
|
: generateRelationalField(key, childFields, item.meta?.interface)
|
|
808
814
|
: [],
|
|
@@ -981,129 +987,145 @@ const generateFieldCompareRules = (rule) => {
|
|
|
981
987
|
};
|
|
982
988
|
|
|
983
989
|
const generateModifiedRules = (meta, custom_message) => {
|
|
984
|
-
|
|
990
|
+
let rules = [];
|
|
991
|
+
if(meta?.validations?.rules?.length > 0){
|
|
992
|
+
rules = meta?.validations?.rules?.map((rule, index) => {
|
|
993
|
+
let modifiedRule = {
|
|
994
|
+
identifier: String(index),
|
|
995
|
+
case: constants.rulesTypes.RULES_COMPARE,
|
|
996
|
+
value: [],
|
|
997
|
+
options: {},
|
|
998
|
+
custom_message,
|
|
999
|
+
};
|
|
1000
|
+
switch (rule.rule) {
|
|
1001
|
+
case "contains":
|
|
1002
|
+
modifiedRule.case = constants.rulesTypes.REGEX;
|
|
1003
|
+
modifiedRule.value = [rule[rule.rule].value];
|
|
1004
|
+
modifiedRule.options = {
|
|
1005
|
+
type: constants.regexTypes.CONTAINS,
|
|
1006
|
+
case_sensitive: !rule[rule.rule].insensitive,
|
|
1007
|
+
multiline: false,
|
|
1008
|
+
global: false,
|
|
1009
|
+
};
|
|
1010
|
+
break;
|
|
1011
|
+
case "doesNotContain":
|
|
1012
|
+
modifiedRule.case = constants.rulesTypes.REGEX;
|
|
1013
|
+
modifiedRule.value = [rule[rule.rule].value];
|
|
1014
|
+
modifiedRule.options = {
|
|
1015
|
+
type: constants.regexTypes.NOT_CONTAINS,
|
|
1016
|
+
case_sensitive: !rule[rule.rule].insensitive,
|
|
1017
|
+
multiline: false,
|
|
1018
|
+
global: false,
|
|
1019
|
+
};
|
|
1020
|
+
break;
|
|
1021
|
+
case "startsWith":
|
|
1022
|
+
modifiedRule.case = constants.rulesTypes.REGEX;
|
|
1023
|
+
modifiedRule.value = [rule[rule.rule].value];
|
|
1024
|
+
modifiedRule.options = {
|
|
1025
|
+
type: constants.regexTypes.START_WITH,
|
|
1026
|
+
case_sensitive: !rule[rule.rule].insensitive,
|
|
1027
|
+
};
|
|
1028
|
+
break;
|
|
1029
|
+
case "doesNotStartWith":
|
|
1030
|
+
modifiedRule.case = constants.rulesTypes.REGEX;
|
|
1031
|
+
modifiedRule.value = [rule[rule.rule].value];
|
|
1032
|
+
modifiedRule.options = {
|
|
1033
|
+
type: constants.regexTypes.NOT_START_WITH,
|
|
1034
|
+
case_sensitive: !rule[rule.rule].insensitive,
|
|
1035
|
+
};
|
|
1036
|
+
break;
|
|
1037
|
+
case "endsWith":
|
|
1038
|
+
modifiedRule.case = constants.rulesTypes.REGEX;
|
|
1039
|
+
modifiedRule.value = [rule[rule.rule].value];
|
|
1040
|
+
modifiedRule.options = {
|
|
1041
|
+
type: constants.regexTypes.ENDS_WITH,
|
|
1042
|
+
case_sensitive: !rule[rule.rule].insensitive,
|
|
1043
|
+
};
|
|
1044
|
+
break;
|
|
1045
|
+
case "doesNotEndWith":
|
|
1046
|
+
modifiedRule.case = constants.rulesTypes.REGEX;
|
|
1047
|
+
modifiedRule.value = [rule[rule.rule].value];
|
|
1048
|
+
modifiedRule.options = {
|
|
1049
|
+
type: constants.regexTypes.NOT_ENDS_WITH,
|
|
1050
|
+
case_sensitive: !rule[rule.rule].insensitive,
|
|
1051
|
+
};
|
|
1052
|
+
break;
|
|
1053
|
+
case "matchesRegExp":
|
|
1054
|
+
modifiedRule.case = constants.rulesTypes.REGEX;
|
|
1055
|
+
modifiedRule.value = [rule.matchesRegExp.value];
|
|
1056
|
+
modifiedRule.options.type = constants.regexTypes.MATCH;
|
|
1057
|
+
break;
|
|
1058
|
+
case "equals":
|
|
1059
|
+
modifiedRule.case = constants.rulesTypes.OPERATOR;
|
|
1060
|
+
modifiedRule.options.operator = constants.operatorTypes.EQUAL;
|
|
1061
|
+
modifiedRule.value = [rule[rule.rule].value];
|
|
1062
|
+
break;
|
|
1063
|
+
case "doesNotEqual":
|
|
1064
|
+
modifiedRule.case = constants.rulesTypes.OPERATOR;
|
|
1065
|
+
modifiedRule.options.operator = constants.operatorTypes.NOT_EQUAL;
|
|
1066
|
+
modifiedRule.value = [rule[rule.rule].value];
|
|
1067
|
+
break;
|
|
1068
|
+
case "lessThan":
|
|
1069
|
+
modifiedRule.case = constants.rulesTypes.OPERATOR;
|
|
1070
|
+
modifiedRule.options.operator = constants.operatorTypes.LESS_THAN;
|
|
1071
|
+
modifiedRule.value = [rule[rule.rule].value];
|
|
1072
|
+
break;
|
|
1073
|
+
case "lessThanOrEqualTo":
|
|
1074
|
+
modifiedRule.case = constants.rulesTypes.OPERATOR;
|
|
1075
|
+
modifiedRule.options.operator = constants.operatorTypes.LESS_THAN_EQUAL;
|
|
1076
|
+
modifiedRule.value = [rule[rule.rule].value];
|
|
1077
|
+
break;
|
|
1078
|
+
case "greaterThan":
|
|
1079
|
+
modifiedRule.case = constants.rulesTypes.OPERATOR;
|
|
1080
|
+
modifiedRule.options.operator = constants.operatorTypes.GREATER_THAN;
|
|
1081
|
+
modifiedRule.value = [rule[rule.rule].value];
|
|
1082
|
+
break;
|
|
1083
|
+
case "greaterThanOrEqualTo":
|
|
1084
|
+
modifiedRule.case = constants.rulesTypes.OPERATOR;
|
|
1085
|
+
modifiedRule.options.operator = constants.operatorTypes.GREATER_THAN_EQUAL;
|
|
1086
|
+
modifiedRule.value = [rule[rule.rule].value];
|
|
1087
|
+
break;
|
|
1088
|
+
case "isEmpty":
|
|
1089
|
+
modifiedRule.case = constants.rulesTypes.EMPTY;
|
|
1090
|
+
modifiedRule.value = [];
|
|
1091
|
+
break;
|
|
1092
|
+
case "isNotEmpty":
|
|
1093
|
+
modifiedRule.case = constants.rulesTypes.NOT_EMPTY;
|
|
1094
|
+
modifiedRule.value = [];
|
|
1095
|
+
break;
|
|
1096
|
+
case "isOneOf":
|
|
1097
|
+
modifiedRule.case = constants.rulesTypes.ONE_OF;
|
|
1098
|
+
modifiedRule.value = rule[rule.rule].value;
|
|
1099
|
+
break;
|
|
1100
|
+
case "isNotOneOf":
|
|
1101
|
+
modifiedRule.case = constants.rulesTypes.NOT_ONE_OF;
|
|
1102
|
+
modifiedRule.value = [rule[rule.rule].value];
|
|
1103
|
+
break;
|
|
1104
|
+
case constants.rulesTypes.FIELD_COMPARE: {
|
|
1105
|
+
const fieldRule = generateFieldCompareRules(rule);
|
|
1106
|
+
modifiedRule.case = fieldRule.case;
|
|
1107
|
+
modifiedRule.options = fieldRule.options;
|
|
1108
|
+
modifiedRule.value = fieldRule.value;
|
|
1109
|
+
break;
|
|
1110
|
+
}
|
|
1111
|
+
}
|
|
1112
|
+
|
|
1113
|
+
return modifiedRule;
|
|
1114
|
+
});
|
|
1115
|
+
}
|
|
1116
|
+
const { options } = meta;
|
|
1117
|
+
if (options?.choices?.length > 0) {
|
|
1118
|
+
const choices = options?.choices?.map((item) => item?.value);
|
|
985
1119
|
let modifiedRule = {
|
|
986
|
-
identifier: String(
|
|
987
|
-
case: constants.rulesTypes.
|
|
988
|
-
value:
|
|
1120
|
+
identifier: String(rules?.length + 1),
|
|
1121
|
+
case: constants.rulesTypes.ONE_OF,
|
|
1122
|
+
value: choices,
|
|
989
1123
|
options: {},
|
|
990
1124
|
custom_message,
|
|
991
1125
|
};
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
modifiedRule.value = [rule[rule.rule].value];
|
|
996
|
-
modifiedRule.options = {
|
|
997
|
-
type: constants.regexTypes.CONTAINS,
|
|
998
|
-
case_sensitive: !rule[rule.rule].insensitive,
|
|
999
|
-
multiline: false,
|
|
1000
|
-
global: false,
|
|
1001
|
-
};
|
|
1002
|
-
break;
|
|
1003
|
-
case "doesNotContain":
|
|
1004
|
-
modifiedRule.case = constants.rulesTypes.REGEX;
|
|
1005
|
-
modifiedRule.value = [rule[rule.rule].value];
|
|
1006
|
-
modifiedRule.options = {
|
|
1007
|
-
type: constants.regexTypes.NOT_CONTAINS,
|
|
1008
|
-
case_sensitive: !rule[rule.rule].insensitive,
|
|
1009
|
-
multiline: false,
|
|
1010
|
-
global: false,
|
|
1011
|
-
};
|
|
1012
|
-
break;
|
|
1013
|
-
case "startsWith":
|
|
1014
|
-
modifiedRule.case = constants.rulesTypes.REGEX;
|
|
1015
|
-
modifiedRule.value = [rule[rule.rule].value];
|
|
1016
|
-
modifiedRule.options = {
|
|
1017
|
-
type: constants.regexTypes.START_WITH,
|
|
1018
|
-
case_sensitive: !rule[rule.rule].insensitive,
|
|
1019
|
-
};
|
|
1020
|
-
break;
|
|
1021
|
-
case "doesNotStartWith":
|
|
1022
|
-
modifiedRule.case = constants.rulesTypes.REGEX;
|
|
1023
|
-
modifiedRule.value = [rule[rule.rule].value];
|
|
1024
|
-
modifiedRule.options = {
|
|
1025
|
-
type: constants.regexTypes.NOT_START_WITH,
|
|
1026
|
-
case_sensitive: !rule[rule.rule].insensitive,
|
|
1027
|
-
};
|
|
1028
|
-
break;
|
|
1029
|
-
case "endsWith":
|
|
1030
|
-
modifiedRule.case = constants.rulesTypes.REGEX;
|
|
1031
|
-
modifiedRule.value = [rule[rule.rule].value];
|
|
1032
|
-
modifiedRule.options = {
|
|
1033
|
-
type: constants.regexTypes.ENDS_WITH,
|
|
1034
|
-
case_sensitive: !rule[rule.rule].insensitive,
|
|
1035
|
-
};
|
|
1036
|
-
break;
|
|
1037
|
-
case "doesNotEndWith":
|
|
1038
|
-
modifiedRule.case = constants.rulesTypes.REGEX;
|
|
1039
|
-
modifiedRule.value = [rule[rule.rule].value];
|
|
1040
|
-
modifiedRule.options = {
|
|
1041
|
-
type: constants.regexTypes.NOT_ENDS_WITH,
|
|
1042
|
-
case_sensitive: !rule[rule.rule].insensitive,
|
|
1043
|
-
};
|
|
1044
|
-
break;
|
|
1045
|
-
case "matchesRegExp":
|
|
1046
|
-
modifiedRule.case = constants.rulesTypes.REGEX;
|
|
1047
|
-
modifiedRule.value = [rule.matchesRegExp.value];
|
|
1048
|
-
modifiedRule.options.type = constants.regexTypes.MATCH;
|
|
1049
|
-
break;
|
|
1050
|
-
case "equals":
|
|
1051
|
-
modifiedRule.case = constants.rulesTypes.OPERATOR;
|
|
1052
|
-
modifiedRule.options.operator = constants.operatorTypes.EQUAL;
|
|
1053
|
-
modifiedRule.value = [rule[rule.rule].value];
|
|
1054
|
-
break;
|
|
1055
|
-
case "doesNotEqual":
|
|
1056
|
-
modifiedRule.case = constants.rulesTypes.OPERATOR;
|
|
1057
|
-
modifiedRule.options.operator = constants.operatorTypes.NOT_EQUAL;
|
|
1058
|
-
modifiedRule.value = [rule[rule.rule].value];
|
|
1059
|
-
break;
|
|
1060
|
-
case "lessThan":
|
|
1061
|
-
modifiedRule.case = constants.rulesTypes.OPERATOR;
|
|
1062
|
-
modifiedRule.options.operator = constants.operatorTypes.LESS_THAN;
|
|
1063
|
-
modifiedRule.value = [rule[rule.rule].value];
|
|
1064
|
-
break;
|
|
1065
|
-
case "lessThanOrEqualTo":
|
|
1066
|
-
modifiedRule.case = constants.rulesTypes.OPERATOR;
|
|
1067
|
-
modifiedRule.options.operator = constants.operatorTypes.LESS_THAN_EQUAL;
|
|
1068
|
-
modifiedRule.value = [rule[rule.rule].value];
|
|
1069
|
-
break;
|
|
1070
|
-
case "greaterThan":
|
|
1071
|
-
modifiedRule.case = constants.rulesTypes.OPERATOR;
|
|
1072
|
-
modifiedRule.options.operator = constants.operatorTypes.GREATER_THAN;
|
|
1073
|
-
modifiedRule.value = [rule[rule.rule].value];
|
|
1074
|
-
break;
|
|
1075
|
-
case "greaterThanOrEqualTo":
|
|
1076
|
-
modifiedRule.case = constants.rulesTypes.OPERATOR;
|
|
1077
|
-
modifiedRule.options.operator = constants.operatorTypes.GREATER_THAN_EQUAL;
|
|
1078
|
-
modifiedRule.value = [rule[rule.rule].value];
|
|
1079
|
-
break;
|
|
1080
|
-
case "isEmpty":
|
|
1081
|
-
modifiedRule.case = constants.rulesTypes.EMPTY;
|
|
1082
|
-
modifiedRule.value = [];
|
|
1083
|
-
break;
|
|
1084
|
-
case "isNotEmpty":
|
|
1085
|
-
modifiedRule.case = constants.rulesTypes.NOT_EMPTY;
|
|
1086
|
-
modifiedRule.value = [];
|
|
1087
|
-
break;
|
|
1088
|
-
case "isOneOf":
|
|
1089
|
-
modifiedRule.case = constants.rulesTypes.ONE_OF;
|
|
1090
|
-
modifiedRule.value = rule[rule.rule].value;
|
|
1091
|
-
break;
|
|
1092
|
-
case "isNotOneOf":
|
|
1093
|
-
modifiedRule.case = constants.rulesTypes.NOT_ONE_OF;
|
|
1094
|
-
modifiedRule.value = [rule[rule.rule].value];
|
|
1095
|
-
break;
|
|
1096
|
-
case constants.rulesTypes.FIELD_COMPARE: {
|
|
1097
|
-
const fieldRule = generateFieldCompareRules(rule);
|
|
1098
|
-
modifiedRule.case = fieldRule.case;
|
|
1099
|
-
modifiedRule.options = fieldRule.options;
|
|
1100
|
-
modifiedRule.value = fieldRule.value;
|
|
1101
|
-
break;
|
|
1102
|
-
}
|
|
1103
|
-
}
|
|
1104
|
-
|
|
1105
|
-
return modifiedRule;
|
|
1106
|
-
});
|
|
1126
|
+
rules.push(modifiedRule)
|
|
1127
|
+
}
|
|
1128
|
+
return rules;
|
|
1107
1129
|
};
|
|
1108
1130
|
|
|
1109
1131
|
const getFieldsGroupBySchemaId = (arr) => {
|
package/lib/validate.js
CHANGED
|
@@ -10,6 +10,8 @@ const {
|
|
|
10
10
|
getParentKey,
|
|
11
11
|
} = require("./helpers");
|
|
12
12
|
|
|
13
|
+
const choices = ["radio", "checkboxes", "dropdown_multiple", "dropdown"];
|
|
14
|
+
|
|
13
15
|
const typeChecks = {
|
|
14
16
|
date: (val, data) => {
|
|
15
17
|
if (val instanceof Date && !isNaN(val)) return true;
|
|
@@ -134,18 +136,81 @@ const handleMinMaxValidation = (
|
|
|
134
136
|
}
|
|
135
137
|
};
|
|
136
138
|
|
|
139
|
+
const isEmptyRelational = ({ api_version, value, interface }) => {
|
|
140
|
+
if (api_version === constants.API_VERSION.V1 && interface !== constants.interfaces.TRANSLATIONS) {
|
|
141
|
+
if (interface === constants.interfaces.MANY_TO_ANY) {
|
|
142
|
+
return (
|
|
143
|
+
value &&
|
|
144
|
+
typeChecks[constants.types.OBJECT](value) &&
|
|
145
|
+
value.hasOwnProperty("collection") &&
|
|
146
|
+
value.hasOwnProperty("sort") &&
|
|
147
|
+
value.hasOwnProperty("item") &&
|
|
148
|
+
value.collection !== null &&
|
|
149
|
+
value.collection !== "" &&
|
|
150
|
+
value.sort !== null &&
|
|
151
|
+
value.sort !== "" &&
|
|
152
|
+
value.item !== null &&
|
|
153
|
+
value.item !== ""
|
|
154
|
+
);
|
|
155
|
+
} else {
|
|
156
|
+
return value?.length > 0;
|
|
157
|
+
}
|
|
158
|
+
} else {
|
|
159
|
+
return value?.create?.length > 0 || value?.existing?.length > 0;
|
|
160
|
+
}
|
|
161
|
+
return false;
|
|
162
|
+
};
|
|
163
|
+
|
|
137
164
|
const validateMetaRules = (
|
|
138
165
|
field,
|
|
139
166
|
addError,
|
|
140
167
|
providedValue,
|
|
141
168
|
currentPath,
|
|
142
169
|
updateValue,
|
|
143
|
-
error_messages
|
|
170
|
+
error_messages,
|
|
171
|
+
onlyFormFields,
|
|
172
|
+
apiVersion
|
|
144
173
|
) => {
|
|
145
174
|
const fieldValue = providedValue;
|
|
146
|
-
const { required = false, nullable = false } = field?.meta ?? {};
|
|
175
|
+
const { required = false, nullable = false, options } = field?.meta ?? {};
|
|
176
|
+
const isRelational = [
|
|
177
|
+
constants.interfaces.FILES,
|
|
178
|
+
constants.interfaces.FILE,
|
|
179
|
+
constants.interfaces.FILE_IMAGE,
|
|
180
|
+
constants.interfaces.MANY_TO_MANY,
|
|
181
|
+
constants.interfaces.ONE_TO_MANY,
|
|
182
|
+
constants.interfaces.MANY_TO_ONE,
|
|
183
|
+
constants.interfaces.MANY_TO_ANY,
|
|
184
|
+
constants.interfaces.TRANSLATIONS,
|
|
185
|
+
].includes(field?.meta?.interface);
|
|
186
|
+
|
|
187
|
+
if (
|
|
188
|
+
choices.includes(field?.meta?.interface) &&
|
|
189
|
+
(!options?.choices || options?.choices?.length > 0)
|
|
190
|
+
) {
|
|
191
|
+
const message = error_messages.ADD_CHOICE.replace(`{field}`, formatLabel(field.display_label));
|
|
192
|
+
addError(
|
|
193
|
+
currentPath,
|
|
194
|
+
{
|
|
195
|
+
label: formatLabel(field.display_label),
|
|
196
|
+
fieldPath: currentPath,
|
|
197
|
+
description: "",
|
|
198
|
+
message,
|
|
199
|
+
},
|
|
200
|
+
field
|
|
201
|
+
);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
const isValidRelational =
|
|
205
|
+
required && isRelational && !onlyFormFields
|
|
206
|
+
? isEmptyRelational({
|
|
207
|
+
api_version: apiVersion,
|
|
208
|
+
value: fieldValue,
|
|
209
|
+
interface: field?.meta?.interface,
|
|
210
|
+
})
|
|
211
|
+
: true;
|
|
147
212
|
|
|
148
|
-
if (required && isEmpty(fieldValue)
|
|
213
|
+
if ((required && isEmpty(fieldValue)) || !isValidRelational) {
|
|
149
214
|
const message = error_messages.REQUIRED.replace(`{field}`, formatLabel(field.display_label));
|
|
150
215
|
addError(
|
|
151
216
|
currentPath,
|
|
@@ -564,14 +629,24 @@ const validateField = (
|
|
|
564
629
|
formData,
|
|
565
630
|
updateValue,
|
|
566
631
|
error_messages,
|
|
567
|
-
onlyFormFields
|
|
632
|
+
onlyFormFields,
|
|
633
|
+
apiVersion
|
|
568
634
|
) => {
|
|
569
635
|
if (onlyFormFields == true && (value === undefined || value === null)) return;
|
|
570
636
|
|
|
571
637
|
const currentPath = fieldPath ? `${fieldPath}.${field.key.split(".").pop()}` : field.key;
|
|
572
638
|
const fieldLabel = formatLabel(field.display_label);
|
|
573
639
|
|
|
574
|
-
validateMetaRules(
|
|
640
|
+
validateMetaRules(
|
|
641
|
+
field,
|
|
642
|
+
addError,
|
|
643
|
+
value,
|
|
644
|
+
currentPath,
|
|
645
|
+
updateValue,
|
|
646
|
+
error_messages,
|
|
647
|
+
onlyFormFields,
|
|
648
|
+
apiVersion
|
|
649
|
+
);
|
|
575
650
|
|
|
576
651
|
if (
|
|
577
652
|
field.type === constants.types.OBJECT &&
|
|
@@ -618,15 +693,22 @@ const validateField = (
|
|
|
618
693
|
formData,
|
|
619
694
|
updateValue,
|
|
620
695
|
error_messages,
|
|
621
|
-
onlyFormFields
|
|
696
|
+
onlyFormFields,
|
|
697
|
+
apiVersion
|
|
622
698
|
)
|
|
623
699
|
);
|
|
624
700
|
} else if (field.type === constants.types.ARRAY && Array.isArray(value)) {
|
|
625
701
|
const itemType = field?.array_type || field?.schema_definition?.type;
|
|
626
702
|
if (itemType) {
|
|
627
703
|
value.forEach((item, index) => {
|
|
704
|
+
const itemPath = `${currentPath}[${index}]`;
|
|
705
|
+
|
|
706
|
+
if (choices.includes(field?.meta?.interface)) {
|
|
707
|
+
applyValidations(field, item, addError, itemPath, formData, error_messages);
|
|
708
|
+
}
|
|
709
|
+
|
|
628
710
|
if (!typeChecks[itemType](item)) {
|
|
629
|
-
addError(
|
|
711
|
+
addError(itemPath, {
|
|
630
712
|
label: fieldLabel,
|
|
631
713
|
fieldPath: `${currentPath}[${index}]`,
|
|
632
714
|
description: "",
|
|
@@ -653,7 +735,8 @@ const validateField = (
|
|
|
653
735
|
formData,
|
|
654
736
|
updateValue,
|
|
655
737
|
error_messages,
|
|
656
|
-
onlyFormFields
|
|
738
|
+
onlyFormFields,
|
|
739
|
+
apiVersion
|
|
657
740
|
)
|
|
658
741
|
);
|
|
659
742
|
});
|
|
@@ -725,7 +808,8 @@ const validate = (data) => {
|
|
|
725
808
|
onlyFormFields,
|
|
726
809
|
} = data;
|
|
727
810
|
|
|
728
|
-
const error_messages =
|
|
811
|
+
const error_messages =
|
|
812
|
+
constants.LOCALE_MESSAGES[language] ?? constants.LOCALE_MESSAGES[constants.LANGUAGES.en];
|
|
729
813
|
|
|
730
814
|
let result = { status: true, errors: {}, data: formData };
|
|
731
815
|
|
|
@@ -923,7 +1007,8 @@ const validate = (data) => {
|
|
|
923
1007
|
formData,
|
|
924
1008
|
updateValue,
|
|
925
1009
|
error_messages,
|
|
926
|
-
onlyFormFields
|
|
1010
|
+
onlyFormFields,
|
|
1011
|
+
apiVersion
|
|
927
1012
|
);
|
|
928
1013
|
});
|
|
929
1014
|
return result;
|