Skip to content
This repository was archived by the owner on Oct 20, 2021. It is now read-only.

Commit 710db4b

Browse files
feat(rules): Added Domain rule
1 parent 4397f03 commit 710db4b

7 files changed

Lines changed: 172 additions & 4 deletions

File tree

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ The library can be loaded either as a standalone script, or through an [AMD](htt
112112
- [DateTime](docs/date-time.md)
113113
- [Digit](docs/digit.md)
114114
- [Directory](docs/directory.md)
115+
- [Domain](docs/domain.md)
115116
- [Each](docs/each.md)
116117
- [Email](docs/email.md)
117118
- [Empty](docs/empty.md)

awesome-validator.min.js

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/domain.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# Domain
2+
3+
Validates domain names.
4+
5+
Valid values:
6+
7+
```js
8+
validator.domain().validate('example.com');
9+
validator.domain().validate('foo.example.com');
10+
validator.domain().validate('bar.foo.example.com');
11+
validator.domain().validate('exa-mple.co.uk');
12+
validator.domain(false).validate('a.b');
13+
validator.domain(false).validate('foo.bar.baz');
14+
validator.domain(false).validate('foo-bar.ba-z.qux');
15+
validator.domain(false).validate('hello.world');
16+
```
17+
18+
Invalid values:
19+
20+
```js
21+
validator.domain().validate('bar.q-ux');
22+
validator.domain().validate('exa_mple.com');
23+
validator.domain().validate('example');
24+
validator.domain().validate('ex*mple.com');
25+
validator.domain().validate('@#$@#$%fd');
26+
```

src/rules/abstract-string.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { AbstractRule } from './abstract-rule';
2+
import { StringType } from './string-type';
3+
4+
export abstract class AbstractString extends AbstractRule {
5+
6+
/**
7+
* Validate.
8+
*/
9+
public validate(input: any): boolean {
10+
if (!new StringType().validate(input)) {
11+
return false;
12+
}
13+
14+
return this.validateString(String(input));
15+
}
16+
17+
/**
18+
* Validate string.
19+
*/
20+
protected abstract validateString(input: string): boolean;
21+
}

src/rules/domain.ts

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import { Validatable } from './../validatable';
2+
import { AbstractRule } from './abstract-rule';
3+
import { Regex } from './regex';
4+
import { StringType } from './string-type';
5+
import { Tld } from './tld';
6+
7+
export class Domain extends AbstractRule {
8+
9+
/**
10+
* Tld.
11+
*/
12+
protected tld: Validatable;
13+
14+
/**
15+
* Domain.
16+
*/
17+
public constructor(tldCheck: boolean = true) {
18+
super();
19+
20+
this.tld = tldCheck ? new Tld() : new Regex(/^[a-zA-Z0-9]+$/gi);
21+
}
22+
23+
/**
24+
* Validate.
25+
*/
26+
public validate(input: any): boolean {
27+
if (!new StringType().validate(input)) {
28+
return false;
29+
}
30+
31+
const parts: string[] = String(input).split('.');
32+
33+
if (parts.length <= 1 || !this.tld.validate(parts.pop())) {
34+
return false;
35+
}
36+
37+
return parts.every((host: string) => {
38+
const regex: Regex = new Regex(/^(?!:\/\/)([a-zA-Z0-9]+|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])$/gi);
39+
40+
return regex.validate(host);
41+
});
42+
}
43+
}

src/rules/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ export * from './currency-code';
3333
export * from './date-time';
3434
export * from './digit';
3535
export * from './directory';
36+
export * from './domain';
3637
export * from './each';
3738
export * from './email';
3839
export * from './empty';

test/rules/domain.ts

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
import { assert } from 'chai';
2+
3+
import { AbstractRule } from '../../src/rules/abstract-rule';
4+
import { Domain } from '../../src/rules/domain';
5+
6+
describe('Domain', () => {
7+
8+
let domain: Domain;
9+
10+
beforeEach(() => {
11+
domain = new Domain();
12+
});
13+
14+
it('is rule', () => {
15+
assert.instanceOf(domain, AbstractRule);
16+
});
17+
18+
it('values is valid', () => {
19+
assert.isTrue(domain.validate('example.com'));
20+
assert.isTrue(domain.validate('foo.example.com'));
21+
assert.isTrue(domain.validate('bar.foo.example.com'));
22+
assert.isTrue(domain.validate('exa-mple.co.uk'));
23+
assert.isTrue(domain.validate('a.com'));
24+
25+
assert.isTrue(new Domain(false).validate('a.b'));
26+
assert.isTrue(new Domain(false).validate('foo.bar.baz'));
27+
assert.isTrue(new Domain(false).validate('foo-bar.ba-z.qux'));
28+
assert.isTrue(new Domain(false).validate('hello.world'));
29+
});
30+
31+
it('values is not valid', () => {
32+
assert.isFalse(domain.validate('bar.q-ux'));
33+
assert.isFalse(domain.validate('exa_mple.com'));
34+
assert.isFalse(domain.validate('example'));
35+
assert.isFalse(domain.validate('ex*mple.com'));
36+
assert.isFalse(domain.validate('@#$@#$%fd'));
37+
assert.isFalse(domain.validate('_example.com'));
38+
assert.isFalse(domain.validate('-example.com'));
39+
assert.isFalse(domain.validate('foo._example.com'));
40+
assert.isFalse(domain.validate('foo.-example.com'));
41+
assert.isFalse(domain.validate('foo.example-.co.uk'));
42+
assert.isFalse(domain.validate('example-.com'));
43+
assert.isFalse(domain.validate('example_.com'));
44+
assert.isFalse(domain.validate('foo.example-.com'));
45+
assert.isFalse(domain.validate('foo.example_.com'));
46+
assert.isFalse(domain.validate('example.com-'));
47+
assert.isFalse(domain.validate('example.com_'));
48+
49+
assert.isFalse(domain.validate(Boolean()));
50+
assert.isFalse(domain.validate(Number()));
51+
assert.isFalse(domain.validate(null));
52+
assert.isFalse(domain.validate(undefined));
53+
assert.isFalse(domain.validate(true));
54+
assert.isFalse(domain.validate(false));
55+
assert.isFalse(domain.validate(0));
56+
assert.isFalse(domain.validate(-0));
57+
assert.isFalse(domain.validate(1));
58+
assert.isFalse(domain.validate(-1));
59+
assert.isFalse(domain.validate(0.0));
60+
assert.isFalse(domain.validate(-0.0));
61+
assert.isFalse(domain.validate(1.0));
62+
assert.isFalse(domain.validate(-1.0));
63+
assert.isFalse(domain.validate(0.1));
64+
assert.isFalse(domain.validate(-0.1));
65+
assert.isFalse(domain.validate(1.1));
66+
assert.isFalse(domain.validate(-1.1));
67+
assert.isFalse(domain.validate([]));
68+
assert.isFalse(domain.validate({}));
69+
assert.isFalse(domain.validate(new Array('foo')));
70+
assert.isFalse(domain.validate(new Object({foo: 'bar'})));
71+
72+
class Foo {}
73+
assert.isFalse(domain.validate(new Foo()));
74+
});
75+
76+
});

0 commit comments

Comments
 (0)