UNPKG

zen-digital-utils

Version:

A collection of utility functions for JavaScript/TypeScript projects

561 lines (551 loc) 17.7 kB
"use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getOwnPropSymbols = Object.getOwnPropertySymbols; var __hasOwnProp = Object.prototype.hasOwnProperty; var __propIsEnum = Object.prototype.propertyIsEnumerable; var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __spreadValues = (a, b) => { for (var prop in b || (b = {})) if (__hasOwnProp.call(b, prop)) __defNormalProp(a, prop, b[prop]); if (__getOwnPropSymbols) for (var prop of __getOwnPropSymbols(b)) { if (__propIsEnum.call(b, prop)) __defNormalProp(a, prop, b[prop]); } return a; }; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/index.ts var index_exports = {}; __export(index_exports, { brazilianStates: () => brazilianStates, capitalize: () => capitalize, capitalizeText: () => capitalizeText, chunk: () => chunk, deepMerge: () => deepMerge, difference: () => difference, flatten: () => flatten, formatAccountingCurrency: () => formatAccountingCurrency, formatBirthdate: () => formatBirthdate, formatBranchNumber: () => formatBranchNumber, formatBranchNumberWithDefault: () => formatBranchNumberWithDefault, formatCountBankNumber: () => formatCountBankNumber, formatCpf: () => formatCpf, formatCurrency: () => formatCurrency, formatCurrencyInput: () => formatCurrencyInput, formatCurrencyWithoutSymbol: () => formatCurrencyWithoutSymbol, formatDate: () => formatDate, formatDateTime: () => formatDateTime, formatFullName: () => formatFullName, formatInternationalCurrency: () => formatInternationalCurrency, formatNumber: () => formatNumber, formatPercent: () => formatPercent, formatPhoneNumber: () => formatPhoneNumber, formatPhoneNumberForWhatsApp: () => formatPhoneNumberForWhatsApp, formatTextOnly: () => formatTextOnly, formatWithCurrencySymbol: () => formatWithCurrencySymbol, formatZipCode: () => formatZipCode, formattedDate: () => formattedDate, getAcronym: () => getAcronym, getDaysBetween: () => getDaysBetween, groupBy: () => groupBy, hideScroll: () => hideScroll, intersection: () => intersection, isWeekend: () => isWeekend, omit: () => omit, parseBrazilianCurrency: () => parseBrazilianCurrency, partition: () => partition, pick: () => pick, shuffle: () => shuffle, slugify: () => slugify, sortBy: () => sortBy, toCents: () => toCents, truncate: () => truncate, unique: () => unique }); module.exports = __toCommonJS(index_exports); // src/utils/states/index.ts var brazilianStates = [ { value: "AC", label: "Acre" }, { value: "AL", label: "Alagoas" }, { value: "AP", label: "Amap\xE1" }, { value: "AM", label: "Amazonas" }, { value: "BA", label: "Bahia" }, { value: "CE", label: "Cear\xE1" }, { value: "DF", label: "Distrito Federal" }, { value: "ES", label: "Esp\xEDrito Santo" }, { value: "GO", label: "Goi\xE1s" }, { value: "MA", label: "Maranh\xE3o" }, { value: "MT", label: "Mato Grosso" }, { value: "MS", label: "Mato Grosso do Sul" }, { value: "MG", label: "Minas Gerais" }, { value: "PA", label: "Par\xE1" }, { value: "PB", label: "Para\xEDba" }, { value: "PR", label: "Paran\xE1" }, { value: "PE", label: "Pernambuco" }, { value: "PI", label: "Piau\xED" }, { value: "RJ", label: "Rio de Janeiro" }, { value: "RN", label: "Rio Grande do Norte" }, { value: "RS", label: "Rio Grande do Sul" }, { value: "RO", label: "Rond\xF4nia" }, { value: "RR", label: "Roraima" }, { value: "SC", label: "Santa Catarina" }, { value: "SP", label: "S\xE3o Paulo" }, { value: "SE", label: "Sergipe" }, { value: "TO", label: "Tocantins" } ]; // src/utils/dom/hideScroll.ts function hideScroll(isOpen) { if (typeof document === "undefined") return; if (isOpen) { document.body.classList.add("!overflow-hidden"); } else { document.body.classList.remove("!overflow-hidden"); } } // src/utils/formatters/date/index.ts function formattedDate(thisDate) { if (!thisDate) return ""; try { const dateParts = thisDate.split("-"); const date = /* @__PURE__ */ new Date(`${dateParts[1]}/${dateParts[2]}/${dateParts[0]}`); if (isNaN(date.getTime())) return ""; const day = String(date.getDate()).padStart(2, "0"); const month = String(date.getMonth() + 1).padStart(2, "0"); const year = date.getFullYear(); return `${day}/${month}/${year}`; } catch (error) { return ""; } } function formatDate(date, format = "DD/MM/YYYY") { if (!(date instanceof Date) || isNaN(date.getTime())) { return ""; } const day = String(date.getDate()).padStart(2, "0"); const month = String(date.getMonth() + 1).padStart(2, "0"); const year = date.getFullYear(); return format.replace("YYYY", year.toString()).replace("MM", month).replace("DD", day); } function formatDateTime(dateTimeString) { if (!dateTimeString) return ""; const parts = dateTimeString.split(" "); if (parts.length !== 2) return dateTimeString; const [date, time] = parts; return `${date} \u2022 ${time}`; } function formatBirthdate(value) { if (!value) return ""; const digits = value.replace(/\D/g, ""); const day = digits.slice(0, 2); const month = digits.slice(2, 4); const year = digits.slice(4, 8); let formatted = ""; if (day) { formatted += day; } if (month) { formatted += `/${month}`; } if (year) { formatted += `/${year}`; } return formatted; } function getDaysBetween(startDate, endDate) { if (!(startDate instanceof Date) || !(endDate instanceof Date) || isNaN(startDate.getTime()) || isNaN(endDate.getTime())) { return 0; } const start = new Date(startDate.setHours(0, 0, 0, 0)); const end = new Date(endDate.setHours(0, 0, 0, 0)); const diffTime = Math.abs(end.getTime() - start.getTime()); return Math.floor(diffTime / (1e3 * 60 * 60 * 24)); } function isWeekend(date) { if (!(date instanceof Date) || isNaN(date.getTime())) { return false; } const day = date.getDay(); return day === 0 || day === 6; } // src/utils/formatters/general/index.ts function capitalize(text) { if (!text || typeof text !== "string") return ""; return text.charAt(0).toUpperCase() + text.slice(1); } function capitalizeText(text) { if (!text) return ""; return text.split(" ").map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()).join(" "); } function slugify(text) { if (!text || typeof text !== "string") return ""; return text.toString().normalize("NFD").replace(/[\u0300-\u036f]/g, "").toLowerCase().trim().replace(/\s+/g, "-").replace(/[^\w-]+/g, "").replace(/--+/g, "-").replace(/^-+|-+$/g, ""); } function truncate(text, length, suffix = "...") { if (!text || typeof text !== "string") return ""; if (text.length <= length) return text; return text.slice(0, length) + suffix; } function formatTextOnly(value) { if (!value) return ""; return value.replace(/[^a-zA-ZÀ-ÿ\s]/g, ""); } function formatFullName(value) { if (!value) return ""; return value.replace(/[^a-záãéêíóõúç\s]/gi, "").replace(/\s+/g, " ").trim(); } function getAcronym(fullName) { if (!fullName) return ""; const names = fullName.trim().split(" "); const firstInitial = names[0] ? names[0][0].toUpperCase() : ""; const secondInitial = names[1] ? names[1][0].toUpperCase() : ""; return firstInitial + secondInitial; } function formatPercent(value) { if (value == null || value === "") { return "0,00%"; } let numberValue = Number(value); if (Number.isNaN(numberValue)) { return "0,00%"; } numberValue = Math.floor(numberValue * 100) / 100; const formattedValue = numberValue.toFixed(2).replace(".", ",").replace(/\B(?=(\d{3})+(?!\d))/g, "."); return `${formattedValue}%`; } function formatZipCode(value) { if (!value) return ""; value = value.replace(/\D/g, ""); value = value.slice(0, 8); if (value.length > 5) { value = value.replace(/(\d{5})(\d)/, "$1-$2"); } return value; } // src/utils/formatters/currency/index.ts function formatCurrencyInput(value) { let numberValue = value == null ? void 0 : value.replace(/\D/g, ""); if (!value || !numberValue) { return "R$ 0,00"; } numberValue = (Number.parseInt(numberValue) / 100).toFixed(2).toString(); return `R$ ${numberValue.replace(".", ",").replace(/\B(?=(\d{3})+(?!\d))/g, ".")}`; } function formatCurrency(value) { if (value == null || value === "") { return "R$ 0,00"; } let numberValue = Number(value); if (Number.isNaN(numberValue)) { return "R$ 0,00"; } numberValue = Math.floor(numberValue * 100) / 100; const formattedValue = numberValue.toFixed(2).replace(".", ",").replace(/\B(?=(\d{3})+(?!\d))/g, "."); return `R$ ${formattedValue}`; } function formatWithCurrencySymbol(value, currencySymbol = "$") { if (value == null || value === "") { return `${currencySymbol} 0.00`; } let numberValue = Number(value); if (Number.isNaN(numberValue)) { return `${currencySymbol} 0.00`; } numberValue = Math.floor(numberValue * 100) / 100; const formattedValue = numberValue.toFixed(2).replace(".", ",").replace(/\B(?=(\d{3})+(?!\d))/g, "."); return `${currencySymbol} ${formattedValue}`; } function formatInternationalCurrency(value, locale = "pt-BR", currencyCode = "BRL") { if (value == null || value === "") { return new Intl.NumberFormat(locale, { style: "currency", currency: currencyCode }).format(0); } const numberValue = Number(value); if (Number.isNaN(numberValue)) { return new Intl.NumberFormat(locale, { style: "currency", currency: currencyCode }).format(0); } return new Intl.NumberFormat(locale, { style: "currency", currency: currencyCode }).format(numberValue); } function formatCurrencyWithoutSymbol(value) { if (value == null || value === "") { return "0,00"; } let numberValue = Number(value); if (Number.isNaN(numberValue)) { return "0,00"; } numberValue = Math.floor(numberValue * 100) / 100; return numberValue.toFixed(2).replace(".", ",").replace(/\B(?=(\d{3})+(?!\d))/g, "."); } function formatAccountingCurrency(value) { if (value == null || value === "") { return "R$ 0,00"; } let numberValue = Number(value); if (Number.isNaN(numberValue)) { return "R$ 0,00"; } numberValue = Math.floor(numberValue * 100) / 100; const isNegative = numberValue < 0; const absoluteValue = Math.abs(numberValue); const formattedValue = absoluteValue.toFixed(2).replace(".", ",").replace(/\B(?=(\d{3})+(?!\d))/g, "."); return isNegative ? `(R$ ${formattedValue})` : `R$ ${formattedValue}`; } function parseBrazilianCurrency(str) { str = str.replace(/[^0-9,.-]+/g, ""); str = str.replace(/\./g, ""); str = str.replace(",", "."); return Number.parseFloat(str); } function toCents(value) { if (typeof value === "string") { return Math.round(parseBrazilianCurrency(value) * 100); } return Math.round(Number(value) * 100); } // src/utils/formatters/numbers/index.ts function formatPhoneNumberForWhatsApp(value) { const cleanValue = value.replace(/\D/g, ""); return cleanValue; } function formatNumber(value) { value = value.replace(/\D/g, ""); return value; } function formatPhoneNumber(value) { if (!value) { return ""; } const valueWithoutMask = value.replace(/\D/g, ""); const maxLength = 11; const limitedValue = valueWithoutMask.slice(0, maxLength); if (limitedValue.length > 10) { return limitedValue.replace(/^(\d{2})(\d{5})(\d{4})/, "($1) $2-$3"); } if (limitedValue.length > 6) { return limitedValue.replace(/^(\d{2})(\d{4})(\d{0,4})/, "($1) $2-$3"); } if (limitedValue.length > 2) { return limitedValue.replace(/^(\d{2})(\d{0,5})/, "($1) $2"); } return limitedValue.replace(/^(\d{0,2})/, "($1"); } function formatCountBankNumber(value) { value = value.replace(/\D/g, ""); value = value.slice(0, 13); if (value.length > 12) { value = value.replace(/(\d{13})/, "$1"); } return value; } function formatBranchNumber(value) { value = value.replace(/\D/g, ""); value = value.slice(0, 5); if (value.length > 4) { value = value.replace(/(\d{4})(\d)/, "$1-$2"); } return value; } function formatBranchNumberWithDefault(value) { value = value.replace(/\D/g, ""); if (value.length === 4) { value += "0"; } value = value.slice(0, 5); if (value.length > 4) { value = value.replace(/(\d{4})(\d)/, "$1-$2"); } return value; } function formatCpf(value) { value = value.replace(/\D/g, ""); value = value.slice(0, 11); value = value.replace(/(\d{3})(\d)/, "$1.$2"); value = value.replace(/(\d{3})(\d)/, "$1.$2"); value = value.replace(/(\d{3})(\d{1,2})$/, "$1-$2"); return value; } // src/utils/objects/index.ts function deepMerge(target, source) { if (!target || typeof target !== "object") return source; if (!source || typeof source !== "object") return target; const output = __spreadValues({}, target); Object.keys(source).forEach((key) => { const targetValue = target[key]; const sourceValue = source[key]; if (Array.isArray(targetValue) && Array.isArray(sourceValue)) { output[key] = [...targetValue, ...sourceValue]; } else if (targetValue && typeof targetValue === "object" && sourceValue && typeof sourceValue === "object") { output[key] = deepMerge(targetValue, sourceValue); } else { output[key] = sourceValue !== void 0 ? sourceValue : targetValue; } }); return output; } function pick(obj, keys) { if (!obj || typeof obj !== "object") return {}; return keys.reduce((result, key) => { if (key in obj) { result[key] = obj[key]; } return result; }, {}); } function omit(obj, keys) { if (!obj || typeof obj !== "object") return {}; const result = __spreadValues({}, obj); keys.forEach((key) => { delete result[key]; }); return result; } // src/utils/arrays/index.ts function chunk(array, size) { if (!Array.isArray(array) || array.length === 0) return []; if (size <= 0) return [array]; const result = []; for (let i = 0; i < array.length; i += size) { result.push(array.slice(i, i + size)); } return result; } function unique(array) { if (!Array.isArray(array)) return []; return [...new Set(array)]; } function sortBy(array, key, direction = "asc") { if (!Array.isArray(array) || array.length === 0) return []; const sorted = [...array].sort((a, b) => { const valueA = a[key]; const valueB = b[key]; if (typeof valueA === "string" && typeof valueB === "string") { return valueA.localeCompare(valueB); } if (valueA < valueB) return -1; if (valueA > valueB) return 1; return 0; }); return direction === "desc" ? sorted.reverse() : sorted; } function groupBy(array, key) { if (!Array.isArray(array)) return {}; return array.reduce((result, item) => { const groupKey = String(item[key]); result[groupKey] = result[groupKey] || []; result[groupKey].push(item); return result; }, {}); } function flatten(array) { if (!Array.isArray(array)) return []; return array.reduce((result, item) => { if (Array.isArray(item)) { result.push(...item); } else { result.push(item); } return result; }, []); } function intersection(...arrays) { if (!arrays.length || arrays.some((arr) => !Array.isArray(arr))) return []; const [first, ...rest] = arrays; return first.filter( (item) => rest.every((arr) => arr.includes(item)) ); } function difference(array, excludeArray) { if (!Array.isArray(array)) return []; if (!Array.isArray(excludeArray)) return [...array]; return array.filter((item) => !excludeArray.includes(item)); } function shuffle(array) { if (!Array.isArray(array)) return []; const result = [...array]; for (let i = result.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); [result[i], result[j]] = [result[j], result[i]]; } return result; } function partition(array, predicate) { if (!Array.isArray(array)) return [[], []]; return array.reduce( (result, item) => { result[predicate(item) ? 0 : 1].push(item); return result; }, [[], []] ); } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { brazilianStates, capitalize, capitalizeText, chunk, deepMerge, difference, flatten, formatAccountingCurrency, formatBirthdate, formatBranchNumber, formatBranchNumberWithDefault, formatCountBankNumber, formatCpf, formatCurrency, formatCurrencyInput, formatCurrencyWithoutSymbol, formatDate, formatDateTime, formatFullName, formatInternationalCurrency, formatNumber, formatPercent, formatPhoneNumber, formatPhoneNumberForWhatsApp, formatTextOnly, formatWithCurrencySymbol, formatZipCode, formattedDate, getAcronym, getDaysBetween, groupBy, hideScroll, intersection, isWeekend, omit, parseBrazilianCurrency, partition, pick, shuffle, slugify, sortBy, toCents, truncate, unique });