From 9d47b4587643cbe7a9fc190e8d80792096395e63 Mon Sep 17 00:00:00 2001 From: Janic Duplessis Date: Thu, 18 Jun 2026 10:17:24 -0400 Subject: [PATCH] feat: handle national trunk prefix in PhoneNumberTransformer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Numbers in trunk-prefix countries (e.g. France 06โ€ฆ, UK 07โ€ฆ) were mis-grouped because the formatter treated the leading national-prefix digit as part of the significant number. The generator now emits nationalPrefix for countries whose formats display it (via nationalPrefixFormattingRule), and the worklet strips that prefix before selecting/applying a format, then re-adds it so cursor mapping stays aligned. US/CA (prefix "1", no display rule) are unaffected. Verified against libphonenumber-js AsYouType for FR/GB/JP/AU; tests added to PhoneNumberTransformer.test.ts. --- scripts/generate-phone-data.ts | 26 ++- .../__tests__/PhoneNumberTransformer.test.ts | 55 ++++++ src/formatters/phone-data.ts | 186 +++++++++++++++--- src/formatters/phone-number.ts | 20 +- 4 files changed, 256 insertions(+), 31 deletions(-) diff --git a/scripts/generate-phone-data.ts b/scripts/generate-phone-data.ts index d94ed49..2344fa2 100644 --- a/scripts/generate-phone-data.ts +++ b/scripts/generate-phone-data.ts @@ -52,14 +52,21 @@ interface CountryPhoneData { code: string; callingCode: string; formats: PhoneFormat[]; + nationalPrefix?: string; name: string; flag: string; } function processCountry(code: string, data: MetadataCountry): CountryPhoneData { const callingCode = data[0]; + const nationalPrefix = data[5]; const rawFormats = Array.isArray(data[4]) ? data[4] : []; + // A format's national prefix formatting rule (e.g. "0$1") means the national + // prefix is part of how the number is displayed. We only carry the prefix for + // countries that display it, so e.g. US/CA (prefix "1", no rule) keep their + // bare-number formatting. + let usesNationalPrefix = false; const formats: PhoneFormat[] = rawFormats.map((f) => { const leadingDigitsArray = f[2]; // Use the last (most specific) leading digits pattern @@ -67,6 +74,10 @@ function processCountry(code: string, data: MetadataCountry): CountryPhoneData { ? leadingDigitsArray[leadingDigitsArray.length - 1] : undefined; + if (f[3]) { + usesNationalPrefix = true; + } + return { pattern: f[0], template: f[1], @@ -78,6 +89,11 @@ function processCountry(code: string, data: MetadataCountry): CountryPhoneData { code, callingCode, formats, + ...(usesNationalPrefix && + typeof nationalPrefix === 'string' && + nationalPrefix.length > 0 + ? { nationalPrefix } + : {}), name: getCountryName(code), flag: countryCodeToFlag(code), }; @@ -107,6 +123,10 @@ function generate(): string { const mainCountry = mainCountries[0]!; if (mainCountry !== code && allData[mainCountry]) { allData[code]!.formats = allData[mainCountry]!.formats; + if (allData[mainCountry]!.nationalPrefix) { + allData[code]!.nationalPrefix = + allData[mainCountry]!.nationalPrefix; + } } } } @@ -131,6 +151,7 @@ function generate(): string { lines.push(' code: string;'); lines.push(' callingCode: string;'); lines.push(' formats: PhoneFormat[];'); + lines.push(' nationalPrefix?: string;'); lines.push(' name: string;'); lines.push(' flag: string;'); lines.push('};'); @@ -154,12 +175,15 @@ function generate(): string { }) .join(', '); + const nationalPrefixStr = data.nationalPrefix + ? `, nationalPrefix: ${JSON.stringify(data.nationalPrefix)}` + : ''; lines.push( ` ${JSON.stringify(code)}: { code: ${JSON.stringify( data.code, )}, callingCode: ${JSON.stringify( data.callingCode, - )}, formats: [${formatsStr}], name: ${JSON.stringify( + )}, formats: [${formatsStr}]${nationalPrefixStr}, name: ${JSON.stringify( data.name, )}, flag: ${JSON.stringify(data.flag)} },`, ); diff --git a/src/formatters/__tests__/PhoneNumberTransformer.test.ts b/src/formatters/__tests__/PhoneNumberTransformer.test.ts index 4b101b6..f4f8f78 100644 --- a/src/formatters/__tests__/PhoneNumberTransformer.test.ts +++ b/src/formatters/__tests__/PhoneNumberTransformer.test.ts @@ -267,6 +267,61 @@ describe('PhoneNumberTransformer', () => { }); }); + describe('national trunk prefix', () => { + const fr = new PhoneNumberTransformer({ + country: 'FR', + includeCallingCode: false, + }); + const gb = new PhoneNumberTransformer({ + country: 'GB', + includeCallingCode: false, + }); + const jp = new PhoneNumberTransformer({ + country: 'JP', + includeCallingCode: false, + }); + const au = new PhoneNumberTransformer({ + country: 'AU', + includeCallingCode: false, + }); + const us = new PhoneNumberTransformer({ + country: 'US', + includeCallingCode: false, + }); + + it('formats a French mobile typed with the leading 0', () => { + expect(transform(fr, '0612345678')?.value).toBe('06 12 34 56 78'); + }); + + it('formats a French landline typed with the leading 0', () => { + expect(transform(fr, '0123456789')?.value).toBe('01 23 45 67 89'); + }); + + it('formats a UK mobile typed with the leading 0', () => { + expect(transform(gb, '07911123456')?.value).toBe('07911 123456'); + }); + + it('formats a UK London number typed with the leading 0', () => { + expect(transform(gb, '02012345678')?.value).toBe('020 1234 5678'); + }); + + it('formats a Japanese number typed with the leading 0', () => { + expect(transform(jp, '0312345678')?.value).toBe('03-1234-5678'); + }); + + it('formats an Australian mobile typed with the leading 0', () => { + expect(transform(au, '0412345678')?.value).toBe('0412 345 678'); + }); + + it('still formats the significant number when no trunk prefix is typed', () => { + expect(transform(fr, '612345678')?.value).toBe('6 12 34 56 78'); + }); + + it('does not treat a leading 1 as a trunk prefix for US', () => { + expect(transform(us, '4155552671')?.value).toBe('(415) 555-2671'); + }); + }); + describe('country switching', () => { it('creates different transformers for different countries', () => { const us = new PhoneNumberTransformer({ country: 'US' }); diff --git a/src/formatters/phone-data.ts b/src/formatters/phone-data.ts index f237169..8887fd8 100644 --- a/src/formatters/phone-data.ts +++ b/src/formatters/phone-data.ts @@ -11,6 +11,7 @@ export type CountryPhoneData = { code: string; callingCode: string; formats: PhoneFormat[]; + nationalPrefix?: string; name: string; flag: string; }; @@ -67,6 +68,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '5', }, ], + nationalPrefix: '0', name: 'United Arab Emirates', flag: '๐Ÿ‡ฆ๐Ÿ‡ช', }, @@ -80,6 +82,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[2-7]', }, ], + nationalPrefix: '0', name: 'Afghanistan', flag: '๐Ÿ‡ฆ๐Ÿ‡ซ', }, @@ -141,6 +144,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '6', }, ], + nationalPrefix: '0', name: 'Albania', flag: '๐Ÿ‡ฆ๐Ÿ‡ฑ', }, @@ -165,6 +169,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[3-9]', }, ], + nationalPrefix: '0', name: 'Armenia', flag: '๐Ÿ‡ฆ๐Ÿ‡ฒ', }, @@ -228,6 +233,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '9', }, ], + nationalPrefix: '0', name: 'Argentina', flag: '๐Ÿ‡ฆ๐Ÿ‡ท', }, @@ -282,6 +288,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '5', }, ], + nationalPrefix: '0', name: 'Austria', flag: '๐Ÿ‡ฆ๐Ÿ‡น', }, @@ -311,6 +318,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '1(?:30|[89])', }, ], + nationalPrefix: '0', name: 'Australia', flag: '๐Ÿ‡ฆ๐Ÿ‡บ', }, @@ -349,6 +357,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '(?:19|[2568])[1-8]|3(?:0[1-9]|[1-9])|9', }, ], + nationalPrefix: '0', name: 'ร…land Islands', flag: '๐Ÿ‡ฆ๐Ÿ‡ฝ', }, @@ -372,6 +381,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[13-9]', }, ], + nationalPrefix: '0', name: 'Azerbaijan', flag: '๐Ÿ‡ฆ๐Ÿ‡ฟ', }, @@ -395,6 +405,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '6', }, ], + nationalPrefix: '0', name: 'Bosnia & Herzegovina', flag: '๐Ÿ‡ง๐Ÿ‡ฆ', }, @@ -434,6 +445,7 @@ export const COUNTRY_PHONE_DATA: Record = { }, { pattern: '(\\d)(\\d{7,8})', template: '$1-$2', leadingDigits: '2' }, ], + nationalPrefix: '0', name: 'Bangladesh', flag: '๐Ÿ‡ง๐Ÿ‡ฉ', }, @@ -462,6 +474,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '4', }, ], + nationalPrefix: '0', name: 'Belgium', flag: '๐Ÿ‡ง๐Ÿ‡ช', }, @@ -523,6 +536,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '9', }, ], + nationalPrefix: '0', name: 'Bulgaria', flag: '๐Ÿ‡ง๐Ÿ‡ฌ', }, @@ -577,7 +591,7 @@ export const COUNTRY_PHONE_DATA: Record = { { pattern: '(\\d{3})(\\d{2})(\\d{2})(\\d{2})', template: '$1 $2 $3 $4', - leadingDigits: '[5-79]', + leadingDigits: '[5-79]|80[6-9]', }, { pattern: '(\\d{3})(\\d{2})(\\d{2})(\\d{2})', @@ -585,6 +599,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '8', }, ], + nationalPrefix: '0', name: 'St. Barthรฉlemy', flag: '๐Ÿ‡ง๐Ÿ‡ฑ', }, @@ -622,9 +637,9 @@ export const COUNTRY_PHONE_DATA: Record = { { pattern: '(\\d)(\\d{7})', template: '$1 $2', - leadingDigits: '[235]|4[46]', + leadingDigits: '[23]|4[46]|50', }, - { pattern: '(\\d{8})', template: '$1', leadingDigits: '[67]' }, + { pattern: '(\\d{8})', template: '$1', leadingDigits: '[5-7]' }, { pattern: '(\\d{3})(\\d{2})(\\d{4})', template: '$1 $2 $3', @@ -678,6 +693,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[16][1-9]|[2-57-9]', }, ], + nationalPrefix: '0', name: 'Brazil', flag: '๐Ÿ‡ง๐Ÿ‡ท', }, @@ -774,6 +790,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[89]', }, ], + nationalPrefix: '8', name: 'Belarus', flag: '๐Ÿ‡ง๐Ÿ‡พ', }, @@ -835,6 +852,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '1(?:30|[89])', }, ], + nationalPrefix: '0', name: 'Cocos (Keeling) Islands', flag: '๐Ÿ‡จ๐Ÿ‡จ', }, @@ -873,6 +891,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '5', }, ], + nationalPrefix: '0', name: 'Congo - Kinshasa', flag: '๐Ÿ‡จ๐Ÿ‡ฉ', }, @@ -927,6 +946,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '8', }, ], + nationalPrefix: '0', name: 'Switzerland', flag: '๐Ÿ‡จ๐Ÿ‡ญ', }, @@ -1083,6 +1103,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[12]', }, ], + nationalPrefix: '0', name: 'China', flag: '๐Ÿ‡จ๐Ÿ‡ณ', }, @@ -1103,6 +1124,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '1', }, ], + nationalPrefix: '0', name: 'Colombia', flag: '๐Ÿ‡จ๐Ÿ‡ด', }, @@ -1137,6 +1159,7 @@ export const COUNTRY_PHONE_DATA: Record = { { pattern: '(\\d)(\\d{7})', template: '$1 $2', leadingDigits: '[56]' }, { pattern: '(\\d{3})(\\d{7})', template: '$1 $2', leadingDigits: '8' }, ], + nationalPrefix: '0', name: 'Cuba', flag: '๐Ÿ‡จ๐Ÿ‡บ', }, @@ -1197,6 +1220,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '1(?:30|[89])', }, ], + nationalPrefix: '0', name: 'Christmas Island', flag: '๐Ÿ‡จ๐Ÿ‡ฝ', }, @@ -1322,6 +1346,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '15', }, ], + nationalPrefix: '0', name: 'Germany', flag: '๐Ÿ‡ฉ๐Ÿ‡ช', }, @@ -1399,6 +1424,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[5-8]', }, ], + nationalPrefix: '0', name: 'Algeria', flag: '๐Ÿ‡ฉ๐Ÿ‡ฟ', }, @@ -1422,6 +1448,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '1', }, ], + nationalPrefix: '0', name: 'Ecuador', flag: '๐Ÿ‡ช๐Ÿ‡จ', }, @@ -1471,6 +1498,7 @@ export const COUNTRY_PHONE_DATA: Record = { }, { pattern: '(\\d{2})(\\d{8})', template: '$1 $2', leadingDigits: '1' }, ], + nationalPrefix: '0', name: 'Egypt', flag: '๐Ÿ‡ช๐Ÿ‡ฌ', }, @@ -1490,6 +1518,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[5-8]', }, ], + nationalPrefix: '0', name: 'Western Sahara', flag: '๐Ÿ‡ช๐Ÿ‡ญ', }, @@ -1503,6 +1532,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[178]', }, ], + nationalPrefix: '0', name: 'Eritrea', flag: '๐Ÿ‡ช๐Ÿ‡ท', }, @@ -1531,9 +1561,10 @@ export const COUNTRY_PHONE_DATA: Record = { { pattern: '(\\d{2})(\\d{3})(\\d{4})', template: '$1 $2 $3', - leadingDigits: '[1-579]', + leadingDigits: '[1-57-9]', }, ], + nationalPrefix: '0', name: 'Ethiopia', flag: '๐Ÿ‡ช๐Ÿ‡น', }, @@ -1559,6 +1590,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '(?:19|[2568])[1-8]|3(?:0[1-9]|[1-9])|9', }, ], + nationalPrefix: '0', name: 'Finland', flag: '๐Ÿ‡ซ๐Ÿ‡ฎ', }, @@ -1622,6 +1654,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[1-79]', }, ], + nationalPrefix: '0', name: 'France', flag: '๐Ÿ‡ซ๐Ÿ‡ท', }, @@ -1685,6 +1718,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[1389]', }, ], + nationalPrefix: '0', name: 'United Kingdom', flag: '๐Ÿ‡ฌ๐Ÿ‡ง', }, @@ -1727,6 +1761,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[348]', }, ], + nationalPrefix: '0', name: 'Georgia', flag: '๐Ÿ‡ฌ๐Ÿ‡ช', }, @@ -1737,7 +1772,7 @@ export const COUNTRY_PHONE_DATA: Record = { { pattern: '(\\d{3})(\\d{2})(\\d{2})(\\d{2})', template: '$1 $2 $3 $4', - leadingDigits: '[5-7]|9[47]', + leadingDigits: '[5-7]|80[6-9]|9[47]', }, { pattern: '(\\d{3})(\\d{2})(\\d{2})(\\d{2})', @@ -1745,6 +1780,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[89]', }, ], + nationalPrefix: '0', name: 'French Guiana', flag: '๐Ÿ‡ฌ๐Ÿ‡ซ', }, @@ -1785,6 +1821,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[1389]', }, ], + nationalPrefix: '0', name: 'Guernsey', flag: '๐Ÿ‡ฌ๐Ÿ‡ฌ', }, @@ -1796,9 +1833,10 @@ export const COUNTRY_PHONE_DATA: Record = { { pattern: '(\\d{2})(\\d{3})(\\d{4})', template: '$1 $2 $3', - leadingDigits: '[235]', + leadingDigits: '[2358]', }, ], + nationalPrefix: '0', name: 'Ghana', flag: '๐Ÿ‡ฌ๐Ÿ‡ญ', }, @@ -1862,7 +1900,7 @@ export const COUNTRY_PHONE_DATA: Record = { { pattern: '(\\d{3})(\\d{2})(\\d{2})(\\d{2})', template: '$1 $2 $3 $4', - leadingDigits: '[5-79]', + leadingDigits: '[5-79]|80[6-9]', }, { pattern: '(\\d{3})(\\d{2})(\\d{2})(\\d{2})', @@ -1870,6 +1908,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '8', }, ], + nationalPrefix: '0', name: 'Guadeloupe', flag: '๐Ÿ‡ฌ๐Ÿ‡ต', }, @@ -2056,6 +2095,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '8', }, ], + nationalPrefix: '0', name: 'Croatia', flag: '๐Ÿ‡ญ๐Ÿ‡ท', }, @@ -2092,6 +2132,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[2-9]', }, ], + nationalPrefix: '06', name: 'Hungary', flag: '๐Ÿ‡ญ๐Ÿ‡บ', }, @@ -2141,6 +2182,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '8', }, ], + nationalPrefix: '0', name: 'Indonesia', flag: '๐Ÿ‡ฎ๐Ÿ‡ฉ', }, @@ -2199,6 +2241,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '8', }, ], + nationalPrefix: '0', name: 'Ireland', flag: '๐Ÿ‡ฎ๐Ÿ‡ช', }, @@ -2239,6 +2282,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '15', }, ], + nationalPrefix: '0', name: 'Israel', flag: '๐Ÿ‡ฎ๐Ÿ‡ฑ', }, @@ -2279,6 +2323,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[1389]', }, ], + nationalPrefix: '0', name: 'Isle of Man', flag: '๐Ÿ‡ฎ๐Ÿ‡ฒ', }, @@ -2311,13 +2356,13 @@ export const COUNTRY_PHONE_DATA: Record = { pattern: '(\\d{3})(\\d{3})(\\d{4})', template: '$1 $2 $3', leadingDigits: - '1(?:2[0-24]|3[0-25]|4[145]|[59][14]|6[1-9]|7[1257]|8[1-57-9])|2(?:1[257]|3[013]|4[01]|5[0137]|6[058]|78|8[1568]|9[14])|3(?:26|4[1-3]|5[34]|6[01489]|7[02-46]|8[159])|4(?:1[36]|2[1-47]|3[15]|5[12]|6[0-26-9]|7[0-24-9]|8[013-57]|9[014-7])|5(?:1[025]|22|[36][25]|4[28]|[578]1|9[15])|6(?:12(?:[2-6]|7[0-8])|74[2-7])|7(?:(?:2[14]|5[15])[2-6]|3171|61[346]|88(?:[2-7]|82))|8(?:70[2-6]|84(?:[2356]|7[19])|91(?:[3-6]|7[19]))|73[134][2-6]|(?:74[47]|8(?:16|2[014]|3[126]|6[136]|7[78]|83))(?:[2-6]|7[19])|(?:1(?:29|60|8[06])|261|552|6(?:[2-4]1|5[17]|6[13]|7(?:1|4[0189])|80)|7(?:12|88[01]))[2-7]', + '1(?:2[0-24]|3[0-25]|4[145]|[59][14]|6[1-9]|7[1257]|8[1-57-9])|2(?:1[257]|3[013]|4[01]|5[0137]|6[058]|78|8[1568]|9[14])|3(?:26|4[1-3]|5[34]|6[01489]|7[02-46]|8[159])|4(?:1[36]|2[1-47]|3[15]|5[12]|6[0-26-9]|7[0-24-9]|8[013-57]|9[014-7])|5(?:1[025]|22|[36][25]|4[28]|[578]1|9[15])|6(?:12(?:[2-6]|7[0-8])|74[2-7])|7(?:3171|5[15][2-6]|61[346]|88(?:[2-7]|82))|8(?:70[2-6]|84(?:[2356]|7[19])|91(?:[3-6]|7[19]))|73[134][2-6]|8(?:16|2[014]|3[126]|6[136]|7[78]|83)(?:[2-6]|7[19])|(?:1(?:29|60|8[06])|261|552|6(?:[2-4]1|5[17]|6[13]|7(?:1|4[0189])|80)|7(?:12|88[01]))[2-7]', }, { pattern: '(\\d{4})(\\d{3})(\\d{3})', template: '$1 $2 $3', leadingDigits: - '1(?:[2-479]|5(?:[0236-9]|5[013-9]))|[2-5]|6(?:2(?:84|95)|355|8(?:28[235-7]|3))|73179|807(?:1|9[1-3])|(?:1552|6(?:(?:1[1358]|2[2457]|3[2-4]|4[235-7]|5[2-689]|6[24578]|7[235689])\\d|8(?:[14-6]\\d|2[0-79]))|7(?:1(?:[013-8]\\d|9[6-9])|28[6-8]|3(?:2[0-49]|9[2-57])|4(?:1[2-4]|[29][0-7]|3[0-8]|[56]\\d|8[0-24-7])|5(?:2[1-3]|9[0-6])|6(?:0[5689]|2[5-9]|3[02-8]|4\\d|5[0-367])|70[13-7]))[2-7]', + '1(?:[2-479]|5(?:[0236-9]|5[013-9]))|[2-5]|6(?:2(?:84|95)|355|8(?:28[235-7]|3))|73179|807(?:1|9[1-3])|(?:1552|6(?:(?:1[1358]|2[2457]|3[2-4]|4[235-7]|5[2-689]|6[24578])\\d|7(?:[23569]\\d|8[0-57-9])|8(?:[14-6]\\d|2[0-79]))|7(?:1(?:[013-8]\\d|9[6-9])|3(?:2[0-49]|9[2-57])|5(?:2[1-3]|9[0-6])|6(?:0[5689]|2[5-9]|3[02-8]|4\\d|5[0-367])|70[13-7]))[2-7]', }, { pattern: '(\\d{5})(\\d{5})', @@ -2335,6 +2380,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '18', }, ], + nationalPrefix: '0', name: 'India', flag: '๐Ÿ‡ฎ๐Ÿ‡ณ', }, @@ -2367,6 +2413,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '7', }, ], + nationalPrefix: '0', name: 'Iraq', flag: '๐Ÿ‡ฎ๐Ÿ‡ถ', }, @@ -2392,6 +2439,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[1-8]', }, ], + nationalPrefix: '0', name: 'Iran', flag: '๐Ÿ‡ฎ๐Ÿ‡ท', }, @@ -2504,6 +2552,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[1389]', }, ], + nationalPrefix: '0', name: 'Jersey', flag: '๐Ÿ‡ฏ๐Ÿ‡ช', }, @@ -2542,6 +2591,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[47]', }, ], + nationalPrefix: '0', name: 'Jordan', flag: '๐Ÿ‡ฏ๐Ÿ‡ด', }, @@ -2592,6 +2642,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[25-9]', }, ], + nationalPrefix: '0', name: 'Japan', flag: '๐Ÿ‡ฏ๐Ÿ‡ต', }, @@ -2611,6 +2662,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[89]', }, ], + nationalPrefix: '0', name: 'Kenya', flag: '๐Ÿ‡ฐ๐Ÿ‡ช', }, @@ -2634,6 +2686,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '8', }, ], + nationalPrefix: '0', name: 'Kyrgyzstan', flag: '๐Ÿ‡ฐ๐Ÿ‡ฌ', }, @@ -2652,6 +2705,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '1', }, ], + nationalPrefix: '0', name: 'Cambodia', flag: '๐Ÿ‡ฐ๐Ÿ‡ญ', }, @@ -2709,6 +2763,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '1', }, ], + nationalPrefix: '0', name: 'North Korea', flag: '๐Ÿ‡ฐ๐Ÿ‡ต', }, @@ -2748,6 +2803,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '5', }, ], + nationalPrefix: '0', name: 'South Korea', flag: '๐Ÿ‡ฐ๐Ÿ‡ท', }, @@ -2815,6 +2871,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '8', }, ], + nationalPrefix: '8', name: 'Kazakhstan', flag: '๐Ÿ‡ฐ๐Ÿ‡ฟ', }, @@ -2838,6 +2895,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[23]', }, ], + nationalPrefix: '0', name: 'Laos', flag: '๐Ÿ‡ฑ๐Ÿ‡ฆ', }, @@ -2856,6 +2914,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[27-9]', }, ], + nationalPrefix: '0', name: 'Lebanon', flag: '๐Ÿ‡ฑ๐Ÿ‡ง', }, @@ -2916,6 +2975,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[1-689]', }, ], + nationalPrefix: '0', name: 'Sri Lanka', flag: '๐Ÿ‡ฑ๐Ÿ‡ฐ', }, @@ -2939,6 +2999,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[2-578]', }, ], + nationalPrefix: '0', name: 'Liberia', flag: '๐Ÿ‡ฑ๐Ÿ‡ท', }, @@ -2980,6 +3041,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[3-6]', }, ], + nationalPrefix: '0', name: 'Lithuania', flag: '๐Ÿ‡ฑ๐Ÿ‡น', }, @@ -3061,6 +3123,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[2-9]', }, ], + nationalPrefix: '0', name: 'Libya', flag: '๐Ÿ‡ฑ๐Ÿ‡พ', }, @@ -3080,6 +3143,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[5-8]', }, ], + nationalPrefix: '0', name: 'Morocco', flag: '๐Ÿ‡ฒ๐Ÿ‡ฆ', }, @@ -3103,6 +3167,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[67]', }, ], + nationalPrefix: '0', name: 'Monaco', flag: '๐Ÿ‡ฒ๐Ÿ‡จ', }, @@ -3122,6 +3187,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[25-7]', }, ], + nationalPrefix: '0', name: 'Moldova', flag: '๐Ÿ‡ฒ๐Ÿ‡ฉ', }, @@ -3135,6 +3201,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[2-9]', }, ], + nationalPrefix: '0', name: 'Montenegro', flag: '๐Ÿ‡ฒ๐Ÿ‡ช', }, @@ -3145,7 +3212,7 @@ export const COUNTRY_PHONE_DATA: Record = { { pattern: '(\\d{3})(\\d{2})(\\d{2})(\\d{2})', template: '$1 $2 $3 $4', - leadingDigits: '[5-79]', + leadingDigits: '[5-79]|80[6-9]', }, { pattern: '(\\d{3})(\\d{2})(\\d{2})(\\d{2})', @@ -3153,6 +3220,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '8', }, ], + nationalPrefix: '0', name: 'St. Martin', flag: '๐Ÿ‡ฒ๐Ÿ‡ซ', }, @@ -3166,6 +3234,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[23]', }, ], + nationalPrefix: '0', name: 'Madagascar', flag: '๐Ÿ‡ฒ๐Ÿ‡ฌ', }, @@ -3202,6 +3271,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[58]', }, ], + nationalPrefix: '0', name: 'North Macedonia', flag: '๐Ÿ‡ฒ๐Ÿ‡ฐ', }, @@ -3269,6 +3339,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '9', }, ], + nationalPrefix: '0', name: 'Myanmar (Burma)', flag: '๐Ÿ‡ฒ๐Ÿ‡ฒ', }, @@ -3279,7 +3350,7 @@ export const COUNTRY_PHONE_DATA: Record = { { pattern: '(\\d{2})(\\d{2})(\\d{4})', template: '$1 $2 $3', - leadingDigits: '[12]1', + leadingDigits: '11|2[16]', }, { pattern: '(\\d{4})(\\d{4})', @@ -3302,6 +3373,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[12]', }, ], + nationalPrefix: '0', name: 'Mongolia', flag: '๐Ÿ‡ฒ๐Ÿ‡ณ', }, @@ -3348,6 +3420,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '8', }, ], + nationalPrefix: '0', name: 'Martinique', flag: '๐Ÿ‡ฒ๐Ÿ‡ถ', }, @@ -3444,6 +3517,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[137-9]', }, ], + nationalPrefix: '0', name: 'Malawi', flag: '๐Ÿ‡ฒ๐Ÿ‡ผ', }, @@ -3500,6 +3574,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '1', }, ], + nationalPrefix: '0', name: 'Malaysia', flag: '๐Ÿ‡ฒ๐Ÿ‡พ', }, @@ -3546,6 +3621,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '8', }, ], + nationalPrefix: '0', name: 'Namibia', flag: '๐Ÿ‡ณ๐Ÿ‡ฆ', }, @@ -3624,6 +3700,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[78]', }, ], + nationalPrefix: '0', name: 'Nigeria', flag: '๐Ÿ‡ณ๐Ÿ‡ฌ', }, @@ -3667,6 +3744,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '9', }, ], + nationalPrefix: '0', name: 'Netherlands', flag: '๐Ÿ‡ณ๐Ÿ‡ฑ', }, @@ -3700,6 +3778,7 @@ export const COUNTRY_PHONE_DATA: Record = { }, { pattern: '(\\d{3})(\\d{7})', template: '$1-$2', leadingDigits: '9' }, ], + nationalPrefix: '0', name: 'Nepal', flag: '๐Ÿ‡ณ๐Ÿ‡ต', }, @@ -3760,6 +3839,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '2(?:[169]|7[0-35-9])|7', }, ], + nationalPrefix: '0', name: 'New Zealand', flag: '๐Ÿ‡ณ๐Ÿ‡ฟ', }, @@ -3818,6 +3898,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '9', }, ], + nationalPrefix: '0', name: 'Peru', flag: '๐Ÿ‡ต๐Ÿ‡ช', }, @@ -3900,6 +3981,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '1', }, ], + nationalPrefix: '0', name: 'Philippines', flag: '๐Ÿ‡ต๐Ÿ‡ญ', }, @@ -3938,6 +4020,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[24-9]', }, ], + nationalPrefix: '0', name: 'Pakistan', flag: '๐Ÿ‡ต๐Ÿ‡ฐ', }, @@ -3955,7 +4038,7 @@ export const COUNTRY_PHONE_DATA: Record = { pattern: '(\\d{2})(\\d{2})(\\d{3})', template: '$1 $2 $3', leadingDigits: - '(?:1[2-8]|2[2-69]|3[2-4]|4[1-468]|5[24-689]|6[1-3578]|7[14-7]|8[1-79]|9[145])19', + '30|(?:1[2-8]|2[2-69]|3[2-4]|4[1-468]|5[24-689]|6[1-3578]|7[14-7]|8[1-79]|9[145])19', }, { pattern: '(\\d{3})(\\d{2})(\\d{2,3})', @@ -3988,7 +4071,7 @@ export const COUNTRY_PHONE_DATA: Record = { { pattern: '(\\d{2})(\\d{2})(\\d{2})', template: '$1 $2 $3', - leadingDigits: '[45]', + leadingDigits: '[2-9]', }, { pattern: '(\\d{3})(\\d{3})(\\d{3})', @@ -4001,6 +4084,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '8', }, ], + nationalPrefix: '0', name: 'St. Pierre & Miquelon', flag: '๐Ÿ‡ต๐Ÿ‡ฒ', }, @@ -4038,6 +4122,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '1', }, ], + nationalPrefix: '0', name: 'Palestinian Territories', flag: '๐Ÿ‡ต๐Ÿ‡ธ', }, @@ -4117,6 +4202,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '9', }, ], + nationalPrefix: '0', name: 'Paraguay', flag: '๐Ÿ‡ต๐Ÿ‡พ', }, @@ -4148,6 +4234,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[26-9]', }, ], + nationalPrefix: '0', name: 'Rรฉunion', flag: '๐Ÿ‡ท๐Ÿ‡ช', }, @@ -4176,6 +4263,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[236-9]', }, ], + nationalPrefix: '0', name: 'Romania', flag: '๐Ÿ‡ท๐Ÿ‡ด', }, @@ -4194,6 +4282,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[1-36]', }, ], + nationalPrefix: '0', name: 'Serbia', flag: '๐Ÿ‡ท๐Ÿ‡ธ', }, @@ -4229,6 +4318,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '8', }, ], + nationalPrefix: '8', name: 'Russia', flag: '๐Ÿ‡ท๐Ÿ‡บ', }, @@ -4252,6 +4342,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[7-9]', }, ], + nationalPrefix: '0', name: 'Rwanda', flag: '๐Ÿ‡ท๐Ÿ‡ผ', }, @@ -4276,6 +4367,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '8', }, ], + nationalPrefix: '0', name: 'Saudi Arabia', flag: '๐Ÿ‡ธ๐Ÿ‡ฆ', }, @@ -4315,6 +4407,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[19]', }, ], + nationalPrefix: '0', name: 'Sudan', flag: '๐Ÿ‡ธ๐Ÿ‡ฉ', }, @@ -4385,6 +4478,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[26]', }, ], + nationalPrefix: '0', name: 'Sweden', flag: '๐Ÿ‡ธ๐Ÿ‡ช', }, @@ -4444,6 +4538,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[1-57]', }, ], + nationalPrefix: '0', name: 'Slovenia', flag: '๐Ÿ‡ธ๐Ÿ‡ฎ', }, @@ -4481,7 +4576,7 @@ export const COUNTRY_PHONE_DATA: Record = { }, { pattern: '(\\d)(\\d{3})(\\d{3})(\\d{2})', - template: '$1/$2 $3 $4', + template: '$1 $2 $3 $4', leadingDigits: '2', }, { @@ -4491,10 +4586,11 @@ export const COUNTRY_PHONE_DATA: Record = { }, { pattern: '(\\d{2})(\\d{3})(\\d{2})(\\d{2})', - template: '$1/$2 $3 $4', + template: '$1 $2 $3 $4', leadingDigits: '[3-5]', }, ], + nationalPrefix: '0', name: 'Slovakia', flag: '๐Ÿ‡ธ๐Ÿ‡ฐ', }, @@ -4508,6 +4604,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[236-9]', }, ], + nationalPrefix: '0', name: 'Sierra Leone', flag: '๐Ÿ‡ธ๐Ÿ‡ฑ', }, @@ -4559,19 +4656,19 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[15]|2[0-79]|3[0-46-8]|4[0-7]', }, { - pattern: '(\\d)(\\d{7})', + pattern: '(\\d{2})(\\d{5,7})', template: '$1 $2', - leadingDigits: '(?:2|90)4|[67]', + leadingDigits: '1|28|9[2-9]', }, { - pattern: '(\\d{3})(\\d{3})(\\d{3})', - template: '$1 $2 $3', - leadingDigits: '[348]|64|79|90', + pattern: '(\\d)(\\d{7})', + template: '$1 $2', + leadingDigits: '[267]|904', }, { - pattern: '(\\d{2})(\\d{5,7})', - template: '$1 $2', - leadingDigits: '1|28|6[0-35-9]|7[67]|9[2-9]', + pattern: '(\\d{2})(\\d{3})(\\d{4})', + template: '$1 $2 $3', + leadingDigits: '[346-9]', }, ], name: 'Somalia', @@ -4610,6 +4707,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[19]', }, ], + nationalPrefix: '0', name: 'South Sudan', flag: '๐Ÿ‡ธ๐Ÿ‡ธ', }, @@ -4670,6 +4768,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[59]', }, ], + nationalPrefix: '0', name: 'Syria', flag: '๐Ÿ‡ธ๐Ÿ‡พ', }, @@ -4754,6 +4853,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '1', }, ], + nationalPrefix: '0', name: 'Thailand', flag: '๐Ÿ‡น๐Ÿ‡ญ', }, @@ -4822,6 +4922,7 @@ export const COUNTRY_PHONE_DATA: Record = { }, { pattern: '(\\d{2})(\\d{6})', template: '$1 $2', leadingDigits: '[67]' }, ], + nationalPrefix: '8', name: 'Turkmenistan', flag: '๐Ÿ‡น๐Ÿ‡ฒ', }, @@ -4869,7 +4970,7 @@ export const COUNTRY_PHONE_DATA: Record = { { pattern: '(\\d{3})(\\d{3})(\\d{2})(\\d{2})', template: '$1 $2 $3 $4', - leadingDigits: '5(?:[0-579]|61[06]1)', + leadingDigits: '5[0-79]', }, { pattern: '(\\d{3})(\\d{3})(\\d{2})(\\d{2})', @@ -4882,6 +4983,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '80', }, ], + nationalPrefix: '0', name: 'Tรผrkiye', flag: '๐Ÿ‡น๐Ÿ‡ท', }, @@ -4919,15 +5021,26 @@ export const COUNTRY_PHONE_DATA: Record = { template: '$1 $2 $3', leadingDigits: '202', }, + { pattern: '(\\d{3})(\\d{5})', template: '$1 $2', leadingDigits: '826' }, + { + pattern: '(\\d{3})(\\d{2})(\\d{3})', + template: '$1 $2 $3', + leadingDigits: '83', + }, + { + pattern: '(\\d{2})(\\d{2})(\\d{4})', + template: '$1 $2 $3', + leadingDigits: '82', + }, { pattern: '(\\d{2})(\\d{3})(\\d{3,4})', template: '$1 $2 $3', - leadingDigits: '[258]0', + leadingDigits: '[25]0|37|49|8[09]', }, { pattern: '(\\d)(\\d{3,4})(\\d{4})', template: '$1 $2 $3', - leadingDigits: '[23568]|4(?:0[2-48]|[1-47-9])|(?:400|7)[1-9]', + leadingDigits: '[23568]|4(?:0[2-48]|[1-478])|(?:400|7)[1-9]', }, { pattern: '(\\d{3})(\\d{3})(\\d{3})', @@ -4940,6 +5053,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '7', }, ], + nationalPrefix: '0', name: 'Taiwan', flag: '๐Ÿ‡น๐Ÿ‡ผ', }, @@ -4964,6 +5078,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[67]', }, ], + nationalPrefix: '0', name: 'Tanzania', flag: '๐Ÿ‡น๐Ÿ‡ฟ', }, @@ -4994,6 +5109,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[89]', }, ], + nationalPrefix: '0', name: 'Ukraine', flag: '๐Ÿ‡บ๐Ÿ‡ฆ', }, @@ -5009,6 +5125,7 @@ export const COUNTRY_PHONE_DATA: Record = { }, { pattern: '(\\d{2})(\\d{7})', template: '$1 $2', leadingDigits: '[34]' }, ], + nationalPrefix: '0', name: 'Uganda', flag: '๐Ÿ‡บ๐Ÿ‡ฌ', }, @@ -5058,6 +5175,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '0', }, ], + nationalPrefix: '0', name: 'Uruguay', flag: '๐Ÿ‡บ๐Ÿ‡พ', }, @@ -5152,6 +5270,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[24-689]', }, ], + nationalPrefix: '0', name: 'Venezuela', flag: '๐Ÿ‡ป๐Ÿ‡ช', }, @@ -5188,11 +5307,15 @@ export const COUNTRY_PHONE_DATA: Record = { callingCode: '84', formats: [ { pattern: '(\\d{2})(\\d{5})', template: '$1 $2', leadingDigits: '80' }, - { pattern: '(\\d{4})(\\d{4,6})', template: '$1 $2', leadingDigits: '1' }, + { + pattern: '(\\d{4})(\\d{4,6})', + template: '$1 $2', + leadingDigits: '1(?:2[02]|[89])', + }, { pattern: '(\\d{2})(\\d{3})(\\d{2})(\\d{2})', template: '$1 $2 $3 $4', - leadingDigits: '6', + leadingDigits: '1[26]|6', }, { pattern: '(\\d{3})(\\d{3})(\\d{3})', @@ -5210,6 +5333,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '2', }, ], + nationalPrefix: '0', name: 'Vietnam', flag: '๐Ÿ‡ป๐Ÿ‡ณ', }, @@ -5276,6 +5400,7 @@ export const COUNTRY_PHONE_DATA: Record = { }, { pattern: '(\\d{2})(\\d{7,10})', template: '$1 $2', leadingDigits: '3' }, ], + nationalPrefix: '0', name: 'Kosovo', flag: '๐Ÿ‡ฝ๐Ÿ‡ฐ', }, @@ -5294,6 +5419,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '7', }, ], + nationalPrefix: '0', name: 'Yemen', flag: '๐Ÿ‡พ๐Ÿ‡ช', }, @@ -5307,6 +5433,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[26-9]', }, ], + nationalPrefix: '0', name: 'Mayotte', flag: '๐Ÿ‡พ๐Ÿ‡น', }, @@ -5340,6 +5467,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '8', }, ], + nationalPrefix: '0', name: 'South Africa', flag: '๐Ÿ‡ฟ๐Ÿ‡ฆ', }, @@ -5358,6 +5486,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '[579]', }, ], + nationalPrefix: '0', name: 'Zambia', flag: '๐Ÿ‡ฟ๐Ÿ‡ฒ', }, @@ -5411,6 +5540,7 @@ export const COUNTRY_PHONE_DATA: Record = { leadingDigits: '258|5483', }, ], + nationalPrefix: '0', name: 'Zimbabwe', flag: '๐Ÿ‡ฟ๐Ÿ‡ผ', }, diff --git a/src/formatters/phone-number.ts b/src/formatters/phone-number.ts index 497fb06..91eb35d 100644 --- a/src/formatters/phone-number.ts +++ b/src/formatters/phone-number.ts @@ -265,6 +265,8 @@ export class PhoneNumberTransformer extends Transformer { const callingCode = countryData.callingCode; const formats = countryData.formats; + const nationalPrefix = countryData.nationalPrefix ?? ''; + const nationalPrefixLen = nationalPrefix.length; const prefix = '+' + callingCode + ' '; // Pre-compute these outside the worklet so only simple string/number // values are captured in the closure (more reliable across worklet runtimes). @@ -353,8 +355,22 @@ export class PhoneNumberTransformer extends Transformer { finalEnd = adjustedStart - 1; } + // Strip the national trunk prefix (e.g. "0") before selecting and applying + // a format โ€” formats describe the national significant number โ€” then + // re-add it so the displayed digits still line up with the input. + let significantDigits = nationalDigits; + let trunkPrefix = ''; + if ( + nationalPrefixLen > 0 && + nationalDigits.length > nationalPrefixLen && + nationalDigits.startsWith(nationalPrefix) + ) { + significantDigits = nationalDigits.slice(nationalPrefixLen); + trunkPrefix = nationalPrefix; + } + // Select format based on leading digits - const format = selectFormat(nationalDigits, formats); + const format = selectFormat(significantDigits, formats); if (!format) { // No format available โ€” just show digits const result = outputPrefix + nationalDigits; @@ -363,7 +379,7 @@ export class PhoneNumberTransformer extends Transformer { } // Apply the selected format - const formatted = applyFormat(nationalDigits, format); + const formatted = trunkPrefix + applyFormat(significantDigits, format); const result = outputPrefix + formatted; // Map cursor position