69 lines
2.3 KiB
JavaScript
69 lines
2.3 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
const internals = {};
|
||
|
|
||
|
|
||
|
/*
|
||
|
From RFC 5321:
|
||
|
|
||
|
Mailbox = Local-part "@" ( Domain / address-literal )
|
||
|
|
||
|
Local-part = Dot-string / Quoted-string
|
||
|
Dot-string = Atom *("." Atom)
|
||
|
Atom = 1*atext
|
||
|
atext = ALPHA / DIGIT / "!" / "#" / "$" / "%" / "&" / "'" / "*" / "+" / "-" / "/" / "=" / "?" / "^" / "_" / "`" / "{" / "|" / "}" / "~"
|
||
|
|
||
|
Domain = sub-domain *("." sub-domain)
|
||
|
sub-domain = Let-dig [Ldh-str]
|
||
|
Let-dig = ALPHA / DIGIT
|
||
|
Ldh-str = *( ALPHA / DIGIT / "-" ) Let-dig
|
||
|
|
||
|
ALPHA = %x41-5A / %x61-7A ; a-z, A-Z
|
||
|
DIGIT = %x30-39 ; 0-9
|
||
|
|
||
|
From RFC 6531:
|
||
|
|
||
|
sub-domain =/ U-label
|
||
|
atext =/ UTF8-non-ascii
|
||
|
|
||
|
UTF8-non-ascii = UTF8-2 / UTF8-3 / UTF8-4
|
||
|
|
||
|
UTF8-2 = %xC2-DF UTF8-tail
|
||
|
UTF8-3 = %xE0 %xA0-BF UTF8-tail /
|
||
|
%xE1-EC 2( UTF8-tail ) /
|
||
|
%xED %x80-9F UTF8-tail /
|
||
|
%xEE-EF 2( UTF8-tail )
|
||
|
UTF8-4 = %xF0 %x90-BF 2( UTF8-tail ) /
|
||
|
%xF1-F3 3( UTF8-tail ) /
|
||
|
%xF4 %x80-8F 2( UTF8-tail )
|
||
|
|
||
|
UTF8-tail = %x80-BF
|
||
|
|
||
|
Note: The following are not supported:
|
||
|
|
||
|
RFC 5321: address-literal, Quoted-string
|
||
|
RFC 5322: obs-*, CFWS
|
||
|
*/
|
||
|
|
||
|
|
||
|
internals.atext = '[\\w!#\\$%&\'\\*\\+\\-/=\\?\\^`\\{\\|\\}~]'; // _ included in \w
|
||
|
|
||
|
|
||
|
exports.atextRx = new RegExp(`^${internals.atext}+$`);
|
||
|
|
||
|
|
||
|
exports.atomRx = new RegExp([
|
||
|
|
||
|
internals.atext,
|
||
|
|
||
|
// %xC2-DF UTF8-tail
|
||
|
'(?:[\\xc2-\\xdf][\\x80-\\xbf])',
|
||
|
|
||
|
// %xE0 %xA0-BF UTF8-tail %xE1-EC 2( UTF8-tail ) %xED %x80-9F UTF8-tail %xEE-EF 2( UTF8-tail )
|
||
|
'(?:\\xe0[\\xa0-\\xbf][\\x80-\\xbf])|(?:[\\xe1-\\xec][\\x80-\\xbf]{2})|(?:\\xed[\\x80-\\x9f][\\x80-\\xbf])|(?:[\\xee-\\xef][\\x80-\\xbf]{2})',
|
||
|
|
||
|
// %xF0 %x90-BF 2( UTF8-tail ) %xF1-F3 3( UTF8-tail ) %xF4 %x80-8F 2( UTF8-tail )
|
||
|
'(?:\\xf0[\\x90-\\xbf][\\x80-\\xbf]{2})|(?:[\\xf1-\\xf3][\\x80-\\xbf]{3})|(?:\\xf4[\\x80-\\x8f][\\x80-\\xbf]{2})'
|
||
|
|
||
|
].join('|'));
|