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

Commit 2fb29aa

Browse files
feat(rules): Added Issn rule
1 parent 1dae344 commit 2fb29aa

5 files changed

Lines changed: 159 additions & 0 deletions

File tree

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@ The library can be loaded either as a standalone script, or through an [AMD](htt
158158
- [Isin](docs/isin.md)
159159
- [Iso8601](docs/iso8601.md)
160160
- [Isrc](docs/isrc.md)
161+
- [Issn](docs/issn.md)
161162
- [Iterable](docs/iterable.md)
162163
- [Json](docs/json.md)
163164
- [KeyNested](docs/key-nested.md)

docs/issn.md

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
# Issn
2+
3+
Validates if the input is [ISSN](https://pt.wikipedia.org/wiki/International_Standard_Serial_Number).
4+
5+
Valid values:
6+
7+
```js
8+
validator.issn(true).validate('2434-561X');
9+
validator.issn(true).validate('2434561X');
10+
validator.issn(true).validate('0378-5955');
11+
validator.issn(true).validate('03785955');
12+
validator.issn(false, true).validate('2434-561X');
13+
validator.issn(false, true).validate('2434-561x');
14+
validator.issn(false, true).validate('0378-5955');
15+
validator.issn(true, true).validate('2434-561X');
16+
validator.issn(true, true).validate('0378-5955');
17+
18+
validator.issn().validate('0378-5955');
19+
validator.issn().validate('0000-0000');
20+
validator.issn().validate('2434-561X');
21+
validator.issn().validate('2434-561x');
22+
validator.issn().validate('01896016');
23+
validator.issn().validate('20905076');
24+
```
25+
26+
Invalid values:
27+
28+
```js
29+
validator.issn(true).validate('2434-561x');
30+
validator.issn(true).validate('2434561x');
31+
validator.issn(false, true).validate('2434561X');
32+
validator.issn(false, true).validate('2434561x');
33+
validator.issn(false, true).validate('03785955');
34+
validator.issn(true, true).validate('2434-561x');
35+
validator.issn(true, true).validate('2434561X');
36+
validator.issn(true, true).validate('2434561x');
37+
validator.issn(true, true).validate('03785955');
38+
39+
validator.issn().validate('0378-5954');
40+
validator.issn().validate('0000-0001');
41+
validator.issn().validate('0378-123');
42+
validator.issn().validate('037-1234');
43+
validator.issn().validate('0');
44+
validator.issn().validate('2434-561c');
45+
validator.issn().validate('1684-5370');
46+
validator.issn().validate('19960791');
47+
```

src/rules/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ export * from './isbn13';
7676
export * from './isin';
7777
export * from './iso8601';
7878
export * from './isrc';
79+
export * from './issn';
7980
export * from './iterable';
8081
export * from './json';
8182
export * from './key-nested';

src/rules/issn.ts

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import { AbstractRule } from './abstract-rule';
2+
3+
export class Issn extends AbstractRule {
4+
5+
/**
6+
* Issn.
7+
*/
8+
public constructor(
9+
public readonly caseSensitive: boolean = false,
10+
public readonly requireHyphen: boolean = false
11+
) {
12+
super();
13+
}
14+
15+
/**
16+
* Validate.
17+
*/
18+
public validate(input: any): boolean {
19+
const inputString: string = String(input);
20+
const regex: string = `^\\d{4}-${(this.requireHyphen ? '' : '?')}\\d{3}[\\dX]$`;
21+
22+
if (!new RegExp(regex, this.caseSensitive ? undefined : 'i').test(inputString)) {
23+
return false;
24+
}
25+
26+
const issnDigits: string = inputString.replace('-', '');
27+
let position: number = 8;
28+
let checksum: number = 0;
29+
30+
for (const digit of issnDigits) {
31+
const digitValue: number = digit.toUpperCase() === 'X' ? 10 : +digit;
32+
checksum += digitValue * position;
33+
--position;
34+
}
35+
36+
return checksum % 11 === 0;
37+
}
38+
}
39+
40+
export default Issn;

test/rules/issn.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 { Issn } from '../../src/rules/issn';
5+
6+
describe('Issn', () => {
7+
8+
let issn: Issn;
9+
10+
beforeEach(() => {
11+
issn = new Issn();
12+
});
13+
14+
it('is rule', () => {
15+
assert.instanceOf(issn, AbstractRule);
16+
});
17+
18+
it('values is valid', () => {
19+
assert.isTrue(new Issn(true).validate('2434-561X'));
20+
assert.isTrue(new Issn(true).validate('2434561X'));
21+
assert.isTrue(new Issn(true).validate('0378-5955'));
22+
assert.isTrue(new Issn(true).validate('03785955'));
23+
assert.isTrue(new Issn(false, true).validate('2434-561X'));
24+
assert.isTrue(new Issn(false, true).validate('2434-561x'));
25+
assert.isTrue(new Issn(false, true).validate('0378-5955'));
26+
assert.isTrue(new Issn(true, true).validate('2434-561X'));
27+
assert.isTrue(new Issn(true, true).validate('0378-5955'));
28+
29+
assert.isTrue(issn.validate('0378-5955'));
30+
assert.isTrue(issn.validate('0000-0000'));
31+
assert.isTrue(issn.validate('2434-561X'));
32+
assert.isTrue(issn.validate('2434-561x'));
33+
assert.isTrue(issn.validate('01896016'));
34+
assert.isTrue(issn.validate('20905076'));
35+
});
36+
37+
it('values is not valid', () => {
38+
assert.isFalse(new Issn(true).validate('2434-561x'));
39+
assert.isFalse(new Issn(true).validate('2434561x'));
40+
assert.isFalse(new Issn(false, true).validate('2434561X'));
41+
assert.isFalse(new Issn(false, true).validate('2434561x'));
42+
assert.isFalse(new Issn(false, true).validate('03785955'));
43+
assert.isFalse(new Issn(true, true).validate('2434-561x'));
44+
assert.isFalse(new Issn(true, true).validate('2434561X'));
45+
assert.isFalse(new Issn(true, true).validate('2434561x'));
46+
assert.isFalse(new Issn(true, true).validate('03785955'));
47+
48+
assert.isFalse(issn.validate('0378-5954'));
49+
assert.isFalse(issn.validate('0000-0001'));
50+
assert.isFalse(issn.validate('0378-123'));
51+
assert.isFalse(issn.validate('037-1234'));
52+
assert.isFalse(issn.validate('0'));
53+
assert.isFalse(issn.validate('2434-561c'));
54+
assert.isFalse(issn.validate('1684-5370'));
55+
assert.isFalse(issn.validate('19960791'));
56+
assert.isFalse(issn.validate(''));
57+
assert.isFalse(issn.validate(null));
58+
assert.isFalse(issn.validate(undefined));
59+
assert.isFalse(issn.validate(true));
60+
assert.isFalse(issn.validate(false));
61+
assert.isFalse(issn.validate([]));
62+
assert.isFalse(issn.validate({}));
63+
assert.isFalse(issn.validate(new Array('foo')));
64+
assert.isFalse(issn.validate(new Object({foo: 'bar'})));
65+
66+
class Foo {}
67+
assert.isFalse(issn.validate(new Foo()));
68+
});
69+
70+
});

0 commit comments

Comments
 (0)