@indodev/toolkit 0.2.0 → 0.3.0
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.
- package/dist/{compare-B1MKSOWV.d.cts → compare-BIodyGn7.d.cts} +54 -1
- package/dist/{compare-B1MKSOWV.d.ts → compare-BIodyGn7.d.ts} +54 -1
- package/dist/currency/index.cjs +23 -0
- package/dist/currency/index.cjs.map +1 -1
- package/dist/currency/index.d.cts +367 -3
- package/dist/currency/index.d.ts +367 -3
- package/dist/currency/index.js +21 -1
- package/dist/currency/index.js.map +1 -1
- package/dist/index.cjs +1117 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +110 -4
- package/dist/index.d.ts +110 -4
- package/dist/index.js +1095 -1
- package/dist/index.js.map +1 -1
- package/dist/nik/index.cjs +44 -0
- package/dist/nik/index.cjs.map +1 -1
- package/dist/nik/index.d.cts +44 -1
- package/dist/nik/index.d.ts +44 -1
- package/dist/nik/index.js +41 -1
- package/dist/nik/index.js.map +1 -1
- package/dist/phone/index.cjs +42 -0
- package/dist/phone/index.cjs.map +1 -1
- package/dist/phone/index.d.cts +57 -1
- package/dist/phone/index.d.ts +57 -1
- package/dist/phone/index.js +39 -1
- package/dist/phone/index.js.map +1 -1
- package/dist/text/index.cjs +811 -0
- package/dist/text/index.cjs.map +1 -1
- package/dist/text/index.d.cts +1 -1
- package/dist/text/index.d.ts +1 -1
- package/dist/text/index.js +808 -1
- package/dist/text/index.js.map +1 -1
- package/package.json +38 -18
- package/LICENCE +0 -21
- package/dist/words-Dy8iYkbv.d.cts +0 -333
- package/dist/words-Dy8iYkbv.d.ts +0 -333
package/dist/phone/index.js.map
CHANGED
|
@@ -1 +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.js","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}"]}
|
|
1
|
+
{"version":3,"sources":["../../src/phone/constants.ts","../../src/phone/validate.ts","../../src/phone/format.ts","../../src/phone/links.ts","../../src/phone/parse.ts"],"names":["normalizeToNational"],"mappings":"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","file":"index.js","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 { toE164 } from './format';\nimport { validatePhoneNumber } from './validate';\n\n/**\n * Generates a WhatsApp click-to-chat link.\n *\n * @param phone - The Indonesian phone number\n * @param message - Optional pre-filled message\n * @returns WhatsApp link, or empty string if phone is invalid\n *\n * @example\n * ```typescript\n * generateWALink('081234567890', 'Halo!');\n * // 'https://wa.me/6281234567890?text=Halo%21'\n * ```\n */\nexport function generateWALink(phone: string, message?: string): string {\n if (!validatePhoneNumber(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 * @param phone - The Indonesian phone number\n * @param body - Optional SMS body\n * @returns SMS link, or empty string if phone is invalid\n *\n * @example\n * ```typescript\n * generateSmsLink('081234567890', 'Pesan ini');\n * // 'sms:+6281234567890?body=Pesan%20ini'\n * ```\n */\nexport function generateSmsLink(phone: string, body?: string): string {\n if (!validatePhoneNumber(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 */\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, 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 * 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 */\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/**\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}\n"]}
|