isISBN.js 1.7 KB

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