Convert libphonenumber utilities to TypeScript, removing unused ones

This commit is contained in:
Evan Hahn 2022-06-01 17:48:16 +00:00 committed by GitHub
parent 9c8fd2a714
commit ab9a50357b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 83 additions and 340 deletions

View file

@ -1,4 +1,4 @@
// Copyright 2021 Signal Messenger, LLC
// Copyright 2021-2022 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import type { ChangeEvent } from 'react';
@ -7,6 +7,7 @@ import type { Plugin } from 'intl-tel-input';
import intlTelInput from 'intl-tel-input';
import { strictAssert } from '../util/assert';
import { parseNumber } from '../util/libphonenumberUtil';
import { getChallengeURL } from '../challenge';
const PhoneInput = ({
@ -42,10 +43,7 @@ const PhoneInput = ({
const regionCode = plugin.getSelectedCountryData().iso2;
const parsedNumber = window.libphonenumber.util.parseNumber(
number,
regionCode
);
const parsedNumber = parseNumber(number, regionCode);
setIsValid(parsedNumber.isValidNumber);
onValidation(parsedNumber.isValidNumber);

View file

@ -19,6 +19,10 @@ import type {
} from '../model-types.d';
import { getInitials } from '../util/getInitials';
import { normalizeUuid } from '../util/normalizeUuid';
import {
getRegionCodeForNumber,
parseNumber,
} from '../util/libphonenumberUtil';
import { clearTimeoutIfNecessary } from '../util/clearTimeoutIfNecessary';
import type { AttachmentType } from '../types/Attachment';
import { isGIF } from '../types/Attachment';
@ -3406,7 +3410,7 @@ export class ConversationModel extends window.Backbone
if (!regionCode) {
throw new Error('No region code');
}
const number = window.libphonenumber.util.parseNumber(
const number = parseNumber(
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
this.get('e164')!,
regionCode
@ -5017,8 +5021,7 @@ export class ConversationModel extends window.Backbone
const number = this.get('e164')!;
try {
const parsedNumber = window.libphonenumber.parse(number);
const regionCode =
window.libphonenumber.getRegionCodeForNumber(parsedNumber);
const regionCode = getRegionCodeForNumber(parsedNumber);
if (regionCode === window.storage.get('regionCode')) {
return window.libphonenumber.format(
parsedNumber,

View file

@ -0,0 +1,30 @@
// Copyright 2015-2022 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import { assert, AssertionError } from 'chai';
import { parseNumber } from '../../util/libphonenumberUtil';
describe('libphonenumber util', () => {
describe('parseNumber', () => {
it('numbers with + are valid without providing regionCode', () => {
const result = parseNumber('+14155555555');
if (!result.isValidNumber) {
throw new AssertionError('Phone number is not valid');
}
assert.strictEqual(result.e164, '+14155555555');
assert.strictEqual(result.regionCode, 'US');
assert.strictEqual(result.countryCode, '1');
});
it('variant numbers with the right regionCode are valid', () => {
['4155555555', '14155555555', '+14155555555'].forEach(number => {
const result = parseNumber(number, 'US');
if (!result.isValidNumber) {
throw new AssertionError('Phone number is not valid');
}
assert.strictEqual(result.e164, '+14155555555');
assert.strictEqual(result.regionCode, 'US');
assert.strictEqual(result.countryCode, '1');
});
});
});
});

View file

@ -1,4 +1,4 @@
// Copyright 2020-2021 Signal Messenger, LLC
// Copyright 2020-2022 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import PQueue from 'p-queue';
@ -31,6 +31,7 @@ import { UUID, UUIDKind } from '../types/UUID';
import { isMoreRecentThan, isOlderThan } from '../util/timestamp';
import { ourProfileKeyService } from '../services/ourProfileKey';
import { assert, strictAssert } from '../util/assert';
import { getRegionCodeForNumber } from '../util/libphonenumberUtil';
import { getProvisioningUrl } from '../util/getProvisioningUrl';
import { SignalService as Proto } from '../protobuf';
import * as log from '../logging/log';
@ -689,8 +690,7 @@ export default class AccountManager extends EventTarget {
await storage.put('read-receipt-setting', Boolean(readReceipts));
const regionCode =
window.libphonenumber.util.getRegionCodeForNumber(number);
const regionCode = getRegionCodeForNumber(number);
await storage.put('regionCode', regionCode);
await storage.protocol.hydrateCaches();
}

View file

@ -0,0 +1,51 @@
// Copyright 2014-2022 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import {
instance as libphonenumber,
PhoneNumberFormat,
} from './libphonenumberInstance';
const FALLBACK_REGION_CODE = 'ZZ';
export function getRegionCodeForNumber(number: string): string {
try {
const parsedNumber = libphonenumber.parse(number);
return (
libphonenumber.getRegionCodeForNumber(parsedNumber) ||
FALLBACK_REGION_CODE
);
} catch (e) {
return FALLBACK_REGION_CODE;
}
}
export function parseNumber(
number: string,
defaultRegionCode?: string
):
| { isValidNumber: false; error: unknown }
| {
isValidNumber: true;
regionCode: undefined | string;
countryCode: undefined | string;
e164: string;
} {
try {
const parsedNumber = libphonenumber.parse(number, defaultRegionCode);
const isValidNumber = libphonenumber.isValidNumber(parsedNumber);
if (!isValidNumber) {
return { error: new Error('Invalid phone number'), isValidNumber: false };
}
return {
isValidNumber: true,
regionCode: libphonenumber.getRegionCodeForNumber(parsedNumber),
countryCode: parsedNumber.getCountryCode()?.toString(),
e164: libphonenumber.format(parsedNumber, PhoneNumberFormat.E164),
};
} catch (error) {
return { error, isValidNumber: false };
}
}

View file

@ -1,4 +1,4 @@
// Copyright 2021 Signal Messenger, LLC
// Copyright 2021-2022 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import loadImage from 'blueimp-load-image';
@ -7,6 +7,7 @@ import type { MIMEType } from '../types/MIME';
import { IMAGE_JPEG } from '../types/MIME';
import { canvasToBlob } from './canvasToBlob';
import { getValue } from '../RemoteConfig';
import { parseNumber } from './libphonenumberUtil';
enum MediaQualityLevels {
One = 1,
@ -67,18 +68,22 @@ function getMediaQualityLevel(): MediaQualityLevels {
if (!values) {
return DEFAULT_LEVEL;
}
const countryValues = parseCountryValues(values);
const e164 = window.textsecure.storage.user.getNumber();
if (!e164) {
return DEFAULT_LEVEL;
}
const parsedPhoneNumber = window.libphonenumber.util.parseNumber(e164);
const parsedPhoneNumber = parseNumber(e164);
if (!parsedPhoneNumber.isValidNumber) {
return DEFAULT_LEVEL;
}
const level = countryValues.get(parsedPhoneNumber.countryCode);
const countryValues = parseCountryValues(values);
const level = parsedPhoneNumber.countryCode
? countryValues.get(parsedPhoneNumber.countryCode)
: undefined;
if (level) {
return level;
}

15
ts/window.d.ts vendored
View file

@ -213,21 +213,6 @@ declare global {
isFullScreen: () => boolean;
initialTheme?: ThemeType;
libphonenumber: {
util: {
getRegionCodeForNumber: (number: string) => string;
parseNumber: (
e164: string,
defaultRegionCode?: string
) =>
| { isValidNumber: false; error: unknown }
| {
isValidNumber: true;
regionCode: string | undefined;
countryCode: string;
nationalNumber: string;
e164: string;
};
};
parse: (number: string) => string;
getRegionCodeForNumber: (number: string) => string;
format: (number: string, format: PhoneNumberFormat) => string;