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 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 = (name, path, schema_definition_type, type, childrenFields = [],relationType="none") => {
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 = apiVersion === constants.API_VERSION.V2 && [
727
- constants.interfaces.FILES,
728
- constants.interfaces.FILE,
729
- constants.interfaces.FILE_IMAGE,
730
- ].includes(item?.meta?.interface);
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,key
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 ? childFields:apiVersion === constants.API_VERSION.V1 &&
805
- item.meta?.interface !== constants.interfaces.TRANSLATIONS
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
- return meta?.validations?.rules?.map((rule, index) => {
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(index),
987
- case: constants.rulesTypes.RULES_COMPARE,
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
- switch (rule.rule) {
993
- case "contains":
994
- modifiedRule.case = constants.rulesTypes.REGEX;
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) && fieldValue !== null) {
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(field, addError, value, currentPath, updateValue, error_messages);
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(`${currentPath}[${index}]`, {
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 = constants.LOCALE_MESSAGES[language] ?? constants.LOCALE_MESSAGES[constants.LANGUAGES.en];
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;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nox-validation",
3
- "version": "1.2.0",
3
+ "version": "1.2.2",
4
4
  "description": "validate dynamic schema",
5
5
  "main": "index.js",
6
6
  "scripts": {