@indodev/toolkit 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/phone/constants.ts","../../src/phone/validate.ts","../../src/phone/format.ts","../../src/phone/parse.ts"],"names":["normalizeToNational"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\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, string> = {\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};\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};\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);","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')) {\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}","import { AREA_CODES } from './constants';\nimport { PhoneFormat, MaskOptions } from './types';\nimport { validatePhoneNumber } from './validate';\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 let normalized: string;\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 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 = normalizeToNational(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 = normalizeToNational(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 = normalizeToNational(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 * Normalizes a phone number to national format (08xx).\n *\n * @param phone - Cleaned phone number\n * @returns Phone number in 08xx format\n * @internal\n */\nfunction normalizeToNational(phone: string): string {\n if (phone.startsWith('+62')) {\n return '0' + phone.substring(3);\n } else if (phone.startsWith('62') && !phone.startsWith('620')) {\n return '0' + phone.substring(2);\n } else if (phone.startsWith('0')) {\n return phone;\n }\n return '';\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', { char: '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 = normalizeToNational(cleaned);\n toMask = normalized || cleaned;\n }\n\n if (toMask.length < 4) {\n return phone;\n }\n\n const { char = '*', separator } = options;\n let { start = 4, end = 4 } = options;\n\n if (start + end >= toMask.length) {\n // Auto-adjust for short numbers to ensure masking happens\n if (toMask.length < 10) {\n const minMaskLength = 1;\n const availableForVisible = toMask.length - minMaskLength;\n\n if (availableForVisible >= 2) {\n start = Math.floor(availableForVisible / 2);\n end = availableForVisible - start;\n } else {\n return toMask;\n }\n } else {\n return toMask;\n }\n }\n\n const startPart = toMask.substring(0, start);\n const endPart = toMask.substring(toMask.length - end);\n const maskLength = toMask.length - start - end;\n const masked = startPart + char.repeat(maskLength) + endPart;\n\n if (separator) {\n return `${masked.substring(0, start)}${separator}${masked.substring(start, masked.length - end)}${separator}${masked.substring(masked.length - end)}`;\n }\n\n return masked;\n}\n","import { OPERATOR_PREFIXES, AREA_CODES } from './constants';\nimport { PhoneInfo } from './types';\nimport {\n cleanPhoneNumber,\n toInternational,\n toNational,\n toE164,\n} from './format';\nimport { validatePhoneNumber, isMobileNumber } from './validate';\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 = normalizeToNational(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: string | null = null;\n let region: string | null = null;\n\n if (isMobile) {\n operator = getOperator(normalized);\n } else {\n region = getRegion(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): string | null {\n if (!isMobileNumber(phone)) {\n return null;\n }\n\n const cleaned = cleanPhoneNumber(phone);\n const normalized = normalizeToNational(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 * Gets the region name for a landline number.\n *\n * @param phone - Landline phone number in national format\n * @returns Region name, or null if not found\n * @internal\n */\nfunction getRegion(phone: string): string | null {\n if (!phone.startsWith('0')) {\n return null;\n }\n\n // Check 4-digit area code\n const areaCode4 = phone.substring(0, 4);\n if (AREA_CODES[areaCode4]) {\n return AREA_CODES[areaCode4];\n }\n\n // Check 3-digit area code\n const areaCode3 = phone.substring(0, 3);\n if (AREA_CODES[areaCode3]) {\n return AREA_CODES[areaCode3];\n }\n\n return null;\n}\n\n/**\n * Normalizes a phone number to national format (08xx).\n *\n * @param phone - Cleaned phone number\n * @returns Phone number in 08xx format\n * @internal\n */\nfunction normalizeToNational(phone: string): string {\n if (phone.startsWith('+62')) {\n return '0' + phone.substring(3);\n } else if (phone.startsWith('62')) {\n return '0' + phone.substring(2);\n } else if (phone.startsWith('0')) {\n return phone;\n }\n return '';\n}"]}
@@ -0,0 +1,472 @@
1
+ /**
2
+ * Validates an Indonesian phone number format.
3
+ *
4
+ * Accepts multiple input formats:
5
+ * - National format: 08xx-xxxx-xxxx or 08xxxxxxxxxx
6
+ * - International with +: +62 8xx-xxxx-xxxx or +628xxxxxxxxxx
7
+ * - International without +: 62 8xx-xxxx-xxxx or 628xxxxxxxxxx
8
+ *
9
+ * For mobile numbers, validates:
10
+ * - Starts with 08 (national) or 628 (international)
11
+ * - Has valid operator prefix (0811, 0812, 0817, etc.)
12
+ * - Total length is 10-13 digits (after removing non-digits)
13
+ *
14
+ * For landline numbers, validates:
15
+ * - Starts with 0 followed by area code (021, 022, etc.)
16
+ * - Total length is appropriate for landline
17
+ *
18
+ * @param phone - The phone number string to validate
19
+ * @returns `true` if the phone number is valid, `false` otherwise
20
+ *
21
+ * @example
22
+ * Valid mobile number (national):
23
+ * ```typescript
24
+ * validatePhoneNumber('081234567890'); // true
25
+ * ```
26
+ *
27
+ * @example
28
+ * Valid mobile number (international):
29
+ * ```typescript
30
+ * validatePhoneNumber('+6281234567890'); // true
31
+ * validatePhoneNumber('6281234567890'); // true
32
+ * ```
33
+ *
34
+ * @example
35
+ * With separators:
36
+ * ```typescript
37
+ * validatePhoneNumber('0812-3456-7890'); // true
38
+ * validatePhoneNumber('+62 812-3456-7890'); // true
39
+ * ```
40
+ *
41
+ * @example
42
+ * Invalid numbers:
43
+ * ```typescript
44
+ * validatePhoneNumber('1234'); // false - too short
45
+ * validatePhoneNumber('08001234567'); // false - invalid prefix
46
+ * validatePhoneNumber('+1234567890'); // false - wrong country code
47
+ * ```
48
+ *
49
+ * @public
50
+ */
51
+ declare function validatePhoneNumber(phone: string): boolean;
52
+ /**
53
+ * Checks if a phone number is a mobile number.
54
+ *
55
+ * @param phone - The phone number to check
56
+ * @returns `true` if it's a mobile number (08xx), `false` otherwise
57
+ *
58
+ * @example
59
+ * ```typescript
60
+ * isMobileNumber('081234567890'); // true
61
+ * isMobileNumber('+6281234567890'); // true
62
+ * isMobileNumber('0212345678'); // false (landline)
63
+ * ```
64
+ *
65
+ * @public
66
+ */
67
+ declare function isMobileNumber(phone: string): boolean;
68
+ /**
69
+ * Checks if a phone number is a landline number.
70
+ *
71
+ * @param phone - The phone number to check
72
+ * @returns `true` if it's a landline number, `false` otherwise
73
+ *
74
+ * @example
75
+ * ```typescript
76
+ * isLandlineNumber('0212345678'); // true
77
+ * isLandlineNumber('081234567890'); // false (mobile)
78
+ * ```
79
+ *
80
+ * @public
81
+ */
82
+ declare function isLandlineNumber(phone: string): boolean;
83
+
84
+ /**
85
+ * Format types for Indonesian phone numbers.
86
+ *
87
+ * - `international`: +62 format with spaces (e.g., '+62 812-3456-7890')
88
+ * - `national`: 08xx format with dashes (e.g., '0812-3456-7890')
89
+ * - `e164`: International format without spaces (e.g., '6281234567890')
90
+ * - `display`: Formatted for display with separators (same as national)
91
+ *
92
+ * @public
93
+ */
94
+ type PhoneFormat = 'international' | 'national' | 'e164' | 'display';
95
+ /**
96
+ * Information extracted from a valid Indonesian phone number.
97
+ *
98
+ * Contains parsed data including country code, operator, formatted variants,
99
+ * and validation status.
100
+ *
101
+ * @example
102
+ * ```typescript
103
+ * const info: PhoneInfo = {
104
+ * countryCode: '62',
105
+ * operator: 'Telkomsel',
106
+ * number: '81234567890',
107
+ * formatted: {
108
+ * international: '+62 812-3456-7890',
109
+ * national: '0812-3456-7890',
110
+ * e164: '6281234567890',
111
+ * },
112
+ * isValid: true,
113
+ * isMobile: true,
114
+ * isLandline: false,
115
+ * };
116
+ * ```
117
+ *
118
+ * @public
119
+ */
120
+ interface PhoneInfo {
121
+ /**
122
+ * Country code (always '62' for Indonesia).
123
+ */
124
+ countryCode: string;
125
+ /**
126
+ * Mobile operator name, or `null` if not detected.
127
+ *
128
+ * Possible values: 'Telkomsel', 'XL', 'Indosat', 'Tri', 'Smartfren', 'Axis'
129
+ *
130
+ * @example
131
+ * ```typescript
132
+ * 'Telkomsel' // for 0812, 0813, 0821, 0822, 0851, 0852, 0853
133
+ * 'XL' // for 0817, 0818, 0819, 0859, 0877, 0878
134
+ * null // if operator cannot be determined
135
+ * ```
136
+ */
137
+ operator: string | null;
138
+ /**
139
+ * Raw phone number without country code or leading zero.
140
+ *
141
+ * @example
142
+ * ```typescript
143
+ * '81234567890' // from '081234567890' or '+6281234567890'
144
+ * ```
145
+ */
146
+ number: string;
147
+ /**
148
+ * Phone number in various formatted styles.
149
+ */
150
+ formatted: {
151
+ /** International format with country code: '+62 812-3456-7890' */
152
+ international: string;
153
+ /** National format with leading zero: '0812-3456-7890' */
154
+ national: string;
155
+ /** E.164 format (no spaces/dashes): '6281234567890' */
156
+ e164: string;
157
+ };
158
+ /**
159
+ * Whether the phone number passed validation checks.
160
+ */
161
+ isValid: boolean;
162
+ /**
163
+ * Whether this is a mobile number (08xx).
164
+ */
165
+ isMobile: boolean;
166
+ /**
167
+ * Whether this is a landline number (02x, 04x, etc).
168
+ */
169
+ isLandline: boolean;
170
+ /**
171
+ * Region name for landline numbers, or `null` for mobile.
172
+ *
173
+ * @example
174
+ * ```typescript
175
+ * 'Jakarta' // for 021 area code
176
+ * 'Bandung' // for 022 area code
177
+ * null // for mobile numbers
178
+ * ```
179
+ */
180
+ region?: string | null;
181
+ }
182
+ /**
183
+ * Options for masking phone numbers.
184
+ *
185
+ * Controls how many digits to show at the start and end,
186
+ * what character to use for masking, and optional separators.
187
+ *
188
+ * @example
189
+ * Default masking:
190
+ * ```typescript
191
+ * { start: 4, end: 4, char: '*' }
192
+ * // '0812****7890'
193
+ * ```
194
+ *
195
+ * @example
196
+ * With separator:
197
+ * ```typescript
198
+ * { start: 4, end: 4, char: '*', separator: '-' }
199
+ * // '0812-****-7890'
200
+ * ```
201
+ *
202
+ * @public
203
+ */
204
+ interface MaskOptions {
205
+ /**
206
+ * Number of digits to show at the start.
207
+ *
208
+ * @defaultValue 4
209
+ */
210
+ start?: number;
211
+ /**
212
+ * Number of digits to show at the end.
213
+ *
214
+ * @defaultValue 4
215
+ */
216
+ end?: number;
217
+ /**
218
+ * Character to use for masking hidden digits.
219
+ *
220
+ * @defaultValue '*'
221
+ */
222
+ char?: string;
223
+ /**
224
+ * Optional separator to add between groups of digits.
225
+ *
226
+ * @defaultValue undefined
227
+ */
228
+ separator?: string;
229
+ }
230
+
231
+ /**
232
+ * Formats an Indonesian phone number to the specified format.
233
+ *
234
+ * Accepts various input formats and converts to the desired output format.
235
+ * Automatically adds appropriate separators for readability.
236
+ *
237
+ * @param phone - The phone number to format
238
+ * @param format - Target format ('international', 'national', 'e164', 'display')
239
+ * @returns Formatted phone number, or original string if invalid
240
+ *
241
+ * @example
242
+ * International format:
243
+ * ```typescript
244
+ * formatPhoneNumber('081234567890', 'international');
245
+ * // '+62 812-3456-7890'
246
+ * ```
247
+ *
248
+ * @example
249
+ * National format:
250
+ * ```typescript
251
+ * formatPhoneNumber('+6281234567890', 'national');
252
+ * // '0812-3456-7890'
253
+ * ```
254
+ *
255
+ * @example
256
+ * E.164 format (no spaces/dashes):
257
+ * ```typescript
258
+ * formatPhoneNumber('0812-3456-7890', 'e164');
259
+ * // '6281234567890'
260
+ * ```
261
+ *
262
+ * @public
263
+ */
264
+ declare function formatPhoneNumber(phone: string, format?: PhoneFormat): string;
265
+ /**
266
+ * Converts a phone number to international format (+62 xxx-xxxx-xxxx).
267
+ *
268
+ * @param phone - The phone number to convert
269
+ * @returns Phone number in international format with separators
270
+ *
271
+ * @example
272
+ * ```typescript
273
+ * toInternational('081234567890');
274
+ * // '+62 812-3456-7890'
275
+ * ```
276
+ *
277
+ * @example
278
+ * Already international:
279
+ * ```typescript
280
+ * toInternational('+6281234567890');
281
+ * // '+62 812-3456-7890'
282
+ * ```
283
+ *
284
+ * @public
285
+ */
286
+ declare function toInternational(phone: string): string;
287
+ /**
288
+ * Converts a phone number to national format (08xx-xxxx-xxxx).
289
+ *
290
+ * @param phone - The phone number to convert
291
+ * @returns Phone number in national format with dashes
292
+ *
293
+ * @example
294
+ * ```typescript
295
+ * toNational('+6281234567890');
296
+ * // '0812-3456-7890'
297
+ * ```
298
+ *
299
+ * @example
300
+ * Already national:
301
+ * ```typescript
302
+ * toNational('081234567890');
303
+ * // '0812-3456-7890'
304
+ * ```
305
+ *
306
+ * @public
307
+ */
308
+ declare function toNational(phone: string): string;
309
+ /**
310
+ * Converts a phone number to E.164 format (6281234567890).
311
+ *
312
+ * E.164 is the international standard format without spaces or dashes.
313
+ * Suitable for API calls and database storage.
314
+ *
315
+ * @param phone - The phone number to convert
316
+ * @returns Phone number in E.164 format
317
+ *
318
+ * @example
319
+ * ```typescript
320
+ * toE164('0812-3456-7890');
321
+ * // '6281234567890'
322
+ * ```
323
+ *
324
+ * @example
325
+ * From international format:
326
+ * ```typescript
327
+ * toE164('+62 812-3456-7890');
328
+ * // '6281234567890'
329
+ * ```
330
+ *
331
+ * @public
332
+ */
333
+ declare function toE164(phone: string): string;
334
+ /**
335
+ * Removes all non-digit characters from a phone number, preserving leading +.
336
+ *
337
+ * @param phone - The phone number to clean
338
+ * @returns Cleaned phone number with only digits (and optional leading +)
339
+ *
340
+ * @example
341
+ * ```typescript
342
+ * cleanPhoneNumber('0812-3456-7890');
343
+ * // '081234567890'
344
+ * ```
345
+ *
346
+ * @example
347
+ * ```typescript
348
+ * cleanPhoneNumber('+62 812 3456 7890');
349
+ * // '+6281234567890'
350
+ * ```
351
+ *
352
+ * @public
353
+ */
354
+ declare function cleanPhoneNumber(phone: string): string;
355
+ /**
356
+ * Masks a phone number for privacy protection.
357
+ *
358
+ * By default, shows the first 4 and last 4 digits, masking the middle digits.
359
+ * Optionally formats with separators.
360
+ *
361
+ * @param phone - The phone number to mask
362
+ * @param options - Masking configuration options
363
+ * @returns Masked phone number, or original string if invalid
364
+ *
365
+ * @example
366
+ * Default masking:
367
+ * ```typescript
368
+ * maskPhoneNumber('081234567890');
369
+ * // '0812****7890'
370
+ * ```
371
+ *
372
+ * @example
373
+ * Custom mask character:
374
+ * ```typescript
375
+ * maskPhoneNumber('081234567890', { char: 'X' });
376
+ * // '0812XXXX7890'
377
+ * ```
378
+ *
379
+ * @example
380
+ * With separator:
381
+ * ```typescript
382
+ * maskPhoneNumber('081234567890', { separator: '-' });
383
+ * // '0812-****-7890'
384
+ * ```
385
+ *
386
+ * @public
387
+ */
388
+ declare function maskPhoneNumber(phone: string, options?: MaskOptions): string;
389
+
390
+ /**
391
+ * Parses an Indonesian phone number and extracts all information.
392
+ *
393
+ * Extracts country code, operator, formatted variants, and determines
394
+ * if it's a mobile or landline number.
395
+ *
396
+ * @param phone - The phone number to parse
397
+ * @returns Parsed phone information, or `null` if invalid
398
+ *
399
+ * @example
400
+ * Parse a mobile number:
401
+ * ```typescript
402
+ * const info = parsePhoneNumber('081234567890');
403
+ * console.log(info);
404
+ * // {
405
+ * // countryCode: '62',
406
+ * // operator: 'Telkomsel',
407
+ * // number: '81234567890',
408
+ * // formatted: {
409
+ * // international: '+62 812-3456-7890',
410
+ * // national: '0812-3456-7890',
411
+ * // e164: '6281234567890'
412
+ * // },
413
+ * // isValid: true,
414
+ * // isMobile: true,
415
+ * // isLandline: false
416
+ * // }
417
+ * ```
418
+ *
419
+ * @example
420
+ * Parse with different input format:
421
+ * ```typescript
422
+ * const info = parsePhoneNumber('+62 812-3456-7890');
423
+ * console.log(info.operator); // 'Telkomsel'
424
+ * console.log(info.formatted.national); // '0812-3456-7890'
425
+ * ```
426
+ *
427
+ * @example
428
+ * Parse a landline:
429
+ * ```typescript
430
+ * const info = parsePhoneNumber('0212345678');
431
+ * console.log(info.region); // 'Jakarta'
432
+ * console.log(info.isLandline); // true
433
+ * ```
434
+ *
435
+ * @public
436
+ */
437
+ declare function parsePhoneNumber(phone: string): PhoneInfo | null;
438
+ /**
439
+ * Detects the mobile operator from a phone number.
440
+ *
441
+ * Identifies the operator based on the phone number prefix.
442
+ * Returns `null` if the operator cannot be determined or if it's not a mobile number.
443
+ *
444
+ * @param phone - The phone number to check
445
+ * @returns Operator name, or `null` if not detected
446
+ *
447
+ * @example
448
+ * Telkomsel numbers:
449
+ * ```typescript
450
+ * getOperator('081234567890'); // 'Telkomsel'
451
+ * getOperator('0812-3456-7890'); // 'Telkomsel'
452
+ * getOperator('+6281234567890'); // 'Telkomsel'
453
+ * ```
454
+ *
455
+ * @example
456
+ * XL numbers:
457
+ * ```typescript
458
+ * getOperator('081734567890'); // 'XL'
459
+ * ```
460
+ *
461
+ * @example
462
+ * Non-mobile or invalid:
463
+ * ```typescript
464
+ * getOperator('0212345678'); // null (landline)
465
+ * getOperator('1234'); // null (invalid)
466
+ * ```
467
+ *
468
+ * @public
469
+ */
470
+ declare function getOperator(phone: string): string | null;
471
+
472
+ export { type MaskOptions, type PhoneFormat, type PhoneInfo, cleanPhoneNumber, formatPhoneNumber, getOperator, isLandlineNumber, isMobileNumber, maskPhoneNumber, parsePhoneNumber, toE164, toInternational, toNational, validatePhoneNumber };