isISBN.js 1.7 KB

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