string/kebabCase.js

import capitalize from './capitalize.js';

const kebab = (str) => {
  const parts =
    str
      ?.replace(/([A-Z])+/g, capitalize)
      ?.split(/(?=[A-Z])|[.\-\s_]/)
      .map((x) => x.toLowerCase()) ?? [];
  if (parts.length === 0) return '';
  if (parts.length === 1) return parts[0];
  return parts.reduce((acc, part) => {
    return `${acc}-${part.toLowerCase()}`;
  });
};

/**
 * 字符串转换为短横线命名(kebab-case)风格
 * 
 * @description 将驼峰命名、下划线命名等风格的字符串转换为短横线命名风格。
 *              支持处理复杂的字符串格式,包括大小写混合、特殊分隔符等。
 *              常用于 CSS 类名、HTML 属性名等场景。
 * 
 * @category string
 * @alias string_kebabCase
 * @author xkloveme <xkloveme@gmail.com>
 * @since 0.1.0
 * 
 * @param {String} value - 需要转换的字符串
 * @param {String} [delimiter='/'] - 用于分割路径的分隔符,默认为 '/'
 * 
 * @returns {String} 转换后的短横线风格字符串
 * 
 * @throws {TypeError} 当输入不是字符串类型时抛出错误
 * 
 * @example
 * // 基本用法
 * kebabCase('helloWorld')
 * // => 'hello-world'
 * 
 * @example
 * // 处理下划线命名
 * kebabCase('hello_world_test')
 * // => 'hello-world-test'
 * 
 * @example
 * // 处理混合格式
 * kebabCase('HelloWorldTest')
 * // => 'hello-world-test'
 * 
 * @example
 * // 处理带分隔符的路径
 * kebabCase('user/profileInfo', '/')
 * // => 'user/profile-info'
 * 
 * @example
 * // 处理空值和边界情况
 * kebabCase('')           // => ''
 * kebabCase(null)         // => null
 * kebabCase(undefined)    // => undefined
 */
export default (value, delimiter = '/') => {
  if (value === undefined || value === null || value === '') return value;
  const data = value
    .split(delimiter)
    .map((v) => kebab(v))
    .join(delimiter);
  return data;
};