@rainersoft/utils 1.1.0 → 1.2.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.mjs CHANGED
@@ -119,6 +119,28 @@ function normalizeSpaces(text, options = {}) {
119
119
  }
120
120
  return cleaned.trim();
121
121
  }
122
+ function calculateReadingTime(content, wordsPerMinute = 200) {
123
+ let text = "";
124
+ if (typeof content === "object" && content !== null) {
125
+ const extractText = (node) => {
126
+ if (!node) return "";
127
+ let result = "";
128
+ if (node.text) {
129
+ result += node.text + " ";
130
+ }
131
+ if (Array.isArray(node.content)) {
132
+ result += node.content.map(extractText).join(" ");
133
+ }
134
+ return result;
135
+ };
136
+ text = extractText(content);
137
+ } else if (typeof content === "string") {
138
+ text = content.replace(/<[^>]*>/g, "");
139
+ }
140
+ const words = text.trim().split(/\s+/).filter((word) => word.length > 0).length;
141
+ const time = Math.ceil(words / wordsPerMinute);
142
+ return time > 0 ? time : 1;
143
+ }
122
144
 
123
145
  // src/string/index.ts
124
146
  function textToSlug(text) {
@@ -839,6 +861,142 @@ function findMinMax(data, field) {
839
861
  max: Math.max(...values)
840
862
  };
841
863
  }
864
+
865
+ // src/auth/index.ts
866
+ var TOKEN_KEY = "auth_token";
867
+ var REFRESH_TOKEN_KEY = "refresh_token";
868
+ var getToken = () => {
869
+ if (typeof window === "undefined") {
870
+ return null;
871
+ }
872
+ return localStorage.getItem(TOKEN_KEY);
873
+ };
874
+ var setToken = (token) => {
875
+ if (typeof window === "undefined") {
876
+ return;
877
+ }
878
+ localStorage.setItem(TOKEN_KEY, token);
879
+ };
880
+ var getRefreshToken = () => {
881
+ if (typeof window === "undefined") {
882
+ return null;
883
+ }
884
+ return localStorage.getItem(REFRESH_TOKEN_KEY);
885
+ };
886
+ var setRefreshToken = (refreshToken) => {
887
+ if (typeof window === "undefined") {
888
+ return;
889
+ }
890
+ localStorage.setItem(REFRESH_TOKEN_KEY, refreshToken);
891
+ };
892
+ var removeToken = () => {
893
+ if (typeof window === "undefined") {
894
+ return;
895
+ }
896
+ localStorage.removeItem(TOKEN_KEY);
897
+ localStorage.removeItem(REFRESH_TOKEN_KEY);
898
+ };
899
+ var hasToken = () => {
900
+ return !!getToken();
901
+ };
902
+ var getTokens = () => {
903
+ return {
904
+ accessToken: getToken(),
905
+ refreshToken: getRefreshToken()
906
+ };
907
+ };
908
+ var setTokens = ({
909
+ accessToken,
910
+ refreshToken
911
+ }) => {
912
+ setToken(accessToken);
913
+ setRefreshToken(refreshToken);
914
+ };
915
+
916
+ // src/search/index.ts
917
+ function searchContent(query, content, options = {}) {
918
+ if (!query.trim()) return content;
919
+ const {
920
+ fields = ["title", "description", "content", "tags"],
921
+ caseSensitive = false,
922
+ exactMatch = false
923
+ } = options;
924
+ const searchQuery = caseSensitive ? query : query.toLowerCase();
925
+ return content.filter((item) => {
926
+ return fields.some((field) => {
927
+ const value = item[field];
928
+ if (!value) return false;
929
+ if (Array.isArray(value)) {
930
+ return value.some((v) => {
931
+ const strValue2 = caseSensitive ? String(v) : String(v).toLowerCase();
932
+ return exactMatch ? strValue2 === searchQuery : strValue2.includes(searchQuery);
933
+ });
934
+ }
935
+ const strValue = caseSensitive ? String(value) : String(value).toLowerCase();
936
+ return exactMatch ? strValue === searchQuery : strValue.includes(searchQuery);
937
+ });
938
+ });
939
+ }
940
+ function searchWithScore(query, content, options = {}) {
941
+ if (!query.trim()) return content;
942
+ const {
943
+ fields = ["title", "description", "content", "tags"],
944
+ caseSensitive = false
945
+ } = options;
946
+ const searchQuery = caseSensitive ? query : query.toLowerCase();
947
+ const scored = content.map((item) => {
948
+ let score = 0;
949
+ fields.forEach((field, index) => {
950
+ const value = item[field];
951
+ if (!value) return;
952
+ const weight = fields.length - index;
953
+ if (Array.isArray(value)) {
954
+ const matches = value.filter((v) => {
955
+ const strValue = caseSensitive ? String(v) : String(v).toLowerCase();
956
+ return strValue.includes(searchQuery);
957
+ }).length;
958
+ score += matches * weight;
959
+ } else {
960
+ const strValue = caseSensitive ? String(value) : String(value).toLowerCase();
961
+ if (strValue.includes(searchQuery)) {
962
+ score += weight;
963
+ if (strValue === searchQuery) {
964
+ score += weight * 2;
965
+ }
966
+ }
967
+ }
968
+ });
969
+ return { item, score };
970
+ });
971
+ return scored.filter(({ score }) => score > 0).sort((a, b) => b.score - a.score).map(({ item }) => item);
972
+ }
973
+ function fuzzySearch(query, content, options = {}) {
974
+ if (!query.trim()) return content;
975
+ const {
976
+ fields = ["title", "description"],
977
+ caseSensitive = false,
978
+ threshold = 0.6
979
+ // Similaridade mínima (0-1)
980
+ } = options;
981
+ const searchQuery = caseSensitive ? query : query.toLowerCase();
982
+ return content.filter((item) => {
983
+ return fields.some((field) => {
984
+ const value = item[field];
985
+ if (!value) return false;
986
+ const strValue = caseSensitive ? String(value) : String(value).toLowerCase();
987
+ const similarity = calculateSimilarity(searchQuery, strValue);
988
+ return similarity >= threshold;
989
+ });
990
+ });
991
+ }
992
+ function calculateSimilarity(str1, str2) {
993
+ if (str1 === str2) return 1;
994
+ if (str1.length === 0 || str2.length === 0) return 0;
995
+ if (str2.includes(str1)) return 0.8;
996
+ const common = str1.split("").filter((char) => str2.includes(char)).length;
997
+ const similarity = common / Math.max(str1.length, str2.length);
998
+ return similarity;
999
+ }
842
1000
  function usePasswordStrength(password, options = {}) {
843
1001
  const {
844
1002
  minLength = 8,
@@ -1059,6 +1217,6 @@ function translateStatus2(status) {
1059
1217
  return translateStatus(status, "pt-BR");
1060
1218
  }
1061
1219
 
1062
- export { CURRENCY_MAP, DEFAULT_LOCALE, calculateChange, calculateMovingAverage, capitalize, cleanText, copyToClipboard, countWords, downloadFile, extractInitials, findMinMax, formatCurrency, formatDate, formatDateTime, formatNumber2 as formatNumber, formatPercentage, formatRelativeDate, generateAvatarUrl, generateDynamicAvatarUrl, generateMockChartData, generateUniqueId, getAvatarColorFromName, getElementPosition, getStatusColor, getStatusVariant, groupDataByPeriod, isDarkMode, isElementVisible, isEmpty, isMobile, isValidAvatarUrl, isValidDate, normalizeSpaces, onDarkModeChange, onReducedMotionChange, prefersReducedMotion, pt_br_exports as ptBR, scrollToElement, scrollToPosition, scrollToTop, smoothScrollTo, textToSlug, toISOString, translatePostStatus, translateStatus, truncateText, usePasswordStrength, validateEmail, validateMessage, validatePassword, validatePhone, validateSlug, validateText, validateUrl, validateUsername };
1220
+ export { CURRENCY_MAP, DEFAULT_LOCALE, calculateChange, calculateMovingAverage, calculateReadingTime, capitalize, cleanText, copyToClipboard, countWords, downloadFile, extractInitials, findMinMax, formatCurrency, formatDate, formatDateTime, formatNumber2 as formatNumber, formatPercentage, formatRelativeDate, fuzzySearch, generateAvatarUrl, generateDynamicAvatarUrl, generateMockChartData, generateUniqueId, getAvatarColorFromName, getElementPosition, getRefreshToken, getStatusColor, getStatusVariant, getToken, getTokens, groupDataByPeriod, hasToken, isDarkMode, isElementVisible, isEmpty, isMobile, isValidAvatarUrl, isValidDate, normalizeSpaces, onDarkModeChange, onReducedMotionChange, prefersReducedMotion, pt_br_exports as ptBR, removeToken, scrollToElement, scrollToPosition, scrollToTop, searchContent, searchWithScore, setRefreshToken, setToken, setTokens, smoothScrollTo, textToSlug, toISOString, translatePostStatus, translateStatus, truncateText, usePasswordStrength, validateEmail, validateMessage, validatePassword, validatePhone, validateSlug, validateText, validateUrl, validateUsername };
1063
1221
  //# sourceMappingURL=index.mjs.map
1064
1222
  //# sourceMappingURL=index.mjs.map