{"version":3,"file":"count-rules.mjs","names":[],"sources":["../../../../../../localization/src/count-rules.ts"],"sourcesContent":["import { getLocalizationConfigurations } from \"./config\";\nimport { LanguageCountRules } from \"./types\";\n\n/**\n * Default count rules for English\n */\nconst defaultCountRules: LanguageCountRules = {\n  negative: (n: number) => n < 0,\n  zero: (n: number) => n === 0,\n  one: (n: number) => n === 1,\n  two: (n: number) => n === 2,\n  three: (n: number) => n === 3,\n  many: (n: number) => n > 3,\n  other: () => true,\n};\n\n/**\n * Arabic count rules\n * Following Arabic plural rules: zero, one, two, few (3-10), many (11+), other\n */\nconst arabicCountRules: LanguageCountRules = {\n  negative: (n: number) => n < 0,\n  zero: (n: number) => n === 0,\n  one: (n: number) => n === 1,\n  two: (n: number) => n === 2,\n  few: (n: number) => {\n    const mod100 = Math.abs(n) % 100;\n    return mod100 >= 3 && mod100 <= 10;\n  },\n  many: (n: number) => {\n    const mod100 = Math.abs(n) % 100;\n    return mod100 >= 11 && mod100 <= 99;\n  },\n  other: () => true,\n};\n\n/**\n * Built-in count rules for common languages\n */\nconst builtInRules = {\n  en: defaultCountRules,\n  ar: arabicCountRules,\n};\n\n/**\n * Get count rules for the given locale code\n */\nexport function getCountRules(localeCode: string): LanguageCountRules {\n  const config = getLocalizationConfigurations();\n\n  // Check for custom rules in config\n  if (config.countRules?.[localeCode]) {\n    return config.countRules[localeCode];\n  }\n\n  // Check for built-in rules\n  if (builtInRules[localeCode]) {\n    return builtInRules[localeCode];\n  }\n\n  // Fallback to default rules\n  return defaultCountRules;\n}\n\n/**\n * Get the appropriate count key suffix based on the count value and locale rules\n */\nexport function getCountKey(count: number, localeCode: string): string {\n  const rules = getCountRules(localeCode);\n  const config = getLocalizationConfigurations();\n  const absCount = Math.abs(count);\n\n  // Handle negative numbers first\n  if (count < 0 && typeof rules.negative === 'function') {\n    return \"_negative\";\n  }\n\n  // Handle range-based counts if enabled\n  if (config.countRanges?.enabled) {\n    const separator = config.countRanges.separator || \"_\";\n    // Custom thresholds via config; fall back to the documented defaults so\n    // existing consumers see no behavior change when `ranges` is unset.\n    const ranges: Array<[number, number]> = config.countRanges.ranges || [\n      [0, 5],\n      [6, 20],\n      [21, Infinity],\n    ];\n\n    for (const [min, max] of ranges) {\n      if (absCount >= min && absCount <= max) {\n        const maxKey = max === Infinity ? \"plus\" : String(max);\n        return `_range${separator}${min}${separator}${maxKey}`;\n      }\n    }\n  }\n\n  // Apply regular count rules\n  for (const [key, rule] of Object.entries(rules)) {\n    if (key !== 'negative' && rule(absCount)) {\n      return `_${key}`;\n    }\n  }\n\n  return \"_other\";\n}\n\n/**\n * Format count value based on configuration\n */\nexport function formatCount(count: number): string | number {\n  return Math.abs(count);\n}\n"],"mappings":";;;;;;AAMA,MAAM,oBAAwC;CAC5C,WAAW,MAAc,IAAI;CAC7B,OAAO,MAAc,MAAM;CAC3B,MAAM,MAAc,MAAM;CAC1B,MAAM,MAAc,MAAM;CAC1B,QAAQ,MAAc,MAAM;CAC5B,OAAO,MAAc,IAAI;CACzB,aAAa;AACf;;;;AAyBA,MAAM,eAAe;CACnB,IAAI;CACJ,IAAI;EApBJ,WAAW,MAAc,IAAI;EAC7B,OAAO,MAAc,MAAM;EAC3B,MAAM,MAAc,MAAM;EAC1B,MAAM,MAAc,MAAM;EAC1B,MAAM,MAAc;GAClB,MAAM,SAAS,KAAK,IAAI,CAAC,IAAI;GAC7B,OAAO,UAAU,KAAK,UAAU;EAClC;EACA,OAAO,MAAc;GACnB,MAAM,SAAS,KAAK,IAAI,CAAC,IAAI;GAC7B,OAAO,UAAU,MAAM,UAAU;EACnC;EACA,aAAa;CAQM;AACrB;;;;AAKA,SAAgB,cAAc,YAAwC;CACpE,MAAM,SAAS,8BAA8B;CAG7C,IAAI,OAAO,aAAa,aACtB,OAAO,OAAO,WAAW;CAI3B,IAAI,aAAa,aACf,OAAO,aAAa;CAItB,OAAO;AACT;;;;AAKA,SAAgB,YAAY,OAAe,YAA4B;CACrE,MAAM,QAAQ,cAAc,UAAU;CACtC,MAAM,SAAS,8BAA8B;CAC7C,MAAM,WAAW,KAAK,IAAI,KAAK;CAG/B,IAAI,QAAQ,KAAK,OAAO,MAAM,aAAa,YACzC,OAAO;CAIT,IAAI,OAAO,aAAa,SAAS;EAC/B,MAAM,YAAY,OAAO,YAAY,aAAa;EAGlD,MAAM,SAAkC,OAAO,YAAY,UAAU;GACnE,CAAC,GAAG,CAAC;GACL,CAAC,GAAG,EAAE;GACN,CAAC,IAAI,QAAQ;EACf;EAEA,KAAK,MAAM,CAAC,KAAK,QAAQ,QACvB,IAAI,YAAY,OAAO,YAAY,KAEjC,OAAO,SAAS,YAAY,MAAM,YADnB,QAAQ,WAAW,SAAS,OAAO,GAAG;CAI3D;CAGA,KAAK,MAAM,CAAC,KAAK,SAAS,OAAO,QAAQ,KAAK,GAC5C,IAAI,QAAQ,cAAc,KAAK,QAAQ,GACrC,OAAO,IAAI;CAIf,OAAO;AACT;;;;AAKA,SAAgB,YAAY,OAAgC;CAC1D,OAAO,KAAK,IAAI,KAAK;AACvB"}