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

Commit 3f77a45

Browse files
feat(rules): Added DateTime rule
1 parent 81cb7ce commit 3f77a45

9 files changed

Lines changed: 115 additions & 25 deletions

File tree

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ The library can be loaded either as a standalone script, or through an [AMD](htt
9292
- [Consonant](docs/consonant.md)
9393
- [Contains](docs/contains.md)
9494
- [Cpf](docs/cpf.md)
95+
- [DateTime](docs/date-time.md)
9596
- [Digit](docs/digit.md)
9697
- [Empty](docs/empty.md)
9798
- [Even](docs/even.md)

awesome-validator.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/date-time.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# DateTime
2+
3+
Validates if input is a date.
4+
5+
Valid values:
6+
7+
```js
8+
validator.dateTime().validate('2008');
9+
validator.dateTime().validate(new Date(2008, 1, 29));
10+
validator.dateTime().validate('2008-02-29');
11+
validator.dateTime().validate(2008);
12+
validator.dateTime().validate(moment([2008]));
13+
validator.dateTime().validate([]);
14+
validator.dateTime().validate({});
15+
validator.dateTime('DD-MM-YYYY').validate('29-02-2008');
16+
validator.dateTime('DD/MM/YYYY HH:mm:ss').validate('20/10/2008 10:30:29');
17+
```
18+
19+
Invalid values:
20+
21+
```js
22+
validator.dateTime().validate('');
23+
validator.dateTime().validate('2009-12-00');
24+
validator.dateTime('DD/MM/YYYY').validate('2008-02-29');
25+
```

src/rules/abstract-date.ts

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -8,30 +8,9 @@ import { StringType } from './string-type';
88
export abstract class AbstractDate extends AbstractRule {
99

1010
/**
11-
* AbstractDate.
12-
*/
13-
public constructor(public readonly format?: moment.MomentFormatSpecification) {
14-
super();
15-
}
16-
17-
/**
18-
* Validate.
19-
*/
20-
public validate(input: any): boolean {
21-
const date: moment.Moment = this.parseDate(input);
22-
23-
return date.isValid() && this.validateDate(date);
24-
}
25-
26-
/**
27-
* Validate Date.
28-
*/
29-
protected abstract validateDate(date: moment.Moment): boolean;
30-
31-
/**
32-
* Parse Date.
11+
* Parse.
3312
*/
34-
private parseDate(input: any): moment.Moment {
13+
public static parse(input: any, format?: moment.MomentFormatSpecification): moment.Moment {
3514
if (new NumberVal().validate(input)) {
3615
if (moment([input]).isValid()) {
3716
return moment([input]);
@@ -41,7 +20,7 @@ export abstract class AbstractDate extends AbstractRule {
4120
}
4221

4322
if (new StringType().validate(input)) {
44-
return moment(input, this.format);
23+
return moment(input, format, !!format);
4524
}
4625

4726
if (new BooleanType().validate(input)) {
@@ -50,4 +29,25 @@ export abstract class AbstractDate extends AbstractRule {
5029

5130
return moment(input);
5231
}
32+
33+
/**
34+
* AbstractDate.
35+
*/
36+
public constructor(public readonly format?: moment.MomentFormatSpecification) {
37+
super();
38+
}
39+
40+
/**
41+
* Validate.
42+
*/
43+
public validate(input: any): boolean {
44+
const date: moment.Moment = AbstractDate.parse(input, this.format);
45+
46+
return date.isValid() && this.validateDate(date);
47+
}
48+
49+
/**
50+
* Validate Date.
51+
*/
52+
protected abstract validateDate(date: moment.Moment): boolean;
5353
}

src/rules/date-time.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import * as moment from 'moment';
2+
3+
import { AbstractDate } from './abstract-date';
4+
5+
export class DateTime extends AbstractDate {
6+
7+
/**
8+
* Validate Date.
9+
*/
10+
protected validateDate(date: moment.Moment): boolean {
11+
return true;
12+
}
13+
}

src/rules/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ export * from './cnpj';
1313
export * from './consonant';
1414
export * from './contains';
1515
export * from './cpf';
16+
export * from './date-time';
1617
export * from './digit';
1718
export * from './empty';
1819
export * from './even';

src/validator.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ export class Validator extends AllOf {
2323
public static consonant = (additionalChars?: string): Validator => new Validator(new rules.Consonant(additionalChars));
2424
public static contains = (value?: any, contains: boolean = true, identical: boolean = false): Validator => new Validator(new rules.Contains(value, contains, identical));
2525
public static cpf = (): Validator => new Validator(new rules.Cpf());
26+
public static dateTime = (format?: momment.MomentFormatSpecification): Validator => new Validator(new rules.DateTime(format));
2627
public static digit = (additionalChars?: string): Validator => new Validator(new rules.Digit(additionalChars));
2728
public static empty = (): Validator => new Validator(new rules.Empty());
2829
public static even = (): Validator => new Validator(new rules.Even());
@@ -118,6 +119,7 @@ export class Validator extends AllOf {
118119
public consonant = (additionalChars?: string): this => this.addRule(new rules.Consonant(additionalChars));
119120
public contains = (value?: any, contains: boolean = true, identical: boolean = false): this => this.addRule(new rules.Contains(value, contains, identical));
120121
public cpf = (): this => this.addRule(new rules.Cpf());
122+
public dateTime = (format?: momment.MomentFormatSpecification): this => this.addRule(new rules.DateTime(format));
121123
public digit = (additionalChars?: string): this => this.addRule(new rules.Digit(additionalChars));
122124
public empty = (): this => this.addRule(new rules.Empty());
123125
public even = (): this => this.addRule(new rules.Even());

test/rules/date-time.ts

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import * as moment from 'moment';
2+
3+
import { assert } from 'chai';
4+
5+
import { AbstractRule } from '../../src/rules/abstract-rule';
6+
import { DateTime } from '../../src/rules/date-time';
7+
8+
describe('DateTime', () => {
9+
10+
let dateTime: DateTime;
11+
12+
beforeEach(() => {
13+
dateTime = new DateTime();
14+
});
15+
16+
it('is rule', () => {
17+
assert.instanceOf(dateTime, AbstractRule);
18+
});
19+
20+
it('values is valid', () => {
21+
assert.isTrue(dateTime.validate('2008'));
22+
assert.isTrue(dateTime.validate(new Date(2008, 1, 29)));
23+
assert.isTrue(dateTime.validate('2008-02-29'));
24+
assert.isTrue(dateTime.validate(2008));
25+
assert.isTrue(dateTime.validate(moment([2008])));
26+
assert.isTrue(dateTime.validate([]));
27+
assert.isTrue(dateTime.validate({}));
28+
});
29+
30+
it('values is valid with format', () => {
31+
assert.isTrue(new DateTime('DD-MM-YYYY').validate('29-02-2008'));
32+
assert.isTrue(new DateTime('DD/MM/YYYY HH:mm:ss').validate('20/10/2008 10:30:29'));
33+
});
34+
35+
it('values is not valid', () => {
36+
assert.isFalse(dateTime.validate(''));
37+
assert.isFalse(dateTime.validate('2009-12-00'));
38+
});
39+
40+
it('values is not valid with format', () => {
41+
assert.isFalse(new DateTime('DD/MM/YYYY').validate('2008-02-29'));
42+
});
43+
44+
});

test/validator.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ describe('Validator', () => {
3434
assert.instanceOf(V.contains('foo', false), V);
3535
assert.instanceOf(V.contains('foo', false, true), V);
3636
assert.instanceOf(V.cpf(), V);
37+
assert.instanceOf(V.dateTime(), V);
38+
assert.instanceOf(V.dateTime('DD-MM-YYYY'), V);
3739
assert.instanceOf(V.digit(), V);
3840
assert.instanceOf(V.digit('foo'), V);
3941
assert.instanceOf(V.empty(), V);
@@ -161,6 +163,8 @@ describe('Validator', () => {
161163
assert.instanceOf(v.contains('foo', false), V);
162164
assert.instanceOf(v.contains('foo', false, true), V);
163165
assert.instanceOf(v.cpf(), V);
166+
assert.instanceOf(v.dateTime(), V);
167+
assert.instanceOf(v.dateTime('DD-MM-YYYY'), V);
164168
assert.instanceOf(v.digit(), V);
165169
assert.instanceOf(v.digit('foo'), V);
166170
assert.instanceOf(v.empty(), V);

0 commit comments

Comments
 (0)