@indodev/toolkit 0.2.0 → 0.3.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.
Files changed (58) hide show
  1. package/dist/{compare-B1MKSOWV.d.cts → compare-CZadJMGl.d.cts} +54 -1
  2. package/dist/{compare-B1MKSOWV.d.ts → compare-CZadJMGl.d.ts} +54 -1
  3. package/dist/currency/index.cjs +23 -0
  4. package/dist/currency/index.cjs.map +1 -1
  5. package/dist/currency/index.d.cts +367 -3
  6. package/dist/currency/index.d.ts +367 -3
  7. package/dist/currency/index.js +21 -1
  8. package/dist/currency/index.js.map +1 -1
  9. package/dist/index.cjs +1188 -0
  10. package/dist/index.cjs.map +1 -1
  11. package/dist/index.d.cts +7 -4
  12. package/dist/index.d.ts +7 -4
  13. package/dist/index.js +1165 -1
  14. package/dist/index.js.map +1 -1
  15. package/dist/nik/index.cjs +44 -0
  16. package/dist/nik/index.cjs.map +1 -1
  17. package/dist/nik/index.d.cts +44 -1
  18. package/dist/nik/index.d.ts +44 -1
  19. package/dist/nik/index.js +41 -1
  20. package/dist/nik/index.js.map +1 -1
  21. package/dist/npwp/index.cjs +95 -0
  22. package/dist/npwp/index.cjs.map +1 -0
  23. package/dist/npwp/index.d.cts +76 -0
  24. package/dist/npwp/index.d.ts +76 -0
  25. package/dist/npwp/index.js +90 -0
  26. package/dist/npwp/index.js.map +1 -0
  27. package/dist/phone/index.cjs +42 -0
  28. package/dist/phone/index.cjs.map +1 -1
  29. package/dist/phone/index.d.cts +57 -1
  30. package/dist/phone/index.d.ts +57 -1
  31. package/dist/phone/index.js +39 -1
  32. package/dist/phone/index.js.map +1 -1
  33. package/dist/plate/index.cjs +99 -0
  34. package/dist/plate/index.cjs.map +1 -0
  35. package/dist/plate/index.d.cts +8 -0
  36. package/dist/plate/index.d.ts +8 -0
  37. package/dist/plate/index.js +94 -0
  38. package/dist/plate/index.js.map +1 -0
  39. package/dist/text/index.cjs +811 -0
  40. package/dist/text/index.cjs.map +1 -1
  41. package/dist/text/index.d.cts +1 -1
  42. package/dist/text/index.d.ts +1 -1
  43. package/dist/text/index.js +808 -1
  44. package/dist/text/index.js.map +1 -1
  45. package/dist/types-i5e6R0AS.d.cts +39 -0
  46. package/dist/types-i5e6R0AS.d.ts +39 -0
  47. package/dist/utils-DDVlOusI.d.cts +30 -0
  48. package/dist/utils-DDVlOusI.d.ts +30 -0
  49. package/dist/vin/index.cjs +84 -0
  50. package/dist/vin/index.cjs.map +1 -0
  51. package/dist/vin/index.d.cts +39 -0
  52. package/dist/vin/index.d.ts +39 -0
  53. package/dist/vin/index.js +74 -0
  54. package/dist/vin/index.js.map +1 -0
  55. package/package.json +48 -18
  56. package/LICENCE +0 -21
  57. package/dist/words-Dy8iYkbv.d.cts +0 -333
  58. package/dist/words-Dy8iYkbv.d.ts +0 -333
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Validates an Indonesian NPWP (Nomor Pokok Wajib Pajak).
3
+ *
4
+ * Supports both 15-digit (standard) and 16-digit (new NIK-based) formats.
5
+ *
6
+ * @param npwp - The NPWP string to validate
7
+ * @returns `true` if valid, `false` otherwise
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * validateNPWP('01.234.567.8-012.000'); // true
12
+ * validateNPWP('012345678012000'); // true
13
+ * ```
14
+ */
15
+ declare function validateNPWP(npwp: string): boolean;
16
+
17
+ /**
18
+ * Information extracted from an NPWP string.
19
+ */
20
+ interface NPWPInfo {
21
+ /** The full 15 or 16 digit numeric string */
22
+ npwp: string;
23
+ /** Taxpayer type (e.g., 01-03 for individual, etc.) */
24
+ type: string;
25
+ /** Serial number */
26
+ serial: string;
27
+ /** Checksum digit */
28
+ checksum: string;
29
+ /** Tax office code */
30
+ taxOfficeCode: string;
31
+ /** Branch code (usually 000 for head office) */
32
+ branchCode: string;
33
+ /** Whether the NPWP is a 16-digit (NIK-based) NPWP */
34
+ isNikBased: boolean;
35
+ }
36
+ /**
37
+ * Options for NPWP masking.
38
+ */
39
+ interface MaskOptions {
40
+ /** Number of characters to keep visible at the start (default: 2) */
41
+ visibleStart?: number;
42
+ /** Number of characters to keep visible at the end (default: 3) */
43
+ visibleEnd?: number;
44
+ /** Character to use for masking (default: '*') */
45
+ maskChar?: string;
46
+ }
47
+
48
+ /**
49
+ * Formats an NPWP string into standard Indonesian format (99.999.999.9-999.999).
50
+ *
51
+ * @param npwp - The NPWP string to format
52
+ * @returns Formatted NPWP string, or original if invalid
53
+ *
54
+ * @example
55
+ * ```typescript
56
+ * formatNPWP('012345678012000'); // '01.234.567.8-012.000'
57
+ * ```
58
+ */
59
+ declare function formatNPWP(npwp: string): string;
60
+ /**
61
+ * Parses an NPWP string into its components.
62
+ *
63
+ * @param npwp - The NPWP string to parse
64
+ * @returns NPWPInfo object, or null if invalid
65
+ */
66
+ declare function parseNPWP(npwp: string): NPWPInfo | null;
67
+ /**
68
+ * Masks an NPWP string for privacy.
69
+ *
70
+ * @param npwp - The NPWP string to mask
71
+ * @param options - Masking options
72
+ * @returns Masked NPWP string
73
+ */
74
+ declare function maskNPWP(npwp: string, options?: MaskOptions): string;
75
+
76
+ export { type MaskOptions, type NPWPInfo, formatNPWP, maskNPWP, parseNPWP, validateNPWP };
@@ -0,0 +1,90 @@
1
+ // src/npwp/validate.ts
2
+ function validateNPWP(npwp) {
3
+ if (!npwp || typeof npwp !== "string") {
4
+ return false;
5
+ }
6
+ const cleaned = npwp.replace(/[^\d]/g, "");
7
+ if (cleaned.length !== 15 && cleaned.length !== 16) {
8
+ return false;
9
+ }
10
+ if (!/^\d+$/.test(cleaned)) {
11
+ return false;
12
+ }
13
+ return true;
14
+ }
15
+
16
+ // src/npwp/format.ts
17
+ function formatNPWP(npwp) {
18
+ if (!validateNPWP(npwp)) {
19
+ return npwp;
20
+ }
21
+ const cleaned = npwp.replace(/[^\d]/g, "");
22
+ if (cleaned.length === 15) {
23
+ return `${cleaned.substring(0, 2)}.${cleaned.substring(
24
+ 2,
25
+ 5
26
+ )}.${cleaned.substring(5, 8)}.${cleaned.substring(8, 9)}-${cleaned.substring(
27
+ 9,
28
+ 12
29
+ )}.${cleaned.substring(12, 15)}`;
30
+ }
31
+ return cleaned;
32
+ }
33
+ function parseNPWP(npwp) {
34
+ if (!validateNPWP(npwp)) {
35
+ return null;
36
+ }
37
+ const cleaned = npwp.replace(/[^\d]/g, "");
38
+ const isNikBased = cleaned.length === 16;
39
+ if (isNikBased) {
40
+ return {
41
+ npwp: cleaned,
42
+ type: cleaned.substring(0, 2),
43
+ serial: cleaned.substring(2, 8),
44
+ checksum: cleaned.substring(8, 9),
45
+ taxOfficeCode: cleaned.substring(9, 12),
46
+ branchCode: cleaned.substring(12, 16),
47
+ isNikBased: true
48
+ };
49
+ }
50
+ return {
51
+ npwp: cleaned,
52
+ type: cleaned.substring(0, 2),
53
+ serial: cleaned.substring(2, 8),
54
+ checksum: cleaned.substring(8, 9),
55
+ taxOfficeCode: cleaned.substring(9, 12),
56
+ branchCode: cleaned.substring(12, 15),
57
+ isNikBased: false
58
+ };
59
+ }
60
+ function maskNPWP(npwp, options) {
61
+ if (!npwp) return "";
62
+ const { visibleStart = 2, visibleEnd = 3, maskChar = "*" } = options || {};
63
+ if (npwp.includes(".") || npwp.includes("-")) {
64
+ let digitCount = 0;
65
+ const digitsOnly = npwp.replace(/[^\d]/g, "");
66
+ const totalDigits = digitsOnly.length;
67
+ return npwp.split("").map((char) => {
68
+ if (/\d/.test(char)) {
69
+ digitCount++;
70
+ if (digitCount <= visibleStart || digitCount > totalDigits - visibleEnd) {
71
+ return char;
72
+ }
73
+ return maskChar;
74
+ }
75
+ return char;
76
+ }).join("");
77
+ }
78
+ const cleaned = npwp.replace(/[^\d]/g, "");
79
+ if (cleaned.length < visibleStart + visibleEnd) {
80
+ return cleaned.replace(/./g, maskChar);
81
+ }
82
+ const start = cleaned.substring(0, visibleStart);
83
+ const end = cleaned.substring(cleaned.length - visibleEnd);
84
+ const middle = maskChar.repeat(cleaned.length - visibleStart - visibleEnd);
85
+ return `${start}${middle}${end}`;
86
+ }
87
+
88
+ export { formatNPWP, maskNPWP, parseNPWP, validateNPWP };
89
+ //# sourceMappingURL=index.js.map
90
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/npwp/validate.ts","../../src/npwp/format.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Validates an Indonesian NPWP (Nomor Pokok Wajib Pajak).\n *\n * Supports both 15-digit (standard) and 16-digit (new NIK-based) formats.\n *\n * @param npwp - The NPWP string to validate\n * @returns `true` if valid, `false` otherwise\n *\n * @example\n * ```typescript\n * validateNPWP('01.234.567.8-012.000'); // true\n * validateNPWP('012345678012000'); // true\n * ```\n */\nexport function validateNPWP(npwp: string): boolean {\n if (!npwp || typeof npwp !== 'string') {\n return false;\n }\n\n const cleaned = npwp.replace(/[^\\d]/g, '');\n\n // Must be 15 or 16 digits\n if (cleaned.length !== 15 && cleaned.length !== 16) {\n return false;\n }\n\n // Basic check: all numeric\n if (!/^\\d+$/.test(cleaned)) {\n return false;\n }\n\n return true;\n}\n","import { validateNPWP } from './validate';\nimport { NPWPInfo, MaskOptions } from './types';\n\n/**\n * Formats an NPWP string into standard Indonesian format (99.999.999.9-999.999).\n *\n * @param npwp - The NPWP string to format\n * @returns Formatted NPWP string, or original if invalid\n *\n * @example\n * ```typescript\n * formatNPWP('012345678012000'); // '01.234.567.8-012.000'\n * ```\n */\nexport function formatNPWP(npwp: string): string {\n if (!validateNPWP(npwp)) {\n return npwp;\n }\n\n const cleaned = npwp.replace(/[^\\d]/g, '');\n\n if (cleaned.length === 15) {\n return `${cleaned.substring(0, 2)}.${cleaned.substring(\n 2,\n 5\n )}.${cleaned.substring(5, 8)}.${cleaned.substring(8, 9)}-${cleaned.substring(\n 9,\n 12\n )}.${cleaned.substring(12, 15)}`;\n }\n\n // 16-digit NPWP (NIK) usually doesn't have a standard \"dots\" format like 15-digit\n // but if it's NIK, it might be formatted as NIK elsewhere.\n // For now, return as is or implement a simple format.\n return cleaned;\n}\n\n/**\n * Parses an NPWP string into its components.\n *\n * @param npwp - The NPWP string to parse\n * @returns NPWPInfo object, or null if invalid\n */\nexport function parseNPWP(npwp: string): NPWPInfo | null {\n if (!validateNPWP(npwp)) {\n return null;\n }\n\n const cleaned = npwp.replace(/[^\\d]/g, '');\n const isNikBased = cleaned.length === 16;\n\n if (isNikBased) {\n return {\n npwp: cleaned,\n type: cleaned.substring(0, 2),\n serial: cleaned.substring(2, 8),\n checksum: cleaned.substring(8, 9),\n taxOfficeCode: cleaned.substring(9, 12),\n branchCode: cleaned.substring(12, 16),\n isNikBased: true,\n };\n }\n\n return {\n npwp: cleaned,\n type: cleaned.substring(0, 2),\n serial: cleaned.substring(2, 8),\n checksum: cleaned.substring(8, 9),\n taxOfficeCode: cleaned.substring(9, 12),\n branchCode: cleaned.substring(12, 15),\n isNikBased: false,\n };\n}\n\n/**\n * Masks an NPWP string for privacy.\n *\n * @param npwp - The NPWP string to mask\n * @param options - Masking options\n * @returns Masked NPWP string\n */\nexport function maskNPWP(npwp: string, options?: MaskOptions): string {\n if (!npwp) return '';\n\n const { visibleStart = 2, visibleEnd = 3, maskChar = '*' } = options || {};\n\n // If input is formatted, we mask the digits but keep the symbols in place\n if (npwp.includes('.') || npwp.includes('-')) {\n let digitCount = 0;\n const digitsOnly = npwp.replace(/[^\\d]/g, '');\n const totalDigits = digitsOnly.length;\n\n return npwp\n .split('')\n .map((char) => {\n if (/\\d/.test(char)) {\n digitCount++;\n if (\n digitCount <= visibleStart ||\n digitCount > totalDigits - visibleEnd\n ) {\n return char;\n }\n return maskChar;\n }\n return char;\n })\n .join('');\n }\n\n const cleaned = npwp.replace(/[^\\d]/g, '');\n\n if (cleaned.length < visibleStart + visibleEnd) {\n return cleaned.replace(/./g, maskChar);\n }\n\n const start = cleaned.substring(0, visibleStart);\n const end = cleaned.substring(cleaned.length - visibleEnd);\n const middle = maskChar.repeat(cleaned.length - visibleStart - visibleEnd);\n\n return `${start}${middle}${end}`;\n}\n"]}
@@ -642,6 +642,37 @@ function maskPhoneNumber(phone, options = {}) {
642
642
  return masked;
643
643
  }
644
644
 
645
+ // src/phone/links.ts
646
+ function generateWALink(phone, message) {
647
+ if (!validatePhoneNumber(phone)) {
648
+ return "";
649
+ }
650
+ const e164 = toE164(phone);
651
+ let link = `https://wa.me/${e164}`;
652
+ if (message) {
653
+ link += `?text=${encodeURIComponent(message)}`;
654
+ }
655
+ return link;
656
+ }
657
+ function generateSmsLink(phone, body) {
658
+ if (!validatePhoneNumber(phone)) {
659
+ return "";
660
+ }
661
+ const e164 = toE164(phone);
662
+ let link = `sms:+${e164}`;
663
+ if (body) {
664
+ link += `?body=${encodeURIComponent(body)}`;
665
+ }
666
+ return link;
667
+ }
668
+ function generateTelLink(phone) {
669
+ if (!validatePhoneNumber(phone)) {
670
+ return "";
671
+ }
672
+ const e164 = toE164(phone);
673
+ return `tel:+${e164}`;
674
+ }
675
+
645
676
  // src/phone/parse.ts
646
677
  function parsePhoneNumber(phone) {
647
678
  if (!validatePhoneNumber(phone)) {
@@ -690,6 +721,13 @@ function getOperator(phone) {
690
721
  const prefix = normalized.substring(0, 4);
691
722
  return OPERATOR_PREFIXES[prefix] || null;
692
723
  }
724
+ function isProvider(phone, providerName) {
725
+ const operator = getOperator(phone);
726
+ if (!operator) {
727
+ return false;
728
+ }
729
+ return operator.toLowerCase() === providerName.toLowerCase();
730
+ }
693
731
  function getRegion(phone) {
694
732
  if (!phone.startsWith("0")) {
695
733
  return null;
@@ -717,9 +755,13 @@ function normalizeToNational2(phone) {
717
755
 
718
756
  exports.cleanPhoneNumber = cleanPhoneNumber;
719
757
  exports.formatPhoneNumber = formatPhoneNumber;
758
+ exports.generateSmsLink = generateSmsLink;
759
+ exports.generateTelLink = generateTelLink;
760
+ exports.generateWALink = generateWALink;
720
761
  exports.getOperator = getOperator;
721
762
  exports.isLandlineNumber = isLandlineNumber;
722
763
  exports.isMobileNumber = isMobileNumber;
764
+ exports.isProvider = isProvider;
723
765
  exports.maskPhoneNumber = maskPhoneNumber;
724
766
  exports.parsePhoneNumber = parsePhoneNumber;
725
767
  exports.toE164 = toE164;
@@ -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.cjs","sourcesContent":["/**\n * Phone number constants for Indonesian operators and area codes.\n *\n * Data sources:\n * - Operator prefixes: Official operator documentation and Wikipedia\n * - Area codes: Ministry of Communication and Information Technology (Kemendagri)\n *\n * Last updated: December 2025\n *\n * @see {@link https://en.wikipedia.org/wiki/Telephone_numbers_in_Indonesia Wikipedia - Telephone numbers in Indonesia}\n * @internal\n */\n\n/**\n * Mobile operator prefix mapping.\n *\n * Maps 4-digit prefixes (e.g., '0812') to operator names.\n * Used for operator detection in mobile numbers.\n *\n * **Important Notes:**\n * - Tri (3 Indonesia) has merged with Indosat as of 2024\n * - Axis has been acquired by XL but maintains separate branding\n * - Some operators have both prepaid and postpaid services\n *\n * @example\n * ```typescript\n * OPERATOR_PREFIXES['0812']; // 'Telkomsel'\n * OPERATOR_PREFIXES['0817']; // 'XL'\n * OPERATOR_PREFIXES['0895']; // 'Indosat'\n * ```\n *\n * @internal\n */\nexport const OPERATOR_PREFIXES: Record<string, string> = {\n // Telkomsel (Halo, Simpati, by.U)\n '0811': 'Telkomsel',\n '0812': 'Telkomsel',\n '0813': 'Telkomsel',\n '0821': 'Telkomsel',\n '0822': 'Telkomsel',\n '0823': 'Telkomsel',\n '0851': 'Telkomsel',\n '0852': 'Telkomsel',\n '0853': 'Telkomsel',\n\n // XL Axiata (XL Prepaid, XL Prioritas, LIVE.ON)\n '0817': 'XL',\n '0818': 'XL',\n '0819': 'XL',\n '0859': 'XL',\n '0877': 'XL',\n '0878': 'XL',\n '0879': 'XL',\n\n // Indosat Ooredoo (IM3, Mentari)\n // Note: Tri (3 Indonesia) merged with Indosat\n '0814': 'Indosat',\n '0815': 'Indosat',\n '0816': 'Indosat',\n '0855': 'Indosat',\n '0856': 'Indosat',\n '0857': 'Indosat',\n '0858': 'Indosat',\n '0895': 'Indosat',\n '0896': 'Indosat',\n '0897': 'Indosat',\n '0898': 'Indosat',\n '0899': 'Indosat',\n\n // Smartfren (Smartfren Power Up)\n '0881': 'Smartfren',\n '0882': 'Smartfren',\n '0883': 'Smartfren',\n '0884': 'Smartfren',\n '0885': 'Smartfren',\n '0886': 'Smartfren',\n '0887': 'Smartfren',\n '0888': 'Smartfren',\n '0889': 'Smartfren',\n\n // Axis (Acquired by XL but maintains separate branding)\n '0831': 'Axis',\n '0832': 'Axis',\n '0833': 'Axis',\n '0838': 'Axis',\n};\n\n/**\n * Landline area code mapping.\n *\n * Maps area codes to city/region names for landline numbers.\n * Includes both 3-digit (e.g., '021') and 4-digit (e.g., '0274') codes.\n *\n * This mapping covers all provinces in Indonesia including:\n * - Jakarta, Banten, West Java, Central Java, Yogyakarta\n * - East Java, Bali, Nusa Tenggara\n * - Sulawesi, Kalimantan\n * - Sumatra, Maluku, Papua\n *\n * @example\n * ```typescript\n * AREA_CODES['021']; // 'Jakarta'\n * AREA_CODES['0274']; // 'Yogyakarta'\n * AREA_CODES['0361']; // 'Denpasar'\n * ```\n *\n * @internal\n */\nexport const AREA_CODES: Record<string, string> = {\n // ========================================\n // JAKARTA, BANTEN & WEST JAVA\n // ========================================\n\n // Jakarta & Greater Jakarta\n '021': 'Jakarta',\n\n // Banten\n '0252': 'Lebak',\n '0253': 'Pandeglang',\n '0254': 'Cilegon & Serang',\n\n // West Java\n '022': 'Bandung',\n '0231': 'Cirebon',\n '0232': 'Kuningan',\n '0233': 'Majalengka',\n '0234': 'Indramayu',\n '0251': 'Bogor',\n '0260': 'Subang',\n '0261': 'Sumedang',\n '0262': 'Garut',\n '0263': 'Cianjur',\n '0264': 'Purwakarta',\n '0265': 'Tasikmalaya',\n '0266': 'Sukabumi',\n '0267': 'Karawang',\n\n // ========================================\n // CENTRAL JAVA & YOGYAKARTA\n // ========================================\n\n // Central Java\n '024': 'Semarang',\n '0271': 'Solo',\n '0272': 'Klaten',\n '0273': 'Wonogiri',\n '0275': 'Purworejo',\n '0276': 'Boyolali',\n '0280': 'Cilacap',\n '0281': 'Banyumas & Purbalingga',\n '0282': 'Cilacap',\n '0283': 'Tegal & Brebes',\n '0284': 'Pemalang',\n '0285': 'Pekalongan',\n '0286': 'Banjarnegara & Wonosobo',\n '0287': 'Kebumen',\n '0289': 'Bumiayu',\n '0291': 'Kudus & Jepara',\n '0292': 'Grobogan',\n '0293': 'Magelang',\n '0294': 'Kendal',\n '0295': 'Pati & Rembang',\n '0296': 'Blora',\n '0297': 'Karimun Jawa',\n '0298': 'Salatiga',\n\n // Yogyakarta\n '0274': 'Yogyakarta',\n\n // ========================================\n // EAST JAVA, BALI & NUSA TENGGARA\n // ========================================\n\n // East Java\n '031': 'Surabaya',\n '0321': 'Mojokerto & Jombang',\n '0322': 'Lamongan',\n '0323': 'Sampang',\n '0324': 'Pamekasan',\n '0325': 'Bawean',\n '0326': 'Masalembu',\n '0327': 'Kangean',\n '0328': 'Sumenep',\n '0331': 'Jember',\n '0332': 'Bondowoso',\n '0333': 'Banyuwangi',\n '0334': 'Lumajang',\n '0335': 'Probolinggo',\n '0336': 'Jember',\n '0338': 'Situbondo',\n '0341': 'Malang',\n '0342': 'Blitar',\n '0343': 'Pasuruan',\n '0351': 'Madiun',\n '0352': 'Ponorogo',\n '0353': 'Bojonegoro',\n '0354': 'Kediri',\n '0355': 'Tulungagung',\n '0356': 'Tuban',\n '0357': 'Pacitan',\n '0358': 'Nganjuk',\n\n // Bali\n '0361': 'Denpasar',\n '0362': 'Singaraja',\n '0363': 'Amlapura',\n '0365': 'Negara',\n '0366': 'Tabanan',\n '0368': 'Gianyar',\n\n // Nusa Tenggara Barat (NTB)\n '0370': 'Mataram',\n '0371': 'Sumbawa',\n '0372': 'West Sumbawa',\n '0373': 'Dompu',\n '0374': 'Bima',\n '0376': 'East Lombok',\n\n // Nusa Tenggara Timur (NTT)\n '0379': 'Alor',\n '0380': 'Kupang',\n '0381': 'Ende',\n '0382': 'Sikka',\n '0383': 'East Flores',\n '0384': 'Ngada',\n '0385': 'Manggarai',\n '0386': 'West Manggarai',\n '0387': 'Sumba',\n '0388': 'North & South Central Timor',\n '0389': 'Belu',\n\n // ========================================\n // SULAWESI\n // ========================================\n\n // South Sulawesi\n '0410': 'Pangkajene',\n '0411': 'Makassar',\n '0413': 'Bantaeng & Bulukumba',\n '0414': 'Selayar',\n '0417': 'Malino',\n '0418': 'Takalar',\n '0419': 'Jeneponto',\n '0420': 'Enrekang',\n '0421': 'Pare Pare',\n '0423': 'Tana Toraja',\n '0427': 'Barru',\n '0471': 'Luwu',\n '0472': 'Wajo (Pitumpanua)',\n '0473': 'North Luwu',\n '0474': 'East Luwu',\n '0475': 'Sorowako',\n '0481': 'Bone',\n '0482': 'Sinjai',\n '0484': 'Soppeng',\n '0485': 'Wajo',\n\n // West Sulawesi\n '0422': 'Majene',\n '0426': 'Mamuju',\n '0428': 'Polewali',\n '0429': 'Central Mamuju',\n\n // Central Sulawesi\n '0409': 'Morowali',\n '0445': 'Buol',\n '0450': 'Parigi Moutong',\n '0451': 'Palu',\n '0452': 'Poso',\n '0453': 'Toli-Toli',\n '0454': 'Tinombo',\n '0455': 'Moutong',\n '0457': 'Donggala',\n '0458': 'Tentena',\n '0461': 'Banggai',\n '0462': 'Banggai Island',\n '0463': 'Bunta',\n '0464': 'Tojo Una-Una',\n '0465': 'North Morowali',\n\n // Southeast Sulawesi\n '0401': 'Kendari',\n '0402': 'Buton',\n '0403': 'Muna',\n '0404': 'Wakatobi',\n '0405': 'Kolaka',\n '0408': 'Konawe',\n\n // North Sulawesi\n '0430': 'South Minahasa',\n '0431': 'Manado',\n '0432': 'Sangihe',\n '0433': 'Talaud',\n '0434': 'Bolaang Mongondow',\n '0438': 'Bitung',\n\n // Gorontalo\n '0435': 'Gorontalo',\n '0442': 'North Gorontalo',\n '0443': 'Pohuwato',\n\n // ========================================\n // KALIMANTAN\n // ========================================\n\n // West Kalimantan\n '0534': 'Ketapang',\n '0535': 'Kayong Utara',\n '0561': 'Pontianak',\n '0562': 'Sambas & Singkawang',\n '0563': 'Landak',\n '0564': 'Sanggau',\n '0565': 'Sintang',\n '0567': 'Kapuas Hulu',\n '0568': 'Melawi',\n\n // Central Kalimantan\n '0513': 'Kapuas',\n '0519': 'North Barito',\n '0526': 'South & East Barito',\n '0528': 'Murung Raya',\n '0531': 'East Kotawaringin',\n '0532': 'West Kotawaringin',\n '0536': 'Palangka Raya',\n '0537': 'Gunung Mas',\n '0538': 'Seruyan',\n '0539': 'Seruyan & East Kotawaringin',\n\n // South Kalimantan\n '0511': 'Banjarmasin',\n '0512': 'Tanah Laut',\n '0517': 'Hulu Sungai Selatan',\n '0518': 'Tanah Bumbu',\n '0527': 'Hulu Sungai Utara',\n\n // East Kalimantan\n '0541': 'Samarinda',\n '0542': 'Balikpapan',\n '0543': 'Paser',\n '0545': 'West Kutai',\n '0548': 'Bontang',\n '0549': 'East Kutai',\n '0554': 'Berau',\n\n // North Kalimantan\n '0551': 'Tarakan',\n '0552': 'Bulungan',\n '0553': 'Malinau',\n '0556': 'Nunukan',\n\n // ========================================\n // SUMATRA\n // ========================================\n\n // Aceh\n '0627': 'Subulussalam & Dairi (North Sumatra)',\n '0629': 'Southeast Aceh',\n '0641': 'Langsa',\n '0642': 'Gayo Lues',\n '0643': 'Central Aceh',\n '0644': 'Bireuen',\n '0645': 'Lhokseumawe',\n '0646': 'East Aceh',\n '0650': 'Simeulue',\n '0651': 'Banda Aceh',\n '0652': 'Sabang',\n '0653': 'Pidie',\n '0654': 'Aceh Jaya',\n '0655': 'West Aceh',\n '0656': 'South Aceh',\n '0657': 'South Aceh',\n '0658': 'Singkil',\n '0659': 'Southwest Aceh',\n\n // North Sumatra\n '061': 'Medan',\n '0620': 'Pangkalan Brandan',\n '0621': 'Tebing Tinggi',\n '0622': 'Pematang Siantar',\n '0623': 'Asahan',\n '0624': 'Labuhan Batu',\n '0625': 'Parapat',\n '0626': 'Samosir',\n // '0627': 'Dairi', // for this prefix, it same with Subulussalam (Aceh)\n '0628': 'Karo',\n '0630': 'South Nias',\n '0631': 'Sibolga',\n '0632': 'Toba Samosir',\n '0633': 'North Tapanuli',\n '0634': 'Padang Sidempuan',\n '0635': 'South Tapanuli',\n '0636': 'Mandailing Natal',\n '0638': 'Barus',\n '0639': 'Nias',\n\n // West Sumatra\n '0751': 'Padang',\n '0752': 'Bukittinggi',\n '0753': 'Pasaman',\n '0754': 'Sawahlunto',\n '0755': 'Solok',\n '0756': 'South Pesisir',\n '0757': 'South Pesisir',\n '0759': 'Mentawai',\n\n // Riau\n '0760': 'Kuantan Singingi',\n '0761': 'Pekanbaru',\n '0762': 'Kampar',\n '0763': 'Bengkalis',\n '0764': 'Siak',\n '0765': 'Dumai',\n '0766': 'Bengkalis',\n '0767': 'Rokan Hulu',\n '0768': 'Indragiri Hilir',\n '0769': 'Indragiri Hulu',\n\n // Riau Islands\n '0770': 'Muka Kuning Batamindo',\n '0771': 'Tanjungpinang',\n '0772': 'Anambas',\n '0773': 'Natuna',\n '0776': 'Lingga',\n '0777': 'Great Karimun',\n '0778': 'Batam',\n '0779': 'Kundur',\n\n // Jambi\n '0741': 'Jambi',\n '0742': 'West Tanjung Jabung',\n '0743': 'Batanghari',\n '0744': 'Tebo',\n '0745': 'Sarolangun',\n '0746': 'Merangin',\n '0747': 'Bungo',\n '0748': 'Kerinci',\n\n // South Sumatra\n '0702': 'Empat Lawang',\n '0711': 'Palembang',\n '0712': 'Ogan Komering Ilir',\n '0713': 'Prabumulih',\n '0714': 'Musi Banyuasin',\n '0730': 'Pagar Alam',\n '0731': 'Lahat',\n '0733': 'Lubuklinggau',\n '0734': 'Muara Enim',\n '0735': 'Ogan Komering Ulu',\n\n // Bangka Belitung\n '0715': 'Belinyu',\n '0716': 'West Bangka',\n '0717': 'Pangkal Pinang',\n '0718': 'Central & South Bangka',\n '0719': 'Belitung',\n\n // Bengkulu\n '0732': 'Rejang Lebong',\n '0736': 'Bengkulu',\n '0737': 'North Bengkulu',\n '0739': 'South Bengkulu',\n\n // Lampung\n '0721': 'Bandar Lampung',\n '0722': 'Tanggamus',\n '0723': 'Way Kanan',\n '0724': 'North Lampung',\n '0725': 'Metro',\n '0726': 'Tulang Bawang',\n '0727': 'South Lampung',\n '0728': 'West Lampung',\n '0729': 'Pringsewu',\n\n // ========================================\n // MALUKU & PAPUA\n // ========================================\n\n // Maluku\n '0910': 'Ambon',\n '0911': 'Southeast Maluku',\n '0913': 'Tual',\n '0914': 'Saumlaki',\n '0916': 'Namlea',\n '0918': 'Ternate',\n '0921': 'Sanana',\n '0924': 'Tobelo',\n\n // Papua & West Papua\n '0901': 'Timika',\n '0902': 'Agats',\n '0951': 'Sorong',\n '0952': 'South Sorong',\n '0967': 'Manokwari',\n '0969': 'Sorong',\n '0971': 'Merauke',\n '0975': 'Boven Digoel',\n '0979': 'Tembagapura',\n '0981': 'Jayapura',\n '0986': 'Wamena',\n};\n\n/**\n * Valid mobile number prefixes (first 4 digits after country code).\n *\n * Used for quick validation without operator detection.\n *\n * @internal\n */\nexport const VALID_MOBILE_PREFIXES = Object.keys(OPERATOR_PREFIXES);\n\n/**\n * Valid area codes for landline numbers.\n *\n * Used for landline validation.\n *\n * @internal\n */\nexport const VALID_AREA_CODES = Object.keys(AREA_CODES);","import { OPERATOR_PREFIXES, AREA_CODES } from './constants';\n\n/**\n * Validates an Indonesian phone number format.\n *\n * Accepts multiple input formats:\n * - National format: 08xx-xxxx-xxxx or 08xxxxxxxxxx\n * - International with +: +62 8xx-xxxx-xxxx or +628xxxxxxxxxx\n * - International without +: 62 8xx-xxxx-xxxx or 628xxxxxxxxxx\n *\n * For mobile numbers, validates:\n * - Starts with 08 (national) or 628 (international)\n * - Has valid operator prefix (0811, 0812, 0817, etc.)\n * - Total length is 10-13 digits (after removing non-digits)\n *\n * For landline numbers, validates:\n * - Starts with 0 followed by area code (021, 022, etc.)\n * - Total length is appropriate for landline\n *\n * @param phone - The phone number string to validate\n * @returns `true` if the phone number is valid, `false` otherwise\n *\n * @example\n * Valid mobile number (national):\n * ```typescript\n * validatePhoneNumber('081234567890'); // true\n * ```\n *\n * @example\n * Valid mobile number (international):\n * ```typescript\n * validatePhoneNumber('+6281234567890'); // true\n * validatePhoneNumber('6281234567890'); // true\n * ```\n *\n * @example\n * With separators:\n * ```typescript\n * validatePhoneNumber('0812-3456-7890'); // true\n * validatePhoneNumber('+62 812-3456-7890'); // true\n * ```\n *\n * @example\n * Invalid numbers:\n * ```typescript\n * validatePhoneNumber('1234'); // false - too short\n * validatePhoneNumber('08001234567'); // false - invalid prefix\n * validatePhoneNumber('+1234567890'); // false - wrong country code\n * ```\n *\n * @public\n */\nexport function validatePhoneNumber(phone: string): boolean {\n if (!phone || typeof phone !== 'string') {\n return false;\n }\n\n // Only allow digits, +, -, space, parentheses, dot\n if (!/^[\\d\\s\\-+().]+$/.test(phone)) {\n return false;\n }\n\n const cleaned = phone.replace(/[\\s\\-().]/g, '');\n\n let normalized: string;\n\n if (cleaned.startsWith('+62')) {\n normalized = '0' + cleaned.substring(3);\n } else if (cleaned.startsWith('62') && !cleaned.startsWith('620')) {\n normalized = '0' + cleaned.substring(2);\n } else if (cleaned.startsWith('0')) {\n normalized = cleaned;\n } else {\n return false;\n }\n\n if (normalized.startsWith('08')) {\n return validateMobileNumber(normalized);\n }\n\n if (normalized.startsWith('0')) {\n return validateLandlineNumber(normalized);\n }\n\n return false;\n}\n\n/**\n * Validates a mobile phone number (08xx format).\n *\n * @param phone - Phone number in 08xx format\n * @returns true if valid mobile number\n * @internal\n */\nfunction validateMobileNumber(phone: string): boolean {\n // Mobile numbers should be 10-13 digits\n if (phone.length < 10 || phone.length > 13) {\n return false;\n }\n\n // Check if prefix is valid (first 4 digits)\n const prefix = phone.substring(0, 4);\n if (!OPERATOR_PREFIXES[prefix]) {\n return false;\n }\n\n // All digits should be numeric\n if (!/^\\d+$/.test(phone)) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Validates a landline phone number.\n *\n * @param phone - Phone number in landline format\n * @returns true if valid landline number\n * @internal\n */\nfunction validateLandlineNumber(phone: string): boolean {\n // Landline numbers typically 9-11 digits\n if (phone.length < 9 || phone.length > 11) {\n return false;\n }\n\n // Check common area codes (3 or 4 digits)\n const areaCode3 = phone.substring(0, 3);\n const areaCode4 = phone.substring(0, 4);\n\n if (AREA_CODES[areaCode3] || AREA_CODES[areaCode4]) {\n return true;\n }\n\n // If not in our area code list, check if it follows general pattern\n // Landlines start with 0 followed by 2-4 digit area code\n if (/^0[2-9]\\d{7,9}$/.test(phone)) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Checks if a phone number is a mobile number.\n *\n * @param phone - The phone number to check\n * @returns `true` if it's a mobile number (08xx), `false` otherwise\n *\n * @example\n * ```typescript\n * isMobileNumber('081234567890'); // true\n * isMobileNumber('+6281234567890'); // true\n * isMobileNumber('0212345678'); // false (landline)\n * ```\n *\n * @public\n */\nexport function isMobileNumber(phone: string): boolean {\n if (!validatePhoneNumber(phone)) {\n return false;\n }\n\n const cleaned = phone.replace(/[^\\d+]/g, '');\n let normalized: string;\n\n if (cleaned.startsWith('+62')) {\n normalized = '0' + cleaned.substring(3);\n } else if (cleaned.startsWith('62')) {\n normalized = '0' + cleaned.substring(2);\n } else {\n normalized = cleaned;\n }\n\n return normalized.startsWith('08');\n}\n\n/**\n * Checks if a phone number is a landline number.\n *\n * @param phone - The phone number to check\n * @returns `true` if it's a landline number, `false` otherwise\n *\n * @example\n * ```typescript\n * isLandlineNumber('0212345678'); // true\n * isLandlineNumber('081234567890'); // false (mobile)\n * ```\n *\n * @public\n */\nexport function isLandlineNumber(phone: string): boolean {\n if (!validatePhoneNumber(phone)) {\n return false;\n }\n\n return !isMobileNumber(phone);\n}","import { AREA_CODES } from './constants';\nimport { PhoneFormat, MaskOptions } from './types';\nimport { validatePhoneNumber } from './validate';\n\n/**\n * Formats an Indonesian phone number to the specified format.\n *\n * Accepts various input formats and converts to the desired output format.\n * Automatically adds appropriate separators for readability.\n *\n * @param phone - The phone number to format\n * @param format - Target format ('international', 'national', 'e164', 'display')\n * @returns Formatted phone number, or original string if invalid\n *\n * @example\n * International format:\n * ```typescript\n * formatPhoneNumber('081234567890', 'international');\n * // '+62 812-3456-7890'\n * ```\n *\n * @example\n * National format:\n * ```typescript\n * formatPhoneNumber('+6281234567890', 'national');\n * // '0812-3456-7890'\n * ```\n *\n * @example\n * E.164 format (no spaces/dashes):\n * ```typescript\n * formatPhoneNumber('0812-3456-7890', 'e164');\n * // '6281234567890'\n * ```\n *\n * @public\n */\nexport function formatPhoneNumber(\n phone: string,\n format: PhoneFormat = 'national'\n): string {\n if (!validatePhoneNumber(phone)) {\n return phone;\n }\n\n const cleaned = cleanPhoneNumber(phone);\n\n let normalized: string;\n if (cleaned.startsWith('+62')) {\n normalized = '0' + cleaned.substring(3);\n } else if (cleaned.startsWith('62') && !cleaned.startsWith('620')) {\n normalized = '0' + cleaned.substring(2);\n } else {\n normalized = cleaned;\n }\n\n switch (format) {\n case 'international':\n return toInternational(normalized);\n case 'national':\n case 'display':\n return toNational(normalized);\n case 'e164':\n return toE164(normalized);\n default:\n return phone;\n }\n}\n\n/**\n * Converts a phone number to international format (+62 xxx-xxxx-xxxx).\n *\n * @param phone - The phone number to convert\n * @returns Phone number in international format with separators\n *\n * @example\n * ```typescript\n * toInternational('081234567890');\n * // '+62 812-3456-7890'\n * ```\n *\n * @example\n * Already international:\n * ```typescript\n * toInternational('+6281234567890');\n * // '+62 812-3456-7890'\n * ```\n *\n * @public\n */\nexport function toInternational(phone: string): string {\n const cleaned = cleanPhoneNumber(phone);\n if (!cleaned) {\n return phone;\n }\n\n const normalized = normalizeToNational(cleaned);\n if (!normalized) {\n return phone;\n }\n\n const withoutZero = normalized.substring(1);\n\n if (normalized.startsWith('08')) {\n if (withoutZero.length === 11) {\n return `+62 ${withoutZero.substring(0, 3)}-${withoutZero.substring(3, 7)}-${withoutZero.substring(7)}`;\n } else if (withoutZero.length === 10) {\n return `+62 ${withoutZero.substring(0, 3)}-${withoutZero.substring(3, 6)}-${withoutZero.substring(6)}`;\n } else if (withoutZero.length === 9) {\n return `+62 ${withoutZero.substring(0, 3)}-${withoutZero.substring(3)}`;\n } else if (withoutZero.length === 12) {\n return `+62 ${withoutZero.substring(0, 3)}-${withoutZero.substring(3, 7)}-${withoutZero.substring(7)}`;\n }\n }\n\n const areaCodeLength = getAreaCodeLength(normalized);\n const areaCode = normalized.substring(1, areaCodeLength + 1);\n const localNumber = normalized.substring(areaCodeLength + 1);\n\n return `+62 ${areaCode}-${localNumber}`;\n}\n\n/**\n * Converts a phone number to national format (08xx-xxxx-xxxx).\n *\n * @param phone - The phone number to convert\n * @returns Phone number in national format with dashes\n *\n * @example\n * ```typescript\n * toNational('+6281234567890');\n * // '0812-3456-7890'\n * ```\n *\n * @example\n * Already national:\n * ```typescript\n * toNational('081234567890');\n * // '0812-3456-7890'\n * ```\n *\n * @public\n */\nexport function toNational(phone: string): string {\n const cleaned = cleanPhoneNumber(phone);\n if (!cleaned) {\n return phone;\n }\n\n const normalized = normalizeToNational(cleaned);\n if (!normalized) {\n return phone;\n }\n\n if (normalized.startsWith('08')) {\n if (normalized.length === 12) {\n return `${normalized.substring(0, 4)}-${normalized.substring(4, 8)}-${normalized.substring(8)}`;\n } else if (normalized.length === 11) {\n return `${normalized.substring(0, 4)}-${normalized.substring(4, 7)}-${normalized.substring(7)}`;\n } else if (normalized.length === 10) {\n return `${normalized.substring(0, 4)}-${normalized.substring(4)}`;\n } else if (normalized.length === 13) {\n return `${normalized.substring(0, 4)}-${normalized.substring(4, 8)}-${normalized.substring(8)}`;\n }\n }\n\n const areaCodeLength = getAreaCodeLength(normalized);\n const areaCodeWithZero = normalized.substring(0, areaCodeLength + 1);\n const localNumber = normalized.substring(areaCodeLength + 1);\n\n return `${areaCodeWithZero}-${localNumber}`;\n}\n\n/**\n * Converts a phone number to E.164 format (6281234567890).\n *\n * E.164 is the international standard format without spaces or dashes.\n * Suitable for API calls and database storage.\n *\n * @param phone - The phone number to convert\n * @returns Phone number in E.164 format\n *\n * @example\n * ```typescript\n * toE164('0812-3456-7890');\n * // '6281234567890'\n * ```\n *\n * @example\n * From international format:\n * ```typescript\n * toE164('+62 812-3456-7890');\n * // '6281234567890'\n * ```\n *\n * @public\n */\nexport function toE164(phone: string): string {\n const cleaned = cleanPhoneNumber(phone);\n if (!cleaned) {\n return phone;\n }\n\n const normalized = normalizeToNational(cleaned);\n if (!normalized) {\n return phone;\n }\n\n return '62' + normalized.substring(1);\n}\n\n/**\n * Removes all non-digit characters from a phone number, preserving leading +.\n *\n * @param phone - The phone number to clean\n * @returns Cleaned phone number with only digits (and optional leading +)\n *\n * @example\n * ```typescript\n * cleanPhoneNumber('0812-3456-7890');\n * // '081234567890'\n * ```\n *\n * @example\n * ```typescript\n * cleanPhoneNumber('+62 812 3456 7890');\n * // '+6281234567890'\n * ```\n *\n * @public\n */\nexport function cleanPhoneNumber(phone: string): string {\n if (!phone || typeof phone !== 'string') {\n return '';\n }\n\n return phone.replace(/[^\\d+]/g, '');\n}\n\n/**\n * Normalizes a phone number to national format (08xx).\n *\n * @param phone - Cleaned phone number\n * @returns Phone number in 08xx format\n * @internal\n */\nfunction normalizeToNational(phone: string): string {\n if (phone.startsWith('+62')) {\n return '0' + phone.substring(3);\n } else if (phone.startsWith('62') && !phone.startsWith('620')) {\n return '0' + phone.substring(2);\n } else if (phone.startsWith('0')) {\n return phone;\n }\n return '';\n}\n\n/**\n * Determines area code length for landline numbers.\n *\n * @param normalized - Phone number in national format (0xxx)\n * @returns Area code length (digits after leading 0)\n * @internal\n */\nfunction getAreaCodeLength(normalized: string): number {\n // Check 4-digit area codes ('0xxxx')\n const fourDigitCode = normalized.substring(0, 5);\n if (AREA_CODES[fourDigitCode]) {\n return 4;\n }\n\n // Check 3-digit area codes ('0xxx')\n const threeDigitCode = normalized.substring(0, 4);\n if (AREA_CODES[threeDigitCode]) {\n return 3;\n }\n\n // Check 2-digit area codes ('0xx')\n const twoDigitCode = normalized.substring(0, 3);\n if (AREA_CODES[twoDigitCode]) {\n return 2;\n }\n\n return 2;\n}\n\n/**\n * Masks a phone number for privacy protection.\n *\n * By default, shows the first 4 and last 4 digits, masking the middle digits.\n * Optionally formats with separators.\n *\n * @param phone - The phone number to mask\n * @param options - Masking configuration options\n * @returns Masked phone number, or original string if invalid\n *\n * @example\n * Default masking:\n * ```typescript\n * maskPhoneNumber('081234567890');\n * // '0812****7890'\n * ```\n *\n * @example\n * Custom mask character:\n * ```typescript\n * maskPhoneNumber('081234567890', { char: 'X' });\n * // '0812XXXX7890'\n * ```\n *\n * @example\n * With separator:\n * ```typescript\n * maskPhoneNumber('081234567890', { separator: '-' });\n * // '0812-****-7890'\n * ```\n *\n * @public\n */\nexport function maskPhoneNumber(\n phone: string,\n options: MaskOptions = {}\n): string {\n const cleaned = cleanPhoneNumber(phone);\n if (!cleaned) {\n return phone;\n }\n\n const isInternational = cleaned.startsWith('+');\n let toMask: string;\n\n if (isInternational) {\n toMask = cleaned;\n } else {\n const normalized = normalizeToNational(cleaned);\n toMask = normalized || cleaned;\n }\n\n if (toMask.length < 4) {\n return phone;\n }\n\n const { char = '*', separator } = options;\n let { start = 4, end = 4 } = options;\n\n if (start + end >= toMask.length) {\n // Auto-adjust for short numbers to ensure masking happens\n if (toMask.length < 10) {\n const minMaskLength = 1;\n const availableForVisible = toMask.length - minMaskLength;\n\n if (availableForVisible >= 2) {\n start = Math.floor(availableForVisible / 2);\n end = availableForVisible - start;\n } else {\n return toMask;\n }\n } else {\n return toMask;\n }\n }\n\n const startPart = toMask.substring(0, start);\n const endPart = toMask.substring(toMask.length - end);\n const maskLength = toMask.length - start - end;\n const masked = startPart + char.repeat(maskLength) + endPart;\n\n if (separator) {\n return `${masked.substring(0, start)}${separator}${masked.substring(start, masked.length - end)}${separator}${masked.substring(masked.length - end)}`;\n }\n\n return masked;\n}\n","import { OPERATOR_PREFIXES, AREA_CODES } from './constants';\nimport { PhoneInfo } from './types';\nimport {\n cleanPhoneNumber,\n toInternational,\n toNational,\n toE164,\n} from './format';\nimport { validatePhoneNumber, isMobileNumber } from './validate';\n\n/**\n * Parses an Indonesian phone number and extracts all information.\n *\n * Extracts country code, operator, formatted variants, and determines\n * if it's a mobile or landline number.\n *\n * @param phone - The phone number to parse\n * @returns Parsed phone information, or `null` if invalid\n *\n * @example\n * Parse a mobile number:\n * ```typescript\n * const info = parsePhoneNumber('081234567890');\n * console.log(info);\n * // {\n * // countryCode: '62',\n * // operator: 'Telkomsel',\n * // number: '81234567890',\n * // formatted: {\n * // international: '+62 812-3456-7890',\n * // national: '0812-3456-7890',\n * // e164: '6281234567890'\n * // },\n * // isValid: true,\n * // isMobile: true,\n * // isLandline: false\n * // }\n * ```\n *\n * @example\n * Parse with different input format:\n * ```typescript\n * const info = parsePhoneNumber('+62 812-3456-7890');\n * console.log(info.operator); // 'Telkomsel'\n * console.log(info.formatted.national); // '0812-3456-7890'\n * ```\n *\n * @example\n * Parse a landline:\n * ```typescript\n * const info = parsePhoneNumber('0212345678');\n * console.log(info.region); // 'Jakarta'\n * console.log(info.isLandline); // true\n * ```\n *\n * @public\n */\nexport function parsePhoneNumber(phone: string): PhoneInfo | null {\n if (!validatePhoneNumber(phone)) {\n return null;\n }\n\n const cleaned = cleanPhoneNumber(phone);\n const normalized = normalizeToNational(cleaned);\n\n if (!normalized) {\n return null;\n }\n\n const countryCode = '62';\n const number = normalized.substring(1); // Remove leading 0\n const isMobile = normalized.startsWith('08');\n const isLandline = !isMobile;\n\n let operator: string | null = null;\n let region: string | null = null;\n\n if (isMobile) {\n operator = getOperator(normalized);\n } else {\n region = getRegion(normalized);\n }\n\n return {\n countryCode,\n operator,\n number,\n formatted: {\n international: toInternational(normalized),\n national: toNational(normalized),\n e164: toE164(normalized),\n },\n isValid: true,\n isMobile,\n isLandline,\n region,\n };\n}\n\n/**\n * Detects the mobile operator from a phone number.\n *\n * Identifies the operator based on the phone number prefix.\n * Returns `null` if the operator cannot be determined or if it's not a mobile number.\n *\n * @param phone - The phone number to check\n * @returns Operator name, or `null` if not detected\n *\n * @example\n * Telkomsel numbers:\n * ```typescript\n * getOperator('081234567890'); // 'Telkomsel'\n * getOperator('0812-3456-7890'); // 'Telkomsel'\n * getOperator('+6281234567890'); // 'Telkomsel'\n * ```\n *\n * @example\n * XL numbers:\n * ```typescript\n * getOperator('081734567890'); // 'XL'\n * ```\n *\n * @example\n * Non-mobile or invalid:\n * ```typescript\n * getOperator('0212345678'); // null (landline)\n * getOperator('1234'); // null (invalid)\n * ```\n *\n * @public\n */\nexport function getOperator(phone: string): string | null {\n if (!isMobileNumber(phone)) {\n return null;\n }\n\n const cleaned = cleanPhoneNumber(phone);\n const normalized = normalizeToNational(cleaned);\n\n if (!normalized || normalized.length < 4) {\n return null;\n }\n\n const prefix = normalized.substring(0, 4);\n return OPERATOR_PREFIXES[prefix] || null;\n}\n\n/**\n * Gets the region name for a landline number.\n *\n * @param phone - Landline phone number in national format\n * @returns Region name, or null if not found\n * @internal\n */\nfunction getRegion(phone: string): string | null {\n if (!phone.startsWith('0')) {\n return null;\n }\n\n // Check 4-digit area code\n const areaCode4 = phone.substring(0, 4);\n if (AREA_CODES[areaCode4]) {\n return AREA_CODES[areaCode4];\n }\n\n // Check 3-digit area code\n const areaCode3 = phone.substring(0, 3);\n if (AREA_CODES[areaCode3]) {\n return AREA_CODES[areaCode3];\n }\n\n return null;\n}\n\n/**\n * Normalizes a phone number to national format (08xx).\n *\n * @param phone - Cleaned phone number\n * @returns Phone number in 08xx format\n * @internal\n */\nfunction normalizeToNational(phone: string): string {\n if (phone.startsWith('+62')) {\n return '0' + phone.substring(3);\n } else if (phone.startsWith('62')) {\n return '0' + phone.substring(2);\n } else if (phone.startsWith('0')) {\n return phone;\n }\n return '';\n}"]}
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.cjs","sourcesContent":["/**\n * Phone number constants for Indonesian operators and area codes.\n *\n * Data sources:\n * - Operator prefixes: Official operator documentation and Wikipedia\n * - Area codes: Ministry of Communication and Information Technology (Kemendagri)\n *\n * Last updated: December 2025\n *\n * @see {@link https://en.wikipedia.org/wiki/Telephone_numbers_in_Indonesia Wikipedia - Telephone numbers in Indonesia}\n * @internal\n */\n\n/**\n * Mobile operator prefix mapping.\n *\n * Maps 4-digit prefixes (e.g., '0812') to operator names.\n * Used for operator detection in mobile numbers.\n *\n * **Important Notes:**\n * - Tri (3 Indonesia) has merged with Indosat as of 2024\n * - Axis has been acquired by XL but maintains separate branding\n * - Some operators have both prepaid and postpaid services\n *\n * @example\n * ```typescript\n * OPERATOR_PREFIXES['0812']; // 'Telkomsel'\n * OPERATOR_PREFIXES['0817']; // 'XL'\n * OPERATOR_PREFIXES['0895']; // 'Indosat'\n * ```\n *\n * @internal\n */\nexport const OPERATOR_PREFIXES: Record<string, string> = {\n // Telkomsel (Halo, Simpati, by.U)\n '0811': 'Telkomsel',\n '0812': 'Telkomsel',\n '0813': 'Telkomsel',\n '0821': 'Telkomsel',\n '0822': 'Telkomsel',\n '0823': 'Telkomsel',\n '0851': 'Telkomsel',\n '0852': 'Telkomsel',\n '0853': 'Telkomsel',\n\n // XL Axiata (XL Prepaid, XL Prioritas, LIVE.ON)\n '0817': 'XL',\n '0818': 'XL',\n '0819': 'XL',\n '0859': 'XL',\n '0877': 'XL',\n '0878': 'XL',\n '0879': 'XL',\n\n // Indosat Ooredoo (IM3, Mentari)\n // Note: Tri (3 Indonesia) merged with Indosat\n '0814': 'Indosat',\n '0815': 'Indosat',\n '0816': 'Indosat',\n '0855': 'Indosat',\n '0856': 'Indosat',\n '0857': 'Indosat',\n '0858': 'Indosat',\n '0895': 'Indosat',\n '0896': 'Indosat',\n '0897': 'Indosat',\n '0898': 'Indosat',\n '0899': 'Indosat',\n\n // Smartfren (Smartfren Power Up)\n '0881': 'Smartfren',\n '0882': 'Smartfren',\n '0883': 'Smartfren',\n '0884': 'Smartfren',\n '0885': 'Smartfren',\n '0886': 'Smartfren',\n '0887': 'Smartfren',\n '0888': 'Smartfren',\n '0889': 'Smartfren',\n\n // Axis (Acquired by XL but maintains separate branding)\n '0831': 'Axis',\n '0832': 'Axis',\n '0833': 'Axis',\n '0838': 'Axis',\n};\n\n/**\n * Landline area code mapping.\n *\n * Maps area codes to city/region names for landline numbers.\n * Includes both 3-digit (e.g., '021') and 4-digit (e.g., '0274') codes.\n *\n * This mapping covers all provinces in Indonesia including:\n * - Jakarta, Banten, West Java, Central Java, Yogyakarta\n * - East Java, Bali, Nusa Tenggara\n * - Sulawesi, Kalimantan\n * - Sumatra, Maluku, Papua\n *\n * @example\n * ```typescript\n * AREA_CODES['021']; // 'Jakarta'\n * AREA_CODES['0274']; // 'Yogyakarta'\n * AREA_CODES['0361']; // 'Denpasar'\n * ```\n *\n * @internal\n */\nexport const AREA_CODES: Record<string, string> = {\n // ========================================\n // JAKARTA, BANTEN & WEST JAVA\n // ========================================\n\n // Jakarta & Greater Jakarta\n '021': 'Jakarta',\n\n // Banten\n '0252': 'Lebak',\n '0253': 'Pandeglang',\n '0254': 'Cilegon & Serang',\n\n // West Java\n '022': 'Bandung',\n '0231': 'Cirebon',\n '0232': 'Kuningan',\n '0233': 'Majalengka',\n '0234': 'Indramayu',\n '0251': 'Bogor',\n '0260': 'Subang',\n '0261': 'Sumedang',\n '0262': 'Garut',\n '0263': 'Cianjur',\n '0264': 'Purwakarta',\n '0265': 'Tasikmalaya',\n '0266': 'Sukabumi',\n '0267': 'Karawang',\n\n // ========================================\n // CENTRAL JAVA & YOGYAKARTA\n // ========================================\n\n // Central Java\n '024': 'Semarang',\n '0271': 'Solo',\n '0272': 'Klaten',\n '0273': 'Wonogiri',\n '0275': 'Purworejo',\n '0276': 'Boyolali',\n '0280': 'Cilacap',\n '0281': 'Banyumas & Purbalingga',\n '0282': 'Cilacap',\n '0283': 'Tegal & Brebes',\n '0284': 'Pemalang',\n '0285': 'Pekalongan',\n '0286': 'Banjarnegara & Wonosobo',\n '0287': 'Kebumen',\n '0289': 'Bumiayu',\n '0291': 'Kudus & Jepara',\n '0292': 'Grobogan',\n '0293': 'Magelang',\n '0294': 'Kendal',\n '0295': 'Pati & Rembang',\n '0296': 'Blora',\n '0297': 'Karimun Jawa',\n '0298': 'Salatiga',\n\n // Yogyakarta\n '0274': 'Yogyakarta',\n\n // ========================================\n // EAST JAVA, BALI & NUSA TENGGARA\n // ========================================\n\n // East Java\n '031': 'Surabaya',\n '0321': 'Mojokerto & Jombang',\n '0322': 'Lamongan',\n '0323': 'Sampang',\n '0324': 'Pamekasan',\n '0325': 'Bawean',\n '0326': 'Masalembu',\n '0327': 'Kangean',\n '0328': 'Sumenep',\n '0331': 'Jember',\n '0332': 'Bondowoso',\n '0333': 'Banyuwangi',\n '0334': 'Lumajang',\n '0335': 'Probolinggo',\n '0336': 'Jember',\n '0338': 'Situbondo',\n '0341': 'Malang',\n '0342': 'Blitar',\n '0343': 'Pasuruan',\n '0351': 'Madiun',\n '0352': 'Ponorogo',\n '0353': 'Bojonegoro',\n '0354': 'Kediri',\n '0355': 'Tulungagung',\n '0356': 'Tuban',\n '0357': 'Pacitan',\n '0358': 'Nganjuk',\n\n // Bali\n '0361': 'Denpasar',\n '0362': 'Singaraja',\n '0363': 'Amlapura',\n '0365': 'Negara',\n '0366': 'Tabanan',\n '0368': 'Gianyar',\n\n // Nusa Tenggara Barat (NTB)\n '0370': 'Mataram',\n '0371': 'Sumbawa',\n '0372': 'West Sumbawa',\n '0373': 'Dompu',\n '0374': 'Bima',\n '0376': 'East Lombok',\n\n // Nusa Tenggara Timur (NTT)\n '0379': 'Alor',\n '0380': 'Kupang',\n '0381': 'Ende',\n '0382': 'Sikka',\n '0383': 'East Flores',\n '0384': 'Ngada',\n '0385': 'Manggarai',\n '0386': 'West Manggarai',\n '0387': 'Sumba',\n '0388': 'North & South Central Timor',\n '0389': 'Belu',\n\n // ========================================\n // SULAWESI\n // ========================================\n\n // South Sulawesi\n '0410': 'Pangkajene',\n '0411': 'Makassar',\n '0413': 'Bantaeng & Bulukumba',\n '0414': 'Selayar',\n '0417': 'Malino',\n '0418': 'Takalar',\n '0419': 'Jeneponto',\n '0420': 'Enrekang',\n '0421': 'Pare Pare',\n '0423': 'Tana Toraja',\n '0427': 'Barru',\n '0471': 'Luwu',\n '0472': 'Wajo (Pitumpanua)',\n '0473': 'North Luwu',\n '0474': 'East Luwu',\n '0475': 'Sorowako',\n '0481': 'Bone',\n '0482': 'Sinjai',\n '0484': 'Soppeng',\n '0485': 'Wajo',\n\n // West Sulawesi\n '0422': 'Majene',\n '0426': 'Mamuju',\n '0428': 'Polewali',\n '0429': 'Central Mamuju',\n\n // Central Sulawesi\n '0409': 'Morowali',\n '0445': 'Buol',\n '0450': 'Parigi Moutong',\n '0451': 'Palu',\n '0452': 'Poso',\n '0453': 'Toli-Toli',\n '0454': 'Tinombo',\n '0455': 'Moutong',\n '0457': 'Donggala',\n '0458': 'Tentena',\n '0461': 'Banggai',\n '0462': 'Banggai Island',\n '0463': 'Bunta',\n '0464': 'Tojo Una-Una',\n '0465': 'North Morowali',\n\n // Southeast Sulawesi\n '0401': 'Kendari',\n '0402': 'Buton',\n '0403': 'Muna',\n '0404': 'Wakatobi',\n '0405': 'Kolaka',\n '0408': 'Konawe',\n\n // North Sulawesi\n '0430': 'South Minahasa',\n '0431': 'Manado',\n '0432': 'Sangihe',\n '0433': 'Talaud',\n '0434': 'Bolaang Mongondow',\n '0438': 'Bitung',\n\n // Gorontalo\n '0435': 'Gorontalo',\n '0442': 'North Gorontalo',\n '0443': 'Pohuwato',\n\n // ========================================\n // KALIMANTAN\n // ========================================\n\n // West Kalimantan\n '0534': 'Ketapang',\n '0535': 'Kayong Utara',\n '0561': 'Pontianak',\n '0562': 'Sambas & Singkawang',\n '0563': 'Landak',\n '0564': 'Sanggau',\n '0565': 'Sintang',\n '0567': 'Kapuas Hulu',\n '0568': 'Melawi',\n\n // Central Kalimantan\n '0513': 'Kapuas',\n '0519': 'North Barito',\n '0526': 'South & East Barito',\n '0528': 'Murung Raya',\n '0531': 'East Kotawaringin',\n '0532': 'West Kotawaringin',\n '0536': 'Palangka Raya',\n '0537': 'Gunung Mas',\n '0538': 'Seruyan',\n '0539': 'Seruyan & East Kotawaringin',\n\n // South Kalimantan\n '0511': 'Banjarmasin',\n '0512': 'Tanah Laut',\n '0517': 'Hulu Sungai Selatan',\n '0518': 'Tanah Bumbu',\n '0527': 'Hulu Sungai Utara',\n\n // East Kalimantan\n '0541': 'Samarinda',\n '0542': 'Balikpapan',\n '0543': 'Paser',\n '0545': 'West Kutai',\n '0548': 'Bontang',\n '0549': 'East Kutai',\n '0554': 'Berau',\n\n // North Kalimantan\n '0551': 'Tarakan',\n '0552': 'Bulungan',\n '0553': 'Malinau',\n '0556': 'Nunukan',\n\n // ========================================\n // SUMATRA\n // ========================================\n\n // Aceh\n '0627': 'Subulussalam & Dairi (North Sumatra)',\n '0629': 'Southeast Aceh',\n '0641': 'Langsa',\n '0642': 'Gayo Lues',\n '0643': 'Central Aceh',\n '0644': 'Bireuen',\n '0645': 'Lhokseumawe',\n '0646': 'East Aceh',\n '0650': 'Simeulue',\n '0651': 'Banda Aceh',\n '0652': 'Sabang',\n '0653': 'Pidie',\n '0654': 'Aceh Jaya',\n '0655': 'West Aceh',\n '0656': 'South Aceh',\n '0657': 'South Aceh',\n '0658': 'Singkil',\n '0659': 'Southwest Aceh',\n\n // North Sumatra\n '061': 'Medan',\n '0620': 'Pangkalan Brandan',\n '0621': 'Tebing Tinggi',\n '0622': 'Pematang Siantar',\n '0623': 'Asahan',\n '0624': 'Labuhan Batu',\n '0625': 'Parapat',\n '0626': 'Samosir',\n // '0627': 'Dairi', // for this prefix, it same with Subulussalam (Aceh)\n '0628': 'Karo',\n '0630': 'South Nias',\n '0631': 'Sibolga',\n '0632': 'Toba Samosir',\n '0633': 'North Tapanuli',\n '0634': 'Padang Sidempuan',\n '0635': 'South Tapanuli',\n '0636': 'Mandailing Natal',\n '0638': 'Barus',\n '0639': 'Nias',\n\n // West Sumatra\n '0751': 'Padang',\n '0752': 'Bukittinggi',\n '0753': 'Pasaman',\n '0754': 'Sawahlunto',\n '0755': 'Solok',\n '0756': 'South Pesisir',\n '0757': 'South Pesisir',\n '0759': 'Mentawai',\n\n // Riau\n '0760': 'Kuantan Singingi',\n '0761': 'Pekanbaru',\n '0762': 'Kampar',\n '0763': 'Bengkalis',\n '0764': 'Siak',\n '0765': 'Dumai',\n '0766': 'Bengkalis',\n '0767': 'Rokan Hulu',\n '0768': 'Indragiri Hilir',\n '0769': 'Indragiri Hulu',\n\n // Riau Islands\n '0770': 'Muka Kuning Batamindo',\n '0771': 'Tanjungpinang',\n '0772': 'Anambas',\n '0773': 'Natuna',\n '0776': 'Lingga',\n '0777': 'Great Karimun',\n '0778': 'Batam',\n '0779': 'Kundur',\n\n // Jambi\n '0741': 'Jambi',\n '0742': 'West Tanjung Jabung',\n '0743': 'Batanghari',\n '0744': 'Tebo',\n '0745': 'Sarolangun',\n '0746': 'Merangin',\n '0747': 'Bungo',\n '0748': 'Kerinci',\n\n // South Sumatra\n '0702': 'Empat Lawang',\n '0711': 'Palembang',\n '0712': 'Ogan Komering Ilir',\n '0713': 'Prabumulih',\n '0714': 'Musi Banyuasin',\n '0730': 'Pagar Alam',\n '0731': 'Lahat',\n '0733': 'Lubuklinggau',\n '0734': 'Muara Enim',\n '0735': 'Ogan Komering Ulu',\n\n // Bangka Belitung\n '0715': 'Belinyu',\n '0716': 'West Bangka',\n '0717': 'Pangkal Pinang',\n '0718': 'Central & South Bangka',\n '0719': 'Belitung',\n\n // Bengkulu\n '0732': 'Rejang Lebong',\n '0736': 'Bengkulu',\n '0737': 'North Bengkulu',\n '0739': 'South Bengkulu',\n\n // Lampung\n '0721': 'Bandar Lampung',\n '0722': 'Tanggamus',\n '0723': 'Way Kanan',\n '0724': 'North Lampung',\n '0725': 'Metro',\n '0726': 'Tulang Bawang',\n '0727': 'South Lampung',\n '0728': 'West Lampung',\n '0729': 'Pringsewu',\n\n // ========================================\n // MALUKU & PAPUA\n // ========================================\n\n // Maluku\n '0910': 'Ambon',\n '0911': 'Southeast Maluku',\n '0913': 'Tual',\n '0914': 'Saumlaki',\n '0916': 'Namlea',\n '0918': 'Ternate',\n '0921': 'Sanana',\n '0924': 'Tobelo',\n\n // Papua & West Papua\n '0901': 'Timika',\n '0902': 'Agats',\n '0951': 'Sorong',\n '0952': 'South Sorong',\n '0967': 'Manokwari',\n '0969': 'Sorong',\n '0971': 'Merauke',\n '0975': 'Boven Digoel',\n '0979': 'Tembagapura',\n '0981': 'Jayapura',\n '0986': 'Wamena',\n};\n\n/**\n * Valid mobile number prefixes (first 4 digits after country code).\n *\n * Used for quick validation without operator detection.\n *\n * @internal\n */\nexport const VALID_MOBILE_PREFIXES = Object.keys(OPERATOR_PREFIXES);\n\n/**\n * Valid area codes for landline numbers.\n *\n * Used for landline validation.\n *\n * @internal\n */\nexport const VALID_AREA_CODES = Object.keys(AREA_CODES);","import { OPERATOR_PREFIXES, AREA_CODES } from './constants';\n\n/**\n * Validates an Indonesian phone number format.\n *\n * Accepts multiple input formats:\n * - National format: 08xx-xxxx-xxxx or 08xxxxxxxxxx\n * - International with +: +62 8xx-xxxx-xxxx or +628xxxxxxxxxx\n * - International without +: 62 8xx-xxxx-xxxx or 628xxxxxxxxxx\n *\n * For mobile numbers, validates:\n * - Starts with 08 (national) or 628 (international)\n * - Has valid operator prefix (0811, 0812, 0817, etc.)\n * - Total length is 10-13 digits (after removing non-digits)\n *\n * For landline numbers, validates:\n * - Starts with 0 followed by area code (021, 022, etc.)\n * - Total length is appropriate for landline\n *\n * @param phone - The phone number string to validate\n * @returns `true` if the phone number is valid, `false` otherwise\n *\n * @example\n * Valid mobile number (national):\n * ```typescript\n * validatePhoneNumber('081234567890'); // true\n * ```\n *\n * @example\n * Valid mobile number (international):\n * ```typescript\n * validatePhoneNumber('+6281234567890'); // true\n * validatePhoneNumber('6281234567890'); // true\n * ```\n *\n * @example\n * With separators:\n * ```typescript\n * validatePhoneNumber('0812-3456-7890'); // true\n * validatePhoneNumber('+62 812-3456-7890'); // true\n * ```\n *\n * @example\n * Invalid numbers:\n * ```typescript\n * validatePhoneNumber('1234'); // false - too short\n * validatePhoneNumber('08001234567'); // false - invalid prefix\n * validatePhoneNumber('+1234567890'); // false - wrong country code\n * ```\n *\n * @public\n */\nexport function validatePhoneNumber(phone: string): boolean {\n if (!phone || typeof phone !== 'string') {\n return false;\n }\n\n // Only allow digits, +, -, space, parentheses, dot\n if (!/^[\\d\\s\\-+().]+$/.test(phone)) {\n return false;\n }\n\n const cleaned = phone.replace(/[\\s\\-().]/g, '');\n\n let normalized: string;\n\n if (cleaned.startsWith('+62')) {\n normalized = '0' + cleaned.substring(3);\n } else if (cleaned.startsWith('62') && !cleaned.startsWith('620')) {\n normalized = '0' + cleaned.substring(2);\n } else if (cleaned.startsWith('0')) {\n normalized = cleaned;\n } else {\n return false;\n }\n\n if (normalized.startsWith('08')) {\n return validateMobileNumber(normalized);\n }\n\n if (normalized.startsWith('0')) {\n return validateLandlineNumber(normalized);\n }\n\n return false;\n}\n\n/**\n * Validates a mobile phone number (08xx format).\n *\n * @param phone - Phone number in 08xx format\n * @returns true if valid mobile number\n * @internal\n */\nfunction validateMobileNumber(phone: string): boolean {\n // Mobile numbers should be 10-13 digits\n if (phone.length < 10 || phone.length > 13) {\n return false;\n }\n\n // Check if prefix is valid (first 4 digits)\n const prefix = phone.substring(0, 4);\n if (!OPERATOR_PREFIXES[prefix]) {\n return false;\n }\n\n // All digits should be numeric\n if (!/^\\d+$/.test(phone)) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Validates a landline phone number.\n *\n * @param phone - Phone number in landline format\n * @returns true if valid landline number\n * @internal\n */\nfunction validateLandlineNumber(phone: string): boolean {\n // Landline numbers typically 9-11 digits\n if (phone.length < 9 || phone.length > 11) {\n return false;\n }\n\n // Check common area codes (3 or 4 digits)\n const areaCode3 = phone.substring(0, 3);\n const areaCode4 = phone.substring(0, 4);\n\n if (AREA_CODES[areaCode3] || AREA_CODES[areaCode4]) {\n return true;\n }\n\n // If not in our area code list, check if it follows general pattern\n // Landlines start with 0 followed by 2-4 digit area code\n if (/^0[2-9]\\d{7,9}$/.test(phone)) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Checks if a phone number is a mobile number.\n *\n * @param phone - The phone number to check\n * @returns `true` if it's a mobile number (08xx), `false` otherwise\n *\n * @example\n * ```typescript\n * isMobileNumber('081234567890'); // true\n * isMobileNumber('+6281234567890'); // true\n * isMobileNumber('0212345678'); // false (landline)\n * ```\n *\n * @public\n */\nexport function isMobileNumber(phone: string): boolean {\n if (!validatePhoneNumber(phone)) {\n return false;\n }\n\n const cleaned = phone.replace(/[^\\d+]/g, '');\n let normalized: string;\n\n if (cleaned.startsWith('+62')) {\n normalized = '0' + cleaned.substring(3);\n } else if (cleaned.startsWith('62')) {\n normalized = '0' + cleaned.substring(2);\n } else {\n normalized = cleaned;\n }\n\n return normalized.startsWith('08');\n}\n\n/**\n * Checks if a phone number is a landline number.\n *\n * @param phone - The phone number to check\n * @returns `true` if it's a landline number, `false` otherwise\n *\n * @example\n * ```typescript\n * isLandlineNumber('0212345678'); // true\n * isLandlineNumber('081234567890'); // false (mobile)\n * ```\n *\n * @public\n */\nexport function isLandlineNumber(phone: string): boolean {\n if (!validatePhoneNumber(phone)) {\n return false;\n }\n\n return !isMobileNumber(phone);\n}","import { AREA_CODES } from './constants';\nimport { PhoneFormat, MaskOptions } from './types';\nimport { validatePhoneNumber } from './validate';\n\n/**\n * Formats an Indonesian phone number to the specified format.\n *\n * Accepts various input formats and converts to the desired output format.\n * Automatically adds appropriate separators for readability.\n *\n * @param phone - The phone number to format\n * @param format - Target format ('international', 'national', 'e164', 'display')\n * @returns Formatted phone number, or original string if invalid\n *\n * @example\n * International format:\n * ```typescript\n * formatPhoneNumber('081234567890', 'international');\n * // '+62 812-3456-7890'\n * ```\n *\n * @example\n * National format:\n * ```typescript\n * formatPhoneNumber('+6281234567890', 'national');\n * // '0812-3456-7890'\n * ```\n *\n * @example\n * E.164 format (no spaces/dashes):\n * ```typescript\n * formatPhoneNumber('0812-3456-7890', 'e164');\n * // '6281234567890'\n * ```\n *\n * @public\n */\nexport function formatPhoneNumber(\n phone: string,\n format: PhoneFormat = 'national'\n): string {\n if (!validatePhoneNumber(phone)) {\n return phone;\n }\n\n const cleaned = cleanPhoneNumber(phone);\n\n let normalized: string;\n if (cleaned.startsWith('+62')) {\n normalized = '0' + cleaned.substring(3);\n } else if (cleaned.startsWith('62') && !cleaned.startsWith('620')) {\n normalized = '0' + cleaned.substring(2);\n } else {\n normalized = cleaned;\n }\n\n switch (format) {\n case 'international':\n return toInternational(normalized);\n case 'national':\n case 'display':\n return toNational(normalized);\n case 'e164':\n return toE164(normalized);\n default:\n return phone;\n }\n}\n\n/**\n * Converts a phone number to international format (+62 xxx-xxxx-xxxx).\n *\n * @param phone - The phone number to convert\n * @returns Phone number in international format with separators\n *\n * @example\n * ```typescript\n * toInternational('081234567890');\n * // '+62 812-3456-7890'\n * ```\n *\n * @example\n * Already international:\n * ```typescript\n * toInternational('+6281234567890');\n * // '+62 812-3456-7890'\n * ```\n *\n * @public\n */\nexport function toInternational(phone: string): string {\n const cleaned = cleanPhoneNumber(phone);\n if (!cleaned) {\n return phone;\n }\n\n const normalized = normalizeToNational(cleaned);\n if (!normalized) {\n return phone;\n }\n\n const withoutZero = normalized.substring(1);\n\n if (normalized.startsWith('08')) {\n if (withoutZero.length === 11) {\n return `+62 ${withoutZero.substring(0, 3)}-${withoutZero.substring(3, 7)}-${withoutZero.substring(7)}`;\n } else if (withoutZero.length === 10) {\n return `+62 ${withoutZero.substring(0, 3)}-${withoutZero.substring(3, 6)}-${withoutZero.substring(6)}`;\n } else if (withoutZero.length === 9) {\n return `+62 ${withoutZero.substring(0, 3)}-${withoutZero.substring(3)}`;\n } else if (withoutZero.length === 12) {\n return `+62 ${withoutZero.substring(0, 3)}-${withoutZero.substring(3, 7)}-${withoutZero.substring(7)}`;\n }\n }\n\n const areaCodeLength = getAreaCodeLength(normalized);\n const areaCode = normalized.substring(1, areaCodeLength + 1);\n const localNumber = normalized.substring(areaCodeLength + 1);\n\n return `+62 ${areaCode}-${localNumber}`;\n}\n\n/**\n * Converts a phone number to national format (08xx-xxxx-xxxx).\n *\n * @param phone - The phone number to convert\n * @returns Phone number in national format with dashes\n *\n * @example\n * ```typescript\n * toNational('+6281234567890');\n * // '0812-3456-7890'\n * ```\n *\n * @example\n * Already national:\n * ```typescript\n * toNational('081234567890');\n * // '0812-3456-7890'\n * ```\n *\n * @public\n */\nexport function toNational(phone: string): string {\n const cleaned = cleanPhoneNumber(phone);\n if (!cleaned) {\n return phone;\n }\n\n const normalized = normalizeToNational(cleaned);\n if (!normalized) {\n return phone;\n }\n\n if (normalized.startsWith('08')) {\n if (normalized.length === 12) {\n return `${normalized.substring(0, 4)}-${normalized.substring(4, 8)}-${normalized.substring(8)}`;\n } else if (normalized.length === 11) {\n return `${normalized.substring(0, 4)}-${normalized.substring(4, 7)}-${normalized.substring(7)}`;\n } else if (normalized.length === 10) {\n return `${normalized.substring(0, 4)}-${normalized.substring(4)}`;\n } else if (normalized.length === 13) {\n return `${normalized.substring(0, 4)}-${normalized.substring(4, 8)}-${normalized.substring(8)}`;\n }\n }\n\n const areaCodeLength = getAreaCodeLength(normalized);\n const areaCodeWithZero = normalized.substring(0, areaCodeLength + 1);\n const localNumber = normalized.substring(areaCodeLength + 1);\n\n return `${areaCodeWithZero}-${localNumber}`;\n}\n\n/**\n * Converts a phone number to E.164 format (6281234567890).\n *\n * E.164 is the international standard format without spaces or dashes.\n * Suitable for API calls and database storage.\n *\n * @param phone - The phone number to convert\n * @returns Phone number in E.164 format\n *\n * @example\n * ```typescript\n * toE164('0812-3456-7890');\n * // '6281234567890'\n * ```\n *\n * @example\n * From international format:\n * ```typescript\n * toE164('+62 812-3456-7890');\n * // '6281234567890'\n * ```\n *\n * @public\n */\nexport function toE164(phone: string): string {\n const cleaned = cleanPhoneNumber(phone);\n if (!cleaned) {\n return phone;\n }\n\n const normalized = normalizeToNational(cleaned);\n if (!normalized) {\n return phone;\n }\n\n return '62' + normalized.substring(1);\n}\n\n/**\n * Removes all non-digit characters from a phone number, preserving leading +.\n *\n * @param phone - The phone number to clean\n * @returns Cleaned phone number with only digits (and optional leading +)\n *\n * @example\n * ```typescript\n * cleanPhoneNumber('0812-3456-7890');\n * // '081234567890'\n * ```\n *\n * @example\n * ```typescript\n * cleanPhoneNumber('+62 812 3456 7890');\n * // '+6281234567890'\n * ```\n *\n * @public\n */\nexport function cleanPhoneNumber(phone: string): string {\n if (!phone || typeof phone !== 'string') {\n return '';\n }\n\n return phone.replace(/[^\\d+]/g, '');\n}\n\n/**\n * Normalizes a phone number to national format (08xx).\n *\n * @param phone - Cleaned phone number\n * @returns Phone number in 08xx format\n * @internal\n */\nfunction normalizeToNational(phone: string): string {\n if (phone.startsWith('+62')) {\n return '0' + phone.substring(3);\n } else if (phone.startsWith('62') && !phone.startsWith('620')) {\n return '0' + phone.substring(2);\n } else if (phone.startsWith('0')) {\n return phone;\n }\n return '';\n}\n\n/**\n * Determines area code length for landline numbers.\n *\n * @param normalized - Phone number in national format (0xxx)\n * @returns Area code length (digits after leading 0)\n * @internal\n */\nfunction getAreaCodeLength(normalized: string): number {\n // Check 4-digit area codes ('0xxxx')\n const fourDigitCode = normalized.substring(0, 5);\n if (AREA_CODES[fourDigitCode]) {\n return 4;\n }\n\n // Check 3-digit area codes ('0xxx')\n const threeDigitCode = normalized.substring(0, 4);\n if (AREA_CODES[threeDigitCode]) {\n return 3;\n }\n\n // Check 2-digit area codes ('0xx')\n const twoDigitCode = normalized.substring(0, 3);\n if (AREA_CODES[twoDigitCode]) {\n return 2;\n }\n\n return 2;\n}\n\n/**\n * Masks a phone number for privacy protection.\n *\n * By default, shows the first 4 and last 4 digits, masking the middle digits.\n * Optionally formats with separators.\n *\n * @param phone - The phone number to mask\n * @param options - Masking configuration options\n * @returns Masked phone number, or original string if invalid\n *\n * @example\n * Default masking:\n * ```typescript\n * maskPhoneNumber('081234567890');\n * // '0812****7890'\n * ```\n *\n * @example\n * Custom mask character:\n * ```typescript\n * maskPhoneNumber('081234567890', { char: 'X' });\n * // '0812XXXX7890'\n * ```\n *\n * @example\n * With separator:\n * ```typescript\n * maskPhoneNumber('081234567890', { separator: '-' });\n * // '0812-****-7890'\n * ```\n *\n * @public\n */\nexport function maskPhoneNumber(\n phone: string,\n options: MaskOptions = {}\n): string {\n const cleaned = cleanPhoneNumber(phone);\n if (!cleaned) {\n return phone;\n }\n\n const isInternational = cleaned.startsWith('+');\n let toMask: string;\n\n if (isInternational) {\n toMask = cleaned;\n } else {\n const normalized = normalizeToNational(cleaned);\n toMask = normalized || cleaned;\n }\n\n if (toMask.length < 4) {\n return phone;\n }\n\n const { char = '*', separator } = options;\n let { start = 4, end = 4 } = options;\n\n if (start + end >= toMask.length) {\n // Auto-adjust for short numbers to ensure masking happens\n if (toMask.length < 10) {\n const minMaskLength = 1;\n const availableForVisible = toMask.length - minMaskLength;\n\n if (availableForVisible >= 2) {\n start = Math.floor(availableForVisible / 2);\n end = availableForVisible - start;\n } else {\n return toMask;\n }\n } else {\n return toMask;\n }\n }\n\n const startPart = toMask.substring(0, start);\n const endPart = toMask.substring(toMask.length - end);\n const maskLength = toMask.length - start - end;\n const masked = startPart + char.repeat(maskLength) + endPart;\n\n if (separator) {\n return `${masked.substring(0, start)}${separator}${masked.substring(start, masked.length - end)}${separator}${masked.substring(masked.length - end)}`;\n }\n\n return masked;\n}\n","import { 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"]}
@@ -387,6 +387,48 @@ declare function cleanPhoneNumber(phone: string): string;
387
387
  */
388
388
  declare function maskPhoneNumber(phone: string, options?: MaskOptions): string;
389
389
 
390
+ /**
391
+ * Generates a WhatsApp click-to-chat link.
392
+ *
393
+ * @param phone - The Indonesian phone number
394
+ * @param message - Optional pre-filled message
395
+ * @returns WhatsApp link, or empty string if phone is invalid
396
+ *
397
+ * @example
398
+ * ```typescript
399
+ * generateWALink('081234567890', 'Halo!');
400
+ * // 'https://wa.me/6281234567890?text=Halo%21'
401
+ * ```
402
+ */
403
+ declare function generateWALink(phone: string, message?: string): string;
404
+ /**
405
+ * Generates an SMS link (sms:).
406
+ *
407
+ * @param phone - The Indonesian phone number
408
+ * @param body - Optional SMS body
409
+ * @returns SMS link, or empty string if phone is invalid
410
+ *
411
+ * @example
412
+ * ```typescript
413
+ * generateSmsLink('081234567890', 'Pesan ini');
414
+ * // 'sms:+6281234567890?body=Pesan%20ini'
415
+ * ```
416
+ */
417
+ declare function generateSmsLink(phone: string, body?: string): string;
418
+ /**
419
+ * Generates a telephone link (tel:).
420
+ *
421
+ * @param phone - The Indonesian phone number
422
+ * @returns Tel link, or empty string if phone is invalid
423
+ *
424
+ * @example
425
+ * ```typescript
426
+ * generateTelLink('081234567890');
427
+ * // 'tel:+6281234567890'
428
+ * ```
429
+ */
430
+ declare function generateTelLink(phone: string): string;
431
+
390
432
  /**
391
433
  * Parses an Indonesian phone number and extracts all information.
392
434
  *
@@ -468,5 +510,19 @@ declare function parsePhoneNumber(phone: string): PhoneInfo | null;
468
510
  * @public
469
511
  */
470
512
  declare function getOperator(phone: string): string | null;
513
+ /**
514
+ * Checks if a phone number belongs to a specific provider.
515
+ *
516
+ * @param phone - The phone number to check
517
+ * @param providerName - The provider name to match (case-insensitive)
518
+ * @returns `true` if it matches, `false` otherwise
519
+ *
520
+ * @example
521
+ * ```typescript
522
+ * isProvider('081234567890', 'Telkomsel'); // true
523
+ * isProvider('081734567890', 'xl'); // true
524
+ * ```
525
+ */
526
+ declare function isProvider(phone: string, providerName: string): boolean;
471
527
 
472
- export { type MaskOptions, type PhoneFormat, type PhoneInfo, cleanPhoneNumber, formatPhoneNumber, getOperator, isLandlineNumber, isMobileNumber, maskPhoneNumber, parsePhoneNumber, toE164, toInternational, toNational, validatePhoneNumber };
528
+ export { type MaskOptions, type PhoneFormat, type PhoneInfo, cleanPhoneNumber, formatPhoneNumber, generateSmsLink, generateTelLink, generateWALink, getOperator, isLandlineNumber, isMobileNumber, isProvider, maskPhoneNumber, parsePhoneNumber, toE164, toInternational, toNational, validatePhoneNumber };