@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.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}"]}
@@ -0,0 +1,333 @@
1
+ /**
2
+ * Currency module types for Indonesian Rupiah utilities.
3
+ *
4
+ * @module currency/types
5
+ * @packageDocumentation
6
+ */
7
+ /**
8
+ * Options for formatting Rupiah currency.
9
+ *
10
+ * @example
11
+ * Default formatting:
12
+ * ```typescript
13
+ * const options: RupiahOptions = {
14
+ * symbol: true,
15
+ * decimal: false,
16
+ * separator: '.',
17
+ * };
18
+ * formatRupiah(1500000, options); // 'Rp 1.500.000'
19
+ * ```
20
+ *
21
+ * @example
22
+ * With decimals:
23
+ * ```typescript
24
+ * const options: RupiahOptions = {
25
+ * symbol: true,
26
+ * decimal: true,
27
+ * precision: 2,
28
+ * };
29
+ * formatRupiah(1500000.50, options); // 'Rp 1.500.000,50'
30
+ * ```
31
+ *
32
+ * @public
33
+ */
34
+ interface RupiahOptions {
35
+ /**
36
+ * Whether to show 'Rp' symbol.
37
+ *
38
+ * @defaultValue true
39
+ */
40
+ symbol?: boolean;
41
+ /**
42
+ * Whether to show decimal places.
43
+ *
44
+ * @defaultValue false
45
+ */
46
+ decimal?: boolean;
47
+ /**
48
+ * Thousands separator character.
49
+ *
50
+ * @defaultValue '.'
51
+ *
52
+ * @example
53
+ * ```typescript
54
+ * '.' // Indonesian standard
55
+ * ',' // International standard
56
+ * ' ' // Space separator
57
+ * ```
58
+ */
59
+ separator?: string;
60
+ /**
61
+ * Decimal separator character.
62
+ *
63
+ * @defaultValue ','
64
+ *
65
+ * @example
66
+ * ```typescript
67
+ * ',' // Indonesian standard
68
+ * '.' // International standard
69
+ * ```
70
+ */
71
+ decimalSeparator?: string;
72
+ /**
73
+ * Number of decimal places to show.
74
+ *
75
+ * @defaultValue 0
76
+ */
77
+ precision?: number;
78
+ /**
79
+ * Whether to add space after 'Rp' symbol.
80
+ *
81
+ * @defaultValue true
82
+ *
83
+ * @example
84
+ * ```typescript
85
+ * true // 'Rp 1.500.000'
86
+ * false // 'Rp1.500.000'
87
+ * ```
88
+ */
89
+ spaceAfterSymbol?: boolean;
90
+ }
91
+ /**
92
+ * Options for converting numbers to Indonesian words (terbilang).
93
+ *
94
+ * @example
95
+ * Default:
96
+ * ```typescript
97
+ * toWords(1500000); // 'satu juta lima ratus ribu rupiah'
98
+ * ```
99
+ *
100
+ * @example
101
+ * Uppercase:
102
+ * ```typescript
103
+ * toWords(1500000, { uppercase: true });
104
+ * // 'Satu juta lima ratus ribu rupiah'
105
+ * ```
106
+ *
107
+ * @example
108
+ * Without currency suffix:
109
+ * ```typescript
110
+ * toWords(1500000, { withCurrency: false });
111
+ * // 'satu juta lima ratus ribu'
112
+ * ```
113
+ *
114
+ * @public
115
+ */
116
+ interface WordOptions {
117
+ /**
118
+ * Whether to capitalize the first letter.
119
+ *
120
+ * @defaultValue false
121
+ *
122
+ * @example
123
+ * ```typescript
124
+ * false // 'satu juta'
125
+ * true // 'Satu juta'
126
+ * ```
127
+ */
128
+ uppercase?: boolean;
129
+ /**
130
+ * Whether to add 'rupiah' at the end.
131
+ *
132
+ * @defaultValue true
133
+ *
134
+ * @example
135
+ * ```typescript
136
+ * true // 'satu juta rupiah'
137
+ * false // 'satu juta'
138
+ * ```
139
+ */
140
+ withCurrency?: boolean;
141
+ }
142
+ /**
143
+ * Unit for rounding currency amounts.
144
+ *
145
+ * Common Indonesian currency rounding units:
146
+ * - `'ribu'`: Round to thousands (1.000)
147
+ * - `'ratus-ribu'`: Round to hundred thousands (100.000)
148
+ * - `'juta'`: Round to millions (1.000.000)
149
+ *
150
+ * @example
151
+ * ```typescript
152
+ * roundToClean(1234567, 'ribu'); // 1235000
153
+ * roundToClean(1234567, 'ratus-ribu'); // 1200000
154
+ * roundToClean(1234567, 'juta'); // 1000000
155
+ * ```
156
+ *
157
+ * @public
158
+ */
159
+ type RoundUnit = 'ribu' | 'ratus-ribu' | 'juta';
160
+
161
+ /**
162
+ * Currency formatting utilities for Indonesian Rupiah.
163
+ *
164
+ * @module currency/format
165
+ * @packageDocumentation
166
+ */
167
+
168
+ /**
169
+ * Formats a number as Indonesian Rupiah currency.
170
+ *
171
+ * Provides flexible formatting options including symbol display,
172
+ * decimal places, and custom separators.
173
+ *
174
+ * @param amount - The amount to format
175
+ * @param options - Formatting options
176
+ * @returns Formatted Rupiah string
177
+ *
178
+ * @example
179
+ * Basic formatting:
180
+ * ```typescript
181
+ * formatRupiah(1500000); // 'Rp 1.500.000'
182
+ * ```
183
+ *
184
+ * @example
185
+ * With decimals:
186
+ * ```typescript
187
+ * formatRupiah(1500000.50, { decimal: true }); // 'Rp 1.500.000,50'
188
+ * ```
189
+ *
190
+ * @example
191
+ * Without symbol:
192
+ * ```typescript
193
+ * formatRupiah(1500000, { symbol: false }); // '1.500.000'
194
+ * ```
195
+ *
196
+ * @example
197
+ * Custom separators:
198
+ * ```typescript
199
+ * formatRupiah(1500000, { separator: ',' }); // 'Rp 1,500,000'
200
+ * ```
201
+ *
202
+ * @public
203
+ */
204
+ declare function formatRupiah(amount: number, options?: RupiahOptions): string;
205
+ /**
206
+ * Formats a number in compact Indonesian format.
207
+ *
208
+ * Uses Indonesian units: ribu, juta, miliar, triliun.
209
+ * Follows Indonesian grammar rules (e.g., "1 juta" not "1,0 juta").
210
+ *
211
+ * @param amount - The amount to format
212
+ * @returns Compact formatted string
213
+ *
214
+ * @example
215
+ * Millions:
216
+ * ```typescript
217
+ * formatCompact(1500000); // 'Rp 1,5 juta'
218
+ * formatCompact(1000000); // 'Rp 1 juta'
219
+ * ```
220
+ *
221
+ * @example
222
+ * Thousands:
223
+ * ```typescript
224
+ * formatCompact(500000); // 'Rp 500 ribu'
225
+ * ```
226
+ *
227
+ * @example
228
+ * Small numbers:
229
+ * ```typescript
230
+ * formatCompact(1500); // 'Rp 1.500'
231
+ * ```
232
+ *
233
+ * @public
234
+ */
235
+ declare function formatCompact(amount: number): string;
236
+
237
+ /**
238
+ * Currency parsing utilities for Indonesian Rupiah.
239
+ *
240
+ * @module currency/parse
241
+ * @packageDocumentation
242
+ */
243
+ /**
244
+ * Parses a formatted Rupiah string back to a number.
245
+ *
246
+ * Handles multiple formats:
247
+ * - Standard: "Rp 1.500.000"
248
+ * - No symbol: "1.500.000"
249
+ * - With decimals: "Rp 1.500.000,50"
250
+ * - Compact: "Rp 1,5 juta", "Rp 500 ribu"
251
+ *
252
+ * @param formatted - The formatted Rupiah string to parse
253
+ * @returns Parsed number, or null if invalid
254
+ *
255
+ * @example
256
+ * Standard format:
257
+ * ```typescript
258
+ * parseRupiah('Rp 1.500.000'); // 1500000
259
+ * ```
260
+ *
261
+ * @example
262
+ * With decimals:
263
+ * ```typescript
264
+ * parseRupiah('Rp 1.500.000,50'); // 1500000.50
265
+ * ```
266
+ *
267
+ * @example
268
+ * Compact format:
269
+ * ```typescript
270
+ * parseRupiah('Rp 1,5 juta'); // 1500000
271
+ * parseRupiah('Rp 500 ribu'); // 500000
272
+ * ```
273
+ *
274
+ * @example
275
+ * Invalid input:
276
+ * ```typescript
277
+ * parseRupiah('invalid'); // null
278
+ * ```
279
+ *
280
+ * @public
281
+ */
282
+ declare function parseRupiah(formatted: string): number | null;
283
+
284
+ /**
285
+ * Convert numbers to Indonesian words (terbilang).
286
+ *
287
+ * @module currency/words
288
+ * @packageDocumentation
289
+ */
290
+
291
+ /**
292
+ * Converts a number to Indonesian words (terbilang).
293
+ *
294
+ * Supports numbers up to trillions (triliun).
295
+ * Follows Indonesian language rules for number pronunciation.
296
+ *
297
+ * Special rules:
298
+ * - 1 = "satu" in most cases, but "se-" for 100, 1000
299
+ * - 11 = "sebelas" (not "satu belas")
300
+ * - 100 = "seratus" (not "satu ratus")
301
+ * - 1000 = "seribu" (not "satu ribu")
302
+ *
303
+ * @param amount - The number to convert
304
+ * @param options - Conversion options
305
+ * @returns Indonesian words representation
306
+ *
307
+ * @example
308
+ * Basic numbers:
309
+ * ```typescript
310
+ * toWords(123); // 'seratus dua puluh tiga rupiah'
311
+ * ```
312
+ *
313
+ * @example
314
+ * Large numbers:
315
+ * ```typescript
316
+ * toWords(1500000); // 'satu juta lima ratus ribu rupiah'
317
+ * ```
318
+ *
319
+ * @example
320
+ * With options:
321
+ * ```typescript
322
+ * toWords(1500000, { uppercase: true });
323
+ * // 'Satu juta lima ratus ribu rupiah'
324
+ *
325
+ * toWords(1500000, { withCurrency: false });
326
+ * // 'satu juta lima ratus ribu'
327
+ * ```
328
+ *
329
+ * @public
330
+ */
331
+ declare function toWords(amount: number, options?: WordOptions): string;
332
+
333
+ export { type RupiahOptions as R, type WordOptions as W, formatCompact as a, type RoundUnit as b, formatRupiah as f, parseRupiah as p, toWords as t };