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.
Files changed (2) hide show
  1. package/lib/validate.js +62 -40
  2. 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
- return Math.floor(date.getTime() / 1000);
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 Math.floor(date.getTime() / 1000);
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
- rule.value = rule.value?.map((key) => {
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}", rule.value[0]);
741
- valid = fieldValueParsed === getComparableValue(rule.value[0]);
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}", rule.value[0]);
748
- valid = fieldValueParsed !== getComparableValue(rule.value[0]);
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}", rule.value[0]);
755
- valid = fieldValueParsed < getComparableValue(rule.value[0]);
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}", rule.value[0]);
762
- valid = fieldValueParsed <= getComparableValue(rule.value[0]);
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}", rule.value[0]);
769
- valid = fieldValueParsed > getComparableValue(rule.value[0]);
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}", rule.value[0]);
776
- valid = fieldValueParsed >= getComparableValue(rule.value[0]);
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
- valid = rule.value.includes(fieldValue);
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
- valid = !rule.value.includes(fieldValue);
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}", rule.value[0]);
825
+ ?.replace("{value}", messageValue);
804
826
  valid = typeChecks[rule.value[0]](fieldValue);
805
827
  break;
806
828
  case constants.operatorTypes.MOD:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nox-validation",
3
- "version": "1.5.6",
3
+ "version": "1.5.8",
4
4
  "description": "validate dynamic schema",
5
5
  "main": "index.js",
6
6
  "scripts": {