{"version":3,"sources":["../../../src/createPhoneNumberUtils/index.ts"],"names":["i"],"mappings":"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","sourcesContent":["import type { PhoneNumberUtils } from '../types';\nimport type PhoneNumberData from '../types/PhoneNumberData';\nimport type ISO2 from '../types/ISO2';\nimport {\n  MASK_SYMBOL,\n  MAX_CALLING_CODE_LENGTH,\n  MAX_NUMBER_LENGTH,\n} from '../constants';\n\n/**\n * Generates utility functions for formatting, parsing, and managing international phone numbers\n * @param [prefix='+'] - Default prefix for country calling codes\n * @returns An object containing utility functions for phone number handling\n */\nconst createPhoneNumberUtils = (\n  data: PhoneNumberData[],\n  prefix = '+'\n): PhoneNumberUtils => {\n  const callingCodeDataMap = new Map<string, PhoneNumberData[]>();\n\n  const iso2DataMap = new Map<string, string>();\n\n  const iso2List: ISO2[] = [];\n\n  for (let i = 0; i < data.length; i++) {\n    const item = data[i];\n\n    const callingCode = String(item[0]);\n\n    const iso2 = item[1];\n\n    iso2List.push(iso2);\n\n    iso2DataMap.set(iso2, callingCode);\n\n    if (callingCodeDataMap.has(callingCode)) {\n      callingCodeDataMap.get(callingCode)!.push(item);\n    } else {\n      callingCodeDataMap.set(callingCode, [item]);\n    }\n  }\n\n  return {\n    iso2List,\n    setPrefix(newPrefix) {\n      prefix = newPrefix;\n    },\n    getCountryCode: iso2DataMap.get.bind(iso2DataMap),\n    toPhoneNumber(value, estimatedIso2) {\n      let countries: PhoneNumberData[] | undefined;\n\n      let countryCode: string = '';\n\n      const withPrefix = prefix && value.startsWith(prefix);\n\n      value = (withPrefix ? value.slice(prefix.length) : value).replace(\n        /\\D/g,\n        ''\n      );\n\n      for (\n        let i = Math.min(MAX_CALLING_CODE_LENGTH, value.length);\n        i > 0;\n        i--\n      ) {\n        countryCode = value.slice(0, i);\n\n        if (callingCodeDataMap.has(countryCode)) {\n          countries = callingCodeDataMap.get(countryCode)!;\n\n          break;\n        }\n      }\n\n      let nationalNumber = value.slice(countryCode.length);\n\n      let iso2: ISO2 | '' = '';\n\n      let formattedValue =\n        ((withPrefix || countryCode) && prefix) + countryCode;\n\n      if (countries) {\n        let countryData: PhoneNumberData;\n\n        const countriesCount = countries.length;\n\n        if (countriesCount == 1) {\n          countryData = countries[0];\n        } else {\n          let mainCountry: PhoneNumberData | undefined;\n\n          let estimatedCountry: PhoneNumberData | undefined;\n\n          for (let i = 0; i < countriesCount; i++) {\n            const item = countries[i];\n\n            if (item.length % 2) {\n              if ((item[item.length - 1] as RegExp).test(nationalNumber)) {\n                countryData = item;\n\n                break;\n              }\n\n              if (estimatedIso2 == item[1]) {\n                estimatedCountry = item;\n              }\n            } else {\n              mainCountry = item;\n            }\n          }\n\n          countryData ||=\n            estimatedCountry || mainCountry || countries[countriesCount - 1];\n        }\n\n        const formatsEnd = countryData.length - (countryData.length % 2);\n\n        iso2 = countryData[1];\n\n        nationalNumber = nationalNumber.slice(\n          0,\n          countryData[formatsEnd - 2] as number\n        );\n\n        if (nationalNumber) {\n          for (let i = 2; i < formatsEnd; i += 2) {\n            if (nationalNumber.length <= (countryData[i] as number)) {\n              const format = countryData[i + 1] as string;\n\n              formattedValue += ' ';\n\n              for (let i = 0, shift = 0; i < nationalNumber.length; i++) {\n                const p = format[i + shift];\n\n                if (p == MASK_SYMBOL) {\n                  formattedValue += nationalNumber[i];\n                } else {\n                  formattedValue += p + nationalNumber[i];\n\n                  shift++;\n                }\n              }\n\n              break;\n            }\n          }\n        }\n      } else {\n        nationalNumber = nationalNumber.slice(0, MAX_NUMBER_LENGTH);\n\n        formattedValue += nationalNumber;\n      }\n\n      return {\n        countryCode,\n        iso2,\n        nationalNumber,\n        formattedValue,\n      };\n    },\n  };\n};\n\nexport default createPhoneNumberUtils;\n"]}