56 lines
1.4 KiB
TypeScript
56 lines
1.4 KiB
TypeScript
import { badRequest } from '../errors.js';
|
|
|
|
export type NormalizedPhoneNumber = {
|
|
countryCode: string;
|
|
nationalNumber: string;
|
|
e164: string;
|
|
maskedNationalNumber: string;
|
|
};
|
|
|
|
function stripPhoneInput(input: string) {
|
|
return input.replace(/[^\d+]/gu, '').trim();
|
|
}
|
|
|
|
export function maskNationalPhoneNumber(phoneNumber: string) {
|
|
if (phoneNumber.length < 7) {
|
|
return phoneNumber;
|
|
}
|
|
|
|
return `${phoneNumber.slice(0, 3)}****${phoneNumber.slice(-4)}`;
|
|
}
|
|
|
|
export function normalizeMainlandChinaPhoneNumber(
|
|
phoneInput: string,
|
|
): NormalizedPhoneNumber {
|
|
const trimmed = stripPhoneInput(phoneInput);
|
|
if (!trimmed) {
|
|
throw badRequest('请输入手机号');
|
|
}
|
|
|
|
let nationalNumber = trimmed;
|
|
if (nationalNumber.startsWith('+86')) {
|
|
nationalNumber = nationalNumber.slice(3);
|
|
} else if (nationalNumber.startsWith('86') && nationalNumber.length === 13) {
|
|
nationalNumber = nationalNumber.slice(2);
|
|
}
|
|
|
|
if (!/^1\d{10}$/u.test(nationalNumber)) {
|
|
throw badRequest('请输入正确的中国大陆手机号');
|
|
}
|
|
|
|
return {
|
|
countryCode: '86',
|
|
nationalNumber,
|
|
e164: `+86${nationalNumber}`,
|
|
maskedNationalNumber: maskNationalPhoneNumber(nationalNumber),
|
|
};
|
|
}
|
|
|
|
export function validateSmsVerifyCode(verifyCode: string) {
|
|
const normalizedVerifyCode = verifyCode.trim();
|
|
if (!/^[A-Za-z0-9]{4,8}$/u.test(normalizedVerifyCode)) {
|
|
throw badRequest('请输入正确的验证码');
|
|
}
|
|
return normalizedVerifyCode;
|
|
}
|