npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

phone3

v4.1.3

Published

## Phone · [![Build Status](https://travis-ci.org/AfterShip/phone.svg?branch=v2)](https://travis-ci.org/AfterShip/phone) [![codecov](https://codecov.io/gh/AfterShip/phone/branch/master/graph/badge.svg)](https://codecov.io/gh/AfterShip/phone) [![PRs

Downloads

6

Readme

This is a folk of aftership/phone, support partial countries code (means you can only support limit countries that you want but not all) and refactor to TypeScript!

Phone · Build Status codecov PRs Welcome

What is phone?

phone is used to normalize mobile phone numbers into E.164 format.

A common problem is that users normally input phone numbers in this way:

`(817) 569-8900` or
`817569-8900` or
`1(817) 569-8900` or
`+1(817) 569-8900` or ...

We always want:

+18175698900

Install

npm install phone3

or

yarn add phone3

Demo

Try it on CodeSandbox

Usage

TypesSript:

import phone, { setupData, getData } from 'phone3';
import { allData } from 'phone3/allData';

// setup all countries data, only run once enough
setupData(allData);

// get data
console.log(getData());

phone('+852 6569-8900'); // return ['+85265698900', 'HKG']
phone('+1(817) 569-8900', ''); // return ['+18175698900', 'USA']
phone('(817) 569-8900', 'USA'); // return ['+18175698900', 'USA']
phone('(817) 569-8900', 'HKG'); // return []
phone('+1(817) 569-8900', 'HKG'); // return [], as it is not a valid HKG mobile phone number
phone('6123-6123', 'HKG'); // return ['+85261236123', 'HKG']

JavaScript:

const phone = require('phone3');

// setup all countries data, only run once enough
const { allData } = require('phone3/allData');
setupData(allData);

phone('+852 6569-8900'); // return ['+85265698900', 'HKG']
phone('+1(817) 569-8900', ''); // return ['+18175698900', 'USA']
phone('(817) 569-8900', 'USA'); // return ['+18175698900', 'USA']
phone('(817) 569-8900', 'HKG'); // return []
phone('+1(817) 569-8900', 'HKG'); // return [], as it is not a valid HKG mobile phone number
phone('6123-6123', 'HKG'); // return ['+85261236123', 'HKG']

Support partial countries example:

const phone, { setupData } = require('phone3');

const America = require('phone/iso3166Data/1_USA');
const China = require('phone/iso3166Data/86_CHN');
const Turkey = require('phone/iso3166Data/90_TUR');
setupData([America, China, Turkey]);

Without country code and no phone prefix

If both country code and country phone prefix are not provided, will treat as USA or Canada by default

phone('(817) 569-8900'); // return ['+18175698900, 'USA']
phone('(817) 569-8900', ''); // return ['+18175698900, 'USA']
phone('(817) 569-8900', ''); // return ['+18175698900', 'USA']
phone('780-569-8900', ''); // return ['+17805698900, 'CAN'], 780 is a Canada phone prefix
phone('6123-6123', ''); // return [], as default country is USA / CAN and it does not match any result

Even you input a valid phone number with a valid prefix, if there is no plus sign, it will not work as expected:

phone('85291234567', '');

852 is a valid Hong Kong phone prefix, and 91234567 is a valid Hong Kong mobile phone number. However, there is no plus sign provided, the module will assume the phone number is a USA or Canada phone number, hence no result will be found.

If you know you have provided country phone prefix, make sure you also provide a plus sign:

phone('+85291234567', '');

// return [ '+85291234567', 'HKG' ]

or, if you know the country, and only want to reformat the phone number to E.164 format:

phone('91234567', 'HKG');

// return [ '+85291234567', 'HKG' ]

Skipping phone number initial digit checking

If you want to skip phone number initial digit checking, set allowLandline to true:

phone('+(852) 2356-4902', '', true);

And the initial digit checking will be disabled completely, even you enter a phone number start with a non-exist digit:

phone('+(852) 0356-4902', '', true); // return [ '+85203564902', 'HKG' ], even the phone number start with `0` is not a valid landline phone number

API

const phone = require('phone');

phone(phone: String, [country: string, allowLandline: Boolean]): Array

Input

| Parameter | Type | Required | Description | | ------------- | ------- | -------- | ------------------------------------------------------------------- | | phone | String | Yes | The phone number text you want to process | | country | String | No | Provided country code in iso-3166 alpha 2 or 3 format | | allowLandLine | Boolean | No | Set to true if you want to skip phone number initial digit checking |

Returns

The return would always be an Array

| Array index | Type | Description | | ----------- | ------ | ------------------------------------------------------------- | | 0 | String | Normalized phone number in E.164 format | | 1 | String | Detected phone number country code in iso-3166 alpha 3 format |

If the phone number cannot be reformatted due to any reason (e.g. unable to match any country), the result would be an empty array.

The function response is in Array format for some historical reason and expected to be updated to a proper object response in the next major version bump. (Will not change on version 2.x)

Test

yarn test

Build

yarn build

Old browsers & browser support

We currently transpile script to work on target environments for which the browser's global usage is >1%, and Node.js 6.10+.

You can check browser usage statistics on the browserlist.

You may need polyfills for some older browsers; for more details, please read the example/README file.

FAQ

  1. Does phone do any logical validation?

    Yes. If you provide the 2nd parameter (country), and the phone number does not start with + sign.

    phone will phone phone_number_lengths and mobile_begin_with

  2. Why is phone returning null for a valid phone number?

    By default, the function will phone a mobile phone number only, to phone a landline phone number, please set 3rd parameter allowLandline to true.

    If you find the result is still incorrect, please submit a ticket to improve our validation rules.

  3. How does allowLandline work?

    Mobile phone number detection is achieved by comparing the beginning digits of a phone number to a list of possible mobile prefixes for a country. In some countries, some or all of these prefixes are the same for both mobile phones and landlines; when allowLandline is set to false you should not assume that all possible landline phone numbers will be reliably filtered out.

Help

We've tried to make sure that this package works for as many cases as possible, if you notice that we have an incorrect rule for a country or other case, please open an issue to let us know.

For creating new pull requests regarding add or modify phone number formats, please include the reference information such as PDFs, websites, etc. Thank you very much.

License

This project is licensed under the MIT license.