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

Commit dbd235c

Browse files
feat(rules): Added Iterable rule
1 parent a020d66 commit dbd235c

8 files changed

Lines changed: 111 additions & 1 deletion

File tree

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ The library can be loaded either as a standalone script, or through an [AMD](htt
110110
- [InstanceOf](docs/instance-of.md)
111111
- [IntType](docs/int-type.md)
112112
- [IntVal](docs/int-val.md)
113+
- [Iterable](docs/iterable.md)
113114
- [Json](docs/json.md)
114115
- [Label](docs/label.md)
115116
- [LeapDate](docs/leap-date.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/iterable.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# Iterable
2+
3+
Validates if the input is iterable.
4+
5+
Valid values:
6+
7+
```js
8+
validator.iterable().validate([]);
9+
validator.iterable().validate('foo');
10+
validator.iterable().validate(new Set());
11+
validator.iterable().validate(new Map());
12+
```
13+
14+
Invalid values:
15+
16+
```js
17+
18+
validator.iterable().validate(null);
19+
validator.iterable().validate(undefined);
20+
validator.iterable().validate(false);
21+
validator.iterable().validate(0);
22+
validator.iterable().validate({});
23+
```

src/rules/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ export * from './in';
3131
export * from './instance-of';
3232
export * from './int-type';
3333
export * from './int-val';
34+
export * from './iterable';
3435
export * from './json';
3536
export * from './label';
3637
export * from './leap-date';

src/rules/iterable.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { AbstractRule } from './abstract-rule';
2+
3+
export class Iterable extends AbstractRule {
4+
5+
/**
6+
* Validate.
7+
*/
8+
public validate(input: any): boolean {
9+
return Symbol.iterator in Object(input);
10+
}
11+
}

src/validator.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ export class Validator extends AllOf {
4141
public static instanceOf = (instanceName: any): Validator => new Validator(new rules.InstanceOf(instanceName));
4242
public static intType = (): Validator => new Validator(new rules.IntType());
4343
public static intVal = (): Validator => new Validator(new rules.IntVal());
44+
public static iterable = (): Validator => new Validator(new rules.Iterable());
4445
public static json = (): Validator => new Validator(new rules.Json());
4546
public static label = (): Validator => new Validator(new rules.Label());
4647
public static leapDate = (format?: moment.MomentFormatSpecification): Validator => new Validator(new rules.LeapDate(format));
@@ -146,6 +147,7 @@ export class Validator extends AllOf {
146147
public instanceOf = (instanceName: any): this => this.addRule(new rules.InstanceOf(instanceName));
147148
public intType = (): this => this.addRule(new rules.IntType());
148149
public intVal = (): this => this.addRule(new rules.IntVal());
150+
public iterable = (): this => this.addRule(new rules.Iterable());
149151
public json = (): this => this.addRule(new rules.Json());
150152
public label = (): this => this.addRule(new rules.Label());
151153
public leapDate = (format?: moment.MomentFormatSpecification): this => this.addRule(new rules.LeapDate(format));

test/rules/iterable.ts

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import { assert } from 'chai';
2+
3+
import { AbstractRule } from '../../src/rules/abstract-rule';
4+
import { Iterable } from '../../src/rules/iterable';
5+
6+
describe('Iterable', () => {
7+
8+
let iterable: Iterable;
9+
10+
beforeEach(() => {
11+
iterable = new Iterable();
12+
});
13+
14+
it('is rule', () => {
15+
assert.instanceOf(iterable, AbstractRule);
16+
});
17+
18+
it('values is valid', () => {
19+
assert.isTrue(iterable.validate([]));
20+
assert.isTrue(iterable.validate(new Array()));
21+
assert.isTrue(iterable.validate(Array()));
22+
assert.isTrue(iterable.validate([1, 2, 3]));
23+
assert.isTrue(iterable.validate(new Array(1, 2, 3)));
24+
assert.isTrue(iterable.validate(Array(1, 2, 3)));
25+
assert.isTrue(iterable.validate(['foo', 'bar', 'foobaz']));
26+
assert.isTrue(iterable.validate(new Array('foo', 'bar', 'foobaz')));
27+
assert.isTrue(iterable.validate(Array('foo', 'bar', 'foobaz')));
28+
assert.isTrue(iterable.validate(new Set([1, 2, 3])));
29+
assert.isTrue(iterable.validate(new Set(['foo', 'bar', 'foobar'])));
30+
assert.isTrue(iterable.validate(new Map().set(1, 'bar')));
31+
assert.isTrue(iterable.validate(new Map().set('foo', 'bar')));
32+
assert.isTrue(iterable.validate(String()));
33+
assert.isTrue(iterable.validate(''));
34+
assert.isTrue(iterable.validate('0'));
35+
assert.isTrue(iterable.validate(' '));
36+
assert.isTrue(iterable.validate(' '));
37+
assert.isTrue(iterable.validate('foo'));
38+
assert.isTrue(iterable.validate(String('fooBar')));
39+
});
40+
41+
it('values is not valid', () => {
42+
assert.isFalse(iterable.validate(Boolean()));
43+
assert.isFalse(iterable.validate(Number()));
44+
assert.isFalse(iterable.validate(null));
45+
assert.isFalse(iterable.validate(undefined));
46+
assert.isFalse(iterable.validate(false));
47+
assert.isFalse(iterable.validate(0));
48+
assert.isFalse(iterable.validate(0.0));
49+
assert.isFalse(iterable.validate(-0.0));
50+
assert.isFalse(iterable.validate({}));
51+
assert.isFalse(iterable.validate(new Object()));
52+
assert.isFalse(iterable.validate(Object.create(null)));
53+
assert.isFalse(iterable.validate(Boolean(true)));
54+
assert.isFalse(iterable.validate(Number(1)));
55+
assert.isFalse(iterable.validate({foo: 'bar'}));
56+
assert.isFalse(iterable.validate(true));
57+
assert.isFalse(iterable.validate(1));
58+
assert.isFalse(iterable.validate(-1));
59+
assert.isFalse(iterable.validate(1.0));
60+
assert.isFalse(iterable.validate(-1.0));
61+
assert.isFalse(iterable.validate(1));
62+
assert.isFalse(iterable.validate(1.0));
63+
assert.isFalse(iterable.validate(1.1));
64+
assert.isFalse(iterable.validate(new Object({foo: 'bar'})));
65+
66+
class Foo {}
67+
assert.isFalse(iterable.validate(new Foo()));
68+
});
69+
70+
});

test/validator.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ describe('Validator', () => {
6363
assert.instanceOf(V.instanceOf(Object), V);
6464
assert.instanceOf(V.intType(), V);
6565
assert.instanceOf(V.intVal(), V);
66+
assert.instanceOf(V.iterable(), V);
6667
assert.instanceOf(V.json(), V);
6768
assert.instanceOf(V.label(), V);
6869
assert.instanceOf(V.leapDate(), V);
@@ -222,6 +223,7 @@ describe('Validator', () => {
222223
assert.instanceOf(v.instanceOf(Object), V);
223224
assert.instanceOf(v.intType(), V);
224225
assert.instanceOf(v.intVal(), V);
226+
assert.instanceOf(v.iterable(), V);
225227
assert.instanceOf(v.json(), V);
226228
assert.instanceOf(v.label(), V);
227229
assert.instanceOf(v.leapDate(), V);

0 commit comments

Comments
 (0)