@salespark/toolkit 2.0.1 → 2.1.1

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