{"version":3,"sources":["../../src/phone/constants.ts","../../src/phone/validate.ts","../../src/phone/utils.ts","../../src/phone/format.ts","../../src/phone/links.ts","../../src/phone/parse.ts","../../src/phone/errors.ts"],"names":["startPart","endPart","masked"],"mappings":"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","file":"index.cjs","sourcesContent":["import { OperatorName } from './types';\n\n/**\n * Phone number constants for Indonesian operators and area codes.\n *\n * Data sources:\n * - Operator prefixes: Official operator documentation and Wikipedia\n * - Area codes: Ministry of Communication and Information Technology (Kemendagri)\n *\n * Last updated: December 2025\n *\n * @see {@link https://en.wikipedia.org/wiki/Telephone_numbers_in_Indonesia Wikipedia - Telephone numbers in Indonesia}\n * @internal\n */\n\n/**\n * Mobile operator prefix mapping.\n *\n * Maps 4-digit prefixes (e.g., '0812') to operator names.\n * Used for operator detection in mobile numbers.\n *\n * **Important Notes:**\n * - Tri (3 Indonesia) has merged with Indosat as of 2024\n * - Axis has been acquired by XL but maintains separate branding\n * - Some operators have both prepaid and postpaid services\n *\n * @example\n * ```typescript\n * OPERATOR_PREFIXES['0812']; // 'Telkomsel'\n * OPERATOR_PREFIXES['0817']; // 'XL'\n * OPERATOR_PREFIXES['0895']; // 'Indosat'\n * ```\n *\n * @internal\n */\nexport const OPERATOR_PREFIXES: Record<string, OperatorName> = {\n  // Telkomsel (Halo, Simpati, by.U)\n  '0811': 'Telkomsel',\n  '0812': 'Telkomsel',\n  '0813': 'Telkomsel',\n  '0821': 'Telkomsel',\n  '0822': 'Telkomsel',\n  '0823': 'Telkomsel',\n  '0851': 'Telkomsel',\n  '0852': 'Telkomsel',\n  '0853': 'Telkomsel',\n\n  // XL Axiata (XL Prepaid, XL Prioritas, LIVE.ON)\n  '0817': 'XL',\n  '0818': 'XL',\n  '0819': 'XL',\n  '0859': 'XL',\n  '0877': 'XL',\n  '0878': 'XL',\n  '0879': 'XL',\n\n  // Indosat Ooredoo (IM3, Mentari)\n  // Note: Tri (3 Indonesia) merged with Indosat\n  '0814': 'Indosat',\n  '0815': 'Indosat',\n  '0816': 'Indosat',\n  '0855': 'Indosat',\n  '0856': 'Indosat',\n  '0857': 'Indosat',\n  '0858': 'Indosat',\n  '0895': 'Indosat',\n  '0896': 'Indosat',\n  '0897': 'Indosat',\n  '0898': 'Indosat',\n  '0899': 'Indosat',\n\n  // Smartfren (Smartfren Power Up)\n  '0881': 'Smartfren',\n  '0882': 'Smartfren',\n  '0883': 'Smartfren',\n  '0884': 'Smartfren',\n  '0885': 'Smartfren',\n  '0886': 'Smartfren',\n  '0887': 'Smartfren',\n  '0888': 'Smartfren',\n  '0889': 'Smartfren',\n\n  // Axis (Acquired by XL but maintains separate branding)\n  '0831': 'Axis',\n  '0832': 'Axis',\n  '0833': 'Axis',\n  '0838': 'Axis',\n} as const;\n\n/**\n * Landline area code mapping.\n *\n * Maps area codes to city/region names for landline numbers.\n * Includes both 3-digit (e.g., '021') and 4-digit (e.g., '0274') codes.\n *\n * This mapping covers all provinces in Indonesia including:\n * - Jakarta, Banten, West Java, Central Java, Yogyakarta\n * - East Java, Bali, Nusa Tenggara\n * - Sulawesi, Kalimantan\n * - Sumatra, Maluku, Papua\n *\n * @example\n * ```typescript\n * AREA_CODES['021']; // 'Jakarta'\n * AREA_CODES['0274']; // 'Yogyakarta'\n * AREA_CODES['0361']; // 'Denpasar'\n * ```\n *\n * @internal\n */\nexport const AREA_CODES: Record<string, string> = {\n  // ========================================\n  // JAKARTA, BANTEN & WEST JAVA\n  // ========================================\n\n  // Jakarta & Greater Jakarta\n  '021': 'Jakarta',\n\n  // Banten\n  '0252': 'Lebak',\n  '0253': 'Pandeglang',\n  '0254': 'Cilegon & Serang',\n\n  // West Java\n  '022': 'Bandung',\n  '0231': 'Cirebon',\n  '0232': 'Kuningan',\n  '0233': 'Majalengka',\n  '0234': 'Indramayu',\n  '0251': 'Bogor',\n  '0260': 'Subang',\n  '0261': 'Sumedang',\n  '0262': 'Garut',\n  '0263': 'Cianjur',\n  '0264': 'Purwakarta',\n  '0265': 'Tasikmalaya',\n  '0266': 'Sukabumi',\n  '0267': 'Karawang',\n\n  // ========================================\n  // CENTRAL JAVA & YOGYAKARTA\n  // ========================================\n\n  // Central Java\n  '024': 'Semarang',\n  '0271': 'Solo',\n  '0272': 'Klaten',\n  '0273': 'Wonogiri',\n  '0275': 'Purworejo',\n  '0276': 'Boyolali',\n  '0280': 'Cilacap',\n  '0281': 'Banyumas & Purbalingga',\n  '0282': 'Cilacap',\n  '0283': 'Tegal & Brebes',\n  '0284': 'Pemalang',\n  '0285': 'Pekalongan',\n  '0286': 'Banjarnegara & Wonosobo',\n  '0287': 'Kebumen',\n  '0289': 'Bumiayu',\n  '0291': 'Kudus & Jepara',\n  '0292': 'Grobogan',\n  '0293': 'Magelang',\n  '0294': 'Kendal',\n  '0295': 'Pati & Rembang',\n  '0296': 'Blora',\n  '0297': 'Karimun Jawa',\n  '0298': 'Salatiga',\n\n  // Yogyakarta\n  '0274': 'Yogyakarta',\n\n  // ========================================\n  // EAST JAVA, BALI & NUSA TENGGARA\n  // ========================================\n\n  // East Java\n  '031': 'Surabaya',\n  '0321': 'Mojokerto & Jombang',\n  '0322': 'Lamongan',\n  '0323': 'Sampang',\n  '0324': 'Pamekasan',\n  '0325': 'Bawean',\n  '0326': 'Masalembu',\n  '0327': 'Kangean',\n  '0328': 'Sumenep',\n  '0331': 'Jember',\n  '0332': 'Bondowoso',\n  '0333': 'Banyuwangi',\n  '0334': 'Lumajang',\n  '0335': 'Probolinggo',\n  '0336': 'Jember',\n  '0338': 'Situbondo',\n  '0341': 'Malang',\n  '0342': 'Blitar',\n  '0343': 'Pasuruan',\n  '0351': 'Madiun',\n  '0352': 'Ponorogo',\n  '0353': 'Bojonegoro',\n  '0354': 'Kediri',\n  '0355': 'Tulungagung',\n  '0356': 'Tuban',\n  '0357': 'Pacitan',\n  '0358': 'Nganjuk',\n\n  // Bali\n  '0361': 'Denpasar',\n  '0362': 'Singaraja',\n  '0363': 'Amlapura',\n  '0365': 'Negara',\n  '0366': 'Tabanan',\n  '0368': 'Gianyar',\n\n  // Nusa Tenggara Barat (NTB)\n  '0370': 'Mataram',\n  '0371': 'Sumbawa',\n  '0372': 'West Sumbawa',\n  '0373': 'Dompu',\n  '0374': 'Bima',\n  '0376': 'East Lombok',\n\n  // Nusa Tenggara Timur (NTT)\n  '0379': 'Alor',\n  '0380': 'Kupang',\n  '0381': 'Ende',\n  '0382': 'Sikka',\n  '0383': 'East Flores',\n  '0384': 'Ngada',\n  '0385': 'Manggarai',\n  '0386': 'West Manggarai',\n  '0387': 'Sumba',\n  '0388': 'North & South Central Timor',\n  '0389': 'Belu',\n\n  // ========================================\n  // SULAWESI\n  // ========================================\n\n  // South Sulawesi\n  '0410': 'Pangkajene',\n  '0411': 'Makassar',\n  '0413': 'Bantaeng & Bulukumba',\n  '0414': 'Selayar',\n  '0417': 'Malino',\n  '0418': 'Takalar',\n  '0419': 'Jeneponto',\n  '0420': 'Enrekang',\n  '0421': 'Pare Pare',\n  '0423': 'Tana Toraja',\n  '0427': 'Barru',\n  '0471': 'Luwu',\n  '0472': 'Wajo (Pitumpanua)',\n  '0473': 'North Luwu',\n  '0474': 'East Luwu',\n  '0475': 'Sorowako',\n  '0481': 'Bone',\n  '0482': 'Sinjai',\n  '0484': 'Soppeng',\n  '0485': 'Wajo',\n\n  // West Sulawesi\n  '0422': 'Majene',\n  '0426': 'Mamuju',\n  '0428': 'Polewali',\n  '0429': 'Central Mamuju',\n\n  // Central Sulawesi\n  '0409': 'Morowali',\n  '0445': 'Buol',\n  '0450': 'Parigi Moutong',\n  '0451': 'Palu',\n  '0452': 'Poso',\n  '0453': 'Toli-Toli',\n  '0454': 'Tinombo',\n  '0455': 'Moutong',\n  '0457': 'Donggala',\n  '0458': 'Tentena',\n  '0461': 'Banggai',\n  '0462': 'Banggai Island',\n  '0463': 'Bunta',\n  '0464': 'Tojo Una-Una',\n  '0465': 'North Morowali',\n\n  // Southeast Sulawesi\n  '0401': 'Kendari',\n  '0402': 'Buton',\n  '0403': 'Muna',\n  '0404': 'Wakatobi',\n  '0405': 'Kolaka',\n  '0408': 'Konawe',\n\n  // North Sulawesi\n  '0430': 'South Minahasa',\n  '0431': 'Manado',\n  '0432': 'Sangihe',\n  '0433': 'Talaud',\n  '0434': 'Bolaang Mongondow',\n  '0438': 'Bitung',\n\n  // Gorontalo\n  '0435': 'Gorontalo',\n  '0442': 'North Gorontalo',\n  '0443': 'Pohuwato',\n\n  // ========================================\n  // KALIMANTAN\n  // ========================================\n\n  // West Kalimantan\n  '0534': 'Ketapang',\n  '0535': 'Kayong Utara',\n  '0561': 'Pontianak',\n  '0562': 'Sambas & Singkawang',\n  '0563': 'Landak',\n  '0564': 'Sanggau',\n  '0565': 'Sintang',\n  '0567': 'Kapuas Hulu',\n  '0568': 'Melawi',\n\n  // Central Kalimantan\n  '0513': 'Kapuas',\n  '0519': 'North Barito',\n  '0526': 'South & East Barito',\n  '0528': 'Murung Raya',\n  '0531': 'East Kotawaringin',\n  '0532': 'West Kotawaringin',\n  '0536': 'Palangka Raya',\n  '0537': 'Gunung Mas',\n  '0538': 'Seruyan',\n  '0539': 'Seruyan & East Kotawaringin',\n\n  // South Kalimantan\n  '0511': 'Banjarmasin',\n  '0512': 'Tanah Laut',\n  '0517': 'Hulu Sungai Selatan',\n  '0518': 'Tanah Bumbu',\n  '0527': 'Hulu Sungai Utara',\n\n  // East Kalimantan\n  '0541': 'Samarinda',\n  '0542': 'Balikpapan',\n  '0543': 'Paser',\n  '0545': 'West Kutai',\n  '0548': 'Bontang',\n  '0549': 'East Kutai',\n  '0554': 'Berau',\n\n  // North Kalimantan\n  '0551': 'Tarakan',\n  '0552': 'Bulungan',\n  '0553': 'Malinau',\n  '0556': 'Nunukan',\n\n  // ========================================\n  // SUMATRA\n  // ========================================\n\n  // Aceh\n  '0627': 'Subulussalam & Dairi (North Sumatra)',\n  '0629': 'Southeast Aceh',\n  '0641': 'Langsa',\n  '0642': 'Gayo Lues',\n  '0643': 'Central Aceh',\n  '0644': 'Bireuen',\n  '0645': 'Lhokseumawe',\n  '0646': 'East Aceh',\n  '0650': 'Simeulue',\n  '0651': 'Banda Aceh',\n  '0652': 'Sabang',\n  '0653': 'Pidie',\n  '0654': 'Aceh Jaya',\n  '0655': 'West Aceh',\n  '0656': 'South Aceh',\n  '0657': 'South Aceh',\n  '0658': 'Singkil',\n  '0659': 'Southwest Aceh',\n\n  // North Sumatra\n  '061': 'Medan',\n  '0620': 'Pangkalan Brandan',\n  '0621': 'Tebing Tinggi',\n  '0622': 'Pematang Siantar',\n  '0623': 'Asahan',\n  '0624': 'Labuhan Batu',\n  '0625': 'Parapat',\n  '0626': 'Samosir',\n  // '0627': 'Dairi', // for this prefix, it same with Subulussalam (Aceh)\n  '0628': 'Karo',\n  '0630': 'South Nias',\n  '0631': 'Sibolga',\n  '0632': 'Toba Samosir',\n  '0633': 'North Tapanuli',\n  '0634': 'Padang Sidempuan',\n  '0635': 'South Tapanuli',\n  '0636': 'Mandailing Natal',\n  '0638': 'Barus',\n  '0639': 'Nias',\n\n  // West Sumatra\n  '0751': 'Padang',\n  '0752': 'Bukittinggi',\n  '0753': 'Pasaman',\n  '0754': 'Sawahlunto',\n  '0755': 'Solok',\n  '0756': 'South Pesisir',\n  '0757': 'South Pesisir',\n  '0759': 'Mentawai',\n\n  // Riau\n  '0760': 'Kuantan Singingi',\n  '0761': 'Pekanbaru',\n  '0762': 'Kampar',\n  '0763': 'Bengkalis',\n  '0764': 'Siak',\n  '0765': 'Dumai',\n  '0766': 'Bengkalis',\n  '0767': 'Rokan Hulu',\n  '0768': 'Indragiri Hilir',\n  '0769': 'Indragiri Hulu',\n\n  // Riau Islands\n  '0770': 'Muka Kuning Batamindo',\n  '0771': 'Tanjungpinang',\n  '0772': 'Anambas',\n  '0773': 'Natuna',\n  '0776': 'Lingga',\n  '0777': 'Great Karimun',\n  '0778': 'Batam',\n  '0779': 'Kundur',\n\n  // Jambi\n  '0741': 'Jambi',\n  '0742': 'West Tanjung Jabung',\n  '0743': 'Batanghari',\n  '0744': 'Tebo',\n  '0745': 'Sarolangun',\n  '0746': 'Merangin',\n  '0747': 'Bungo',\n  '0748': 'Kerinci',\n\n  // South Sumatra\n  '0702': 'Empat Lawang',\n  '0711': 'Palembang',\n  '0712': 'Ogan Komering Ilir',\n  '0713': 'Prabumulih',\n  '0714': 'Musi Banyuasin',\n  '0730': 'Pagar Alam',\n  '0731': 'Lahat',\n  '0733': 'Lubuklinggau',\n  '0734': 'Muara Enim',\n  '0735': 'Ogan Komering Ulu',\n\n  // Bangka Belitung\n  '0715': 'Belinyu',\n  '0716': 'West Bangka',\n  '0717': 'Pangkal Pinang',\n  '0718': 'Central & South Bangka',\n  '0719': 'Belitung',\n\n  // Bengkulu\n  '0732': 'Rejang Lebong',\n  '0736': 'Bengkulu',\n  '0737': 'North Bengkulu',\n  '0739': 'South Bengkulu',\n\n  // Lampung\n  '0721': 'Bandar Lampung',\n  '0722': 'Tanggamus',\n  '0723': 'Way Kanan',\n  '0724': 'North Lampung',\n  '0725': 'Metro',\n  '0726': 'Tulang Bawang',\n  '0727': 'South Lampung',\n  '0728': 'West Lampung',\n  '0729': 'Pringsewu',\n\n  // ========================================\n  // MALUKU & PAPUA\n  // ========================================\n\n  // Maluku\n  '0910': 'Ambon',\n  '0911': 'Southeast Maluku',\n  '0913': 'Tual',\n  '0914': 'Saumlaki',\n  '0916': 'Namlea',\n  '0918': 'Ternate',\n  '0921': 'Sanana',\n  '0924': 'Tobelo',\n\n  // Papua & West Papua\n  '0901': 'Timika',\n  '0902': 'Agats',\n  '0951': 'Sorong',\n  '0952': 'South Sorong',\n  '0967': 'Manokwari',\n  '0969': 'Sorong',\n  '0971': 'Merauke',\n  '0975': 'Boven Digoel',\n  '0979': 'Tembagapura',\n  '0981': 'Jayapura',\n  '0986': 'Wamena',\n} as const;\n\n/**\n * Valid mobile number prefixes (first 4 digits after country code).\n *\n * Used for quick validation without operator detection.\n *\n * @internal\n */\nexport const VALID_MOBILE_PREFIXES = Object.keys(OPERATOR_PREFIXES);\n\n/**\n * Valid area codes for landline numbers.\n *\n * Used for landline validation.\n *\n * @internal\n */\nexport const VALID_AREA_CODES = Object.keys(AREA_CODES);\n","import { OPERATOR_PREFIXES, AREA_CODES } from './constants';\n\n/**\n * Validates an Indonesian phone number format.\n *\n * Accepts multiple input formats:\n * - National format: 08xx-xxxx-xxxx or 08xxxxxxxxxx\n * - International with +: +62 8xx-xxxx-xxxx or +628xxxxxxxxxx\n * - International without +: 62 8xx-xxxx-xxxx or 628xxxxxxxxxx\n *\n * For mobile numbers, validates:\n * - Starts with 08 (national) or 628 (international)\n * - Has valid operator prefix (0811, 0812, 0817, etc.)\n * - Total length is 10-13 digits (after removing non-digits)\n *\n * For landline numbers, validates:\n * - Starts with 0 followed by area code (021, 022, etc.)\n * - Total length is appropriate for landline\n *\n * @param phone - The phone number string to validate\n * @returns `true` if the phone number is valid, `false` otherwise\n *\n * @example\n * Valid mobile number (national):\n * ```typescript\n * validatePhoneNumber('081234567890'); // true\n * ```\n *\n * @example\n * Valid mobile number (international):\n * ```typescript\n * validatePhoneNumber('+6281234567890'); // true\n * validatePhoneNumber('6281234567890'); // true\n * ```\n *\n * @example\n * With separators:\n * ```typescript\n * validatePhoneNumber('0812-3456-7890'); // true\n * validatePhoneNumber('+62 812-3456-7890'); // true\n * ```\n *\n * @example\n * Invalid numbers:\n * ```typescript\n * validatePhoneNumber('1234'); // false - too short\n * validatePhoneNumber('08001234567'); // false - invalid prefix\n * validatePhoneNumber('+1234567890'); // false - wrong country code\n * ```\n *\n * @public\n */\nexport function validatePhoneNumber(phone: string): boolean {\n  if (!phone || typeof phone !== 'string') {\n    return false;\n  }\n\n  // Only allow digits, +, -, space, parentheses, dot\n  if (!/^[\\d\\s\\-+().]+$/.test(phone)) {\n    return false;\n  }\n\n  const cleaned = phone.replace(/[\\s\\-().]/g, '');\n\n  let normalized: string;\n\n  if (cleaned.startsWith('+62')) {\n    normalized = '0' + cleaned.substring(3);\n  } else if (cleaned.startsWith('62') && !cleaned.startsWith('620')) {\n    normalized = '0' + cleaned.substring(2);\n  } else if (cleaned.startsWith('0')) {\n    normalized = cleaned;\n  } else {\n    return false;\n  }\n\n  if (normalized.startsWith('08')) {\n    return validateMobileNumber(normalized);\n  }\n\n  if (normalized.startsWith('0')) {\n    return validateLandlineNumber(normalized);\n  }\n\n  return false;\n}\n\n/**\n * Validates a mobile phone number (08xx format).\n *\n * @param phone - Phone number in 08xx format\n * @returns true if valid mobile number\n * @internal\n */\nfunction validateMobileNumber(phone: string): boolean {\n  // Mobile numbers should be 10-13 digits\n  if (phone.length < 10 || phone.length > 13) {\n    return false;\n  }\n\n  // Check if prefix is valid (first 4 digits)\n  const prefix = phone.substring(0, 4);\n  if (!OPERATOR_PREFIXES[prefix]) {\n    return false;\n  }\n\n  // All digits should be numeric\n  if (!/^\\d+$/.test(phone)) {\n    return false;\n  }\n\n  return true;\n}\n\n/**\n * Validates a landline phone number.\n *\n * @param phone - Phone number in landline format\n * @returns true if valid landline number\n * @internal\n */\nfunction validateLandlineNumber(phone: string): boolean {\n  // Landline numbers typically 9-11 digits\n  if (phone.length < 9 || phone.length > 11) {\n    return false;\n  }\n\n  // Check common area codes (3 or 4 digits)\n  const areaCode3 = phone.substring(0, 3);\n  const areaCode4 = phone.substring(0, 4);\n\n  if (AREA_CODES[areaCode3] || AREA_CODES[areaCode4]) {\n    return true;\n  }\n\n  // If not in our area code list, check if it follows general pattern\n  // Landlines start with 0 followed by 2-4 digit area code\n  if (/^0[2-9]\\d{7,9}$/.test(phone)) {\n    return true;\n  }\n\n  return false;\n}\n\n/**\n * Checks if a phone number is a mobile number.\n *\n * @param phone - The phone number to check\n * @returns `true` if it's a mobile number (08xx), `false` otherwise\n *\n * @example\n * ```typescript\n * isMobileNumber('081234567890'); // true\n * isMobileNumber('+6281234567890'); // true\n * isMobileNumber('0212345678'); // false (landline)\n * ```\n *\n * @public\n */\nexport function isMobileNumber(phone: string): boolean {\n  if (!validatePhoneNumber(phone)) {\n    return false;\n  }\n\n  const cleaned = phone.replace(/[^\\d+]/g, '');\n  let normalized: string;\n\n  if (cleaned.startsWith('+62')) {\n    normalized = '0' + cleaned.substring(3);\n  } else if (cleaned.startsWith('62') && !cleaned.startsWith('620')) {\n    normalized = '0' + cleaned.substring(2);\n  } else {\n    normalized = cleaned;\n  }\n\n  return normalized.startsWith('08');\n}\n\n/**\n * Checks if a phone number is a landline number.\n *\n * @param phone - The phone number to check\n * @returns `true` if it's a landline number, `false` otherwise\n *\n * @example\n * ```typescript\n * isLandlineNumber('0212345678'); // true\n * isLandlineNumber('081234567890'); // false (mobile)\n * ```\n *\n * @public\n */\nexport function isLandlineNumber(phone: string): boolean {\n  if (!validatePhoneNumber(phone)) {\n    return false;\n  }\n\n  return !isMobileNumber(phone);\n}\n","import { AREA_CODES } from './constants';\n\n/**\n * Normalizes a cleaned phone number to national format (0xxx).\n *\n * Accepts pre-cleaned phone string (digits only, optional leading +).\n * Use `cleanPhoneNumber()` first if input may contain separators.\n *\n * @param phone - Cleaned phone number string\n * @returns Phone number in 08xx format, or empty string if invalid\n *\n * @example\n * ```typescript\n * normalizePhoneNumber('+6281234567890'); // '081234567890'\n * normalizePhoneNumber('6281234567890'); // '081234567890'\n * normalizePhoneNumber('081234567890'); // '081234567890'\n * ```\n *\n * @example\n * Invalid inputs return empty string:\n * ```typescript\n * normalizePhoneNumber(''); // ''\n * normalizePhoneNumber('620812345678'); // '' (620 is not valid country code pattern)\n * normalizePhoneNumber('invalid'); // ''\n * ```\n *\n * @public\n */\nexport function normalizePhoneNumber(phone: string): string {\n  if (!phone || typeof phone !== 'string') {\n    return '';\n  }\n\n  if (phone.startsWith('+62')) {\n    return '0' + phone.substring(3);\n  }\n\n  if (phone.startsWith('62') && !phone.startsWith('620')) {\n    return '0' + phone.substring(2);\n  }\n\n  if (phone.startsWith('0')) {\n    return phone;\n  }\n\n  return '';\n}\n\n/**\n * Compares two phone numbers regardless of format.\n *\n * Both inputs are normalized to E.164 format for comparison.\n * Returns false if either input is invalid.\n *\n * @param phoneA - First phone number in any format\n * @param phoneB - Second phone number in any format\n * @returns true if both represent the same number, false otherwise\n *\n * @example\n * Same number in different formats:\n * ```typescript\n * comparePhones('081234567890', '+6281234567890'); // true\n * comparePhones('0812-3456-7890', '6281234567890'); // true\n * ```\n *\n * @example\n * Different numbers:\n * ```typescript\n * comparePhones('081234567890', '081234567891'); // false\n * comparePhones('0212345678', '0221234567'); // false\n * ```\n *\n * @example\n * Invalid inputs return false:\n * ```typescript\n * comparePhones('invalid', '081234567890'); // false\n * comparePhones('', ''); // false\n * ```\n *\n * @public\n */\nexport function comparePhones(phoneA: string, phoneB: string): boolean {\n  if (typeof phoneA !== 'string' || typeof phoneB !== 'string') {\n    return false;\n  }\n\n  const cleanedA = phoneA.replace(/[^\\d+]/g, '');\n  const cleanedB = phoneB.replace(/[^\\d+]/g, '');\n\n  const normalizedA = normalizePhoneNumber(cleanedA);\n  const normalizedB = normalizePhoneNumber(cleanedB);\n\n  if (!normalizedA || !normalizedB) {\n    return false;\n  }\n\n  const e164A = '62' + normalizedA.substring(1);\n  const e164B = '62' + normalizedB.substring(1);\n\n  return e164A === e164B;\n}\n\n/**\n * Gets the region name for a landline number.\n *\n * Accepts phone number in any format (national, international, e164).\n *\n * @param phone - Landline phone number in any format\n * @returns Region name, or null if not found or if mobile number\n *\n * @example\n * ```typescript\n * getLandlineRegion('0212345678'); // 'Jakarta'\n * getLandlineRegion('+62212345678'); // 'Jakarta'\n * getLandlineRegion('081234567890'); // null (mobile)\n * ```\n *\n * @public\n */\nexport function getLandlineRegion(phone: string): string | null {\n  if (!phone || typeof phone !== 'string') {\n    return null;\n  }\n\n  const cleaned = phone.replace(/[^\\d+]/g, '');\n  const normalized = normalizePhoneNumber(cleaned);\n\n  if (!normalized || !normalized.startsWith('0')) {\n    return null;\n  }\n\n  if (normalized.startsWith('08')) {\n    return null;\n  }\n\n  const areaCode4 = normalized.substring(0, 4);\n  if (AREA_CODES[areaCode4]) {\n    return AREA_CODES[areaCode4];\n  }\n\n  const areaCode3 = normalized.substring(0, 3);\n  if (AREA_CODES[areaCode3]) {\n    return AREA_CODES[areaCode3];\n  }\n\n  const areaCode2 = normalized.substring(0, 2);\n  if (AREA_CODES[areaCode2]) {\n    return AREA_CODES[areaCode2];\n  }\n\n  return null;\n}\n","import { AREA_CODES } from './constants';\nimport { PhoneFormat, MaskOptions } from './types';\nimport { validatePhoneNumber } from './validate';\nimport { normalizePhoneNumber } from './utils';\n\n/**\n * Formats an Indonesian phone number to the specified format.\n *\n * Accepts various input formats and converts to the desired output format.\n * Automatically adds appropriate separators for readability.\n *\n * @param phone - The phone number to format\n * @param format - Target format ('international', 'national', 'e164', 'display')\n * @returns Formatted phone number, or original string if invalid\n *\n * @example\n * International format:\n * ```typescript\n * formatPhoneNumber('081234567890', 'international');\n * // '+62 812-3456-7890'\n * ```\n *\n * @example\n * National format:\n * ```typescript\n * formatPhoneNumber('+6281234567890', 'national');\n * // '0812-3456-7890'\n * ```\n *\n * @example\n * E.164 format (no spaces/dashes):\n * ```typescript\n * formatPhoneNumber('0812-3456-7890', 'e164');\n * // '6281234567890'\n * ```\n *\n * @public\n */\nexport function formatPhoneNumber(\n  phone: string,\n  format: PhoneFormat = 'national'\n): string {\n  if (!validatePhoneNumber(phone)) {\n    return phone;\n  }\n\n  const cleaned = cleanPhoneNumber(phone);\n\n  const normalized = normalizePhoneNumber(cleaned);\n  if (!normalized) {\n    return phone;\n  }\n\n  switch (format) {\n    case 'international':\n      return toInternational(normalized);\n    case 'national':\n    case 'display':\n      return toNational(normalized);\n    case 'e164':\n      return toE164(normalized);\n    default:\n      return phone;\n  }\n}\n\n/**\n * Converts a phone number to international format (+62 xxx-xxxx-xxxx).\n *\n * @param phone - The phone number to convert\n * @returns Phone number in international format with separators\n *\n * @example\n * ```typescript\n * toInternational('081234567890');\n * // '+62 812-3456-7890'\n * ```\n *\n * @example\n * Already international:\n * ```typescript\n * toInternational('+6281234567890');\n * // '+62 812-3456-7890'\n * ```\n *\n * @public\n */\nexport function toInternational(phone: string): string {\n  const cleaned = cleanPhoneNumber(phone);\n  if (!cleaned) {\n    return phone;\n  }\n\n  const normalized = normalizePhoneNumber(cleaned);\n  if (!normalized) {\n    return phone;\n  }\n\n  const withoutZero = normalized.substring(1);\n\n  if (normalized.startsWith('08')) {\n    if (withoutZero.length === 11) {\n      return `+62 ${withoutZero.substring(0, 3)}-${withoutZero.substring(3, 7)}-${withoutZero.substring(7)}`;\n    } else if (withoutZero.length === 10) {\n      return `+62 ${withoutZero.substring(0, 3)}-${withoutZero.substring(3, 6)}-${withoutZero.substring(6)}`;\n    } else if (withoutZero.length === 9) {\n      return `+62 ${withoutZero.substring(0, 3)}-${withoutZero.substring(3)}`;\n    } else if (withoutZero.length === 12) {\n      return `+62 ${withoutZero.substring(0, 3)}-${withoutZero.substring(3, 7)}-${withoutZero.substring(7)}`;\n    }\n  }\n\n  const areaCodeLength = getAreaCodeLength(normalized);\n  const areaCode = normalized.substring(1, areaCodeLength + 1);\n  const localNumber = normalized.substring(areaCodeLength + 1);\n\n  return `+62 ${areaCode}-${localNumber}`;\n}\n\n/**\n * Converts a phone number to national format (08xx-xxxx-xxxx).\n *\n * @param phone - The phone number to convert\n * @returns Phone number in national format with dashes\n *\n * @example\n * ```typescript\n * toNational('+6281234567890');\n * // '0812-3456-7890'\n * ```\n *\n * @example\n * Already national:\n * ```typescript\n * toNational('081234567890');\n * // '0812-3456-7890'\n * ```\n *\n * @public\n */\nexport function toNational(phone: string): string {\n  const cleaned = cleanPhoneNumber(phone);\n  if (!cleaned) {\n    return phone;\n  }\n\n  const normalized = normalizePhoneNumber(cleaned);\n  if (!normalized) {\n    return phone;\n  }\n\n  if (normalized.startsWith('08')) {\n    if (normalized.length === 12) {\n      return `${normalized.substring(0, 4)}-${normalized.substring(4, 8)}-${normalized.substring(8)}`;\n    } else if (normalized.length === 11) {\n      return `${normalized.substring(0, 4)}-${normalized.substring(4, 7)}-${normalized.substring(7)}`;\n    } else if (normalized.length === 10) {\n      return `${normalized.substring(0, 4)}-${normalized.substring(4)}`;\n    } else if (normalized.length === 13) {\n      return `${normalized.substring(0, 4)}-${normalized.substring(4, 8)}-${normalized.substring(8)}`;\n    }\n  }\n\n  const areaCodeLength = getAreaCodeLength(normalized);\n  const areaCodeWithZero = normalized.substring(0, areaCodeLength + 1);\n  const localNumber = normalized.substring(areaCodeLength + 1);\n\n  return `${areaCodeWithZero}-${localNumber}`;\n}\n\n/**\n * Converts a phone number to E.164 format (6281234567890).\n *\n * E.164 is the international standard format without spaces or dashes.\n * Suitable for API calls and database storage.\n *\n * @param phone - The phone number to convert\n * @returns Phone number in E.164 format\n *\n * @example\n * ```typescript\n * toE164('0812-3456-7890');\n * // '6281234567890'\n * ```\n *\n * @example\n * From international format:\n * ```typescript\n * toE164('+62 812-3456-7890');\n * // '6281234567890'\n * ```\n *\n * @public\n */\nexport function toE164(phone: string): string {\n  const cleaned = cleanPhoneNumber(phone);\n  if (!cleaned) {\n    return phone;\n  }\n\n  const normalized = normalizePhoneNumber(cleaned);\n  if (!normalized) {\n    return phone;\n  }\n\n  return '62' + normalized.substring(1);\n}\n\n/**\n * Removes all non-digit characters from a phone number, preserving leading +.\n *\n * @param phone - The phone number to clean\n * @returns Cleaned phone number with only digits (and optional leading +)\n *\n * @example\n * ```typescript\n * cleanPhoneNumber('0812-3456-7890');\n * // '081234567890'\n * ```\n *\n * @example\n * ```typescript\n * cleanPhoneNumber('+62 812 3456 7890');\n * // '+6281234567890'\n * ```\n *\n * @public\n */\nexport function cleanPhoneNumber(phone: string): string {\n  if (!phone || typeof phone !== 'string') {\n    return '';\n  }\n\n  return phone.replace(/[^\\d+]/g, '');\n}\n\n/**\n * Determines area code length for landline numbers.\n *\n * @param normalized - Phone number in national format (0xxx)\n * @returns Area code length (digits after leading 0)\n * @internal\n */\nfunction getAreaCodeLength(normalized: string): number {\n  // Check 4-digit area codes ('0xxxx')\n  const fourDigitCode = normalized.substring(0, 5);\n  if (AREA_CODES[fourDigitCode]) {\n    return 4;\n  }\n\n  // Check 3-digit area codes ('0xxx')\n  const threeDigitCode = normalized.substring(0, 4);\n  if (AREA_CODES[threeDigitCode]) {\n    return 3;\n  }\n\n  // Check 2-digit area codes ('0xx')\n  const twoDigitCode = normalized.substring(0, 3);\n  if (AREA_CODES[twoDigitCode]) {\n    return 2;\n  }\n\n  return 2;\n}\n\n/**\n * Masks a phone number for privacy protection.\n *\n * By default, shows the first 4 and last 4 digits, masking the middle digits.\n * Optionally formats with separators.\n *\n * @param phone - The phone number to mask\n * @param options - Masking configuration options\n * @returns Masked phone number, or original string if invalid\n *\n * @example\n * Default masking:\n * ```typescript\n * maskPhoneNumber('081234567890');\n * // '0812****7890'\n * ```\n *\n * @example\n * Custom mask character:\n * ```typescript\n * maskPhoneNumber('081234567890', { maskChar: 'X' });\n * // '0812XXXX7890'\n * ```\n *\n * @example\n * With separator:\n * ```typescript\n * maskPhoneNumber('081234567890', { separator: '-' });\n * // '0812-****-7890'\n * ```\n *\n * @public\n */\nexport function maskPhoneNumber(\n  phone: string,\n  options: MaskOptions = {}\n): string {\n  const cleaned = cleanPhoneNumber(phone);\n  if (!cleaned) {\n    return phone;\n  }\n\n  const isInternational = cleaned.startsWith('+');\n  let toMask: string;\n\n  if (isInternational) {\n    toMask = cleaned;\n  } else {\n    const normalized = normalizePhoneNumber(cleaned);\n    toMask = normalized || cleaned;\n  }\n\n  if (toMask.length < 4) {\n    return phone;\n  }\n\n  const { maskChar, separator, visibleStart, visibleEnd, start, end, char } =\n    options;\n\n  const hasLegacyOptions =\n    start !== undefined || end !== undefined || char !== undefined;\n\n  if (hasLegacyOptions) {\n    console.warn(\n      '[DEPRECATED] Mask options start/end/char are deprecated. ' +\n        'Use visibleStart/visibleEnd/maskChar instead. ' +\n        'These old names will be removed in v1.0.0.'\n    );\n  }\n\n  const effectiveStart =\n    visibleStart !== undefined ? visibleStart : start !== undefined ? start : 4;\n  const effectiveEnd =\n    visibleEnd !== undefined ? visibleEnd : end !== undefined ? end : 4;\n  const effectiveChar =\n    maskChar !== undefined ? maskChar : char !== undefined ? char : '*';\n\n  if (effectiveStart + effectiveEnd >= toMask.length) {\n    if (toMask.length < 10) {\n      const minMaskLength = 1;\n      const availableForVisible = toMask.length - minMaskLength;\n\n      if (availableForVisible >= 2) {\n        const newStart = Math.floor(availableForVisible / 2);\n        const newEnd = availableForVisible - newStart;\n\n        const startPart = toMask.substring(0, newStart);\n        const endPart = toMask.substring(toMask.length - newEnd);\n        const masked = startPart + effectiveChar + endPart;\n\n        if (separator) {\n          return `${startPart}${separator}${effectiveChar}${separator}${endPart}`;\n        }\n        return masked;\n      } else {\n        return toMask;\n      }\n    }\n    return toMask;\n  }\n\n  const startPart = toMask.substring(0, effectiveStart);\n  const endPart = toMask.substring(toMask.length - effectiveEnd);\n  const maskLength = toMask.length - effectiveStart - effectiveEnd;\n  const masked = startPart + effectiveChar.repeat(maskLength) + endPart;\n\n  if (separator) {\n    return `${masked.substring(0, effectiveStart)}${separator}${masked.substring(effectiveStart, masked.length - effectiveEnd)}${separator}${masked.substring(masked.length - effectiveEnd)}`;\n  }\n\n  return masked;\n}\n","import { toE164 } from './format';\nimport { validatePhoneNumber, isMobileNumber } from './validate';\n\n/**\n * Generates a WhatsApp click-to-chat link.\n *\n * WhatsApp only works on mobile numbers, so landlines will return empty string.\n *\n * @param phone - The Indonesian mobile phone number\n * @param message - Optional pre-filled message\n * @returns WhatsApp link, or empty string if phone is invalid or landline\n *\n * @example\n * ```typescript\n * generateWALink('081234567890', 'Halo!');\n * // 'https://wa.me/6281234567890?text=Halo%21'\n * ```\n *\n * @example\n * Landlines return empty string (WhatsApp doesn't work on landlines):\n * ```typescript\n * generateWALink('0212345678'); // ''\n * ```\n *\n * @public\n */\nexport function generateWALink(phone: string, message?: string): string {\n  if (!validatePhoneNumber(phone) || !isMobileNumber(phone)) {\n    return '';\n  }\n\n  const e164 = toE164(phone);\n  let link = `https://wa.me/${e164}`;\n\n  if (message) {\n    link += `?text=${encodeURIComponent(message)}`;\n  }\n\n  return link;\n}\n\n/**\n * Generates an SMS link (sms:).\n *\n * SMS only works on mobile numbers, so landlines will return empty string.\n *\n * @param phone - The Indonesian mobile phone number\n * @param body - Optional SMS body\n * @returns SMS link, or empty string if phone is invalid or landline\n *\n * @example\n * ```typescript\n * generateSmsLink('081234567890', 'Pesan ini');\n * // 'sms:+6281234567890?body=Pesan%20ini'\n * ```\n *\n * @example\n * Landlines return empty string (SMS doesn't work on landlines):\n * ```typescript\n * generateSmsLink('0212345678'); // ''\n * ```\n *\n * @public\n */\nexport function generateSmsLink(phone: string, body?: string): string {\n  if (!validatePhoneNumber(phone) || !isMobileNumber(phone)) {\n    return '';\n  }\n\n  const e164 = toE164(phone);\n  let link = `sms:+${e164}`;\n\n  if (body) {\n    link += `?body=${encodeURIComponent(body)}`;\n  }\n\n  return link;\n}\n\n/**\n * Generates a telephone link (tel:).\n *\n * @param phone - The Indonesian phone number\n * @returns Tel link, or empty string if phone is invalid\n *\n * @example\n * ```typescript\n * generateTelLink('081234567890');\n * // 'tel:+6281234567890'\n * ```\n *\n * @public\n */\nexport function generateTelLink(phone: string): string {\n  if (!validatePhoneNumber(phone)) {\n    return '';\n  }\n\n  const e164 = toE164(phone);\n  return `tel:+${e164}`;\n}\n","import { OPERATOR_PREFIXES } from './constants';\nimport { PhoneInfo, OperatorName } from './types';\nimport {\n  cleanPhoneNumber,\n  toInternational,\n  toNational,\n  toE164,\n} from './format';\nimport { validatePhoneNumber, isMobileNumber } from './validate';\nimport { normalizePhoneNumber, getLandlineRegion } from './utils';\n\n/**\n * Parses an Indonesian phone number and extracts all information.\n *\n * Extracts country code, operator, formatted variants, and determines\n * if it's a mobile or landline number.\n *\n * @param phone - The phone number to parse\n * @returns Parsed phone information, or `null` if invalid\n *\n * @example\n * Parse a mobile number:\n * ```typescript\n * const info = parsePhoneNumber('081234567890');\n * console.log(info);\n * // {\n * //   countryCode: '62',\n * //   operator: 'Telkomsel',\n * //   number: '81234567890',\n * //   formatted: {\n * //     international: '+62 812-3456-7890',\n * //     national: '0812-3456-7890',\n * //     e164: '6281234567890'\n * //   },\n * //   isValid: true,\n * //   isMobile: true,\n * //   isLandline: false\n * // }\n * ```\n *\n * @example\n * Parse with different input format:\n * ```typescript\n * const info = parsePhoneNumber('+62 812-3456-7890');\n * console.log(info.operator); // 'Telkomsel'\n * console.log(info.formatted.national); // '0812-3456-7890'\n * ```\n *\n * @example\n * Parse a landline:\n * ```typescript\n * const info = parsePhoneNumber('0212345678');\n * console.log(info.region); // 'Jakarta'\n * console.log(info.isLandline); // true\n * ```\n *\n * @public\n */\nexport function parsePhoneNumber(phone: string): PhoneInfo | null {\n  if (!validatePhoneNumber(phone)) {\n    return null;\n  }\n\n  const cleaned = cleanPhoneNumber(phone);\n  const normalized = normalizePhoneNumber(cleaned);\n\n  if (!normalized) {\n    return null;\n  }\n\n  const countryCode = '62';\n  const number = normalized.substring(1); // Remove leading 0\n  const isMobile = normalized.startsWith('08');\n  const isLandline = !isMobile;\n\n  let operator: OperatorName | null = null;\n  let region: string | null = null;\n\n  if (isMobile) {\n    operator = getOperator(normalized);\n  } else {\n    region = getLandlineRegion(normalized);\n  }\n\n  return {\n    countryCode,\n    operator,\n    number,\n    formatted: {\n      international: toInternational(normalized),\n      national: toNational(normalized),\n      e164: toE164(normalized),\n    },\n    isValid: true,\n    isMobile,\n    isLandline,\n    region,\n  };\n}\n\n/**\n * Detects the mobile operator from a phone number.\n *\n * Identifies the operator based on the phone number prefix.\n * Returns `null` if the operator cannot be determined or if it's not a mobile number.\n *\n * @param phone - The phone number to check\n * @returns Operator name, or `null` if not detected\n *\n * @example\n * Telkomsel numbers:\n * ```typescript\n * getOperator('081234567890'); // 'Telkomsel'\n * getOperator('0812-3456-7890'); // 'Telkomsel'\n * getOperator('+6281234567890'); // 'Telkomsel'\n * ```\n *\n * @example\n * XL numbers:\n * ```typescript\n * getOperator('081734567890'); // 'XL'\n * ```\n *\n * @example\n * Non-mobile or invalid:\n * ```typescript\n * getOperator('0212345678'); // null (landline)\n * getOperator('1234'); // null (invalid)\n * ```\n *\n * @public\n */\nexport function getOperator(phone: string): OperatorName | null {\n  if (!isMobileNumber(phone)) {\n    return null;\n  }\n\n  const cleaned = cleanPhoneNumber(phone);\n  const normalized = normalizePhoneNumber(cleaned);\n\n  if (!normalized || normalized.length < 4) {\n    return null;\n  }\n\n  const prefix = normalized.substring(0, 4);\n  return OPERATOR_PREFIXES[prefix] || null;\n}\n\n/**\n * Checks if a phone number belongs to a specific provider.\n *\n * @param phone - The phone number to check\n * @param providerName - The provider name to match (case-insensitive)\n * @returns `true` if it matches, `false` otherwise\n *\n * @example\n * ```typescript\n * isProvider('081234567890', 'Telkomsel'); // true\n * isProvider('081734567890', 'xl'); // true\n * ```\n *\n * @public\n */\nexport function isProvider(phone: string, providerName: string): boolean {\n  const operator = getOperator(phone);\n  if (!operator) {\n    return false;\n  }\n  return operator.toLowerCase() === providerName.toLowerCase();\n}\n","/**\n * Error thrown when an invalid phone number is provided to a function.\n * Extends native Error with a `code` property for programmatic error handling.\n *\n * @example\n * ```typescript\n * try {\n *   requirePhone('invalid');\n * } catch (error) {\n *   if (error instanceof InvalidPhoneError) {\n *     console.log(error.code); // 'INVALID_PHONE'\n *   }\n * }\n * ```\n *\n * @public\n */\nexport class InvalidPhoneError extends Error {\n  readonly code = 'INVALID_PHONE' as const;\n\n  constructor(message: string = 'Invalid phone number provided') {\n    super(message);\n    this.name = 'InvalidPhoneError';\n  }\n}\n"]}