This changelog only mentions the changes in the code. See Google's changelog for metadata changes.
- (TypeScript) Fixed Tagged type to be more strict, as suggested in an issue by Islam Sharabash.
- Added
PhoneNumber.getPossibleCountries()
function. It returns a list of countries this phone number could possibly belong to. Can be used when parsing complete international phone numbers containing a "calling code" that is shared between several countries. If parsing such a phone number returnscountry: undefined
thengetPossibleCountries()
function could be used to somehow speculate about what country could this phone number possibly belong to.
- Migrated the library to use "ES Modules" export. This shouldn't break anyone's code and it makes it more modern since people asked about this feature.
- Merged a pull request that changed the declaration of basic "string" types like
E164Number
,NationalNumber
,Extension
, etc.
- Added
AsYouType.getNumberValue()
function. The function will be used inreact-phone-number-input
component. Returns the phone number inE.164
format. For example, for country"US"
and input"(222) 333-4444"
it will return"+12223334444"
. Will returnundefined
if no digits have been input, or when inputting a phone number in national format and no default country or default "country calling code" have been set.
- Added a better called alias for
metadata.full.json
—metadata.max.json
.
- Improved format selection in
AsYouType
formatter: previously it chose the first one before there were at least 3 national (significant) number digits, now it starts filtering out formats right from the start of the national (significant) number.
- Added a
setExt(ext: string)
function of aPhoneNumber
class instance. It could be useful when formatting phone numbers stored as two separate fields: the phone number itself and the extension part.
-
Added TypeScript "typings" on the exported
Metadata
class. Also rewroteMetadata
class API docs and the description ofleading_digits
metadata property. -
TypeScript
Metadata
exported type was renamed toMetadataJson
so that theMetadata
class type could be exported asMetadata
.
- Added
validatePhoneNumberLength()
function: same asisPossiblePhoneNumber()
but tells the actual reason why a phone number is not possible:TOO_SHORT
,TOO_LONG
,INVALID_LENGTH
, etc.
validatePhoneNumberLength('abcde') === 'NOT_A_NUMBER'
validatePhoneNumberLength('444 1 44') === 'INVALID_COUNTRY'
validatePhoneNumberLength('444 1 44', 'TR') === 'TOO_SHORT'
validatePhoneNumberLength('444 1 444', 'TR') === undefined
validatePhoneNumberLength('444 1 4444', 'TR') === 'INVALID_LENGTH'
validatePhoneNumberLength('444 1 44444', 'TR') === 'INVALID_LENGTH'
validatePhoneNumberLength('444 1 444444', 'TR') === undefined
validatePhoneNumberLength('444 1 4444444444', 'TR') === 'TOO_LONG'
- Changed formatting numbers in
IDD
format to always use the preferred IDD prefix (if defined), not just in cases when a country has multiple IDD prefixes. This means that it will output8~10
as the prefix instead of810
for some regions (like Uzbekistan) that have this tilde in their IDD prefix (the tilde designates that the user should wait before continuing to dial).
-
Added
extract: false
option onparsePhoneNumberFromString()
: it enables a bit "stricter" parsing in a way that it attempts to parse the entire text as a phone number rather than extracting a phone number from text. For example, withextract: false
option,"(213) 373-4253"
is parsed as a valid phone number, but"Call: (213) 373-4253"
is not, because the"Call: "
part doesn't automatically get trimmed in this case. If there's version2.x
, I guessextract: false
will be the default behavior because it looks more appropriate than the default "extract" behavior of Google'slibphonenumber
. -
Added
isPossiblePhoneNumber()
andisValidPhoneNumber()
functions, which are basically shortucts toparsePhoneNumberFromString(text, { extract: false })
and then.isValid()
/.isPossible()
.
- Fixed the issue with
findPhoneNumbersInText()
returning incorrectstartAt
andendsAt
positions in some cases.
- Refactored the main ES6 export in order to support "tree shaking".
-
Added
AsYouType.getChars()
method. -
Added formatting of international phone numbers that have been input without a leading
+
.
- Metadata
version
is now an integer instead of a semver version. Semver versions of previously generated metadata are automatically converted into an integer version.
- Merged the latest Google's patch on parsing phone number extensions.
-
Refactored
AsYouType
formatter. -
(could be a breaking change for some) Some people might have used some of the undocumented
AsYouType
instance properties like.countryCallingCode
,.nationalNumber
, etc: those have been moved to a new.state
object. The.state
object is also not part of the public API, so developers shouldn't use it: use the documented getter methods instead. The.country
property ofAsYouType
instance still stays: not because it hasn't been moved (it has been and is emulated), but because it has been part of an official (now legacy) API ofAsYouType
formatter. -
(misc) Renamed
asYouType
instance methodgetCountryCallingCode()
togetCountryCode()
. The older name still works. -
(could be a build-time breaking change for custom metadata) For those who were generating custom metadata, the
libphonenumber-generate-metadata
console command has been moved to a separate package calledlibphonenumber-metadata-generator
. The applications that're using it should donpm install libphonenumber-metadata-generator --save-dev
and then use the newlibphonenumber-metadata-generator
command instead of the old one (only the name changed). See instructions.
-
Refactored
AsYouType
formatter. -
Fixed
AsYouType
formatter not formatting numbers in some cases like, for example, certain types of Argentinian mobile numbers.
humanReadable
option of"IDD"
formatting has been removed: now it's alwaystrue
. The rationale is that Google'sformatOutOfCountryCallingNumber()
original function always formats in "human readable" format.
- (advanced) Fixed
metadata.mobile.json
and generating "custom" metadata: now it won't include non-relevant phone number types. Previously,metadata.mobile.json
(and any other "custom"-generated metadata) included all phone number types for cases when there're several countries corresponding to the same country calling code (for example,US
andCA
). So, in case ofmetadata.mobile.json
, forDE
it only contained mobile phone number type, but forUS
andCA
it contained all phone number types (this has been unnoticed until this release). Now it only contains mobile phone number types for any country, as it's supposed to be. This change didn't result in any significant "mobile" metadata size reduction: just105 KB
->95 KB
.
- Renamed
parsePhoneNumber()
named export toparsePhoneNumberWithError()
. The older name still works.
- Promoted
parsePhoneNumberFromString()
named export to a default export due to the name being too verbose.
- Added some utility functions to
AsYouType
:
/**
* Returns `true` if the phone number is being input in international format.
* In other words, returns `true` if and only if the parsed phone number starts with a `"+"`.
* @return {boolean}
*/
isInternational()
/**
* Returns the "country calling code" part of the phone number.
* Returns `undefined` if the number is not being input in international format.
* Returns "country calling code" for "non-geographic" phone numbering plans too.
* @return {string} [countryCallingCode]
*/
getCountryCallingCode()
/**
* Returns a two-letter country code of the phone number.
* Returns `undefined` for "non-geographic" phone numbering plans.
* Returns `undefined` if no phone number has been input yet.
* @return {string} [country]
*/
getCountry()
/**
* Returns `true` if the phone number is "possible".
* Is just a shortcut for `PhoneNumber.isPossible()`.
* @return {boolean}
*/
isPossible()
/**
* Returns `true` if the phone number is "valid".
* Is just a shortcut for `PhoneNumber.isValid()`.
* @return {boolean}
*/
isValid()
-
Removed the
"001"
country code ("Non-Geographic Entity"): now in case of "non-geographic" phone numbers theircountry
is justundefined
. Instead,PhoneNumber
class has an.isNonGeographic()
method. -
Fixed "non-geographic" numbers
.isPossible() === false
bug.
- Fixed "Non-Geographic Entities" (
001
country code).
-
Refactored the code. Mostly
AsYouType
formatter.AsYouType.input()
no longer accepts "falsy" values likenull
: instead, it only accepts strings. -
Fixed
AsYouType
formatter bugs (#318). -
Added
nationalPrefix: boolean
option toPhoneNumber.format()
— Some phone numbers can be formatted both with national prefix and without it. In such cases the library defaults to "with national prefix" (for legacy reasons). PassnationalPrefix: false
option to force formatting without national prefix in such cases. -
Renamed
findNumbers(text, { v2: true })
tofindPhoneNumbersInText(text)
, andsearchNumbers(text, { v2: true })
tosearchPhoneNumbersInText(text)
.
- Added
getCountries()
function that returns a list of all available two-letter country codes. This is to prevent some users from having to deal withUnknown country
error.
-
findNumbers()
,searchNumbers()
,PhoneNumberMatcher
don't throw "Unknown country" error anymore: a non-existent country is simply ignored instead. Same goes forgetExampleNumber()
andgetExtPrefix()
. -
parsePhoneNumberFromString()
doesn't returnundefined
if a non-existent default country is passed: it simply ignores such country instead and still parses international numbers. -
Added
isSupportedCountry(country)
function. -
Added CDN bundles for
min
/max
/mobile
sub-packages. -
Moved demo to
max
metadata (wasmin
previously). -
Added TypeScript definitions for
min
/max
/mobile
/core
sub-packages.
-
Added
/min
,/max
,/mobile
and/custom
subpackages pre-wired with different flavors of metadata. See the relevant readme section for more info. -
Added
parsePhoneNumberFromString()
function (which doesn't throw but instead returnsundefined
).
- Refactored the code to remove cyclic dependencies which caused warnings on React Native. It's not a breaking change but it's still a big code diff overall so incremented the "minor" version number.
- Support Russian extension character "доб" as a valid one while parsing the numbers.
- Added
.getNumber()
method toAsYouType
formatter instance. Returns aPhoneNumber
.
-
Added
parsePhoneNumber()
function andPhoneNumber
class. -
Added
v2: true
option tofindNumbers()
function. -
Added
getExampleNumber()
function. -
Added
isPossibleNumber()
function. -
In
formatNumber()
renamedNational
toNATIONAL
andInternational
toINTERNATIONAL
. The older variants still work but are considered deprecated. -
(metadata file internal format breaking change) (doesn't affect users of this library) If anyone was using metadata files from this library bypassing the library functions (i.e. those who parsed
metadata.min.json
file manually) then there's a new internal optimization introduced in this version: previouslyformats
were copy-pasted for each country of the same region (e.g.NANPA
) while now theformats
are only defined on the "main" country for region and other countries simply read theformats
from it at runtime. This reduced the default metadata file size by 5 kilobytes.
- Deprecated
findPhoneNumbers()
,searchPhoneNumbers()
andPhoneNumberSearch
. UsefindNumbers()
,searchNumbers()
andPhoneNumberMatcher
instead. The now-deprecated functions were a half-self-made implementation of Google's JavafindNumbers()
until the Java code was ported into javascript and passed tests. The port of Google's Java implementation is supposed to find numbers more correctly. It hasn't been tested by users in production yet, but the same tests as for the previous implementation offindPhoneNumbers()
pass, so seems that it can be used in production.
- Fixed
formatNumber('NATIONAL')
not formatting national phone numbers with a national prefix when it's marked as optional (e.g. Russia). Before it didn't add national prefix when formatting national numbers if national prefix was marked as optional. Now it always adds national prefix when formatting national numbers even when national prefix is marked as optional.
- A bug in
matches_entirely
was found by a user which resulted in incorrect regexp matching in some cases, e.g. when there was a|
in a regexp. This could cause incorrectparseNumber()
results, or any other weird behaviour.
-
Changed the output of
AsYouType
formatter. E.g. before forUS
and input21
it was outputting(21 )
which is not good for phone number input (not intuitive and is confusing). Now it will not add closing braces which haven't been reached yet by the input cursor and it will also strip the corresponding opening braces, so forUS
and input21
it now is just21
, and for213
it is(213)
. -
(could be a breaking change for those who somehow used
.template
property of anAsYouType
instance) Due to the change inAsYouType
formatting the.template
property no longer strictly corresponds to the output, e.g. forUS
and input21
the output is now21
but the.template
is still(xxx) xxx-xxxx
like it used to be in the older versions when the output was(21 )
. Therefore, a new function has been added toAsYouType
instance called.getTemplate()
which will return the partial template for the currently input value, so for input21
the output will be21
and.getTemplate()
will returnxx
, and for input213
the output will be(213)
and.getTemplate()
will return(xxx)
. So there is this difference between the new.getTemplate()
function and the old.template
property: the old.template
property always returns the template for a fully entered phone number and the new.getTemplate()
function always returns the template for the partially entered phone number, i.e. for the partially entered number(213) 45
it will return template(xxx) xx
so it's a one-to-one correspondence now.
-
Fixed
parseNumber()
,isValidNumber()
andgetNumberType()
in some rare cases (made them a bit less strict where it fits): previously they were treatingdefaultCountry
argument as "the country" in case of local numbers, e.g.isValidNumber('07624 369230', 'GB')
would befalse
because07624 369230
number belongs toIM
(the Isle of Man). WhileIM
is notGB
it should still betrue
becauseGB
is the default country, without it necessarily being the country. -
Added a new function
isValidNumberForRegion(number, country)
which mimics Google'slibphonenumber
's one.
- Fixed a previously unnoticed bug regarding parsing RFC3966 phone URIs: previously
:
was mistakenly being considered a key-value separator instead of=
. E.g. it was parsing RFC3966 phone numbers astel:+78005553535;ext:123
instead oftel:+78005553535;ext=123
. The bug was found and reported by @cdunn.
- Removed
parseNumber()
'sfromCountry
parameter used for parsing IDD prefixes: now it usesdefaultCountry
instead.formatNumber()
'sfromCountry
parameter stays and is not removed.
- Optimized metadata a bit: using
0
instead ofnull
/false
and1
instead oftrue
.
- Added support for IDD prefixes —
parse()
now parses IDD-prefixed phones iffromCountry
option is passed,format()
now has anIDD
format.
-
Added
parseNumber()
andformatNumber()
aliases forparse()
andformat()
. Now these are the default ones, andparse()
andformat()
names are considered deprecated. The rationale is thatparse()
andformat()
function names are too unspecific and can clash with other functions declared in a javascript file. And also searching in a project forparseNumber
andformatNumber
is easier than searching in a project forparse
andformat
. -
Fixed
parseRFC3966()
andformatRFC3966()
non-custom exports.
parse()
is now more forgiving when parsing invalid international numbers. E.g.parse('+49(0)15123020522', 'DE')
doesn't return{}
and instead removes the invalid(0)
national prefix from the number.
- Added
PhoneNumberSearch
class for asynchronous phone number search.
- Added
findPhoneNumbers
function.
- Added
parseRFC3966
andformatRFC3966
functions which are exported.
- Fixed custom metadata backwards compatibility bug introduced in
1.0.16
. All people who previously installed1.0.16
or1.0.17
should update. - Refactored metadata module which now supports versioning by adding the
version
property to metadata JSON.
- Fixed
RFC3966
format not prependingtel:
to the output. - Renamed
{ possible: true }
option to{ extended: true }
and the result is now more verbose (see the README). - Added
possible_lengths
property in metadata: metadata generated using previous versions of the library should be re-generated with then new version.
- (experimental) Added
{ possible: true }
option forparse()
for parsing "possible numbers" which are not considered valid (like Google's demo does). E.g.parse('+71111111111', { possible: true }) === { countryCallingCode: '7', phone: '1111111111', possible: true }
andformat({ countryCallingCode: '7', phone: '1111111111' }, 'E.164') === '+71111111111'
. getPhoneCode
name is deprecated, usegetCountryCallingCode
instead.getPhoneCodeCustom
name is deprecated, usegetCountryCallingCodeCustom
instead.AsYouType.country_phone_code
renamed toAsYouType.countryCallingCode
(but no one should have used that property).
- If
country: string
argument is passed toparse()
now it becomes "the default country" rather than "restrict to country" ("restrict to country" option is gone). parse()
options
argument changed: it's now an undocumented feature and can have only a single option inside —defaultCountry: string
— which should be passed as a string argument instead.- Removed all previously deprecated stuff: all underscored exports (
is_valid_number
,get_number_type
andas_you_type
), lowercase exports forasYouType
andasYouTypeCustom
(useAsYouType
andAsYouTypeCustom
instead),"International_plaintext"
format (use"E.164"
instead). - Integer phone numbers no longer get automatically converted to strings.
parse()
,isValidNumber()
,getNumberType()
andformat()
no longer acceptundefined
phone number argument: it must be either a string or a parsed number object having a stringphone
property.
- Added
formatExtension(number, extension)
option toformat()
- Added support for phone number extensions.
asYouType
name is deprecated, useAsYouType
instead (same goes forasYouTypeCustom
).is_valid_number
,get_number_type
andas_you_type
names are deprecated, use camelCased names instead.International_plaintext
format is deprecated, useE.164
instead.- Added
RFC3966
format for phone number URIs (tel:+1213334455;ext=123
).
- Added missing
getNumberTypeCustom
es6 export
- Removed
.valid
from "as you type" formatter because it wasn't reliable (gave false negatives). UseisValidNumber(value)
for phone number validation instead.
- Fixed a bug when "as you type" formatter incorrectly formatted the input using non-matching phone number formats
- Loosened national prefix requirement when parsing (fixed certain Brazilian phone numbers parsing)
- Added more strict validation to
isValidNumber
- Fixed CommonJS export for
getNumberType
- Now exporting
getNumberType
function
- Removed
libphonenumber-js/custom.es6
exported file: now everything should be imported from the root package in ES6-capable bundlers (because tree-shaking actually works that way) - Now custom functions like
parse
,format
andisValidNumber
are not bound to custom metadata: it's passed as the last argument instead. And customasYouType
is now not a function — instead,asYouType
constructor takes an additionalmetadata
argument
- Fixed
update-metadata
utility
- Added national prefix check for
parse
andisPhoneValid
- A bit more precise
valid
flag for "as you type" formatter
- Added metadata update
bin
command for end users (see README) - Added the ability to include extra regular expressions for finer-grained phone number validation
- Added the ability to use custom-countries generated metadata as a parameter for the functions exported from this library
- Small fix for "as you type" to not prepend national prefix to the number being typed
- Reset
default_country
for "as you type" if the input is an international phone number
- (misc) Small fix for
format()
when the national number isundefined
- Better "as you type" matching: when the national prefix is optional it now tries both variants — with the national prefix extracted and without
- Exporting
metadata
andgetPhoneCode()
- Fixed a minor bug in "as you type" when a local phone number without national prefix got formatted with the national prefix
- Fixed a bug when country couldn't be parsed from a phone number in most cases
- Added
.country_phone_code
readable property to "as you type" formatter
- "As you type" formatter's
country_code
argument is nowdefault_country_code
, and it doesn't restrict to the specified country anymore.
- "As you type" formatter
template
fix for national prefixes (which weren't replaced withx
-es)
- "As you type" formatter now formats the whole input passed to the
.input()
function one at a time without splitting it into individual characters (which yields better performance)
- Added
valid
,country
andtemplate
fields to "as you type" instance
- Managed to reduce metadata size by another 5 KiloBytes removing redundant (duplicate) phone number type regular expressions (because there's no "get phone type" API in this library).
- Managed to reduce metadata size by 10 KiloBytes removing phone number type regular expressions when
leading_digits
are present.
- Turned out those numerous bulky regular expressions (
<fixedLine/>
,<mobile/>
, etc) are actually required to reliably infer country from country calling code and national phone number in cases where there are multiple countries assigned to the same country phone code (e.g. NANPA), so I've included those big regular expressions for those ambiguous cases which increased metadata size by 20 KiloBytes resulting in a total of 90 KiloBytes for the metadata.
- Small fix for "as you type" formatter: replacing digit placeholders (punctuation spaces) with regular spaces in the output
- Fixed a bug when national prefix
1
was present in "as you type" formatter for NANPA countries (while it shouldn't have been present)
- (may be a breaking change) renamed
.clear()
to.reset()
for "as you type" formatter
- Better
asYouType
(better than Google's original "as you type" formatter)
- Added
asYouType
andisValidNumber
.
- Added
format
function.
- Initial release.
parse
function is working.