@salespark/toolkit 2.0.1 → 2.1.0

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/dist/index.cjs CHANGED
@@ -442,8 +442,1125 @@ var addThousandsSpace = (value) => {
442
442
  return value;
443
443
  }
444
444
  };
445
+ var delay = (ms) => new Promise((resolve) => setTimeout(resolve, Math.max(0, ms)));
446
+ var isNilTextOrEmpty = (value) => {
447
+ try {
448
+ if (value === null || value === void 0 || value === "") return true;
449
+ if (typeof value === "string") {
450
+ const v = value.trim().toLowerCase();
451
+ return v === "null" || v === "undefined";
452
+ }
453
+ return false;
454
+ } catch {
455
+ return true;
456
+ }
457
+ };
458
+ var formatCurrency = (value, withoutCurrencySymbol = false, currency = "EUR", locale = "pt-PT") => {
459
+ try {
460
+ const numValue = value === void 0 || value === null || value === "" ? 0 : Number(value);
461
+ if (isNaN(numValue) || !isFinite(numValue)) {
462
+ return withoutCurrencySymbol ? "0,00" : "0,00 \u20AC";
463
+ }
464
+ const intlOptions = {
465
+ style: withoutCurrencySymbol ? "decimal" : "currency",
466
+ currency,
467
+ minimumFractionDigits: 2,
468
+ maximumFractionDigits: 2
469
+ };
470
+ return new Intl.NumberFormat(locale, intlOptions).format(numValue);
471
+ } catch (error) {
472
+ const numValue = Number(value) || 0;
473
+ const formatted = numValue.toFixed(2).replace(".", ",");
474
+ return withoutCurrencySymbol ? formatted : `${formatted} \u20AC`;
475
+ }
476
+ };
477
+ var parseName = (name) => {
478
+ try {
479
+ if (name === void 0 || name === null || name === "") {
480
+ return { firstName: "", lastName: "" };
481
+ }
482
+ const cleanName = name.toString().trim().replace(/\s+/g, " ");
483
+ if (cleanName === "") {
484
+ return { firstName: "", lastName: "" };
485
+ }
486
+ if (!cleanName.includes(" ")) {
487
+ return { firstName: cleanName, lastName: "" };
488
+ }
489
+ const nameParts = cleanName.split(" ");
490
+ const firstName = nameParts[0];
491
+ const lastName = nameParts[nameParts.length - 1];
492
+ return { firstName, lastName };
493
+ } catch (error) {
494
+ const fallbackName = name ? String(name).trim() : "";
495
+ return { firstName: fallbackName, lastName: "" };
496
+ }
497
+ };
498
+ var symbolToCurrency = (symbol) => {
499
+ try {
500
+ if (!symbol || typeof symbol !== "string") {
501
+ return "EUR";
502
+ }
503
+ const normalizedSymbol = symbol.trim();
504
+ switch (normalizedSymbol) {
505
+ case "\u20AC":
506
+ return "EUR";
507
+ case "\xA3":
508
+ return "GBP";
509
+ case "$":
510
+ return "USD";
511
+ case "\xA5":
512
+ case "\uFFE5":
513
+ return "JPY";
514
+ case "\u20B9":
515
+ return "INR";
516
+ case "\u20BD":
517
+ return "RUB";
518
+ case "\xA2":
519
+ return "USD";
520
+ // US cents
521
+ case "\u20A9":
522
+ return "KRW";
523
+ // South Korean Won
524
+ case "\u20AA":
525
+ return "ILS";
526
+ // Israeli Shekel
527
+ case "\u20A6":
528
+ return "NGN";
529
+ // Nigerian Naira
530
+ case "\u20A8":
531
+ return "PKR";
532
+ // Pakistani Rupee
533
+ case "\u20B1":
534
+ return "PHP";
535
+ // Philippine Peso
536
+ case "\u20AB":
537
+ return "VND";
538
+ // Vietnamese Dong
539
+ case "\u20A1":
540
+ return "CRC";
541
+ // Costa Rican Colon
542
+ case "\u20B2":
543
+ return "PYG";
544
+ // Paraguayan Guarani
545
+ case "\u20B4":
546
+ return "UAH";
547
+ // Ukrainian Hryvnia
548
+ case "\u20B5":
549
+ return "GHS";
550
+ // Ghanaian Cedi
551
+ case "\u20B6":
552
+ return "EUR";
553
+ // Livre tournois (historical, fallback to EUR)
554
+ case "\u20B8":
555
+ return "KZT";
556
+ // Kazakhstani Tenge
557
+ case "\u20BA":
558
+ return "TRY";
559
+ // Turkish Lira
560
+ case "\u20BB":
561
+ return "EUR";
562
+ // Nordic mark (historical, fallback to EUR)
563
+ case "\u20BC":
564
+ return "AZN";
565
+ // Azerbaijani Manat
566
+ case "\u20BE":
567
+ return "GEL";
568
+ // Georgian Lari
569
+ case "\u20BF":
570
+ return "BTC";
571
+ // Bitcoin
572
+ case "\uFDFC":
573
+ return "SAR";
574
+ // Saudi Riyal
575
+ case "\uFF04":
576
+ return "USD";
577
+ // Full-width dollar sign
578
+ case "\uFFE0":
579
+ return "USD";
580
+ // Full-width cent sign
581
+ case "\uFFE1":
582
+ return "GBP";
583
+ // Full-width pound sign
584
+ case "\uFFE2":
585
+ return "GBP";
586
+ // Full-width not sign (sometimes used for pound)
587
+ case "\uFFE3":
588
+ return "JPY";
589
+ // Full-width macron (sometimes used for yen)
590
+ case "\uFFE4":
591
+ return "EUR";
592
+ // Full-width lira sign
593
+ case "\uFFE6":
594
+ return "KRW";
595
+ // Full-width won sign
596
+ // Additional common symbols
597
+ case "R":
598
+ return "ZAR";
599
+ // South African Rand (when used as symbol)
600
+ case "R$":
601
+ return "BRL";
602
+ // Brazilian Real
603
+ case "C$":
604
+ return "CAD";
605
+ // Canadian Dollar
606
+ case "A$":
607
+ return "AUD";
608
+ // Australian Dollar
609
+ case "S$":
610
+ return "SGD";
611
+ // Singapore Dollar
612
+ case "HK$":
613
+ return "HKD";
614
+ // Hong Kong Dollar
615
+ case "NZ$":
616
+ return "NZD";
617
+ // New Zealand Dollar
618
+ case "kr":
619
+ case "Kr":
620
+ return "SEK";
621
+ // Swedish Krona (fallback, could be NOK or DKK)
622
+ case "z\u0142":
623
+ return "PLN";
624
+ // Polish Zloty
625
+ case "K\u010D":
626
+ return "CZK";
627
+ // Czech Koruna
628
+ case "Ft":
629
+ return "HUF";
630
+ // Hungarian Forint
631
+ case "lei":
632
+ return "RON";
633
+ // Romanian Leu
634
+ case "\u043B\u0432":
635
+ return "BGN";
636
+ // Bulgarian Lev
637
+ case "kn":
638
+ return "HRK";
639
+ // Croatian Kuna
640
+ case "din":
641
+ return "RSD";
642
+ // Serbian Dinar
643
+ case "\u0434\u0435\u043D":
644
+ return "MKD";
645
+ // Macedonian Denar
646
+ default:
647
+ return "EUR";
648
+ }
649
+ } catch (error) {
650
+ return "EUR";
651
+ }
652
+ };
653
+ var currencyToSymbol = (currency) => {
654
+ try {
655
+ if (!currency || typeof currency !== "string") {
656
+ return "\u20AC";
657
+ }
658
+ const normalizedCurrency = currency.trim().toUpperCase();
659
+ switch (normalizedCurrency) {
660
+ case "EUR":
661
+ return "\u20AC";
662
+ case "GBP":
663
+ return "\xA3";
664
+ case "USD":
665
+ return "$";
666
+ case "JPY":
667
+ return "\xA5";
668
+ case "INR":
669
+ return "\u20B9";
670
+ case "RUB":
671
+ return "\u20BD";
672
+ case "CNY":
673
+ return "\xA5";
674
+ case "KRW":
675
+ return "\u20A9";
676
+ // South Korean Won
677
+ case "ILS":
678
+ return "\u20AA";
679
+ // Israeli Shekel
680
+ case "NGN":
681
+ return "\u20A6";
682
+ // Nigerian Naira
683
+ case "PKR":
684
+ return "\u20A8";
685
+ // Pakistani Rupee
686
+ case "PHP":
687
+ return "\u20B1";
688
+ // Philippine Peso
689
+ case "VND":
690
+ return "\u20AB";
691
+ // Vietnamese Dong
692
+ case "CRC":
693
+ return "\u20A1";
694
+ // Costa Rican Colon
695
+ case "PYG":
696
+ return "\u20B2";
697
+ // Paraguayan Guarani
698
+ case "UAH":
699
+ return "\u20B4";
700
+ // Ukrainian Hryvnia
701
+ case "GHS":
702
+ return "\u20B5";
703
+ // Ghanaian Cedi
704
+ case "KZT":
705
+ return "\u20B8";
706
+ // Kazakhstani Tenge
707
+ case "TRY":
708
+ return "\u20BA";
709
+ // Turkish Lira
710
+ case "AZN":
711
+ return "\u20BC";
712
+ // Azerbaijani Manat
713
+ case "GEL":
714
+ return "\u20BE";
715
+ // Georgian Lari
716
+ case "BTC":
717
+ return "\u20BF";
718
+ // Bitcoin
719
+ case "SAR":
720
+ return "\uFDFC";
721
+ // Saudi Riyal
722
+ case "ZAR":
723
+ return "R";
724
+ // South African Rand
725
+ case "BRL":
726
+ return "R$";
727
+ // Brazilian Real
728
+ case "CAD":
729
+ return "C$";
730
+ // Canadian Dollar
731
+ case "AUD":
732
+ return "A$";
733
+ // Australian Dollar
734
+ case "SGD":
735
+ return "S$";
736
+ // Singapore Dollar
737
+ case "HKD":
738
+ return "HK$";
739
+ // Hong Kong Dollar
740
+ case "NZD":
741
+ return "NZ$";
742
+ // New Zealand Dollar
743
+ case "SEK":
744
+ return "kr";
745
+ // Swedish Krona
746
+ case "NOK":
747
+ return "kr";
748
+ // Norwegian Krone
749
+ case "DKK":
750
+ return "kr";
751
+ // Danish Krone
752
+ case "PLN":
753
+ return "z\u0142";
754
+ // Polish Zloty
755
+ case "CZK":
756
+ return "K\u010D";
757
+ // Czech Koruna
758
+ case "HUF":
759
+ return "Ft";
760
+ // Hungarian Forint
761
+ case "RON":
762
+ return "lei";
763
+ // Romanian Leu
764
+ case "BGN":
765
+ return "\u043B\u0432";
766
+ // Bulgarian Lev
767
+ case "HRK":
768
+ return "kn";
769
+ // Croatian Kuna
770
+ case "RSD":
771
+ return "din";
772
+ // Serbian Dinar
773
+ case "MKD":
774
+ return "\u0434\u0435\u043D";
775
+ // Macedonian Denar
776
+ case "CHF":
777
+ return "CHF";
778
+ // Swiss Franc (commonly written as CHF)
779
+ case "THB":
780
+ return "\u0E3F";
781
+ // Thai Baht
782
+ case "MYR":
783
+ return "RM";
784
+ // Malaysian Ringgit
785
+ case "IDR":
786
+ return "Rp";
787
+ // Indonesian Rupiah
788
+ case "CLP":
789
+ return "$";
790
+ // Chilean Peso (uses $ symbol)
791
+ case "COP":
792
+ return "$";
793
+ // Colombian Peso (uses $ symbol)
794
+ case "MXN":
795
+ return "$";
796
+ // Mexican Peso (uses $ symbol)
797
+ case "ARS":
798
+ return "$";
799
+ // Argentine Peso (uses $ symbol)
800
+ case "UYU":
801
+ return "$";
802
+ // Uruguayan Peso (uses $ symbol)
803
+ case "PEN":
804
+ return "S/";
805
+ // Peruvian Sol
806
+ case "BOB":
807
+ return "Bs";
808
+ // Bolivian Boliviano
809
+ case "EGP":
810
+ return "\xA3";
811
+ // Egyptian Pound (uses £ symbol)
812
+ case "LBP":
813
+ return "\xA3";
814
+ // Lebanese Pound (uses £ symbol)
815
+ case "SYP":
816
+ return "\xA3";
817
+ // Syrian Pound (uses £ symbol)
818
+ default:
819
+ return "\u20AC";
820
+ }
821
+ } catch (error) {
822
+ return "\u20AC";
823
+ }
824
+ };
825
+ var isNullUndefinedOrEmptyEnforced = isNilTextOrEmpty;
445
826
  var addSpaceBetweenNumbers = addThousandsSpace;
446
827
 
828
+ // src/utils/validations.ts
829
+ function isPTTaxId(value) {
830
+ try {
831
+ if (value === null || value === void 0) return false;
832
+ let nif = String(value).trim();
833
+ nif = nif.replace(/[^0-9]/g, "");
834
+ if (nif.length !== 9) return false;
835
+ if (!/^\d{9}$/.test(nif)) return false;
836
+ if (/^(\d)\1{8}$/.test(nif)) return false;
837
+ const first = nif[0];
838
+ const defaultAllowed = /* @__PURE__ */ new Set(["1", "2", "3", "5", "6", "8", "9"]);
839
+ if (!defaultAllowed.has(first)) return false;
840
+ let sum = 0;
841
+ for (let i = 0; i < 8; i++) {
842
+ const digit = parseInt(nif[i], 10);
843
+ const weight = 9 - i;
844
+ sum += digit * weight;
845
+ }
846
+ const mod11 = sum % 11;
847
+ const checkDigit = mod11 < 2 ? 0 : 11 - mod11;
848
+ return checkDigit === parseInt(nif[8], 10);
849
+ } catch {
850
+ return false;
851
+ }
852
+ }
853
+ var isValidPTTaxId = isPTTaxId;
854
+
855
+ // src/utils/iban.ts
856
+ function isValidIBAN(value) {
857
+ try {
858
+ if (!value || typeof value !== "string") return false;
859
+ const iban = value.replace(/[\s-]/g, "").toUpperCase();
860
+ if (iban.length < 15 || iban.length > 34) return false;
861
+ if (!/^[A-Z]{2}[0-9]{2}[A-Z0-9]+$/.test(iban)) return false;
862
+ const countryCode = iban.slice(0, 2);
863
+ const spec = countrySpecs[countryCode];
864
+ if (!spec?.bban_regexp || !spec.chars) return false;
865
+ if (spec.chars !== iban.length) return false;
866
+ if (!/^[0-9]{2}$/.test(iban.slice(2, 4))) return false;
867
+ const bban = iban.slice(4);
868
+ if (!new RegExp(spec.bban_regexp).test(bban)) return false;
869
+ if (spec.bban_validation_func && !spec.bban_validation_func(bban))
870
+ return false;
871
+ return isValidIBANChecksum(iban);
872
+ } catch {
873
+ return false;
874
+ }
875
+ }
876
+ function isValidIBANChecksum(iban) {
877
+ const rearranged = iban.slice(4) + iban.slice(0, 4);
878
+ const numericString = rearranged.split("").map((char) => {
879
+ const code = char.charCodeAt(0);
880
+ return code >= 65 ? (code - 55).toString() : char;
881
+ }).join("");
882
+ return mod97(numericString) === 1;
883
+ }
884
+ function mod97(numStr) {
885
+ let remainder = numStr;
886
+ while (remainder.length > 2) {
887
+ const chunk2 = remainder.slice(0, 9);
888
+ const chunkNum = parseInt(chunk2, 10);
889
+ if (isNaN(chunkNum)) return NaN;
890
+ remainder = chunkNum % 97 + remainder.slice(chunk2.length);
891
+ }
892
+ return parseInt(remainder, 10) % 97;
893
+ }
894
+ var countrySpecs = {
895
+ AD: {
896
+ chars: 24,
897
+ bban_regexp: "^[0-9]{8}[A-Z0-9]{12}$",
898
+ IBANRegistry: true,
899
+ SEPA: true
900
+ },
901
+ AE: { chars: 23, bban_regexp: "^[0-9]{3}[0-9]{16}$", IBANRegistry: true },
902
+ AL: { chars: 28, bban_regexp: "^[0-9]{8}[A-Z0-9]{16}$", IBANRegistry: true },
903
+ AT: { chars: 20, bban_regexp: "^[0-9]{16}$", IBANRegistry: true, SEPA: true },
904
+ AZ: { chars: 28, bban_regexp: "^[A-Z]{4}[A-Z0-9]{20}$", IBANRegistry: true },
905
+ BA: {
906
+ chars: 20,
907
+ bban_regexp: "^[0-9]{16}$",
908
+ bban_validation_func: checkMod97BBAN,
909
+ IBANRegistry: true
910
+ },
911
+ BE: {
912
+ chars: 16,
913
+ bban_regexp: "^[0-9]{12}$",
914
+ bban_validation_func: checkBelgianBBAN,
915
+ IBANRegistry: true,
916
+ SEPA: true
917
+ },
918
+ BG: {
919
+ chars: 22,
920
+ bban_regexp: "^[A-Z]{4}[0-9]{6}[A-Z0-9]{8}$",
921
+ IBANRegistry: true,
922
+ SEPA: true
923
+ },
924
+ BH: { chars: 22, bban_regexp: "^[A-Z]{4}[A-Z0-9]{14}$", IBANRegistry: true },
925
+ BR: {
926
+ chars: 29,
927
+ bban_regexp: "^[0-9]{23}[A-Z]{1}[A-Z0-9]{1}$",
928
+ IBANRegistry: true
929
+ },
930
+ BY: {
931
+ chars: 28,
932
+ bban_regexp: "^[A-Z]{4}[0-9]{4}[A-Z0-9]{16}$",
933
+ IBANRegistry: true
934
+ },
935
+ CH: {
936
+ chars: 21,
937
+ bban_regexp: "^[0-9]{5}[A-Z0-9]{12}$",
938
+ IBANRegistry: true,
939
+ SEPA: true
940
+ },
941
+ CR: { chars: 22, bban_regexp: "^[0-9]{18}$", IBANRegistry: true },
942
+ CY: {
943
+ chars: 28,
944
+ bban_regexp: "^[0-9]{8}[A-Z0-9]{16}$",
945
+ IBANRegistry: true,
946
+ SEPA: true
947
+ },
948
+ CZ: {
949
+ chars: 24,
950
+ bban_regexp: "^[0-9]{20}$",
951
+ bban_validation_func: checkCzechSlovakBBAN,
952
+ IBANRegistry: true,
953
+ SEPA: true
954
+ },
955
+ DE: { chars: 22, bban_regexp: "^[0-9]{18}$", IBANRegistry: true, SEPA: true },
956
+ DK: { chars: 18, bban_regexp: "^[0-9]{14}$", IBANRegistry: true, SEPA: true },
957
+ DO: { chars: 28, bban_regexp: "^[A-Z]{4}[0-9]{20}$", IBANRegistry: true },
958
+ EE: {
959
+ chars: 20,
960
+ bban_regexp: "^[0-9]{16}$",
961
+ bban_validation_func: checkEstonianBBAN,
962
+ IBANRegistry: true,
963
+ SEPA: true
964
+ },
965
+ EG: { chars: 29, bban_regexp: "^[0-9]{25}$", IBANRegistry: true },
966
+ ES: {
967
+ chars: 24,
968
+ bban_regexp: "^[0-9]{20}$",
969
+ bban_validation_func: checkSpanishBBAN,
970
+ IBANRegistry: true,
971
+ SEPA: true
972
+ },
973
+ FI: { chars: 18, bban_regexp: "^[0-9]{14}$", IBANRegistry: true, SEPA: true },
974
+ FO: { chars: 18, bban_regexp: "^[0-9]{14}$", IBANRegistry: true },
975
+ FR: {
976
+ chars: 27,
977
+ bban_regexp: "^[0-9]{10}[A-Z0-9]{11}[0-9]{2}$",
978
+ bban_validation_func: checkFrenchBBAN,
979
+ IBANRegistry: true,
980
+ SEPA: true
981
+ },
982
+ GB: {
983
+ chars: 22,
984
+ bban_regexp: "^[A-Z]{4}[0-9]{14}$",
985
+ IBANRegistry: true,
986
+ SEPA: true
987
+ },
988
+ GE: { chars: 22, bban_regexp: "^[A-Z0-9]{2}[0-9]{16}$", IBANRegistry: true },
989
+ GI: {
990
+ chars: 23,
991
+ bban_regexp: "^[A-Z]{4}[A-Z0-9]{15}$",
992
+ IBANRegistry: true,
993
+ SEPA: true
994
+ },
995
+ GL: { chars: 18, bban_regexp: "^[0-9]{14}$", IBANRegistry: true },
996
+ GR: {
997
+ chars: 27,
998
+ bban_regexp: "^[0-9]{7}[A-Z0-9]{16}$",
999
+ IBANRegistry: true,
1000
+ SEPA: true
1001
+ },
1002
+ GT: { chars: 28, bban_regexp: "^[A-Z0-9]{24}$", IBANRegistry: true },
1003
+ HR: {
1004
+ chars: 21,
1005
+ bban_regexp: "^[0-9]{17}$",
1006
+ bban_validation_func: checkCroatianBBAN,
1007
+ IBANRegistry: true,
1008
+ SEPA: true
1009
+ },
1010
+ HU: {
1011
+ chars: 28,
1012
+ bban_regexp: "^[0-9]{24}$",
1013
+ bban_validation_func: checkHungarianBBAN,
1014
+ IBANRegistry: true,
1015
+ SEPA: true
1016
+ },
1017
+ IE: {
1018
+ chars: 22,
1019
+ bban_regexp: "^[A-Z0-9]{4}[0-9]{14}$",
1020
+ IBANRegistry: true,
1021
+ SEPA: true
1022
+ },
1023
+ IL: { chars: 23, bban_regexp: "^[0-9]{19}$", IBANRegistry: true },
1024
+ IS: { chars: 26, bban_regexp: "^[0-9]{22}$", IBANRegistry: true, SEPA: true },
1025
+ IT: {
1026
+ chars: 27,
1027
+ bban_regexp: "^[A-Z]{1}[0-9]{10}[A-Z0-9]{12}$",
1028
+ IBANRegistry: true,
1029
+ SEPA: true
1030
+ },
1031
+ JO: {
1032
+ chars: 30,
1033
+ bban_regexp: "^[A-Z]{4}[0-9]{4}[A-Z0-9]{18}$",
1034
+ IBANRegistry: true
1035
+ },
1036
+ KW: { chars: 30, bban_regexp: "^[A-Z]{4}[A-Z0-9]{22}$", IBANRegistry: true },
1037
+ KZ: { chars: 20, bban_regexp: "^[0-9]{3}[A-Z0-9]{13}$", IBANRegistry: true },
1038
+ LB: { chars: 28, bban_regexp: "^[0-9]{4}[A-Z0-9]{20}$", IBANRegistry: true },
1039
+ LC: { chars: 32, bban_regexp: "^[A-Z]{4}[A-Z0-9]{24}$", IBANRegistry: true },
1040
+ LI: {
1041
+ chars: 21,
1042
+ bban_regexp: "^[0-9]{5}[A-Z0-9]{12}$",
1043
+ IBANRegistry: true,
1044
+ SEPA: true
1045
+ },
1046
+ LT: { chars: 20, bban_regexp: "^[0-9]{16}$", IBANRegistry: true, SEPA: true },
1047
+ LU: {
1048
+ chars: 20,
1049
+ bban_regexp: "^[0-9]{3}[A-Z0-9]{13}$",
1050
+ IBANRegistry: true,
1051
+ SEPA: true
1052
+ },
1053
+ LV: {
1054
+ chars: 21,
1055
+ bban_regexp: "^[A-Z]{4}[A-Z0-9]{13}$",
1056
+ IBANRegistry: true,
1057
+ SEPA: true
1058
+ },
1059
+ MC: {
1060
+ chars: 27,
1061
+ bban_regexp: "^[0-9]{10}[A-Z0-9]{11}[0-9]{2}$",
1062
+ bban_validation_func: checkFrenchBBAN,
1063
+ IBANRegistry: true,
1064
+ SEPA: true
1065
+ },
1066
+ MD: {
1067
+ chars: 24,
1068
+ bban_regexp: "^[A-Z0-9]{2}[A-Z0-9]{18}$",
1069
+ IBANRegistry: true
1070
+ },
1071
+ ME: {
1072
+ chars: 22,
1073
+ bban_regexp: "^[0-9]{18}$",
1074
+ bban_validation_func: checkMod97BBAN,
1075
+ IBANRegistry: true
1076
+ },
1077
+ MK: {
1078
+ chars: 19,
1079
+ bban_regexp: "^[0-9]{3}[A-Z0-9]{10}[0-9]{2}$",
1080
+ bban_validation_func: checkMod97BBAN,
1081
+ IBANRegistry: true
1082
+ },
1083
+ MR: { chars: 27, bban_regexp: "^[0-9]{23}$", IBANRegistry: true },
1084
+ MT: {
1085
+ chars: 31,
1086
+ bban_regexp: "^[A-Z]{4}[0-9]{5}[A-Z0-9]{18}$",
1087
+ IBANRegistry: true,
1088
+ SEPA: true
1089
+ },
1090
+ MU: {
1091
+ chars: 30,
1092
+ bban_regexp: "^[A-Z]{4}[0-9]{19}[A-Z]{3}$",
1093
+ IBANRegistry: true
1094
+ },
1095
+ NL: {
1096
+ chars: 18,
1097
+ bban_regexp: "^[A-Z]{4}[0-9]{10}$",
1098
+ IBANRegistry: true,
1099
+ SEPA: true
1100
+ },
1101
+ NO: {
1102
+ chars: 15,
1103
+ bban_regexp: "^[0-9]{11}$",
1104
+ bban_validation_func: checkNorwegianBBAN,
1105
+ IBANRegistry: true,
1106
+ SEPA: true
1107
+ },
1108
+ PK: { chars: 24, bban_regexp: "^[A-Z0-9]{4}[0-9]{16}$", IBANRegistry: true },
1109
+ PL: {
1110
+ chars: 28,
1111
+ bban_regexp: "^[0-9]{24}$",
1112
+ bban_validation_func: checkPolishBBAN,
1113
+ IBANRegistry: true,
1114
+ SEPA: true
1115
+ },
1116
+ PS: { chars: 29, bban_regexp: "^[A-Z0-9]{4}[0-9]{21}$", IBANRegistry: true },
1117
+ PT: {
1118
+ chars: 25,
1119
+ bban_regexp: "^[0-9]{21}$",
1120
+ bban_validation_func: checkMod97BBAN,
1121
+ IBANRegistry: true,
1122
+ SEPA: true
1123
+ },
1124
+ QA: { chars: 29, bban_regexp: "^[A-Z]{4}[A-Z0-9]{21}$", IBANRegistry: true },
1125
+ RO: {
1126
+ chars: 24,
1127
+ bban_regexp: "^[A-Z]{4}[A-Z0-9]{16}$",
1128
+ IBANRegistry: true,
1129
+ SEPA: true
1130
+ },
1131
+ RS: {
1132
+ chars: 22,
1133
+ bban_regexp: "^[0-9]{18}$",
1134
+ bban_validation_func: checkMod97BBAN,
1135
+ IBANRegistry: true
1136
+ },
1137
+ SA: { chars: 24, bban_regexp: "^[0-9]{2}[A-Z0-9]{18}$", IBANRegistry: true },
1138
+ SE: { chars: 24, bban_regexp: "^[0-9]{20}$", IBANRegistry: true, SEPA: true },
1139
+ SI: {
1140
+ chars: 19,
1141
+ bban_regexp: "^[0-9]{15}$",
1142
+ bban_validation_func: checkMod97BBAN,
1143
+ IBANRegistry: true,
1144
+ SEPA: true
1145
+ },
1146
+ SK: {
1147
+ chars: 24,
1148
+ bban_regexp: "^[0-9]{20}$",
1149
+ bban_validation_func: checkCzechSlovakBBAN,
1150
+ IBANRegistry: true,
1151
+ SEPA: true
1152
+ },
1153
+ SM: {
1154
+ chars: 27,
1155
+ bban_regexp: "^[A-Z]{1}[0-9]{10}[A-Z0-9]{12}$",
1156
+ IBANRegistry: true,
1157
+ SEPA: true
1158
+ },
1159
+ TN: { chars: 24, bban_regexp: "^[0-9]{20}$", IBANRegistry: true },
1160
+ TR: { chars: 26, bban_regexp: "^[0-9]{5}[A-Z0-9]{17}$", IBANRegistry: true },
1161
+ UA: { chars: 29, bban_regexp: "^[0-9]{6}[A-Z0-9]{19}$", IBANRegistry: true },
1162
+ VG: { chars: 24, bban_regexp: "^[A-Z0-9]{4}[0-9]{16}$", IBANRegistry: true },
1163
+ XK: { chars: 20, bban_regexp: "^[0-9]{16}$", IBANRegistry: true }
1164
+ };
1165
+ function checkMod97BBAN(bban) {
1166
+ const stripped = bban.replace(/[\s.]+/g, "");
1167
+ return mod97(stripped) === 1;
1168
+ }
1169
+ function checkBelgianBBAN(bban) {
1170
+ const stripped = bban.replace(/[\s.]+/g, "");
1171
+ const checkingPart = parseInt(stripped.substring(0, stripped.length - 2), 10);
1172
+ const checksum = parseInt(stripped.substring(stripped.length - 2), 10);
1173
+ const remainder = checkingPart % 97 === 0 ? 97 : checkingPart % 97;
1174
+ return remainder === checksum;
1175
+ }
1176
+ function checkCzechSlovakBBAN(bban) {
1177
+ const weightsPrefix = [10, 5, 8, 4, 2, 1];
1178
+ const weightsSuffix = [6, 3, 7, 9, 10, 5, 8, 4, 2, 1];
1179
+ const controlPrefix = parseInt(bban.charAt(9), 10);
1180
+ const controlSuffix = parseInt(bban.charAt(19), 10);
1181
+ const prefix = bban.substring(4, 9);
1182
+ const suffix = bban.substring(10, 19);
1183
+ let sum = 0;
1184
+ for (let i = 0; i < prefix.length; i++) {
1185
+ sum += parseInt(prefix.charAt(i), 10) * weightsPrefix[i];
1186
+ }
1187
+ let remainder = sum % 11;
1188
+ if (controlPrefix !== (remainder === 0 ? 0 : remainder === 1 ? 1 : 11 - remainder)) {
1189
+ return false;
1190
+ }
1191
+ sum = 0;
1192
+ for (let i = 0; i < suffix.length; i++) {
1193
+ sum += parseInt(suffix.charAt(i), 10) * weightsSuffix[i];
1194
+ }
1195
+ remainder = sum % 11;
1196
+ return controlSuffix === (remainder === 0 ? 0 : remainder === 1 ? 1 : 11 - remainder);
1197
+ }
1198
+ function checkEstonianBBAN(bban) {
1199
+ const weights = [7, 1, 3, 7, 1, 3, 7, 1, 3, 7, 1, 3, 7];
1200
+ const controlDigit = parseInt(bban.charAt(15), 10);
1201
+ const toCheck = bban.substring(2, 15);
1202
+ let sum = 0;
1203
+ for (let i = 0; i < toCheck.length; i++) {
1204
+ sum += parseInt(toCheck.charAt(i), 10) * weights[i];
1205
+ }
1206
+ const remainder = sum % 10;
1207
+ return controlDigit === (remainder === 0 ? 0 : 10 - remainder);
1208
+ }
1209
+ function checkSpanishBBAN(bban) {
1210
+ const weightsBankBranch = [4, 8, 5, 10, 9, 7, 3, 6];
1211
+ const weightsAccount = [1, 2, 4, 8, 5, 10, 9, 7, 3, 6];
1212
+ const controlBankBranch = parseInt(bban.charAt(8), 10);
1213
+ const controlAccount = parseInt(bban.charAt(9), 10);
1214
+ const bankBranch = bban.substring(0, 8);
1215
+ const account = bban.substring(10, 20);
1216
+ let sum = 0;
1217
+ for (let i = 0; i < 8; i++) {
1218
+ sum += parseInt(bankBranch.charAt(i), 10) * weightsBankBranch[i];
1219
+ }
1220
+ let remainder = sum % 11;
1221
+ if (controlBankBranch !== (remainder === 0 ? 0 : remainder === 1 ? 1 : 11 - remainder)) {
1222
+ return false;
1223
+ }
1224
+ sum = 0;
1225
+ for (let i = 0; i < 10; i++) {
1226
+ sum += parseInt(account.charAt(i), 10) * weightsAccount[i];
1227
+ }
1228
+ remainder = sum % 11;
1229
+ return controlAccount === (remainder === 0 ? 0 : remainder === 1 ? 1 : 11 - remainder);
1230
+ }
1231
+ function checkFrenchBBAN(bban) {
1232
+ const stripped = bban.replace(/[\s.]+/g, "");
1233
+ const normalized = Array.from(stripped);
1234
+ for (let i = 0; i < stripped.length; i++) {
1235
+ const c = normalized[i].charCodeAt(0);
1236
+ if (c >= 65) {
1237
+ switch (c) {
1238
+ case 65:
1239
+ case 74:
1240
+ normalized[i] = "1";
1241
+ break;
1242
+ case 66:
1243
+ case 75:
1244
+ case 83:
1245
+ normalized[i] = "2";
1246
+ break;
1247
+ case 67:
1248
+ case 76:
1249
+ case 84:
1250
+ normalized[i] = "3";
1251
+ break;
1252
+ case 68:
1253
+ case 77:
1254
+ case 85:
1255
+ normalized[i] = "4";
1256
+ break;
1257
+ case 69:
1258
+ case 78:
1259
+ case 86:
1260
+ normalized[i] = "5";
1261
+ break;
1262
+ case 70:
1263
+ case 79:
1264
+ case 87:
1265
+ normalized[i] = "6";
1266
+ break;
1267
+ case 71:
1268
+ case 80:
1269
+ case 88:
1270
+ normalized[i] = "7";
1271
+ break;
1272
+ case 72:
1273
+ case 81:
1274
+ case 89:
1275
+ normalized[i] = "8";
1276
+ break;
1277
+ case 73:
1278
+ case 82:
1279
+ case 90:
1280
+ normalized[i] = "9";
1281
+ break;
1282
+ }
1283
+ }
1284
+ }
1285
+ return mod97(normalized.join("")) === 0;
1286
+ }
1287
+ function checkCroatianBBAN(bban) {
1288
+ const controlBankBranch = parseInt(bban.charAt(6), 10);
1289
+ const controlAccount = parseInt(bban.charAt(16), 10);
1290
+ const bankBranch = bban.substring(0, 6);
1291
+ const account = bban.substring(7, 16);
1292
+ return checkMod11(bankBranch, controlBankBranch) && checkMod11(account, controlAccount);
1293
+ }
1294
+ function checkMod11(toCheck, control) {
1295
+ let nr = 10;
1296
+ for (let i = 0; i < toCheck.length; i++) {
1297
+ nr += parseInt(toCheck.charAt(i), 10);
1298
+ if (nr % 10 !== 0) {
1299
+ nr = nr % 10;
1300
+ }
1301
+ nr = nr * 2;
1302
+ nr = nr % 11;
1303
+ }
1304
+ return control === (11 - nr === 10 ? 0 : 11 - nr);
1305
+ }
1306
+ function checkHungarianBBAN(bban) {
1307
+ const weights = [9, 7, 3, 1, 9, 7, 3, 1, 9, 7, 3, 1, 9, 7, 3];
1308
+ const controlDigitBankBranch = parseInt(bban.charAt(7), 10);
1309
+ const toCheckBankBranch = bban.substring(0, 7);
1310
+ let sum = 0;
1311
+ for (let i = 0; i < toCheckBankBranch.length; i++) {
1312
+ sum += parseInt(toCheckBankBranch.charAt(i), 10) * weights[i];
1313
+ }
1314
+ const remainder = sum % 10;
1315
+ if (controlDigitBankBranch !== (remainder === 0 ? 0 : 10 - remainder)) {
1316
+ return false;
1317
+ }
1318
+ if (bban.endsWith("00000000")) {
1319
+ const toCheckAccount = bban.substring(8, 15);
1320
+ const controlDigitAccount = parseInt(bban.charAt(15), 10);
1321
+ sum = 0;
1322
+ for (let i = 0; i < toCheckAccount.length; i++) {
1323
+ sum += parseInt(toCheckAccount.charAt(i), 10) * weights[i];
1324
+ }
1325
+ const accountRemainder = sum % 10;
1326
+ return controlDigitAccount === (accountRemainder === 0 ? 0 : 10 - accountRemainder);
1327
+ } else {
1328
+ const toCheckAccount = bban.substring(8, 23);
1329
+ const controlDigitAccount = parseInt(bban.charAt(23), 10);
1330
+ sum = 0;
1331
+ for (let i = 0; i < toCheckAccount.length; i++) {
1332
+ sum += parseInt(toCheckAccount.charAt(i), 10) * weights[i];
1333
+ }
1334
+ const accountRemainder = sum % 10;
1335
+ return controlDigitAccount === (accountRemainder === 0 ? 0 : 10 - accountRemainder);
1336
+ }
1337
+ }
1338
+ function checkNorwegianBBAN(bban) {
1339
+ const weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2];
1340
+ const stripped = bban.replace(/[\s.]+/g, "");
1341
+ const controlDigit = parseInt(stripped.charAt(10), 10);
1342
+ const toCheck = stripped.substring(0, 10);
1343
+ let sum = 0;
1344
+ for (let i = 0; i < 10; i++) {
1345
+ sum += parseInt(toCheck.charAt(i), 10) * weights[i];
1346
+ }
1347
+ const remainder = sum % 11;
1348
+ return controlDigit === (remainder === 0 ? 0 : 11 - remainder);
1349
+ }
1350
+ function checkPolishBBAN(bban) {
1351
+ const weights = [3, 9, 7, 1, 3, 9, 7];
1352
+ const controlDigit = parseInt(bban.charAt(7), 10);
1353
+ const toCheck = bban.substring(0, 7);
1354
+ let sum = 0;
1355
+ for (let i = 0; i < 7; i++) {
1356
+ sum += parseInt(toCheck.charAt(i), 10) * weights[i];
1357
+ }
1358
+ const remainder = sum % 10;
1359
+ return controlDigit === (remainder === 0 ? 0 : 10 - remainder);
1360
+ }
1361
+
1362
+ // src/utils/security.ts
1363
+ var checkMarkdownSecurity = (markdownText) => {
1364
+ if (!markdownText || typeof markdownText !== "string") {
1365
+ return {
1366
+ isValid: true,
1367
+ text: "",
1368
+ risks: [],
1369
+ sanitized: false
1370
+ };
1371
+ }
1372
+ const securityCheck = {
1373
+ isValid: true,
1374
+ text: markdownText,
1375
+ risks: [],
1376
+ sanitized: false
1377
+ };
1378
+ const securityPatterns = {
1379
+ // Critical risks
1380
+ scriptTags: {
1381
+ pattern: /<\s*script\b[^>]*>[\s\S]*?<\s*\/\s*script\s*>/gi,
1382
+ severity: "critical",
1383
+ description: "Script tags detected - high XSS risk"
1384
+ },
1385
+ eventHandlers: {
1386
+ pattern: /on\w+\s*=\s*["'][^"']*["']/gi,
1387
+ severity: "critical",
1388
+ description: "JavaScript event handlers detected"
1389
+ },
1390
+ javascriptUrls: {
1391
+ pattern: /javascript\s*:[^"'\s>]*/gi,
1392
+ severity: "critical",
1393
+ description: "JavaScript URLs detected"
1394
+ },
1395
+ // High risks
1396
+ iframes: {
1397
+ pattern: /<\s*iframe\b[^>]*>[\s\S]*?<\s*\/\s*iframe\s*>/gi,
1398
+ severity: "high",
1399
+ description: "Iframe elements detected - potential embedding risk"
1400
+ },
1401
+ objectTags: {
1402
+ pattern: /<\s*object\b[^>]*>[\s\S]*?<\s*\/\s*object\s*>/gi,
1403
+ severity: "high",
1404
+ description: "Object tags detected - potential code execution"
1405
+ },
1406
+ embedTags: {
1407
+ pattern: /<\s*embed\b[^>]*>[\s\S]*?<\s*\/\s*embed\s*>/gi,
1408
+ severity: "high",
1409
+ description: "Embed tags detected - potential code execution"
1410
+ },
1411
+ formTags: {
1412
+ pattern: /<\s*form\b[^>]*>[\s\S]*?<\s*\/\s*form\s*>/gi,
1413
+ severity: "high",
1414
+ description: "Form elements detected - potential data submission risk"
1415
+ },
1416
+ // Medium risks
1417
+ dataUrls: {
1418
+ pattern: /data:\s*[^,\s]+,[^"'\s)>]*/gi,
1419
+ severity: "medium",
1420
+ description: "Data URLs detected - potential data exfiltration"
1421
+ },
1422
+ baseTags: {
1423
+ pattern: /<\s*base\b[^>]*\/?>/gi,
1424
+ severity: "medium",
1425
+ description: "Base tags detected - potential URL hijacking"
1426
+ },
1427
+ styleTags: {
1428
+ pattern: /<\s*style\b[^>]*>[\s\S]*?<\s*\/\s*style\s*>/gi,
1429
+ severity: "medium",
1430
+ description: "Style tags detected - potential CSS injection"
1431
+ },
1432
+ linkTags: {
1433
+ pattern: /<\s*link\b[^>]*\/?>/gi,
1434
+ severity: "medium",
1435
+ description: "Link tags detected - potential resource hijacking"
1436
+ },
1437
+ // Low risks
1438
+ metaTags: {
1439
+ pattern: /<\s*meta\b[^>]*\/?>/gi,
1440
+ severity: "low",
1441
+ description: "Meta tags detected - potential information disclosure"
1442
+ }
1443
+ };
1444
+ const additionalChecks = [
1445
+ {
1446
+ pattern: /(file|ftp|ws|wss|gopher|ldap|telnet):/gi,
1447
+ type: "suspiciousProtocol",
1448
+ description: "Suspicious URL protocol detected",
1449
+ severity: "high"
1450
+ },
1451
+ {
1452
+ pattern: /(contenteditable|autofocus|formaction|srcdoc|srclang)/gi,
1453
+ type: "dangerousAttributes",
1454
+ description: "Potentially dangerous HTML attributes detected",
1455
+ severity: "medium"
1456
+ },
1457
+ {
1458
+ pattern: /(expression|eval|setTimeout|setInterval|Function|constructor)/gi,
1459
+ type: "dangerousJavaScript",
1460
+ description: "Potentially dangerous JavaScript functions detected",
1461
+ severity: "high"
1462
+ },
1463
+ {
1464
+ pattern: /(vbscript|livescript|mocha):/gi,
1465
+ type: "dangerousScriptProtocol",
1466
+ description: "Dangerous scripting protocols detected",
1467
+ severity: "critical"
1468
+ },
1469
+ {
1470
+ pattern: /<!--[\s\S]*?-->/g,
1471
+ type: "htmlComments",
1472
+ description: "HTML comments detected - potential information leakage",
1473
+ severity: "low"
1474
+ }
1475
+ ];
1476
+ const sanitizeContent = (text, pattern, replacement = "") => {
1477
+ return text.replace(pattern, replacement);
1478
+ };
1479
+ let contentWasSanitized = false;
1480
+ Object.entries(securityPatterns).forEach(([riskType, config]) => {
1481
+ if (config.pattern.test(markdownText)) {
1482
+ securityCheck.isValid = false;
1483
+ securityCheck.risks.push({
1484
+ type: riskType,
1485
+ description: config.description,
1486
+ severity: config.severity
1487
+ });
1488
+ securityCheck.text = sanitizeContent(securityCheck.text, config.pattern);
1489
+ contentWasSanitized = true;
1490
+ }
1491
+ });
1492
+ additionalChecks.forEach((check) => {
1493
+ if (check.pattern.test(markdownText)) {
1494
+ securityCheck.isValid = false;
1495
+ securityCheck.risks.push({
1496
+ type: check.type,
1497
+ description: check.description,
1498
+ severity: check.severity
1499
+ });
1500
+ securityCheck.text = sanitizeContent(securityCheck.text, check.pattern);
1501
+ contentWasSanitized = true;
1502
+ }
1503
+ });
1504
+ securityCheck.sanitized = contentWasSanitized;
1505
+ const severityOrder = { critical: 0, high: 1, medium: 2, low: 3 };
1506
+ securityCheck.risks.sort((a, b) => {
1507
+ const aSeverity = severityOrder[a.severity || "low"];
1508
+ const bSeverity = severityOrder[b.severity || "low"];
1509
+ return aSeverity - bSeverity;
1510
+ });
1511
+ return securityCheck;
1512
+ };
1513
+ var sanitizeMarkdown = (text) => {
1514
+ if (!text || typeof text !== "string") {
1515
+ return "";
1516
+ }
1517
+ try {
1518
+ return text.replace(/<[^>]*>/g, "").replace(/javascript:/gi, "").replace(/data:[^,]*,[^"'\s>)]*/gi, "").replace(/(file|ftp|ws|wss|vbscript|livescript|mocha):/gi, "").replace(/&[#\w]+;/g, "").replace(/expression\s*\([^)]*\)/gi, "").replace(/\s+/g, " ").trim();
1519
+ } catch (error) {
1520
+ return "";
1521
+ }
1522
+ };
1523
+ var assessSecurityRisks = (risks) => {
1524
+ if (!risks || risks.length === 0) {
1525
+ return {
1526
+ score: 0,
1527
+ level: "safe",
1528
+ recommendations: ["Content appears safe to use"]
1529
+ };
1530
+ }
1531
+ const severityScores = { critical: 100, high: 50, medium: 20, low: 5 };
1532
+ const score = risks.reduce((total, risk) => {
1533
+ return total + (severityScores[risk.severity || "low"] || 5);
1534
+ }, 0);
1535
+ let level;
1536
+ if (score >= 100) level = "critical";
1537
+ else if (score >= 50) level = "high";
1538
+ else if (score >= 20) level = "medium";
1539
+ else if (score >= 5) level = "low";
1540
+ else level = "safe";
1541
+ const recommendations = [];
1542
+ const hasCritical = risks.some((r) => r.severity === "critical");
1543
+ const hasHigh = risks.some((r) => r.severity === "high");
1544
+ if (hasCritical) {
1545
+ recommendations.push("URGENT: Critical security risks detected - do not render this content");
1546
+ recommendations.push("Use aggressive sanitization before any processing");
1547
+ }
1548
+ if (hasHigh) {
1549
+ recommendations.push("High security risks detected - sanitization strongly recommended");
1550
+ recommendations.push("Consider rejecting this content or applying strict filtering");
1551
+ }
1552
+ if (level === "medium") {
1553
+ recommendations.push("Medium security risks detected - apply sanitization");
1554
+ recommendations.push("Review content carefully before use");
1555
+ }
1556
+ if (level === "low") {
1557
+ recommendations.push("Low security risks detected - basic sanitization recommended");
1558
+ }
1559
+ recommendations.push("Always validate content from untrusted sources");
1560
+ recommendations.push("Consider implementing Content Security Policy (CSP)");
1561
+ return { score, level, recommendations };
1562
+ };
1563
+
447
1564
  // src/index.ts
448
1565
  var isBrowser = typeof globalThis !== "undefined" && typeof globalThis.document !== "undefined";
449
1566
  var isNode = typeof process !== "undefined" && !!process.versions?.node;
@@ -452,13 +1569,17 @@ exports.addSpaceBetweenNumbers = addSpaceBetweenNumbers;
452
1569
  exports.addThousandsSpace = addThousandsSpace;
453
1570
  exports.areArraysDeepEqualUnordered = areArraysDeepEqualUnordered;
454
1571
  exports.areArraysEqual = areArraysEqual;
1572
+ exports.assessSecurityRisks = assessSecurityRisks;
455
1573
  exports.basicSanitize = basicSanitize;
1574
+ exports.checkMarkdownSecurity = checkMarkdownSecurity;
456
1575
  exports.chunk = chunk;
457
1576
  exports.clamp = clamp;
458
1577
  exports.cleanObject = cleanObject;
459
1578
  exports.compact = compact;
1579
+ exports.currencyToSymbol = currencyToSymbol;
460
1580
  exports.debounce = debounce;
461
1581
  exports.deburr = deburr;
1582
+ exports.delay = delay;
462
1583
  exports.difference = difference;
463
1584
  exports.fill = fill;
464
1585
  exports.flatten = flatten;
@@ -466,6 +1587,7 @@ exports.flattenDepth = flattenDepth;
466
1587
  exports.flattenDepthBase = flattenDepthBase;
467
1588
  exports.flattenOnce = flattenOnce;
468
1589
  exports.formatBytes = formatBytes;
1590
+ exports.formatCurrency = formatCurrency;
469
1591
  exports.getStringSimilarity = getStringSimilarity;
470
1592
  exports.groupBy = groupBy;
471
1593
  exports.hasNilOrEmpty = hasNilOrEmpty;
@@ -479,6 +1601,7 @@ exports.isNilOrEmpty = isNilOrEmpty;
479
1601
  exports.isNilOrNaN = isNilOrNaN;
480
1602
  exports.isNilOrZeroLen = isNilOrZeroLen;
481
1603
  exports.isNilText = isNilText;
1604
+ exports.isNilTextOrEmpty = isNilTextOrEmpty;
482
1605
  exports.isNode = isNode;
483
1606
  exports.isNullOrUndefined = isNullOrUndefined;
484
1607
  exports.isNullOrUndefinedEmptyOrZero = isNullOrUndefinedEmptyOrZero;
@@ -486,10 +1609,15 @@ exports.isNullOrUndefinedInArray = isNullOrUndefinedInArray;
486
1609
  exports.isNullOrUndefinedOrNaN = isNullOrUndefinedOrNaN;
487
1610
  exports.isNullOrUndefinedTextInc = isNullOrUndefinedTextInc;
488
1611
  exports.isNullUndefinedOrEmpty = isNullUndefinedOrEmpty;
1612
+ exports.isNullUndefinedOrEmptyEnforced = isNullUndefinedOrEmptyEnforced;
489
1613
  exports.isNullUndefinedOrZero = isNullUndefinedOrZero;
1614
+ exports.isPTTaxId = isPTTaxId;
1615
+ exports.isValidIBAN = isValidIBAN;
1616
+ exports.isValidPTTaxId = isValidPTTaxId;
490
1617
  exports.objectToString = objectToString;
491
1618
  exports.omit = omit;
492
1619
  exports.otp = otp;
1620
+ exports.parseName = parseName;
493
1621
  exports.parseToNumber = parseToNumber;
494
1622
  exports.pick = pick;
495
1623
  exports.pluck = pluck;
@@ -499,10 +1627,12 @@ exports.removeDiacritics = removeDiacritics;
499
1627
  exports.round = round;
500
1628
  exports.safeParseInt = safeParseInt;
501
1629
  exports.sanitize = sanitize;
1630
+ exports.sanitizeMarkdown = sanitizeMarkdown;
502
1631
  exports.shuffle = shuffle;
503
1632
  exports.slugify = slugify;
504
1633
  exports.sortBy = sortBy;
505
1634
  exports.stringSimilarity = stringSimilarity;
1635
+ exports.symbolToCurrency = symbolToCurrency;
506
1636
  exports.throttle = throttle;
507
1637
  exports.toInteger = toInteger;
508
1638
  exports.toNumber = toNumber;