50 lines
1.2 KiB
TypeScript
50 lines
1.2 KiB
TypeScript
import { z } from 'zod'
|
|
|
|
export const weixinBindingStatusSchema = z.enum([
|
|
'stopped',
|
|
'starting',
|
|
'pending',
|
|
'scanned',
|
|
'verification_required',
|
|
'connected',
|
|
'expired',
|
|
'failed'
|
|
])
|
|
export type WeixinBindingStatus = z.infer<
|
|
typeof weixinBindingStatusSchema
|
|
>
|
|
|
|
export const weixinBindingSnapshotSchema = z
|
|
.object({
|
|
status: weixinBindingStatusSchema,
|
|
qrPayload: z.string().min(1).max(4_096).optional(),
|
|
qrExpiresAt: z.string().datetime({ offset: true }).optional(),
|
|
accountDisplay: z.string().trim().min(1).max(64).optional(),
|
|
detail: z.string().trim().min(1).max(512).optional()
|
|
})
|
|
.strict()
|
|
export type WeixinBindingSnapshot = z.infer<
|
|
typeof weixinBindingSnapshotSchema
|
|
>
|
|
|
|
export const weixinVerificationInputSchema = z
|
|
.object({
|
|
code: z
|
|
.string()
|
|
.trim()
|
|
.min(1)
|
|
.max(32)
|
|
.regex(/^[0-9]+$/u, '验证码只能包含数字')
|
|
})
|
|
.strict()
|
|
export type WeixinVerificationInput = z.infer<
|
|
typeof weixinVerificationInputSchema
|
|
>
|
|
|
|
export function weixinAccountDisplay(value: string): string | undefined {
|
|
const normalized = value.trim()
|
|
return normalized
|
|
? `微信用户 ****${normalized.slice(-4)}`
|
|
: undefined
|
|
}
|