Files
Genarrative/server-node/src/auth/phoneNumber.ts
2026-04-10 15:37:02 +08:00

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;
}