@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/date/index.d.mts +2 -9
- package/dist/date/index.d.ts +2 -9
- package/dist/index-BA11MtKk.d.ts +18 -0
- package/dist/index-BPYjFrM1.d.mts +18 -0
- package/dist/index-BfZE8XjJ.d.ts +18 -0
- package/dist/index-BuqX8-qm.d.mts +18 -0
- package/dist/index.d.mts +66 -3
- package/dist/index.d.ts +66 -3
- package/dist/index.js +222 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +207 -1
- package/dist/index.mjs.map +1 -1
- package/dist/status/index.d.mts +2 -9
- package/dist/status/index.d.ts +2 -9
- package/package.json +1 -1
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
|
-
|
|
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
|