const legex = require('legex');
const c = legex.C;
const v = legex.V;
const beforeAtType1 = c.And(
v.StartWithNon('<>()[]\\.,;:@ '),
v.HasN(1, '@'),
v.BeforeNth(
1, '@',
v.Exclude('<>()[]\\,;:@ ')
)
);
const beforeAtType2 = v.BeforeNth(
1, '@',
v.QuoteBy(
'"', '"',
v.Anything()
)
);
const beforeAt = c.Or(beforeAtType1, beforeAtType2);
const afterAtType1 = v.AfterNth(
1, '@',
v.QuoteBy(
'[', ']',
v.IsIP()
)
);
const alphabets = c.And(
v.IsAlphabet(),
v.LenGeq(2)
);
const afterAtType2 = c.And(
v.AfterNth(
1, '@',
v.BeforeNth(
1, '.',
v.IsWord()
)
),
v.AfterNth(
1, '@',
v.AfterNth(
1, '.',
alphabets
)
)
);
const afterAt = c.Or(afterAtType1, afterAtType2);
const email = c.And(beforeAt, afterAt);
console.log('Valid emails:');
assert('aaa@aaa.dds', email('aaa@aaa.dds'));
assert('aaa@aaa.dd', email('aaa@aaa.dd'));
assert('aaa@[192.168.0.1]', email('aaa@[192.168.0.1]'));
assert('\".....\"@aaa.dds', email('\".....\"@aaa.dds'));
assert('simple@example.com', email('simple@example.com'));
assert('very.common@example.com', email('very.common@example.com'));
assert('disposable.style.email.with+symbol@example.com', email('disposable.style.email.with+symbol@example.com'));
assert('other.email-with-dash@example.com', email('other.email-with-dash@example.com'));
assert('fully-qualified-domain@example.com', email('fully-qualified-domain@example.com'));
assert('user.name+tag+sorting@example.com', email('user.name+tag+sorting@example.com'));
assert('#!$%&\'*+-/=?^_`{}|~@example.org', email('#!$%&\'*+-/=?^_`{}|~@example.org'));
console.log('Invalid emails:');
assert('.aaa@aaa.dds', !email('.aaa@aaa.dds'));
assert('aaa@aaa.d', !email('aaa@aaa.d'));
assert('aaa@aaa.d4s', !email('aaa@aaa.d4s'));
assert('aaa@[19.23.2]', !email('aaa@[19.23.2]'));
assert('.....@aaa.dds', !email('.....@aaa.dds'));
console.log('Valid emails:');
assert('aaa@aaa.dds', v.IsEmail().check('aaa@aaa.dds'));
assert('aaa@aaa.dd', v.IsEmail().check('aaa@aaa.dd'));
assert('aaa@[192.168.0.1]', v.IsEmail().check('aaa@[192.168.0.1]'));
assert('\".....\"@aaa.dds', v.IsEmail().check('\".....\"@aaa.dds'));
assert('simple@example.com', email('simple@example.com'));
assert('very.common@example.com', email('very.common@example.com'));
assert('disposable.style.email.with+symbol@example.com', email('disposable.style.email.with+symbol@example.com'));
assert('other.email-with-dash@example.com', email('other.email-with-dash@example.com'));
assert('fully-qualified-domain@example.com', email('fully-qualified-domain@example.com'));
assert('user.name+tag+sorting@example.com', email('user.name+tag+sorting@example.com'));
assert('#!$%&\'*+-/=?^_`{}|~@example.org', email('#!$%&\'*+-/=?^_`{}|~@example.org'));
console.log('Invalid emails:');
assert('.aaa@aaa.dds', !v.IsEmail().check('.aaa@aaa.dds'));
assert('aaa@aaa.d', !v.IsEmail().check('aaa@aaa.d'));
assert('aaa@aaa.d4s', !v.IsEmail().check('aaa@aaa.d4s'));
assert('aaa@[19.23.2]', !v.IsEmail().check('aaa@[19.23.2]'));
assert('.....@aaa.dds', !v.IsEmail().check('.....@aaa.dds'));
function assert(description, boolean, msg) {
console.log(description);
if (!boolean)
throw new Error(msg);
else
console.log('pass');
}