decentralized-internet
Version:
An NPM library of programs to create decentralized web and distributed computing projects
1 lines • 16.5 kB
JavaScript
"use strict";const Punycode=require("punycode"),Code=require("code"),Address=require(".."),Lab=require("lab"),internals={},{describe:describe,it:it}=exports.lab=Lab.script(),expect=Code.expect;describe("email",()=>{describe("analyze()",()=>{it("identifies error",()=>{const t=[["","Address must be a non-empty string"],["êjness@iana.org","Address contains forbidden Unicode characters",{allowUnicode:!1}],["test@test@test","Address cannot contain more than one @ character"],["test","Address must contain one @ character"],["@example.com","Address local part cannot be empty"],["test@","Domain cannot be empty"],["1234567890@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz.com","Address too long"],["1234567890123456789012345678901234567890123456789012345678901234567890@example.com","Address local part too long"],["x..y@example.com","Address local part contains empty dot-separated segment"],["x:y@example.com","Address local part contains invalid character"],["ê:y@example.com","Address local part contains invalid character"],["test@com","Domain lacks the minimum required number of segments"],["test@x.no-such-tld","Domain uses forbidden TLD"],["test@example..com","Domain contains empty dot-separated segment"],["test@1234567890123456789012345678901234567890123456789012345678901234567890.com","Domain contains dot-separated segment that is too long"],["test@example+.com","Domain contains invalid character",{tlds:!1}],["test@example.com_","Domain contains invalid tld character",{tlds:!1}]];for(let e=0;e<t.length;++e){const o=t[e],a=Address.email.analyze(o[0],o[2]),n=o[1];a&&a.error===n||console.log(e,o[0]),expect(a.error).to.equal(n)}}),it("validates options",()=>{const t=[["test@example.com","Invalid options: tlds must be a boolean or an object",{tlds:1}],["test@example.com","Invalid options: tlds.allow must be a Set object or true",{tlds:{allow:["test"]}}],["test@example.com","Invalid options: tlds.deny must be a Set object",{tlds:{deny:["test"]}}],["test@example.com","Invalid options: cannot specify both tlds.allow and tlds.deny lists",{tlds:{allow:new Set,deny:new Set}}],[1,"Invalid input: value must be a string"]];for(let e=0;e<t.length;++e){const o=t[e];expect(()=>Address.email.analyze(o[0],o[2])).to.throw(o[1])}}),describe("validated TLD",()=>{it("applies built-in list",()=>{expect(Address.email.analyze("test@example.com")).to.not.exist(),expect(Address.email.analyze("test@example.com",{tlds:!0})).to.not.exist(),expect(Address.email.analyze("test@example.com",{tlds:{allow:!0}})).to.not.exist()}),it("ignores built-in list",()=>{expect(Address.email.analyze("test@example.invalid-top",{tlds:!1})).to.not.exist()}),it("denies listed tls",()=>{expect(Address.email.analyze("test@example.com",{tlds:{deny:new Set(["test"])}})).to.not.exist(),expect(Address.email.analyze("test@example.com",{tlds:{deny:new Set(["com"])}})).to.equal({error:"Domain uses forbidden TLD"})})})}),describe("isValid()",()=>{it("validates email",()=>{const t=[["\r",!1],["test",!1],["@",!1],["test@",!1],["test@io",!1],["test@io",!0,{minDomainSegments:1}],["@io",!1],["@iana.org",!1],["test@iana.org",!0],["test@nominet.org.uk",!0],["test@about.museum",!0],["a@iana.org",!0],["êjness@iana.org",!0],["ñoñó1234@iana.org",!0],["ñoñó1234@something.com",!0],["伊昭傑@郵件.商務",!0,{tlds:{allow:new Set([Punycode.toASCII("商務")])}}],["𐐷𤭢@iana.org",!0],["test.test@iana.org",!0],[".test@iana.org",!1],["test.@iana.org",!1],["test..iana.org",!1],["test_exa-mple.com",!1],["!#$%&`*+/=?^`{|}~@iana.org",!0],["test\\@test@iana.org",!1],["123@iana.org",!0],["test@123.com",!0],["test@iana.123",!1],["test@255.255.255.255",!1],["abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklm@iana.org",!0],["abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklmn@iana.org",!1],["😆😆😆😆😆😆😆😆😆😆😆😆😆😆😆😆😆@iana.org",!1],["test@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklm",!1],["test@😆😆😆😆😆😆😆😆😆😆😆😆😆😆😆😆.org",!0],["test@abcdefghijklmnopqrstuvwxyzabcdefghijklmno😆😆😆😆😆😆😆😆😆😆😆😆😆😆😆😆😆.org",!1],["test@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklm.com",!1],["test@mason-dixon.com",!0],["test@-iana.org",!1],["test@iana-.com",!1],["test@.iana.org",!1],["test@iana.org.",!1],["test@iana..com",!1],["abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklm@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefg.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefg.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefg.abcdefghijklmno",!1],["abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklm@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefg.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefg.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefg.😆😆😆😆",!1],["abcdef@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefg.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefg.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefg.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdef.hijklmnopqrstuv",!1],["abcdef@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefg.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefg.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefg.abcdefghi.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd😆",!1],["abcdef@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefg.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefg.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefg.abcdefghi.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz😆",!1],["a@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefg.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefg.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefg.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefg.abcdefghijkl.hijk",!1],["a@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefg.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefg.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefg.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefg.abcdefghijkl.😆",!1],['"\r',!1],['"test"@iana.org',!1],['""@iana.org',!1],['"""@iana.org',!1],['"\\a"@iana.org',!1],['"\\""@iana.org',!1],['"\\"@iana.org',!1],['"\\\\"@iana.org',!1],['test"@iana.org',!1],['"test@iana.org',!1],['"test"test@iana.org',!1],['test"text"@iana.org',!1],['"test""test"@iana.org',!1],['"test"."test"@iana.org',!1],['"test\\ test"@iana.org',!1],['"test".test@iana.org',!1],['"test\0"@iana.org',!1],['"test\\\0"@iana.org',!1],['"test\r\n test"@iana.org',!1],['"abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz abcdefghj"@iana.org',!1],['"abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz abcdefg\\h"@iana.org',!1],["test@[255.255.255.255]",!1],["test@a[255.255.255.255]",!1],["test@[255.255.255]",!1],["test@[255.255.255.255.255]",!1],["test@[255.255.255.256]",!1],["test@[1111:2222:3333:4444:5555:6666:7777:8888]",!1],["test@[IPv6:1111:2222:3333:4444:5555:6666:7777]",!1],["test@[IPv6:1111:2222:3333:4444:5555:6666:7777:8888]",!1],["test@[IPv6:1111:2222:3333:4444:5555:6666:7777:8888:9999]",!1],["test@[IPv6:1111:2222:3333:4444:5555:6666:7777:888G]",!1],["test@[IPv6:1111:2222:3333:4444:5555:6666::8888]",!1],["test@[IPv6:1111:2222:3333:4444:5555::8888]",!1],["test@[IPv6:1111:2222:3333:4444:5555:6666::7777:8888]",!1],["test@[IPv6::3333:4444:5555:6666:7777:8888]",!1],["test@[IPv6:::3333:4444:5555:6666:7777:8888]",!1],["test@[IPv6:1111::4444:5555::8888]",!1],["test@[IPv6:::]",!1],["test@[IPv6:1111:2222:3333:4444:5555:255.255.255.255]",!1],["test@[IPv6:1111:2222:3333:4444:5555:6666:255.255.255.255]",!1],["test@[IPv6:1111:2222:3333:4444:5555:6666:7777:255.255.255.255]",!1],["test@[IPv6:1111:2222:3333:4444::255.255.255.255]",!1],["test@[IPv6:1111:2222:3333:4444:5555:6666::255.255.255.255]",!1],["test@[IPv6:1111:2222:3333:4444:::255.255.255.255]",!1],["test@[IPv6::255.255.255.255]",!1],["test@[255.255.255.255].local",!1],["test@local.[255.255.255.255]",!1],["test@local.[255.255.255.255].local",!1],["test@local.(comment)[255.255.255.255].local",!1],["test@local. [255.255.255.255].local",!1],["test@local.[255.255.255.255](comment).local",!1],["test@local.[255.255.255.255] .local",!1],[" test @iana.org",!1],["test@ iana .com",!1],["test . test@iana.org",!1],["\r\n test@iana.org",!1],["\r\n \r\n test@iana.org",!1],["(\r",!1],["(comment)test@iana.org",!1],["((comment)test@iana.org",!1],["(comment(comment))test@iana.org",!1],["test@(comment)iana.org",!1],["test(comment)@iana.org",!1],["test(comment)test@iana.org",!1],["test@(comment)[255.255.255.255]",!1],["(comment)abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklm@iana.org",!1],["test@(comment)abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefg.com",!1],["(comment)test@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefg.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefg.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefg.abcdefghijklmnopqrstuvwxyzabcdefghijk.abcdefghijklmnopqrst",!1],["test@iana.org\n",!1],["xn--test@iana.org",!0],["test@iana.org-",!1],['"test@iana.org',!1],["(test@iana.org",!1],["test@(iana.org",!1],["test@[1.2.3.4",!1],['"test\\"@iana.org',!1],["(comment\\)test@iana.org",!1],["test@iana.org(comment\\)",!1],["test@iana.org(comment\\",!1],["test@[RFC-5322-domain-literal]",!1],["test@[RFC-5322-郵件ñó-domain-literal]",!1],["test@[RFC-5322]-domain-literal]",!1],["test@[RFC-5322].domain-literal]",!1],["test@[RFC-5322-[domain-literal]",!1],["test@[",!1],["test@[]",!1],["test@[RFC-5322-\\-domain-literal]",!1],["test@[RFC-5322-\\\t-domain-literal]",!1],["test@[RFC-5322-\\]-domain-literal]",!1],["test@[RFC-5322-\\郵-no-domain-literal]",!1],["test@[RFC-5322--domain-literal]",!1],["test@[RFC-5322-domain-literal\\]",!1],["test@[RFC-5322-domain-literal\\",!1],["test@[RFC 5322 domain literal]",!1],["test@[RFC-5322-domain-literal] (comment)",!1],["@iana.org",!1],["test@.org",!1],['""@iana.org',!1],['""@iana.org',!1],['"\\"@iana.org',!1],["()test@iana.org",!1],["()test@iana.org",!1],["test@iana.org\r",!1],["\rtest@iana.org",!1],['"\rtest"@iana.org',!1],["(\r)test@iana.org",!1],["test@iana.org(\r)",!1],["test@<iana>.org",!1],["\ntest@iana.org",!1],['"\n"@iana.org',!1],['"\\\n"@iana.org',!1],["(\n)test@iana.org",!1],["@iana.org",!1],["test@.org",!1],['""@iana.org',!1],['"\\"@iana.org',!1],["()test@iana.org",!1],["\r\ntest@iana.org",!1],["\r\n \r\ntest@iana.org",!1],[" \r\ntest@iana.org",!1],[" \r\n test@iana.org",!1],[" \r\n \r\ntest@iana.org",!1],[" \r\n\r\ntest@iana.org",!1],[" \r\n\r\n test@iana.org",!1],["test@iana.org\r\n ",!1],["test@iana.org\r\n \r\n ",!1],["test@iana.org\r\n",!1],["test@iana.org \r",!1],["test@iana.org\r\n \r\n",!1],["test@iana.org \r\n",!1],["test@iana.org \r\n ",!1],["test@iana.org \r\n \r\n",!1],["test@iana.org \r\n\r\n",!1],["test@iana.org \r\n\r\n ",!1],["test@iana. org",!1],["test@[\r",!1],["test@[\r\n",!1],[" test@iana.org",!1],["test@iana.org ",!1],["test@[IPv6:1::2:]",!1],['"test\\"@iana.org',!1],["test@iana/icann.org",!1],["test@iana!icann.org",!1],["test@iana?icann.org",!1],["test@iana^icann.org",!1],["test@iana{icann}.org",!1],["test.(comment)test@iana.org",!1],["test@iana.(comment)org",!1],["test@iana(comment)iana.org",!1],["(comment\r\n comment)test@iana.org",!1],["test@org",!0,{minDomainSegments:1}],["test\ud800@invalid",!1],['"\ud800"@invalid',!1],['"\\\ud800"@invalid',!1],["(\ud800)thing@invalid",!1],['"\\\ud800"@invalid',!1],["test@ñoñó郵件ñoñó郵件.郵件ñoñó郵件ñoñó郵件.ñoñó郵件ñoñó郵件.ñoñó郵件ñoñó郵件.ñoñó郵件ñoñó郵件.ñoñó郵件ñoñó郵件.ñoñó郵件ñoñó郵件.noñó郵件.商務",!0,{tlds:{allow:new Set([Punycode.toASCII("商務")])}}],["test@ñoñó郵件ñoñó郵件.郵件ñoñó郵件ñoñó郵件.ñoñó郵件ñoñó郵件.ñoñó郵件ñoñó郵件.ñoñó郵件ñoñó郵件.ñoñó郵件ñoñó郵件.ñoñó郵件ñoñó郵件.noñó郵件ñoñó郵.商務",!1,{tlds:{allow:new Set([Punycode.toASCII("商務")])}}],["test@ñoñó郵件ñoñó郵件.郵件ñoñó郵件ñoñó郵件.ñoñó郵件ñoñó郵件ñoñó郵件.ñoñó郵件ñoñó郵件.ñoñó郵件ñoñó郵件.ñoñó郵件ñoñó郵件.ñoñó郵件ñoñó郵件.ñoñó郵件ñoñó郵件.oñó郵件ñoñó郵件ñoñó郵件.商務",!1,{tlds:{allow:new Set([Punycode.toASCII("商務")])}}],["test@ñoñoñó郵件😆ñoñ.oñó郵件세ñoñ.oñó郵件ل们čñoñoñó郵件לño.ñoñó郵件य本ñoñoñó郵件세añoñ.oñó郵件😆bc세郵😆ño.ñoñó郵件ñoñoñó郵件😆ñoñoñó郵件세ñoñ.oñó郵件ل们ñoñoñó.郵件😆ñoñoñó郵件郵세ñoñoñó郵件ل们ñoñoñó郵件.😆ñoñoñó郵件郵세ل们.郵件😆ñoñoñó郵.件郵세们😆ñoñoñó件郵세ñoñoñó郵件",!1,{tlds:{allow:new Set([Punycode.toASCII("商務")])}}],["test@ñoñó郵件ñoñó郵件ñoñó郵件ñoñoñó郵件ñoñó郵件ñoñó郵件ñoñó郵件ñoñó郵件ñoñó郵件ñoñó郵件ñoñó郵件ñoñó郵件ñoñó郵件ñoñó郵件ñoñó郵件ñoñó郵件ñoñó郵件ñoñó郵件ñoñó郵件ñoñó郵件ñoñó郵件ñoñó郵件ñoñó郵件ñoñó郵件ñoñó郵件ñoñó郵件ñoñó郵件ñoñó郵件ñoñó郵件ñoñó郵件ñoñó郵件ñoñó郵件ñoñó郵件ñoñó郵件ñoñó郵件ñoñó郵件ñoñó郵件ñoñó郵件ñoñó郵件ñoñó郵件ñoñó郵件ñoñó郵件ñoñó郵件.商務",!1,{tlds:{allow:new Set([Punycode.toASCII("商務")])}}],["😆ñoñó郵件ñoñó郵件ñoñó😆郵件ñoñoñó郵@郵件ñoñó郵件ñoñó.😆郵件ñoñó郵件ñoñó.😆郵件ñoñó郵件ñoñó.郵件ñoñó郵件ñoñó😆.郵件ñoñó郵件ñoñó.郵件ñoñó郵件.ñoñó郵件ñoñó.郵件ñoñó郵件.😆郵件ñoñó郵件ñoñó.😆郵件ñoñó郵件ñoñó.😆商務.郵件ñoñó郵件ñoñó郵件.😆商務.😆商務.😆商務",!1,{tlds:{allow:new Set([Punycode.toASCII("商務")])}}],["test@[\0",!1],["(\0)test@example.com",!1],["shouldbe@invalid",!1],["shouldbe@INVALID",!1],["shouldbe@example.com",!0],["shouldbe@example.COM",!0],["apple-touch-icon-60x60@2x.png",!1],["shouldbe@XN--UNUP4Y",!0,{minDomainSegments:1}],["shouldbe@xn--unup4y",!0,{minDomainSegments:1}],["shouldbe@游戏",!0,{minDomainSegments:1}]];for(let e=0;e<t.length;++e){const o=t[e],a=Address.email.isValid(o[0],o[2]),n=o[1];if(a!==n){const t=Address.email.analyze(o[0],o[2]);t?console.log(e,o[0],t.error):console.log(e,o[0])}expect(a).to.equal(n)}})})}),describe("domain",()=>{describe("analyze()",()=>{it("identifies error",()=>{const t=[["","Domain must be a non-empty string"],["êiana.org","Domain contains forbidden Unicode characters",{allowUnicode:!1}],["abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz.com","Domain too long"],["com","Domain lacks the minimum required number of segments"],["x.no-such-tld","Domain uses forbidden TLD"],["example..com","Domain contains empty dot-separated segment"],["1234567890123456789012345678901234567890123456789012345678901234567890.com","Domain contains dot-separated segment that is too long"],["example+.com","Domain contains invalid character",{tlds:!1}],["example.com_","Domain contains invalid tld character",{tlds:!1}]];for(let e=0;e<t.length;++e){const o=t[e],a=Address.domain.analyze(o[0],o[2]),n=o[1];a&&a.error===n||console.log(e,o[0]),expect(a.error).to.equal(n)}})}),describe("isValid()",()=>{it("validates domain",()=>{const t=[["\r",!1],["test",!1],["@",!1],["iana.org",!0],["nominet.org.uk",!0],["about.museum",!0],["x.商務",!0,{tlds:{allow:new Set([Punycode.toASCII("商務")])}}],["iana.123",!1],["255.255.255.255",!1],["XN--UNUP4Y",!0,{minDomainSegments:1}]];for(let e=0;e<t.length;++e){const o=t[e],a=Address.domain.isValid(o[0],o[2]),n=o[1];if(a!==n){const t=Address.domain.analyze(o[0],o[2]);t?console.log(e,o[0],t.error):console.log(e,o[0])}expect(a).to.equal(n)}})})});