36 lines
820 B
TypeScript
36 lines
820 B
TypeScript
export type ClaimantIdentifier = {
|
||
canonical: string;
|
||
display: string;
|
||
kind: "phone" | "wechat";
|
||
};
|
||
|
||
function stripLabel(value: string) {
|
||
return value
|
||
.replace(/^(?:微信号|微信|wechat|手机号|手机)\s*[::]?\s*/i, "")
|
||
.trim();
|
||
}
|
||
|
||
export function parseClaimantIdentifier(value: unknown): ClaimantIdentifier | null {
|
||
const input = stripLabel(String(value ?? "").trim());
|
||
if (!input) return null;
|
||
|
||
const phone = input.replace(/[\s-]/g, "").replace(/^\+?86/, "");
|
||
if (/^1[3-9]\d{9}$/.test(phone)) {
|
||
return {
|
||
canonical: `phone:${phone}`,
|
||
display: phone,
|
||
kind: "phone",
|
||
};
|
||
}
|
||
|
||
if (/^[A-Za-z][A-Za-z0-9_-]{5,31}$/.test(input)) {
|
||
return {
|
||
canonical: `wechat:${input.toLowerCase()}`,
|
||
display: input,
|
||
kind: "wechat",
|
||
};
|
||
}
|
||
|
||
return null;
|
||
}
|