UNPKG

@puq/names

Version:

The library provides a useful function to create all casing variants of a given string value such as title-case, pascal-case, snake-case and so more.

63 lines (62 loc) 1.96 kB
import { InvalidNameError } from '@puq/errors'; import { trim } from './trim.js'; export const VALID_NAME_EXP = ()=>/^[a-zA-Z\-_]{1,}[a-zA-Z\-_\s]{1,}$/; export const HAS_UPPER_CASE_EXP = ()=>/[A-Z]{1,}/; export const HAS_LOWER_CASE_EXP = ()=>/[a-z]{1,}/; export const HAS_UNDER_SCORE_EXP = ()=>/[_]{1,}/; export const HAS_DASH_EXP = ()=>/[-]{1,}/; export function isValidName(name) { return VALID_NAME_EXP().test(name); } export function isValidNameOrThrow(name) { if (!isValidName(name)) { throw new InvalidNameError(name, VALID_NAME_EXP().source); } return true; } export function hasUpperCase(name) { return HAS_UPPER_CASE_EXP().test(name); } export function hasLowerCase(name) { return HAS_LOWER_CASE_EXP().test(name); } export function hasUnderScore(name) { return HAS_UNDER_SCORE_EXP().test(name); } export function hasDash(name) { return HAS_DASH_EXP().test(name); } export function hasUpperCaseAndLowerCase(name) { return [ hasUpperCase, hasLowerCase ].map((f)=>f(name)).every((v)=>v == true); } export function upperCaseFirst(name) { return name[0].toUpperCase() + name.slice(1); } export function lowerCaseFirst(name) { return name[0].toLowerCase() + name.slice(1); } /** * Normalize the given {@link name} by transforming into lowercase and replace delimeters with a single space * @param name string * @returns normalized name in the lowercase and space seperated string */ export function normalizeName(name) { name = trim(name); isValidNameOrThrow(name); if (hasUpperCaseAndLowerCase(name)) { name = name.split('').map((v, i)=>{ if (i > 0) { if (/^[A-Z]$/.test(v)) { return '-' + v; } } return v; }).join(''); } name = name.replace(/[\s-_]{1,}/g, ' '); name = name.toLowerCase(); return name; } //# sourceMappingURL=normalize-name.js.map