Skip to content

Commit 908e3e2

Browse files
authored
chore(deps): replace google-libphonenumber with libphonenumber-js (#21)
1 parent 186f6ca commit 908e3e2

File tree

8 files changed

+1104
-846
lines changed

8 files changed

+1104
-846
lines changed

.github/dependabot.yml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
version: 2
2+
updates:
3+
- package-ecosystem: "npm"
4+
directory: "/"
5+
schedule:
6+
interval: "weekly"
7+
allow:
8+
- dependency-name: "libphonenumber-js"
9+
open-pull-requests-limit: 2

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
[![Payload CMS](https://img.shields.io/badge/Payload%20CMS-v3-blue)](https://github.com/payloadcms/payload)
44
[![NPM Version](https://img.shields.io/npm/v/payload-phone-number-plugin)](https://www.npmjs.com/package/payload-phone-number-plugin)
55

6-
This Payload CMS plugin uses [google-libphonenumber](https://github.com/ruimarinho/google-libphonenumber) to format and validate phone numbers.
6+
This Payload CMS plugin uses [libphonenumber-js](https://www.npmjs.com/package/libphonenumber-js) to format and validate phone numbers.
77

88
![Preview](./src/assets/preview.png)
99

package.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,8 +119,7 @@
119119
"registry": "https://registry.npmjs.org/",
120120
"dependencies": {
121121
"@payloadcms/translations": "^3.0.0",
122-
"@types/google-libphonenumber": "^7.4.30",
123122
"clsx": "^2.1.1",
124-
"google-libphonenumber": "^3.2.43"
123+
"libphonenumber-js": "^1.12.33"
125124
}
126125
}

pnpm-lock.yaml

Lines changed: 1063 additions & 797 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/types.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { RegionCode } from 'google-libphonenumber';
1+
import type { CountryCode } from 'libphonenumber-js';
22

33
export type PhoneNumberPluginOptions = {};
44

@@ -40,4 +40,4 @@ export type Defaults = {
4040
countryPrefixDisplayFormat: CountryPrefixDisplayFormat;
4141
};
4242

43-
export type { RegionCode };
43+
export type RegionCode = CountryCode;

src/ui/Field/helpers.ts

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,17 @@
1-
import libphonenumber from 'google-libphonenumber';
2-
const { PhoneNumberUtil, PhoneNumberFormat, AsYouTypeFormatter } = libphonenumber;
1+
import { AsYouType, parsePhoneNumber } from 'libphonenumber-js/max';
32

43
import type { PhoneNumberValue, RegionCode } from '../../types.js';
54

6-
const phoneUtil = PhoneNumberUtil.getInstance();
7-
85
export function extractE164FromValue(value: PhoneNumberValue) {
96
return typeof value === 'object' && value !== null ? value.e164 : value || '';
107
}
118

129
export function parseE164ToNationalFormat(e164PhoneNumber: string): { regionCode: RegionCode | null; national: string } | null {
1310
try {
14-
const number = phoneUtil.parse(e164PhoneNumber);
15-
const regionCode = phoneUtil.getRegionCodeForNumber(number) || null;
16-
const national = phoneUtil.format(number, PhoneNumberFormat.NATIONAL);
11+
const phoneNumber = parsePhoneNumber(e164PhoneNumber);
12+
13+
const regionCode = phoneNumber.country || null;
14+
const national = phoneNumber.formatNational();
1715

1816
return { regionCode, national };
1917
} catch {
@@ -22,20 +20,18 @@ export function parseE164ToNationalFormat(e164PhoneNumber: string): { regionCode
2220
}
2321

2422
export function formatToNationalAsYouType(input: string, regionCode: RegionCode) {
25-
const formatter = new AsYouTypeFormatter(regionCode);
26-
let nationalFormat = '';
27-
for (const char of input.replace(/\D/g, '')) {
28-
nationalFormat = formatter.inputDigit(char);
29-
}
23+
const formatter = new AsYouType(regionCode);
24+
const nationalFormat = formatter.input(input.replace(/\D/g, ''));
3025

3126
return nationalFormat;
3227
}
3328

3429
export function convertToE164(nationalPhoneNumber: string, regionCode: RegionCode): { e164: string; detectedRegion: RegionCode | null } | null {
3530
try {
36-
const number = phoneUtil.parseAndKeepRawInput(nationalPhoneNumber, regionCode);
37-
const e164 = phoneUtil.format(number, PhoneNumberFormat.E164);
38-
const detectedRegion = phoneUtil.getRegionCodeForNumber(number) || null;
31+
const phoneNumber = parsePhoneNumber(nationalPhoneNumber, regionCode);
32+
33+
const e164 = phoneNumber.number;
34+
const detectedRegion = phoneNumber.country || null;
3935

4036
return { e164, detectedRegion };
4137
} catch {
@@ -52,9 +48,10 @@ export function extractDigitsWithPlus(input: string) {
5248
export function parseInternationalNumber(input: string): { regionCode: RegionCode | null; national: string } | null {
5349
try {
5450
const cleanInput = extractDigitsWithPlus(input);
55-
const number = phoneUtil.parse(cleanInput);
56-
const regionCode = phoneUtil.getRegionCodeForNumber(number) || null;
57-
const national = phoneUtil.format(number, PhoneNumberFormat.NATIONAL);
51+
const phoneNumber = parsePhoneNumber(cleanInput);
52+
53+
const regionCode = phoneNumber.country || null;
54+
const national = phoneNumber.formatNational();
5855

5956
return { regionCode, national };
6057
} catch {

src/utilities/getPhoneNumberDetails.ts

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,25 @@
11
import type { PhoneNumber } from '../types.js';
22

3-
import libphonenumber from 'google-libphonenumber';
4-
const { PhoneNumberUtil, PhoneNumberFormat } = libphonenumber;
3+
import { parsePhoneNumber } from 'libphonenumber-js/max';
54

65
import { countries } from './countries.js';
76

8-
let phoneUtil: libphonenumber.PhoneNumberUtil | null = null;
9-
107
export function getPhoneNumberDetails(e164PhoneNumber: string): PhoneNumber | null {
11-
if (!phoneUtil) {
12-
phoneUtil = PhoneNumberUtil.getInstance();
13-
}
14-
158
try {
16-
const number = phoneUtil.parse(e164PhoneNumber);
17-
const regionCode = phoneUtil.getRegionCodeForNumber(number);
9+
const phoneNumber = parsePhoneNumber(e164PhoneNumber);
10+
11+
const regionCode = phoneNumber.country;
1812

1913
if (!regionCode) {
2014
return null;
2115
}
2216

23-
const national = phoneUtil.format(number, PhoneNumberFormat.NATIONAL);
24-
const international = phoneUtil.format(number, PhoneNumberFormat.INTERNATIONAL);
25-
const e164Formatted = phoneUtil.format(number, PhoneNumberFormat.E164);
17+
const national = phoneNumber.formatNational();
18+
const international = phoneNumber.formatInternational();
19+
const e164Formatted = phoneNumber.number;
2620

2721
const country = countries.find((c) => c.regionCode === regionCode);
28-
const callingCode = country?.callingCode || `+${number.getCountryCode()}`;
22+
const callingCode = country?.callingCode || `+${phoneNumber.countryCallingCode}`;
2923

3024
return {
3125
e164: e164Formatted,

src/utilities/validate.ts

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,11 @@
11
import type { TextField, Validate } from 'payload';
22

3-
import libphonenumber from 'google-libphonenumber';
4-
const { PhoneNumberUtil } = libphonenumber;
3+
import { parsePhoneNumber } from 'libphonenumber-js/max';
54

65
import type { RegionCode } from '../types.js';
76

8-
let phoneUtil: libphonenumber.PhoneNumberUtil | null = null;
9-
107
export const createPhoneNumberValidator = (allowedCountries?: RegionCode[]): Validate<string, unknown, unknown, TextField> => {
118
return (value, { req, required }) => {
12-
if (!phoneUtil) {
13-
phoneUtil = PhoneNumberUtil.getInstance();
14-
}
15-
169
if (!value) {
1710
if (required) {
1811
return req.t('validation:required');
@@ -31,15 +24,15 @@ export const createPhoneNumberValidator = (allowedCountries?: RegionCode[]): Val
3124
}
3225

3326
try {
34-
const number = phoneUtil.parse(phoneNumberValue);
35-
if (!phoneUtil.isValidNumber(number)) {
27+
const phoneNumber = parsePhoneNumber(phoneNumberValue);
28+
if (!phoneNumber.isValid()) {
3629
// @ts-expect-error - translations are not typed in plugins yet
3730
return req.t('payload-phone-number-plugin:invalidPhoneNumber');
3831
}
3932

4033
if (allowedCountries && allowedCountries.length > 0) {
41-
const regionCode = phoneUtil.getRegionCodeForNumber(number);
42-
if (regionCode && !allowedCountries.includes(regionCode as RegionCode)) {
34+
const regionCode = phoneNumber.country;
35+
if (regionCode && !allowedCountries.includes(regionCode)) {
4336
// @ts-expect-error - translations are not typed in plugins yet
4437
return req.t('payload-phone-number-plugin:phoneNumberCountryNotAllowed');
4538
}

0 commit comments

Comments
 (0)