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