{"version":3,"sources":["../src/index.ts"],"sourcesContent":["const FallbackKey = '@@fallback' as const\nconst FallbackPlaceholder = '\\u2007'\n\ntype PaddingRule = {\n  test: RegExp | ((char: string) => boolean) | typeof FallbackKey\n  placeholder: string\n}\n\nconst DefaultPaddingMap: Record<string, PaddingRule> = {\n  cjk: {\n    test: (char: string) => isCJK(char),\n    placeholder: '\\u2001',\n  },\n  [FallbackKey]: {\n    test: FallbackKey,\n    placeholder: FallbackPlaceholder,\n  },\n}\n\nfunction isCJK(char: string) {\n  const cjkRanges = [\n    // Chinese (Hanzi) ranges\n    [0x4e00, 0x9fff], // CJK Unified Ideographs\n    [0x3400, 0x4dbf], // CJK Unified Ideographs Extension A\n    [0x20000, 0x2a6df], // CJK Unified Ideographs Extension B\n    [0x2a700, 0x2b73f], // CJK Unified Ideographs Extension C\n    [0x2b740, 0x2b81f], // CJK Unified Ideographs Extension D\n    [0x2b820, 0x2ceaf], // CJK Unified Ideographs Extension E\n    [0xf900, 0xfaff], // CJK Compatibility Ideographs\n    [0x2f800, 0x2fa1f], // CJK Compatibility Ideographs Supplement\n\n    // Japanese ranges\n    [0x3040, 0x309f], // Hiragana\n    [0x30a0, 0x30ff], // Katakana\n    [0x31f0, 0x31ff], // Katakana Phonetic Extensions\n\n    // Korean ranges\n    [0xac00, 0xd7a3], // Hangul Syllables\n    [0x1100, 0x11ff], // Hangul Jamo\n    [0x3130, 0x318f], // Hangul Compatibility Jamo\n  ]\n\n  const charCode = char.codePointAt(0)!\n\n  return cjkRanges.some(([start, end]) => charCode >= start && charCode <= end)\n}\n\nfunction countChars(\n  str: string,\n  rules: Record<string, PaddingRule>\n): Record<string, number> {\n  const counts: Record<string, number> = {\n    [FallbackKey]: 0,\n  }\n\n  Object.keys(rules).forEach(key => (counts[key] = 0))\n\n  for (const char of str) {\n    let matched = false\n    for (const [key, rule] of Object.entries(rules)) {\n      if (key === FallbackKey || rule.test === FallbackKey) {\n        continue\n      }\n\n      if (\n        typeof rule.test === 'function' ? rule.test(char) : rule.test.test(char)\n      ) {\n        counts[key]++\n        matched = true\n        break\n      }\n    }\n\n    if (!matched) {\n      counts[FallbackKey]++\n    }\n  }\n\n  return counts\n}\n\nfunction findMaxCounts(\n  counts: Record<string, number>[]\n): Record<string, number> {\n  const maxCounts: Record<string, number> = {}\n\n  for (const count of counts) {\n    Object.keys(count).forEach(key => {\n      maxCounts[key] = Math.max(maxCounts[key] || 0, count[key])\n    })\n  }\n\n  return maxCounts\n}\n\n/**\n * Aligns an array of strings by adding spaces to each string so that all strings have the same number of English and Chinese characters.\n *\n * @param {string[]} strings - An array of strings to be aligned.\n * @param {Record<string, PaddingRule | string>} paddingMap - A map of padding rules for different character types.\n * @returns {string[]} - An array of aligned strings with added spaces.\n */\nexport function alignText(\n  strings: string[],\n  paddingMap: Record<string, PaddingRule | string> = DefaultPaddingMap\n): string[] {\n  const normalizedPaddingMap: Record<string, PaddingRule> = {}\n\n  for (const [key, value] of Object.entries(paddingMap)) {\n    if (typeof value === 'string') {\n      if (!DefaultPaddingMap[key]) {\n        continue\n      }\n\n      normalizedPaddingMap[key] = {\n        test: DefaultPaddingMap[key]?.test,\n        placeholder: value,\n      }\n      continue\n    }\n\n    normalizedPaddingMap[key] = value\n  }\n\n  normalizedPaddingMap[FallbackKey] ??= {\n    test: FallbackKey,\n    placeholder: FallbackPlaceholder,\n  }\n\n  const counts = strings.map(str => countChars(str, normalizedPaddingMap))\n  const maxCounts = findMaxCounts(counts)\n\n  return strings.map((str, index) => {\n    const currentCounts = counts[index]\n    let result = str\n\n    for (const [key, count] of Object.entries(maxCounts)) {\n      const diff = count - currentCounts[key]\n      result += normalizedPaddingMap[key].placeholder.repeat(diff)\n    }\n\n    return result\n  })\n}\n"],"mappings":"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","names":[]}