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

Commit 1d55ccd

Browse files
feat(rules): Added options contains an identical in search
1 parent 0ddb80d commit 1d55ccd

8 files changed

Lines changed: 81 additions & 11 deletions

File tree

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/contains.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ validator.contains(1).validate(new Map().set(1, 'bar'));
1515
validator.contains('foo').validate(new Map().set('foo', 'bar'));
1616
validator.contains('foo').validate({foo: 'bar'});
1717
validator.contains('foo').validate(Object({foo: 'bar'}));
18+
validator.contains('foo', false).validate('Foo');
19+
validator.contains('FOO', false, true).validate('FOO');
1820
```
1921

2022
Invalid values:
@@ -31,4 +33,6 @@ validator.contains('foobar').validate(new Map().set('foo', 'bar'));
3133
validator.contains('bar').validate({foo: 'bar'});
3234
validator.contains('bar').validate(Object({foo: 'bar'}));
3335
validator.contains().validate(null);
36+
validator.contains('foo', false).validate('foobar');
37+
validator.contains('foo', false, true).validate('FOO');
3438
```

docs/in.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ validator.in(new Map().set(1, 'bar')).validate(1);
1515
validator.in(new Map().set('foo', 'bar')).validate('foo');
1616
validator.in({foo: 'bar'}).validate('foo');
1717
validator.in(Object({foo: 'bar'})).validate('foo');
18+
validator.in('Foo', false).validate('foo');
19+
validator.in('FOO', false, true).validate('FOO');
1820
```
1921

2022
Invalid values:
@@ -31,4 +33,6 @@ validator.in(new Map().set('foo', 'bar')).validate('foobar');
3133
validator.in({foo: 'bar'}).validate('bar');
3234
validator.in(Object({foo: 'bar'})).validate('bar');
3335
validator.in().validate(null);
36+
validator.in('foobar', false).validate('foo');
37+
validator.in('FOO', false, true).validate('foo');
3438
```

src/rules/abstract-searcher.ts

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,36 @@
11
import { AbstractRule } from './abstract-rule';
2-
import { StringType } from './string-type';
2+
import { Scalar } from './scalar';
33

44
export abstract class AbstractSearcher extends AbstractRule {
55

66
/**
77
* Abstract searcher.
88
*/
9-
public constructor(public readonly searcher?: any) {
9+
public constructor(
10+
public readonly searcher?: any,
11+
public readonly contains: boolean = true,
12+
public readonly identical: boolean = false
13+
) {
1014
super();
1115
}
1216

1317
/**
1418
* Validate searcher.
1519
*/
1620
protected validateSearcher(searcher: any, input: any): boolean {
17-
if (new StringType().validate(searcher)) {
18-
return String(searcher).indexOf(input) !== - 1;
21+
if (new Scalar().validate(searcher)) {
22+
return String(searcher).search(
23+
RegExp(this.contains ? `${input}` : `^${input}$`, this.identical ? undefined : 'i')
24+
) !== -1;
1925
}
2026

2127
if (Array.isArray(searcher)) {
28+
if (!this.identical && new Scalar().validate(input)) {
29+
return searcher.findIndex(
30+
(item: any) => this.validateSearcher(item, input)
31+
) !== -1;
32+
}
33+
2234
return searcher.indexOf(input) !== -1;
2335
}
2436

@@ -30,10 +42,10 @@ export abstract class AbstractSearcher extends AbstractRule {
3042
return searcher.has(input);
3143
}
3244

33-
if (searcher instanceof Object) {
45+
if (searcher instanceof Object && /number|string|symbol/.test(typeof input)) {
3446
return searcher.hasOwnProperty(input);
3547
}
3648

37-
return false;
49+
return searcher === input;
3850
}
3951
}

src/validator.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ export class Validator extends AllOf {
1818
public static cnh = (): Validator => new Validator(new rules.Cnh());
1919
public static cnpj = (): Validator => new Validator(new rules.Cnpj());
2020
public static consonant = (additionalChars?: string): Validator => new Validator(new rules.Consonant(additionalChars));
21-
public static contains = (value?: any): Validator => new Validator(new rules.Contains(value));
21+
public static contains = (value?: any, contains: boolean = true, identical: boolean = false): Validator => new Validator(new rules.Contains(value, contains, identical));
2222
public static cpf = (): Validator => new Validator(new rules.Cpf());
2323
public static empty = (): Validator => new Validator(new rules.Empty());
2424
public static even = (): Validator => new Validator(new rules.Even());
@@ -27,7 +27,7 @@ export class Validator extends AllOf {
2727
public static floatVal = (): Validator => new Validator(new rules.FloatVal());
2828
public static functionInstance = (): Validator => new Validator(new rules.FunctionInstance());
2929
public static functionType = (): Validator => new Validator(new rules.FunctionType());
30-
public static in = (searcher?: any): Validator => new Validator(new rules.In(searcher));
30+
public static in = (searcher?: any, contains: boolean = true, identical: boolean = false): Validator => new Validator(new rules.In(searcher, contains, identical));
3131
public static instanceOf = (instanceName: any): Validator => new Validator(new rules.InstanceOf(instanceName));
3232
public static intType = (): Validator => new Validator(new rules.IntType());
3333
public static intVal = (): Validator => new Validator(new rules.IntVal());
@@ -95,7 +95,7 @@ export class Validator extends AllOf {
9595
public cnh = (): this => this.addRule(new rules.Cnh());
9696
public cnpj = (): this => this.addRule(new rules.Cnpj());
9797
public consonant = (additionalChars?: string): this => this.addRule(new rules.Consonant(additionalChars));
98-
public contains = (value?: any): this => this.addRule(new rules.Contains(value));
98+
public contains = (value?: any, contains: boolean = true, identical: boolean = false): this => this.addRule(new rules.Contains(value, contains, identical));
9999
public cpf = (): this => this.addRule(new rules.Cpf());
100100
public empty = (): this => this.addRule(new rules.Empty());
101101
public even = (): this => this.addRule(new rules.Even());
@@ -104,7 +104,7 @@ export class Validator extends AllOf {
104104
public floatVal = (): this => this.addRule(new rules.FloatVal());
105105
public functionInstance = (): this => this.addRule(new rules.FunctionInstance());
106106
public functionType = (): this => this.addRule(new rules.FunctionType());
107-
public in = (searcher?: any): this => this.addRule(new rules.In(searcher));
107+
public in = (searcher?: any, contains: boolean = true, identical: boolean = false): this => this.addRule(new rules.In(searcher, contains, identical));
108108
public instanceOf = (instanceName: any): this => this.addRule(new rules.InstanceOf(instanceName));
109109
public intType = (): this => this.addRule(new rules.IntType());
110110
public intVal = (): this => this.addRule(new rules.IntVal());

test/rules/contains.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,39 @@ import { AbstractRule } from '../../src/rules/abstract-rule';
44
import { Contains } from '../../src/rules/contains';
55

66
describe('Contains', () => {
7+
class Foo {
8+
/**
9+
* bar
10+
*/
11+
public bar: string = 'foobar';
12+
}
713

814
it('is rule', () => {
915
assert.instanceOf(new Contains(), AbstractRule);
1016
});
1117

1218
it('values is valid', () => {
19+
assert.isTrue(new Contains('foo').validate('FOO'));
20+
assert.isTrue(new Contains('FOO').validate('foo'));
21+
assert.isTrue(new Contains('foo').validate(['FOO']));
1322
assert.isTrue(new Contains('foo').validate('foobar'));
1423
assert.isTrue(new Contains('foo').validate(String('foobar')));
1524
assert.isTrue(new Contains(1).validate([1, 2, 3]));
25+
assert.isTrue(new Contains('1').validate([1, 2, 3]));
1626
assert.isTrue(new Contains('foo').validate(new Array('foo', 'bar', 'foobar')));
1727
assert.isTrue(new Contains(1).validate(new Set([1, 2, 3])));
1828
assert.isTrue(new Contains('foo').validate(new Set(['foo', 'bar', 'foobar'])));
1929
assert.isTrue(new Contains(1).validate(new Map().set(1, 'bar')));
2030
assert.isTrue(new Contains('foo').validate(new Map().set('foo', 'bar')));
2131
assert.isTrue(new Contains('foo').validate({foo: 'bar'}));
2232
assert.isTrue(new Contains('foo').validate(Object({foo: 'bar'})));
33+
assert.isTrue(new Contains('foo', false).validate('Foo'));
34+
assert.isTrue(new Contains('FOO', false, true).validate('FOO'));
35+
assert.isTrue(new Contains(null).validate(null));
36+
37+
const foo: Foo = new Foo();
38+
assert.isTrue(new Contains(foo).validate(foo));
39+
assert.isTrue(new Contains('bar').validate(foo));
2340
});
2441

2542
it('values is not valid', () => {
@@ -34,6 +51,11 @@ describe('Contains', () => {
3451
assert.isFalse(new Contains('bar').validate({foo: 'bar'}));
3552
assert.isFalse(new Contains('bar').validate(Object({foo: 'bar'})));
3653
assert.isFalse(new Contains().validate(null));
54+
assert.isFalse(new Contains('foo', false).validate('foobar'));
55+
assert.isFalse(new Contains('foo', false, true).validate('FOO'));
56+
assert.isFalse(new Contains().validate(null));
57+
assert.isFalse(new Contains(new Foo()).validate(new Foo()));
58+
assert.isFalse(new Contains('foobar').validate(new Foo()));
3759
});
3860

3961
});

test/rules/in.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,21 @@ import { AbstractRule } from '../../src/rules/abstract-rule';
44
import { In } from '../../src/rules/in';
55

66
describe('In', () => {
7+
class Foo {
8+
/**
9+
* bar
10+
*/
11+
public bar: string = 'foobar';
12+
}
713

814
it('is rule', () => {
915
assert.instanceOf(new In(), AbstractRule);
1016
});
1117

1218
it('values is valid', () => {
1319
assert.isTrue(new In('foobar').validate('foo'));
20+
assert.isTrue(new In('foobar').validate('FOO'));
21+
assert.isTrue(new In('fooBAR').validate('bar'));
1422
assert.isTrue(new In(String('foobar')).validate('foo'));
1523
assert.isTrue(new In([1, 2, 3]).validate(1));
1624
assert.isTrue(new In(new Array('foo', 'bar', 'foobar')).validate('foo'));
@@ -20,6 +28,13 @@ describe('In', () => {
2028
assert.isTrue(new In(new Map().set('foo', 'bar')).validate('foo'));
2129
assert.isTrue(new In({foo: 'bar'}).validate('foo'));
2230
assert.isTrue(new In(Object({foo: 'bar'})).validate('foo'));
31+
assert.isTrue(new In('Foo', false).validate('foo'));
32+
assert.isTrue(new In('FOO', false, true).validate('FOO'));
33+
assert.isTrue(new In(null).validate(null));
34+
35+
const foo: Foo = new Foo();
36+
assert.isTrue(new In(foo).validate(foo));
37+
assert.isTrue(new In(foo).validate('bar'));
2338
});
2439

2540
it('values is not valid', () => {
@@ -34,6 +49,11 @@ describe('In', () => {
3449
assert.isFalse(new In({foo: 'bar'}).validate('bar'));
3550
assert.isFalse(new In(Object({foo: 'bar'})).validate('bar'));
3651
assert.isFalse(new In().validate(null));
52+
assert.isFalse(new In('foobar', false).validate('foo'));
53+
assert.isFalse(new In('FOO', false, true).validate('foo'));
54+
assert.isFalse(new In().validate(null));
55+
assert.isFalse(new In(new Foo()).validate(new Foo()));
56+
assert.isFalse(new In(new Foo()).validate('foobar'));
3757
});
3858

3959
});

test/validator.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ describe('Validator', () => {
2929
assert.instanceOf(V.cnpj(), V);
3030
assert.instanceOf(V.consonant(), V);
3131
assert.instanceOf(V.contains('foo'), V);
32+
assert.instanceOf(V.contains('foo', false), V);
33+
assert.instanceOf(V.contains('foo', false, true), V);
3234
assert.instanceOf(V.cpf(), V);
3335
assert.instanceOf(V.empty(), V);
3436
assert.instanceOf(V.even(), V);
@@ -38,6 +40,8 @@ describe('Validator', () => {
3840
assert.instanceOf(V.functionInstance(), V);
3941
assert.instanceOf(V.functionType(), V);
4042
assert.instanceOf(V.in([]), V);
43+
assert.instanceOf(V.in([], false), V);
44+
assert.instanceOf(V.in([], false, true), V);
4145
assert.instanceOf(V.instanceOf(Object), V);
4246
assert.instanceOf(V.intType(), V);
4347
assert.instanceOf(V.intVal(), V);
@@ -111,6 +115,8 @@ describe('Validator', () => {
111115
assert.instanceOf(v.cnpj(), V);
112116
assert.instanceOf(v.consonant(), V);
113117
assert.instanceOf(v.contains('foo'), V);
118+
assert.instanceOf(v.contains('foo', false), V);
119+
assert.instanceOf(v.contains('foo', false, true), V);
114120
assert.instanceOf(v.cpf(), V);
115121
assert.instanceOf(v.empty(), V);
116122
assert.instanceOf(v.even(), V);
@@ -120,6 +126,8 @@ describe('Validator', () => {
120126
assert.instanceOf(v.functionInstance(), V);
121127
assert.instanceOf(v.functionType(), V);
122128
assert.instanceOf(v.in([]), V);
129+
assert.instanceOf(v.in([], false), V);
130+
assert.instanceOf(v.in([], false, true), V);
123131
assert.instanceOf(v.instanceOf(Object), V);
124132
assert.instanceOf(v.intType(), V);
125133
assert.instanceOf(v.intVal(), V);

0 commit comments

Comments
 (0)