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

Commit 0184d8b

Browse files
feat(rules): Added Isbn rule
1 parent 3838b80 commit 0184d8b

11 files changed

Lines changed: 319 additions & 0 deletions

File tree

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,9 @@ The library can be loaded either as a standalone script, or through an [AMD](htt
152152
- [IntType](docs/int-type.md)
153153
- [IntVal](docs/int-val.md)
154154
- [Ip](docs/ip.md)
155+
- [Isbn](docs/isbn.md)
156+
- [Isbn10](docs/isbn10.md)
157+
- [Isbn13](docs/isbn13.md)
155158
- [Isin](docs/isin.md)
156159
- [Iso8601](docs/iso8601.md)
157160
- [Isrc](docs/isrc.md)

docs/isbn.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# Isbn
2+
3+
Validates if the input is [ISBN](https://pt.wikipedia.org/wiki/International_Standard_Book_Number).
4+
5+
Valid values:
6+
7+
```js
8+
validator.isbn().validate('9783836221191');
9+
validator.isbn().validate('9783401013190');
10+
validator.isbn().validate('3836221195');
11+
validator.isbn().validate('1617290858');
12+
```
13+
14+
Invalid values:
15+
16+
```js
17+
validator.isbn().validate('9783836221190');
18+
validator.isbn().validate('3423214121');
19+
validator.isbn().validate('123456789a');
20+
validator.isbn().validate('foo');
21+
```

docs/isbn10.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# Isbn10
2+
3+
Validates if the input is [ISBN-10](https://pt.wikipedia.org/wiki/International_Standard_Book_Number#ISBN-10).
4+
5+
Valid values:
6+
7+
```js
8+
validator.isbn10().validate('3836221195');
9+
validator.isbn10().validate('3-8362-2119-5');
10+
validator.isbn10().validate('3 8362 2119 5');
11+
validator.isbn10().validate('1617290858');
12+
```
13+
14+
Invalid values:
15+
16+
```js
17+
validator.isbn10().validate('3423214121');
18+
validator.isbn10().validate('3-423-21412-1');
19+
validator.isbn10().validate('3 423 21412 ');
20+
validator.isbn10().validate('978-3836221191');
21+
```

docs/isbn13.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# Isbn13
2+
3+
Validates if the input is [ISBN-13](https://pt.wikipedia.org/wiki/International_Standard_Book_Number#ISBN-13).
4+
5+
Valid values:
6+
7+
```js
8+
validator.isbn13().validate('9783836221191');
9+
validator.isbn13().validate('978-3-8362-2119-');
10+
validator.isbn13().validate('978 3 8362 2119 1');
11+
validator.isbn13().validate('9783401013190');
12+
```
13+
14+
Invalid values:
15+
16+
```js
17+
validator.isbn13().validate('9783836221190');
18+
validator.isbn13().validate('978-3-8362-2119-0');
19+
validator.isbn13().validate('978 3 8362 2119 0');
20+
validator.isbn13().validate('3836221195');
21+
```

src/rules/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,9 @@ export * from './instance-of';
7070
export * from './int-type';
7171
export * from './int-val';
7272
export * from './ip';
73+
export * from './isbn';
74+
export * from './isbn10';
75+
export * from './isbn13';
7376
export * from './isin';
7477
export * from './iso8601';
7578
export * from './isrc';

src/rules/isbn.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { Validatable } from './../validatable';
2+
import { AbstractWrapper } from './abstract-wrapper';
3+
import { AnyOf } from './any-of';
4+
import { Isbn10 } from './isbn10';
5+
import { Isbn13 } from './isbn13';
6+
7+
export class Isbn extends AbstractWrapper {
8+
9+
/**
10+
* Get Validatable.
11+
*/
12+
protected getValidatable(input: any): Validatable {
13+
return new AnyOf(new Isbn10(), new Isbn13());
14+
}
15+
}
16+
17+
export default Isbn;

src/rules/isbn10.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import { AbstractRule } from './abstract-rule';
2+
3+
export class Isbn10 extends AbstractRule {
4+
5+
/**
6+
* Validate.
7+
*/
8+
public validate(input: any): boolean {
9+
const inputString: string = String(input).replace(/[\s-]+/g, '');
10+
let checksum: number = 0;
11+
12+
if (!/^(?:[0-9]{9}X|[0-9]{10})$/.test(inputString)) {
13+
return false;
14+
}
15+
16+
for (let i: number = 0; i < 9; i++) {
17+
checksum += (i + 1) * Number(inputString.charAt(i));
18+
}
19+
20+
checksum += ((inputString.charAt(9) === 'X') ? 10 : Number(inputString.charAt(9))) * 10;
21+
22+
if ((checksum % 11) === 0) {
23+
return !!inputString;
24+
}
25+
26+
return false;
27+
}
28+
}
29+
30+
export default Isbn10;

src/rules/isbn13.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { AbstractRule } from './abstract-rule';
2+
3+
export class Isbn13 extends AbstractRule {
4+
5+
/**
6+
* Validate.
7+
*/
8+
public validate(input: any): boolean {
9+
const factor: number[] = [1, 3];
10+
const inputString: string = String(input).replace(/[\s-]+/g, '');
11+
let checksum: number = 0;
12+
13+
if (!/^(?:[0-9]{13})$/.test(inputString)) {
14+
return false;
15+
}
16+
17+
for (let i: number = 0; i < 12; i++) {
18+
checksum += factor[i % 2] * Number(inputString.charAt(i));
19+
}
20+
21+
if (Number(inputString.charAt(12)) - ((10 - (checksum % 10)) % 10) === 0) {
22+
return !!inputString;
23+
}
24+
25+
return false;
26+
}
27+
}
28+
29+
export default Isbn13;

test/rules/isbn.ts

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import { assert } from 'chai';
2+
3+
import { AbstractRule } from '../../src/rules/abstract-rule';
4+
import { Isbn } from '../../src/rules/isbn';
5+
6+
describe('Isbn', () => {
7+
8+
let isbn: Isbn;
9+
10+
beforeEach(() => {
11+
isbn = new Isbn();
12+
});
13+
14+
it('is rule', () => {
15+
assert.instanceOf(isbn, AbstractRule);
16+
});
17+
18+
it('values is valid', () => {
19+
assert.isTrue(isbn.validate('3836221195'));
20+
assert.isTrue(isbn.validate('3-8362-2119-5'));
21+
assert.isTrue(isbn.validate('3 8362 2119 5'));
22+
assert.isTrue(isbn.validate('1617290858'));
23+
assert.isTrue(isbn.validate('1-61729-085-8'));
24+
assert.isTrue(isbn.validate('1 61729 085-8'));
25+
assert.isTrue(isbn.validate('0007269706'));
26+
assert.isTrue(isbn.validate('0-00-726970-6'));
27+
assert.isTrue(isbn.validate('0 00 726970 6'));
28+
assert.isTrue(isbn.validate('3423214120'));
29+
assert.isTrue(isbn.validate('3-423-21412-0'));
30+
assert.isTrue(isbn.validate('3 423 21412 0'));
31+
assert.isTrue(isbn.validate('340101319X'));
32+
assert.isTrue(isbn.validate('3-401-01319-X'));
33+
assert.isTrue(isbn.validate('3 401 01319 X'));
34+
assert.isTrue(isbn.validate('9783836221191'));
35+
assert.isTrue(isbn.validate('978-3-8362-2119-1'));
36+
assert.isTrue(isbn.validate('978 3 8362 2119 1'));
37+
assert.isTrue(isbn.validate('9783401013190'));
38+
assert.isTrue(isbn.validate('978-3401013190'));
39+
assert.isTrue(isbn.validate('978 3401013190'));
40+
assert.isTrue(isbn.validate('9784873113685'));
41+
assert.isTrue(isbn.validate('978-4-87311-368-5'));
42+
assert.isTrue(isbn.validate('978 4 87311 368 5'));
43+
});
44+
45+
it('values is not valid', () => {
46+
assert.isFalse(isbn.validate('3423214121'));
47+
assert.isFalse(isbn.validate('9783836221190'));
48+
assert.isFalse(isbn.validate('foo'));
49+
assert.isFalse(isbn.validate(''));
50+
assert.isFalse(isbn.validate(null));
51+
assert.isFalse(isbn.validate(undefined));
52+
assert.isFalse(isbn.validate(true));
53+
assert.isFalse(isbn.validate(false));
54+
assert.isFalse(isbn.validate([]));
55+
assert.isFalse(isbn.validate({}));
56+
assert.isFalse(isbn.validate(new Array('foo')));
57+
assert.isFalse(isbn.validate(new Object({foo: 'bar'})));
58+
59+
class Foo {}
60+
assert.isFalse(isbn.validate(new Foo()));
61+
});
62+
63+
});

test/rules/isbn10.ts

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import { assert } from 'chai';
2+
3+
import { AbstractRule } from '../../src/rules/abstract-rule';
4+
import { Isbn10 } from '../../src/rules/isbn10';
5+
6+
describe('Isbn10', () => {
7+
8+
let isbn10: Isbn10;
9+
10+
beforeEach(() => {
11+
isbn10 = new Isbn10();
12+
});
13+
14+
it('is rule', () => {
15+
assert.instanceOf(isbn10, AbstractRule);
16+
});
17+
18+
it('values is valid', () => {
19+
assert.isTrue(isbn10.validate('3836221195'));
20+
assert.isTrue(isbn10.validate('3-8362-2119-5'));
21+
assert.isTrue(isbn10.validate('3 8362 2119 5'));
22+
assert.isTrue(isbn10.validate('1617290858'));
23+
assert.isTrue(isbn10.validate('1-61729-085-8'));
24+
assert.isTrue(isbn10.validate('1 61729 085-8'));
25+
assert.isTrue(isbn10.validate('0007269706'));
26+
assert.isTrue(isbn10.validate('0-00-726970-6'));
27+
assert.isTrue(isbn10.validate('0 00 726970 6'));
28+
assert.isTrue(isbn10.validate('3423214120'));
29+
assert.isTrue(isbn10.validate('3-423-21412-0'));
30+
assert.isTrue(isbn10.validate('3 423 21412 0'));
31+
assert.isTrue(isbn10.validate('340101319X'));
32+
assert.isTrue(isbn10.validate('3-401-01319-X'));
33+
assert.isTrue(isbn10.validate('3 401 01319 X'));
34+
});
35+
36+
it('values is not valid', () => {
37+
assert.isFalse(isbn10.validate('3423214121'));
38+
assert.isFalse(isbn10.validate('3-423-21412-1'));
39+
assert.isFalse(isbn10.validate('3 423 21412 1'));
40+
assert.isFalse(isbn10.validate('978-3836221191'));
41+
assert.isFalse(isbn10.validate('9783836221191'));
42+
assert.isFalse(isbn10.validate('123456789a'));
43+
assert.isFalse(isbn10.validate('foo'));
44+
assert.isFalse(isbn10.validate(''));
45+
assert.isFalse(isbn10.validate(null));
46+
assert.isFalse(isbn10.validate(undefined));
47+
assert.isFalse(isbn10.validate(true));
48+
assert.isFalse(isbn10.validate(false));
49+
assert.isFalse(isbn10.validate([]));
50+
assert.isFalse(isbn10.validate({}));
51+
assert.isFalse(isbn10.validate(new Array('foo')));
52+
assert.isFalse(isbn10.validate(new Object({foo: 'bar'})));
53+
54+
class Foo {}
55+
assert.isFalse(isbn10.validate(new Foo()));
56+
});
57+
58+
});

0 commit comments

Comments
 (0)