nox-validation 1.5.6 → 1.5.8
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/validate.js +62 -40
- package/package.json +1 -1
package/lib/validate.js
CHANGED
|
@@ -662,34 +662,44 @@ const validateOperatorRule = (
|
|
|
662
662
|
return hh * 3600 + mm * 60 + ss;
|
|
663
663
|
};
|
|
664
664
|
|
|
665
|
+
// Helper to parse date string to UTC midnight timestamp
|
|
666
|
+
const parseDateToUTC = (value) => {
|
|
667
|
+
if (!value) return NaN;
|
|
668
|
+
const date = new Date(value);
|
|
669
|
+
// Set to UTC midnight
|
|
670
|
+
return Date.UTC(
|
|
671
|
+
date.getUTCFullYear(),
|
|
672
|
+
date.getUTCMonth(),
|
|
673
|
+
date.getUTCDate()
|
|
674
|
+
);
|
|
675
|
+
};
|
|
676
|
+
|
|
677
|
+
// Helper to parse datetime string to UTC timestamp (seconds/milliseconds)
|
|
678
|
+
const parseDateTimeToUTC = (value) => {
|
|
679
|
+
if (!value) return NaN;
|
|
680
|
+
const date = new Date(value);
|
|
681
|
+
return date.getTime();
|
|
682
|
+
};
|
|
683
|
+
|
|
665
684
|
const getComparableValue = (value, forMessage = false) => {
|
|
666
685
|
if (isNumber) return Number(value);
|
|
667
686
|
if (isDate) {
|
|
668
|
-
const date = new Date(value);
|
|
669
|
-
date.setHours(0, 0, 0, 0);
|
|
670
687
|
if (forMessage) {
|
|
688
|
+
// Format as YYYY-MM-DD
|
|
689
|
+
const date = new Date(value);
|
|
671
690
|
return `${date.getUTCFullYear()}-${String(
|
|
672
691
|
date.getUTCMonth() + 1
|
|
673
692
|
).padStart(2, "0")}-${String(date.getUTCDate()).padStart(2, "0")}`;
|
|
674
693
|
}
|
|
675
|
-
|
|
694
|
+
// Return UTC midnight timestamp for comparison
|
|
695
|
+
return parseDateToUTC(value);
|
|
676
696
|
}
|
|
677
697
|
if (isDateTime) {
|
|
678
|
-
const date = new Date(value);
|
|
679
|
-
|
|
680
698
|
if (forMessage) {
|
|
681
|
-
return
|
|
682
|
-
`${date.getUTCFullYear()}-${String(date.getUTCMonth() + 1).padStart(
|
|
683
|
-
2,
|
|
684
|
-
"0"
|
|
685
|
-
)}-${String(date.getUTCDate()).padStart(2, "0")} ` +
|
|
686
|
-
`${String(date.getUTCHours()).padStart(2, "0")}:${String(
|
|
687
|
-
date.getUTCMinutes()
|
|
688
|
-
).padStart(2, "0")}:${String(date.getUTCSeconds()).padStart(2, "0")}`
|
|
689
|
-
);
|
|
699
|
+
return value;
|
|
690
700
|
}
|
|
691
|
-
|
|
692
|
-
return
|
|
701
|
+
// Return UTC timestamp for comparison
|
|
702
|
+
return parseDateTimeToUTC(value);
|
|
693
703
|
}
|
|
694
704
|
if (isTime) {
|
|
695
705
|
if (forMessage) {
|
|
@@ -700,20 +710,23 @@ const validateOperatorRule = (
|
|
|
700
710
|
return value;
|
|
701
711
|
};
|
|
702
712
|
|
|
703
|
-
|
|
704
|
-
const value = isFieldCompare
|
|
705
|
-
? getComparableValue(getValue(formData, key), true)
|
|
706
|
-
: getComparableValue(key, true);
|
|
707
|
-
return value ? value : key;
|
|
708
|
-
});
|
|
709
|
-
|
|
713
|
+
// For date/datetime, parse to comparable value (timestamp)
|
|
710
714
|
const fieldValueParsed = getComparableValue(fieldValue);
|
|
711
715
|
|
|
712
716
|
const messageValue = Array.isArray(rule.value)
|
|
713
|
-
? rule.value.join(", ")
|
|
714
|
-
: String(rule.value);
|
|
717
|
+
? rule.value?.map((key) => getComparableValue(key, true)).join(", ")
|
|
718
|
+
: String(getComparableValue(rule.value, true));
|
|
715
719
|
let message = "";
|
|
716
720
|
|
|
721
|
+
// For date/datetime, rule.value should be parsed to comparable value (timestamp)
|
|
722
|
+
rule.value = rule.value?.map((key) => {
|
|
723
|
+
const value = isFieldCompare
|
|
724
|
+
? getComparableValue(getValue(formData, key), false)
|
|
725
|
+
: getComparableValue(key, false);
|
|
726
|
+
// For date/datetime, allow 0 as valid value
|
|
727
|
+
return value !== undefined && value !== null ? value : key;
|
|
728
|
+
});
|
|
729
|
+
|
|
717
730
|
switch (rule.options.operator) {
|
|
718
731
|
case constants.operatorTypes.AND:
|
|
719
732
|
message = custom_message ?? error_messages.AND;
|
|
@@ -737,57 +750,66 @@ const validateOperatorRule = (
|
|
|
737
750
|
message = custom_message ?? error_messages.EQUAL;
|
|
738
751
|
message = message
|
|
739
752
|
?.replace(`{field}`, formatLabel(field.display_label))
|
|
740
|
-
?.replace("{value}",
|
|
741
|
-
valid = fieldValueParsed ===
|
|
753
|
+
?.replace("{value}", messageValue);
|
|
754
|
+
valid = fieldValueParsed === rule.value[0];
|
|
742
755
|
break;
|
|
743
756
|
case constants.operatorTypes.NOT_EQUAL:
|
|
744
757
|
message = custom_message ?? error_messages.NOT_EQUAL;
|
|
745
758
|
message = message
|
|
746
759
|
?.replace(`{field}`, formatLabel(field.display_label))
|
|
747
|
-
?.replace("{value}",
|
|
748
|
-
valid = fieldValueParsed !==
|
|
760
|
+
?.replace("{value}", messageValue);
|
|
761
|
+
valid = fieldValueParsed !== rule.value[0];
|
|
749
762
|
break;
|
|
750
763
|
case constants.operatorTypes.LESS_THAN:
|
|
751
764
|
message = custom_message ?? error_messages.LESS_THAN;
|
|
752
765
|
message = message
|
|
753
766
|
?.replace(`{field}`, formatLabel(field.display_label))
|
|
754
|
-
?.replace("{value}",
|
|
755
|
-
valid = fieldValueParsed <
|
|
767
|
+
?.replace("{value}", messageValue);
|
|
768
|
+
valid = fieldValueParsed < rule.value[0];
|
|
756
769
|
break;
|
|
757
770
|
case constants.operatorTypes.LESS_THAN_EQUAL:
|
|
758
771
|
message = custom_message ?? error_messages.LESS_THAN_EQUAL;
|
|
759
772
|
message = message
|
|
760
773
|
?.replace(`{field}`, formatLabel(field.display_label))
|
|
761
|
-
?.replace("{value}",
|
|
762
|
-
valid = fieldValueParsed <=
|
|
774
|
+
?.replace("{value}", messageValue);
|
|
775
|
+
valid = fieldValueParsed <= rule.value[0];
|
|
763
776
|
break;
|
|
764
777
|
case constants.operatorTypes.GREATER_THAN:
|
|
765
778
|
message = custom_message ?? error_messages.GREATER_THAN;
|
|
766
779
|
message = message
|
|
767
780
|
?.replace(`{field}`, formatLabel(field.display_label))
|
|
768
|
-
?.replace("{value}",
|
|
769
|
-
valid = fieldValueParsed >
|
|
781
|
+
?.replace("{value}", messageValue);
|
|
782
|
+
valid = fieldValueParsed > rule.value[0];
|
|
770
783
|
break;
|
|
771
784
|
case constants.operatorTypes.GREATER_THAN_EQUAL:
|
|
772
785
|
message = custom_message ?? error_messages.GREATER_THAN_EQUAL;
|
|
773
786
|
message = message
|
|
774
787
|
?.replace(`{field}`, formatLabel(field.display_label))
|
|
775
|
-
?.replace("{value}",
|
|
776
|
-
valid = fieldValueParsed >=
|
|
788
|
+
?.replace("{value}", messageValue);
|
|
789
|
+
valid = fieldValueParsed >= rule.value[0];
|
|
777
790
|
break;
|
|
778
791
|
case constants.operatorTypes.IN:
|
|
779
792
|
message = custom_message ?? error_messages.IN;
|
|
780
793
|
message = message
|
|
781
794
|
?.replace(`{field}`, formatLabel(field.display_label))
|
|
782
795
|
?.replace("{value}", messageValue);
|
|
783
|
-
|
|
796
|
+
// For date/datetime, compare timestamps
|
|
797
|
+
if (isDate || isDateTime) {
|
|
798
|
+
valid = rule.value.includes(fieldValueParsed);
|
|
799
|
+
} else {
|
|
800
|
+
valid = rule.value.includes(fieldValue);
|
|
801
|
+
}
|
|
784
802
|
break;
|
|
785
803
|
case constants.operatorTypes.NOT_IN:
|
|
786
804
|
message = custom_message ?? error_messages.NOT_IN;
|
|
787
805
|
message = message
|
|
788
806
|
?.replace(`{field}`, formatLabel(field.display_label))
|
|
789
807
|
?.replace("{value}", messageValue);
|
|
790
|
-
|
|
808
|
+
if (isDate || isDateTime) {
|
|
809
|
+
valid = !rule.value.includes(fieldValueParsed);
|
|
810
|
+
} else {
|
|
811
|
+
valid = !rule.value.includes(fieldValue);
|
|
812
|
+
}
|
|
791
813
|
break;
|
|
792
814
|
case constants.operatorTypes.EXISTS:
|
|
793
815
|
message = custom_message ?? error_messages.EXISTS;
|
|
@@ -800,7 +822,7 @@ const validateOperatorRule = (
|
|
|
800
822
|
message = custom_message ?? error_messages.TYPE;
|
|
801
823
|
message = message
|
|
802
824
|
?.replace(`{field}`, formatLabel(field.display_label))
|
|
803
|
-
?.replace("{value}",
|
|
825
|
+
?.replace("{value}", messageValue);
|
|
804
826
|
valid = typeChecks[rule.value[0]](fieldValue);
|
|
805
827
|
break;
|
|
806
828
|
case constants.operatorTypes.MOD:
|