@rainersoft/utils 1.1.0 → 1.3.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
@@ -15,6 +15,22 @@ var CURRENCY_MAP = {
15
15
  };
16
16
 
17
17
  // src/text/index.ts
18
+ var text_exports = {};
19
+ __export(text_exports, {
20
+ calculateReadingTime: () => calculateReadingTime,
21
+ capitalize: () => capitalize,
22
+ cleanText: () => cleanText,
23
+ countWords: () => countWords,
24
+ extractInitials: () => extractInitials,
25
+ generateAvatarUrl: () => generateAvatarUrl,
26
+ generateDynamicAvatarUrl: () => generateDynamicAvatarUrl,
27
+ generateUniqueId: () => generateUniqueId,
28
+ getAvatarColorFromName: () => getAvatarColorFromName,
29
+ isEmpty: () => isEmpty,
30
+ isValidAvatarUrl: () => isValidAvatarUrl,
31
+ normalizeSpaces: () => normalizeSpaces,
32
+ truncateText: () => truncateText
33
+ });
18
34
  function extractInitials(name, maxChars = 2) {
19
35
  if (!name || !name.trim()) {
20
36
  return "";
@@ -119,6 +135,28 @@ function normalizeSpaces(text, options = {}) {
119
135
  }
120
136
  return cleaned.trim();
121
137
  }
138
+ function calculateReadingTime(content, wordsPerMinute = 200) {
139
+ let text = "";
140
+ if (typeof content === "object" && content !== null) {
141
+ const extractText = (node) => {
142
+ if (!node) return "";
143
+ let result = "";
144
+ if (node.text) {
145
+ result += node.text + " ";
146
+ }
147
+ if (Array.isArray(node.content)) {
148
+ result += node.content.map(extractText).join(" ");
149
+ }
150
+ return result;
151
+ };
152
+ text = extractText(content);
153
+ } else if (typeof content === "string") {
154
+ text = content.replace(/<[^>]*>/g, "");
155
+ }
156
+ const words = text.trim().split(/\s+/).filter((word) => word.length > 0).length;
157
+ const time = Math.ceil(words / wordsPerMinute);
158
+ return time > 0 ? time : 1;
159
+ }
122
160
 
123
161
  // src/string/index.ts
124
162
  function textToSlug(text) {
@@ -126,6 +164,14 @@ function textToSlug(text) {
126
164
  }
127
165
 
128
166
  // src/date/index.ts
167
+ var date_exports = {};
168
+ __export(date_exports, {
169
+ formatDate: () => formatDate,
170
+ formatDateTime: () => formatDateTime,
171
+ formatRelativeDate: () => formatRelativeDate,
172
+ isValidDate: () => isValidDate,
173
+ toISOString: () => toISOString
174
+ });
129
175
  var RELATIVE_TEXTS = {
130
176
  "pt-BR": {
131
177
  now: "agora",
@@ -243,6 +289,13 @@ function formatCompact(value, decimals = 1, locale = DEFAULT_LOCALE) {
243
289
  }
244
290
 
245
291
  // src/status/index.ts
292
+ var status_exports = {};
293
+ __export(status_exports, {
294
+ getStatusColor: () => getStatusColor,
295
+ getStatusVariant: () => getStatusVariant,
296
+ translatePostStatus: () => translatePostStatus,
297
+ translateStatus: () => translateStatus
298
+ });
246
299
  var STATUS_TRANSLATIONS = {
247
300
  "pt-BR": {
248
301
  // Estados de conteúdo
@@ -839,6 +892,153 @@ function findMinMax(data, field) {
839
892
  max: Math.max(...values)
840
893
  };
841
894
  }
895
+
896
+ // src/auth/index.ts
897
+ var auth_exports = {};
898
+ __export(auth_exports, {
899
+ getRefreshToken: () => getRefreshToken,
900
+ getToken: () => getToken,
901
+ getTokens: () => getTokens,
902
+ hasToken: () => hasToken,
903
+ removeToken: () => removeToken,
904
+ setRefreshToken: () => setRefreshToken,
905
+ setToken: () => setToken,
906
+ setTokens: () => setTokens
907
+ });
908
+ var TOKEN_KEY = "auth_token";
909
+ var REFRESH_TOKEN_KEY = "refresh_token";
910
+ var getToken = () => {
911
+ if (typeof window === "undefined") {
912
+ return null;
913
+ }
914
+ return localStorage.getItem(TOKEN_KEY);
915
+ };
916
+ var setToken = (token) => {
917
+ if (typeof window === "undefined") {
918
+ return;
919
+ }
920
+ localStorage.setItem(TOKEN_KEY, token);
921
+ };
922
+ var getRefreshToken = () => {
923
+ if (typeof window === "undefined") {
924
+ return null;
925
+ }
926
+ return localStorage.getItem(REFRESH_TOKEN_KEY);
927
+ };
928
+ var setRefreshToken = (refreshToken) => {
929
+ if (typeof window === "undefined") {
930
+ return;
931
+ }
932
+ localStorage.setItem(REFRESH_TOKEN_KEY, refreshToken);
933
+ };
934
+ var removeToken = () => {
935
+ if (typeof window === "undefined") {
936
+ return;
937
+ }
938
+ localStorage.removeItem(TOKEN_KEY);
939
+ localStorage.removeItem(REFRESH_TOKEN_KEY);
940
+ };
941
+ var hasToken = () => {
942
+ return !!getToken();
943
+ };
944
+ var getTokens = () => {
945
+ return {
946
+ accessToken: getToken(),
947
+ refreshToken: getRefreshToken()
948
+ };
949
+ };
950
+ var setTokens = ({
951
+ accessToken,
952
+ refreshToken
953
+ }) => {
954
+ setToken(accessToken);
955
+ setRefreshToken(refreshToken);
956
+ };
957
+
958
+ // src/search/index.ts
959
+ function searchContent(query, content, options = {}) {
960
+ if (!query.trim()) return content;
961
+ const {
962
+ fields = ["title", "description", "content", "tags"],
963
+ caseSensitive = false,
964
+ exactMatch = false
965
+ } = options;
966
+ const searchQuery = caseSensitive ? query : query.toLowerCase();
967
+ return content.filter((item) => {
968
+ return fields.some((field) => {
969
+ const value = item[field];
970
+ if (!value) return false;
971
+ if (Array.isArray(value)) {
972
+ return value.some((v) => {
973
+ const strValue2 = caseSensitive ? String(v) : String(v).toLowerCase();
974
+ return exactMatch ? strValue2 === searchQuery : strValue2.includes(searchQuery);
975
+ });
976
+ }
977
+ const strValue = caseSensitive ? String(value) : String(value).toLowerCase();
978
+ return exactMatch ? strValue === searchQuery : strValue.includes(searchQuery);
979
+ });
980
+ });
981
+ }
982
+ function searchWithScore(query, content, options = {}) {
983
+ if (!query.trim()) return content;
984
+ const {
985
+ fields = ["title", "description", "content", "tags"],
986
+ caseSensitive = false
987
+ } = options;
988
+ const searchQuery = caseSensitive ? query : query.toLowerCase();
989
+ const scored = content.map((item) => {
990
+ let score = 0;
991
+ fields.forEach((field, index) => {
992
+ const value = item[field];
993
+ if (!value) return;
994
+ const weight = fields.length - index;
995
+ if (Array.isArray(value)) {
996
+ const matches = value.filter((v) => {
997
+ const strValue = caseSensitive ? String(v) : String(v).toLowerCase();
998
+ return strValue.includes(searchQuery);
999
+ }).length;
1000
+ score += matches * weight;
1001
+ } else {
1002
+ const strValue = caseSensitive ? String(value) : String(value).toLowerCase();
1003
+ if (strValue.includes(searchQuery)) {
1004
+ score += weight;
1005
+ if (strValue === searchQuery) {
1006
+ score += weight * 2;
1007
+ }
1008
+ }
1009
+ }
1010
+ });
1011
+ return { item, score };
1012
+ });
1013
+ return scored.filter(({ score }) => score > 0).sort((a, b) => b.score - a.score).map(({ item }) => item);
1014
+ }
1015
+ function fuzzySearch(query, content, options = {}) {
1016
+ if (!query.trim()) return content;
1017
+ const {
1018
+ fields = ["title", "description"],
1019
+ caseSensitive = false,
1020
+ threshold = 0.6
1021
+ // Similaridade mínima (0-1)
1022
+ } = options;
1023
+ const searchQuery = caseSensitive ? query : query.toLowerCase();
1024
+ return content.filter((item) => {
1025
+ return fields.some((field) => {
1026
+ const value = item[field];
1027
+ if (!value) return false;
1028
+ const strValue = caseSensitive ? String(value) : String(value).toLowerCase();
1029
+ const similarity = calculateSimilarity(searchQuery, strValue);
1030
+ return similarity >= threshold;
1031
+ });
1032
+ });
1033
+ }
1034
+ function calculateSimilarity(str1, str2) {
1035
+ if (str1 === str2) return 1;
1036
+ if (str1.length === 0 || str2.length === 0) return 0;
1037
+ if (str2.includes(str1)) return 0.8;
1038
+ const common = str1.split("").filter((char) => str2.includes(char)).length;
1039
+ const similarity = common / Math.max(str1.length, str2.length);
1040
+ return similarity;
1041
+ }
842
1042
  function usePasswordStrength(password, options = {}) {
843
1043
  const {
844
1044
  minLength = 8,
@@ -1059,6 +1259,12 @@ function translateStatus2(status) {
1059
1259
  return translateStatus(status, "pt-BR");
1060
1260
  }
1061
1261
 
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 };
1262
+ // src/index.ts
1263
+ var textProcessing = text_exports;
1264
+ var datetime = date_exports;
1265
+ var authentication = auth_exports;
1266
+ var stateManagement = status_exports;
1267
+
1268
+ export { CURRENCY_MAP, DEFAULT_LOCALE, authentication, calculateChange, calculateMovingAverage, calculateReadingTime, capitalize, cleanText, copyToClipboard, countWords, datetime, 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, stateManagement, textProcessing, textToSlug, toISOString, translatePostStatus, translateStatus, truncateText, usePasswordStrength, validateEmail, validateMessage, validatePassword, validatePhone, validateSlug, validateText, validateUrl, validateUsername };
1063
1269
  //# sourceMappingURL=index.mjs.map
1064
1270
  //# sourceMappingURL=index.mjs.map