@oxog/string
Version:
Comprehensive string manipulation utilities with zero dependencies
130 lines (129 loc) • 4.49 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.isEmail = isEmail;
exports.isUrl = isUrl;
exports.isUuid = isUuid;
exports.isHexColor = isHexColor;
exports.isBase64 = isBase64;
exports.isJson = isJson;
exports.isNumeric = isNumeric;
exports.isAlpha = isAlpha;
exports.isAlphanumeric = isAlphanumeric;
exports.isEmpty = isEmpty;
function isEmail(str) {
const emailRegex = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;
return emailRegex.test(str);
}
function isUrl(str, options = {}) {
const { requireProtocol = false, allowUnderscore = false, allowTrailingDot = false, allowProtocols = ['http', 'https', 'ftp'] } = options;
if (!str || typeof str !== 'string') {
return false;
}
try {
const url = new URL(str);
if (!allowProtocols.includes(url.protocol.slice(0, -1))) {
return false;
}
if (!allowUnderscore && url.hostname.includes('_')) {
return false;
}
if (!allowTrailingDot && url.hostname.endsWith('.')) {
return false;
}
return true;
}
catch (_a) {
if (!requireProtocol && !str.includes('://')) {
try {
const testUrl = new URL(`http://${str}`);
// Additional validation for domain format
if (!/^[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(testUrl.hostname)) {
return false;
}
return true;
}
catch (_b) {
return false;
}
}
return false;
}
}
function isUuid(str, version) {
const uuidRegexes = {
1: /^[0-9a-f]{8}-[0-9a-f]{4}-1[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,
2: /^[0-9a-f]{8}-[0-9a-f]{4}-2[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,
3: /^[0-9a-f]{8}-[0-9a-f]{4}-3[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,
4: /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,
5: /^[0-9a-f]{8}-[0-9a-f]{4}-5[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i
};
if (version && uuidRegexes[version]) {
return uuidRegexes[version].test(str);
}
const generalUuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
return generalUuidRegex.test(str);
}
function isHexColor(str) {
const hexColorRegex = /^#([0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/i;
return hexColorRegex.test(str);
}
function isBase64(str) {
if (!str || str.length % 4 !== 0) {
return false;
}
const base64Regex = /^[A-Za-z0-9+/]*={0,2}$/;
return base64Regex.test(str);
}
function isJson(str) {
try {
JSON.parse(str);
return true;
}
catch (_a) {
return false;
}
}
function isNumeric(str) {
return !isNaN(Number(str)) && !isNaN(parseFloat(str)) && isFinite(Number(str));
}
function isAlpha(str, locale) {
if (locale) {
const localeRegexes = {
'en': /^[a-zA-Z]+$/,
'es': /^[a-zA-ZáéíóúüñÁÉÍÓÚÜÑ]+$/,
'fr': /^[a-zA-ZàâäéèêëïîôöùûüÿçÀÂÄÉÈÊËÏÎÔÖÙÛÜŸÇ]+$/,
'de': /^[a-zA-ZäöüßÄÖÜ]+$/,
'it': /^[a-zA-ZàèéìíîòóùúÀÈÉÌÍÎÒÓÙÚ]+$/,
'pt': /^[a-zA-ZáàâãéêíóôõúçÁÀÂÃÉÊÍÓÔÕÚÇ]+$/
};
const regex = localeRegexes[locale];
if (regex) {
return regex.test(str);
}
}
return /^[a-zA-Z]+$/.test(str);
}
function isAlphanumeric(str, locale) {
if (locale) {
const localeRegexes = {
'en': /^[a-zA-Z0-9]+$/,
'es': /^[a-zA-Z0-9áéíóúüñÁÉÍÓÚÜÑ]+$/,
'fr': /^[a-zA-Z0-9àâäéèêëïîôöùûüÿçÀÂÄÉÈÊËÏÎÔÖÙÛÜŸÇ]+$/,
'de': /^[a-zA-Z0-9äöüßÄÖÜ]+$/,
'it': /^[a-zA-Z0-9àèéìíîòóùúÀÈÉÌÍÎÒÓÙÚ]+$/,
'pt': /^[a-zA-Z0-9áàâãéêíóôõúçÁÀÂÃÉÊÍÓÔÕÚÇ]+$/
};
const regex = localeRegexes[locale];
if (regex) {
return regex.test(str);
}
}
return /^[a-zA-Z0-9]+$/.test(str);
}
function isEmpty(str, options = {}) {
const { ignoreWhitespace = false } = options;
if (ignoreWhitespace) {
return str.trim().length === 0;
}
return str.length === 0;
}