detect-case
Version:
Detects the casing of the input string (camelcase, lowercase, snakecase etc).
1 lines • 3.25 kB
Source Map (JSON)
{"version":3,"sources":["../index.ts"],"sourcesContent":["export const WORD_SPLIT_REGEX_STRICT = /([\\p{Lu}]+[\\p{Ll}]*|[\\p{Ll}]+|[\\p{N}]+)/gu;\nexport const WORD_SPLIT_REGEX = /([\\p{Lu}(.,-]+[\\p{Ll})]*|[\\p{Ll}()]+|[\\p{N}()]+)/gu;\n\nexport const splitString = (input: unknown, strict = true): string[] => {\n const regex = strict ? WORD_SPLIT_REGEX_STRICT : WORD_SPLIT_REGEX;\n return input ? (String(input).match(regex) || []).filter(Boolean) : [];\n};\n\nconst isPascalCase = (input: string): boolean => {\n return /^([A-Z][a-zA-Z]*)+$/.test(input);\n};\n\nexport const detectCase = (input: string): string => {\n if (typeof input !== 'string') {\n throw new TypeError('Expected input to be a string');\n }\n\n if (!input) return 'unknown';\n if (!/[a-z]/i.test(input)) return 'unknown';\n\n if (input.includes('_')) {\n if (/^([A-Z][A-Z0-9_]+)+$/.test(input)) return 'uppersnake';\n if (/^([a-z][a-z0-9_]+)+$/.test(input)) return 'snakecase';\n return 'mixedcase';\n }\n\n if (input.includes('-')) {\n if (/^([a-z][a-z0-9-]+)+$/.test(input)) return 'kebabcase';\n return 'mixedcase';\n }\n\n if (/^[a-z ]+$/.test(input)) return 'lowercase';\n if (/^[A-Z][A-Z0-9_]*$/.test(input)) return 'uppercase';\n\n const words = input.split(/\\s+/);\n if (words.length > 1 && words.every((word) => isPascalCase(word))) {\n return 'titlecase';\n }\n\n // The exception to previous is when the first word is a number\n // making the second word a candidate for pascal case\n if (words.length > 1 && (/^[0-9]+$/.test(words[0]) && isPascalCase(words[1]))) {\n return 'titlecase';\n }\n\n if (words.length > 1 && isPascalCase(words[0])) {\n return 'sentencecase';\n }\n\n if (isPascalCase(input)) return 'pascalcase';\n if (/^(?:[0-9]+\\s+)?(?:[A-Z]\\w*\\s+)+$/.test(input)) return 'titlecase';\n if (/^([a-z][a-z0-9]*[A-Z]+[a-z0-9]*)+$/.test(input)) return 'camelcase';\n if (/[.!?;:,](?!(?:\\s|$))/.test(input)) return 'unknown';\n return 'mixedcase';\n};\n\nexport default detectCase;\n"],"mappings":";;;;AAAO,IAAM,0BAA0B;AAChC,IAAM,mBAAmB;AAEzB,IAAM,cAAc,wBAAC,OAAgB,SAAS,SAAmB;AACtE,QAAM,QAAQ,SAAS,0BAA0B;AACjD,SAAO,SAAS,OAAO,KAAK,EAAE,MAAM,KAAK,KAAK,CAAC,GAAG,OAAO,OAAO,IAAI,CAAC;AACvE,GAH2B;AAK3B,IAAM,eAAe,wBAAC,UAA2B;AAC/C,SAAO,sBAAsB,KAAK,KAAK;AACzC,GAFqB;AAId,IAAM,aAAa,wBAAC,UAA0B;AACnD,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,IAAI,UAAU,+BAA+B;AAAA,EACrD;AAEA,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,CAAC,SAAS,KAAK,KAAK,EAAG,QAAO;AAElC,MAAI,MAAM,SAAS,GAAG,GAAG;AACvB,QAAI,uBAAuB,KAAK,KAAK,EAAG,QAAO;AAC/C,QAAI,uBAAuB,KAAK,KAAK,EAAG,QAAO;AAC/C,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,SAAS,GAAG,GAAG;AACvB,QAAI,uBAAuB,KAAK,KAAK,EAAG,QAAO;AAC/C,WAAO;AAAA,EACT;AAEA,MAAI,YAAY,KAAK,KAAK,EAAG,QAAO;AACpC,MAAI,oBAAoB,KAAK,KAAK,EAAG,QAAO;AAE5C,QAAM,QAAQ,MAAM,MAAM,KAAK;AAC/B,MAAI,MAAM,SAAS,KAAK,MAAM,MAAM,CAAC,SAAS,aAAa,IAAI,CAAC,GAAG;AACjE,WAAO;AAAA,EACT;AAIA,MAAI,MAAM,SAAS,MAAM,WAAW,KAAK,MAAM,CAAC,CAAC,KAAK,aAAa,MAAM,CAAC,CAAC,IAAI;AAC7E,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,SAAS,KAAK,aAAa,MAAM,CAAC,CAAC,GAAG;AAC9C,WAAO;AAAA,EACT;AAEA,MAAI,aAAa,KAAK,EAAG,QAAO;AAChC,MAAI,mCAAmC,KAAK,KAAK,EAAG,QAAO;AAC3D,MAAI,qCAAqC,KAAK,KAAK,EAAG,QAAO;AAC7D,MAAI,uBAAuB,KAAK,KAAK,EAAG,QAAO;AAC/C,SAAO;AACT,GA1C0B;AA4C1B,IAAO,gBAAQ;","names":[]}