API reference › @evolu/common › Type › Email
const Email: brand(
"Email",
String,
(value: string) =>
/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/u.test(
value,
)
? ok()
: err<EmailError>({ type: "Email", value }),
formatEmailError,
);
Defined in: packages/common/src/Type.ts:9164
Email address as defined by the WHATWG HTML Standard.
Email accepts a valid email
address,
the syntax browsers enforce for <input type="email">. The HTML Standard
deliberately departs from RFC 5322: it rejects quoted local parts, comments,
IP address literals, and whitespace, and it accepts only ASCII. Use the ASCII
(xn--) form of internationalized domains.
Email does not normalize. The local part is case-sensitive, so different Email strings can still reach the same mailbox, and only a delivered message proves that an address exists.
The HTML Standard limits each domain label to 63 characters but sets no total
length. SMTP limits an address to 254 characters; compose
maxLength(254)(Email) when that limit matters.
Example
import {
assertEqual,
assertErr,
assertOk,
Email,
maxLength,
} from "@evolu/common";
assertOk(Email.fromUnknown("ada@example.com"), "ada@example.com");
assertOk(Email.fromUnknown("Ada@Example.com"), "Ada@Example.com");
const invalid = Email.fromUnknown("Ada <ada@example.com>");
assertErr(invalid);
assertEqual(invalid.error, {
type: "Email",
value: "Ada <ada@example.com>",
});
const SmtpEmail = maxLength(254)(Email);
assertErr(SmtpEmail.fromUnknown(`${"a".repeat(251)}@b.c`));