isISBN.js 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. import assertString from './util/assertString';
  2. var possibleIsbn10 = /^(?:[0-9]{9}X|[0-9]{10})$/;
  3. var possibleIsbn13 = /^(?:[0-9]{13})$/;
  4. var factor = [1, 3];
  5. export default function isISBN(isbn, options) {
  6. assertString(isbn);
  7. // For backwards compatibility:
  8. // isISBN(str [, version]), i.e. `options` could be used as argument for the legacy `version`
  9. var version = String((options === null || options === void 0 ? void 0 : options.version) || options);
  10. if (!(options !== null && options !== void 0 && options.version || options)) {
  11. return isISBN(isbn, {
  12. version: 10
  13. }) || isISBN(isbn, {
  14. version: 13
  15. });
  16. }
  17. var sanitizedIsbn = isbn.replace(/[\s-]+/g, '');
  18. var checksum = 0;
  19. if (version === '10') {
  20. if (!possibleIsbn10.test(sanitizedIsbn)) {
  21. return false;
  22. }
  23. for (var i = 0; i < version - 1; i++) {
  24. checksum += (i + 1) * sanitizedIsbn.charAt(i);
  25. }
  26. if (sanitizedIsbn.charAt(9) === 'X') {
  27. checksum += 10 * 10;
  28. } else {
  29. checksum += 10 * sanitizedIsbn.charAt(9);
  30. }
  31. if (checksum % 11 === 0) {
  32. return true;
  33. }
  34. } else if (version === '13') {
  35. if (!possibleIsbn13.test(sanitizedIsbn)) {
  36. return false;
  37. }
  38. for (var _i = 0; _i < 12; _i++) {
  39. checksum += factor[_i % 2] * sanitizedIsbn.charAt(_i);
  40. }
  41. if (sanitizedIsbn.charAt(12) - (10 - checksum % 10) % 10 === 0) {
  42. return true;
  43. }
  44. }
  45. return false;
  46. }