const test = require('tape') const isValidDomain = require('../') const sldMap = require('../data/sldMap.json') test('tld and simple subdomains', function (t) { t.plan(14) t.equal(isValidDomain('example.com'), true) t.equal(isValidDomain('foo.example.com'), true) t.equal(isValidDomain('bar.foo.example.com'), true) t.equal(isValidDomain('exa-mple.co.uk'), true) t.equal(isValidDomain('a.com'), true) t.equal(isValidDomain('a.b'), true) t.equal(isValidDomain('foo.bar.baz'), true) t.equal(isValidDomain('foo-bar.ba-z.qux'), true) t.equal(isValidDomain('hello.world'), true) t.equal(isValidDomain('ex-am-ple.com'), true) t.equal(isValidDomain('xn--80ak6aa92e.com'), true) t.equal(isValidDomain('example.a9'), true) t.equal(isValidDomain('example.9a'), true) t.equal(isValidDomain('example.99'), false) }) test('more subdomains', function (t) { t.plan(22) t.equal(isValidDomain('example.com'), true) t.equal(isValidDomain('foo.example.com'), true) t.equal(isValidDomain('example.com', { subdomain: true }), true) t.equal(isValidDomain('foo.example.com', { subdomain: true }), true) t.equal(isValidDomain('foo.example.com', { subdomain: false }), false) t.equal(isValidDomain('-foo.example.com', { subdomain: true }), false) t.equal(isValidDomain('foo-.example.com', { subdomain: true }), false) t.equal(isValidDomain('-foo-.example.com', { subdomain: true }), false) t.equal(isValidDomain('-foo.example.com'), false) t.equal(isValidDomain('foo-.example.com'), false) t.equal(isValidDomain('-foo-.example.com'), false) t.equal(isValidDomain('foo-.bar.example.com'), false) t.equal(isValidDomain('-foo.bar.example.com'), false) t.equal(isValidDomain('-foo-.bar.example.com'), false) t.equal(isValidDomain('-foo-.bar.example.com', { subdomain: true }), false) t.equal(isValidDomain('foo-.bar.example.com', { subdomain: true }), false) t.equal(isValidDomain('-foo-.bar.example.com', { subdomain: true }), false) t.equal(isValidDomain('-foo-.-bar-.example.com', { subdomain: true }), false) t.equal(isValidDomain('example.com', { subdomain: false }), true) t.equal(isValidDomain('*.example.com', { subdomain: true }), false) t.equal(isValidDomain('abcd--def.example.com', { subdomain: true }), true) t.equal(isValidDomain('ab--cd.ab--cd.example.com', { subdomain: true }), true) }) test('sld', function (t) { t.plan(5) t.equal(isValidDomain('example.co.uk'), true) t.equal(isValidDomain('exampl1.co.uk', { subdomain: false }), true) t.equal(isValidDomain('abc.example.co.uk', { subdomain: false }), false) t.equal(isValidDomain('*.example.co.uk', { subdomain: true }), false) t.equal(isValidDomain('*.example.co.uk', { subdomain: true, wildcard: true }), true) }) test('slds from map file', function (t) { t.plan(Object.keys(sldMap).length) for (const sld in sldMap) { t.equal(isValidDomain(`example.${sld}`), true) } }) test('punycode', function (t) { t.plan(15) t.equal(isValidDomain('xn--6qq79v.xn--fiqz9s'), true) t.equal(isValidDomain('xn--ber-goa.com'), true) t.equal(isValidDomain('xn--a--ber-goa.com'), false) t.equal(isValidDomain('xn--c1yn36f.example.com'), true) t.equal(isValidDomain('xn--addas-o4a.de'), true) t.equal(isValidDomain('xn--p8j9a0d9c9a.xn--q9jyb4c'), true) t.equal(isValidDomain('привет-мир.рф', { allowUnicode: true }), true) t.equal(isValidDomain('test-me.рф', { allowUnicode: true }), true) t.equal(isValidDomain('test--me.рф', { allowUnicode: true }), false) t.equal(isValidDomain('приветмир.com', { allowUnicode: true }), true) t.equal(isValidDomain('xn--b1aghctohfp.xn--p1ai', { allowUnicode: false }), true) t.equal(isValidDomain('привет-мир.com', { allowUnicode: true }), true) t.equal(isValidDomain('привет-мир.рф', { allowUnicode: true }), true) t.equal(isValidDomain('дядя-ваня.рф', { allowUnicode: true }), true) t.equal(isValidDomain('дядя-ваня.ru.com', { allowUnicode: true }), true) }) test('unicode', function (t) { t.plan(4) t.equal(isValidDomain('はじめよう.みんな'), false) t.equal(isValidDomain('名がドメイン.com'), false) t.equal(isValidDomain('はじめよう.みんな', { allowUnicode: true }), true) t.equal(isValidDomain('名がドメイン.com', { allowUnicode: true }), true) }) test('country code tld', function (t) { t.plan(7) t.equal(isValidDomain('ai.'), false) t.equal(isValidDomain('ai'), false) t.equal(isValidDomain('ai.', { topLevel: true }), true) t.equal(isValidDomain('ai', { topLevel: true }), true) t.equal(isValidDomain('ae.'), false) t.equal(isValidDomain('ae.', { topLevel: true }), true) t.equal(isValidDomain('xx.', { topLevel: true }), false) }) test('invalid tld and subdomain', function (t) { t.plan(23) t.equal(isValidDomain('localhost'), false) t.equal(isValidDomain('127.0.0.1'), false) t.equal(isValidDomain('bar.q-ux'), false) t.equal(isValidDomain('exa_mple.com'), false) t.equal(isValidDomain('example'), false) t.equal(isValidDomain('ex*mple.com'), false) t.equal(isValidDomain('@#$@#$%fd'), false) t.equal(isValidDomain('_example.com'), false) t.equal(isValidDomain('-example.com'), false) t.equal(isValidDomain('xn–pple-43d.com'), false) t.equal(isValidDomain('foo._example.com'), false) t.equal(isValidDomain('foo.-example.com'), false) t.equal(isValidDomain('foo.example-.co.uk'), false) t.equal(isValidDomain('example-.com'), false) t.equal(isValidDomain('example_.com'), false) t.equal(isValidDomain('foo.example-.com'), false) t.equal(isValidDomain('foo.example_.com'), false) t.equal(isValidDomain('example.com-'), false) t.equal(isValidDomain('example.com_'), false) t.equal(isValidDomain('-foo.example.com_'), false) t.equal(isValidDomain('_foo.example.com_'), false) t.equal(isValidDomain('*.com_'), false) t.equal(isValidDomain('*.*.com_'), false) }) test('subdomain underscores', function (t) { t.plan(5) t.equal(isValidDomain('_dnslink.ipfs.io'), true) t.equal(isValidDomain('_dnslink.ip_fs.io'), false) t.equal(isValidDomain('_foo.example.com'), true) t.equal(isValidDomain('xn--_eamop.donata.com'), true) t.equal(isValidDomain('__foo.example.com'), true) }) test('wildcard', function (t) { t.plan(9) t.equal(isValidDomain('*.example.com'), false) t.equal(isValidDomain('*.example.com', { wildcard: false }), false) t.equal(isValidDomain('*.example.com', { wildcard: true }), true) t.equal(isValidDomain('*.*.com', { wildcard: true }), false) t.equal(isValidDomain('*.com', { wildcard: true }), false) t.equal(isValidDomain('example.com', { wildcard: true }), true) t.equal(isValidDomain('example.com', { subdomain: true, wildcard: true }), true) t.equal(isValidDomain('*.example.com', { subdomain: true, wildcard: true }), true) t.equal(isValidDomain('*.example.com', { subdomain: false, wildcard: true }), false) }) test('length', function (t) { t.plan(3) t.equal(isValidDomain(`${'a'.repeat(63)}.${'b'.repeat(63)}.${'c'.repeat(63)}.${'c'.repeat(61)}`), true) t.equal(isValidDomain(`${'a'.repeat(63)}.${'b'.repeat(63)}.${'c'.repeat(63)}.${'c'.repeat(61)}.`), true) t.equal(isValidDomain(`${'a'.repeat(63)}.${'b'.repeat(63)}.${'c'.repeat(63)}.${'c'.repeat(62)}`), false) }) test('invalid types', function (t) { t.plan(4) t.equal(isValidDomain(3434), false) t.equal(isValidDomain(''), false) t.equal(isValidDomain({}), false) t.equal(isValidDomain(function () {}), false) }) test('invalid values', function (t) { t.plan(10) t.equal(isValidDomain('foo.example.com*'), false) t.equal(isValidDomain('foo.example.com*', { wildcard: true }), false) t.equal(isValidDomain('google.com"\'\"\""\\"\\\'test test'), false) t.equal(isValidDomain('google.com.au\'"\'\"\""\\"\\\'test'), false) t.equal(isValidDomain('...'), false) t.equal(isValidDomain('example..com'), false) t.equal(isValidDomain('.example.'), false) t.equal(isValidDomain('.example.com'), false) t.equal(isValidDomain('"example.com"'), false) t.equal(isValidDomain('http://xn--addas-o4a.de'), false) }) test('thai domains', function (t) { t.plan(5) t.equal(isValidDomain('universal-acceptance-test.international'), true) t.equal(isValidDomain('universal-acceptance-test.icu'), true) t.equal(isValidDomain('ยูเอทดสอบ.ไทย'), true) t.equal(isValidDomain('ทีเอชนิค.องค์กร.ไทย'), true) t.equal(isValidDomain('เราไม่ทิ้งกัน.com'), true) })