39 lines
1.1 KiB
TypeScript
39 lines
1.1 KiB
TypeScript
import { z } from "zod/v4";
|
|
|
|
export const CustomerIdSchema = z.string().refine(
|
|
(val) => {
|
|
if (val === "") return false;
|
|
if (val.includes("@")) return false;
|
|
if (val.includes(" ")) return false;
|
|
if (val.includes(".")) return false;
|
|
return /^[a-zA-Z0-9_-]+$/.test(val);
|
|
},
|
|
{
|
|
error: (issue) => {
|
|
const input = issue.input as string;
|
|
if (input === "") return { message: "can't be an empty string" };
|
|
if (input.includes("@"))
|
|
return {
|
|
message:
|
|
"cannot contain @ symbol. Use only letters, numbers, underscores, and hyphens.",
|
|
};
|
|
if (input.includes(" "))
|
|
return {
|
|
message:
|
|
"cannot contain spaces. Use only letters, numbers, underscores, and hyphens.",
|
|
};
|
|
if (input.includes("."))
|
|
return {
|
|
message:
|
|
"cannot contain periods. Use only letters, numbers, underscores, and hyphens.",
|
|
};
|
|
const invalidChar = input.match(/[^a-zA-Z0-9_-]/)?.[0];
|
|
return {
|
|
message: `cannot contain '${invalidChar}'. Use only letters, numbers, underscores, and hyphens.`,
|
|
};
|
|
},
|
|
},
|
|
);
|
|
|
|
type CustomerId = z.infer<typeof CustomerIdSchema>;
|